import isEqual from "lodash.isequal"; import { observer } from "mobx-react-lite"; import { Server } from "revolt.js/esm/maps/Servers"; import { useMemo, useState } from "preact/hooks"; import { useIntermediate } from "../../../context/intermediate/Intermediate"; import Checkbox from "../../../components/ui/Checkbox"; import ColourSwatches from "../../../components/ui/ColourSwatches"; import InputBox from "../../../components/ui/InputBox"; import Overline from "../../../components/ui/Overline"; import { Button, PermissionsLayout, SpaceBetween, H1 } from "@revoltchat/ui"; import { PermissionList } from "../../../components/settings/roles/PermissionList"; import { RoleOrDefault } from "../../../components/settings/roles/RoleSelection"; 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); // Pull in modal context. const { openScreen } = useIntermediate(); return ( openScreen({ id: "special_input", type: "create_role", server: server as any, 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 (

Edit {currentRole.name}


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

setValue({ ...value, name: e.currentTarget.value, }) } contrast />

Role Colour

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

Role Options

setValue({ ...value, hoist }) } description="Display this role above others."> Hoist Role

Role Ranking

setValue({ ...value, rank: parseInt( e.currentTarget.value, ), }) } contrast />

)}

Edit Permissions

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

Danger Zone

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