import { HelpCircle } from "@styled-icons/boxicons-solid"; import isEqual from "lodash.isequal"; import { observer } from "mobx-react-lite"; import { Server } from "revolt.js"; import styled from "styled-components"; import { Text } from "preact-i18n"; import { useMemo, useState } from "preact/hooks"; import { Button, PermissionsLayout, SpaceBetween, H1, Checkbox, ColourSwatches, InputBox, Category, } from "@revoltchat/ui"; import Tooltip from "../../../components/common/Tooltip"; import { PermissionList } from "../../../components/settings/roles/PermissionList"; import { RoleOrDefault } from "../../../components/settings/roles/RoleSelection"; import { modalController } from "../../../controllers/modals/ModalController"; interface Props { server: Server; } /** * Hook to memo-ize role information. * @param server Target server * @returns Role array */ export function useRoles(server: Server) { return useMemo( () => [ // Pull in known server roles. ...server.orderedRoles, // Include the default server permissions. { id: "default", name: "Default", permissions: server.default_permissions, }, ] as RoleOrDefault[], [server.roles, server.default_permissions], ); } /** * Roles settings menu */ export const Roles = observer(({ server }: Props) => { // Consolidate all permissions that we can change right now. const currentRoles = useRoles(server); const RoleId = styled.div` gap: 4px; display: flex; align-items: center; font-size: 12px; font-weight: 600; color: var(--tertiary-foreground); a { color: var(--tertiary-foreground); } `; const DeleteRoleButton = styled(Button)` margin: 16px 0; `; return ( modalController.push({ type: "create_role", server, callback, }) } editor={({ selected }) => { const currentRole = currentRoles.find( (x) => x.id === selected, )!; if (!currentRole) return null; // Keep track of whatever role we're editing right now. const [value, setValue] = useState>({}); const currentRoleValue = { ...currentRole, ...value }; // Calculate permissions we have access to on this server. const current = server.permission; // Upload new role information to server. function save() { const { permissions: permsCurrent, ...current } = currentRole; const { permissions: permsValue, ...value } = currentRoleValue; if (!isEqual(permsCurrent, permsValue)) { server.setPermissions( selected, typeof permsValue === "number" ? permsValue : { allow: permsValue.a, deny: permsValue.d, }, ); } if (!isEqual(current, value)) { server.editRole(selected, value); } } // Delete the role from this server. function deleteRole() { server.deleteRole(selected); } return (


{selected !== "default" && ( <>

setValue({ ...value, name: e.currentTarget.value, }) } palette="secondary" />

{"Role ID"} }> modalController.writeText( currentRole.id, ) }> {currentRole.id}

setValue({ ...value, colour }) } />

setValue({ ...value, hoist }) } title={ } description={ } />

setValue({ ...value, rank: parseInt( e.currentTarget.value, ), }) } palette="secondary" />

)}

setValue({ ...value, permissions, } as RoleOrDefault) } target={server} /> {selected !== "default" && ( <>

)}
); }} /> ); });