import { Plus } from "@styled-icons/boxicons-regular"; import isEqual from "lodash.isequal"; import { observer } from "mobx-react-lite"; import { ChannelPermission, ServerPermission } from "revolt.js"; import { Server } from "revolt.js/dist/maps/Servers"; import styles from "./Panes.module.scss"; import { Text } from "preact-i18n"; import {useCallback, useContext, useEffect, useMemo, useState} from "preact/hooks"; import { useIntermediate } from "../../../context/intermediate/Intermediate"; import Button from "../../../components/ui/Button"; 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 ButtonItem from "../../../components/navigation/items/ButtonItem"; import {AppContext} from "../../../context/revoltjs/RevoltClient"; interface Props { server: Server; } const I32ToU32 = (arr: number[]) => arr.map((x) => x >>> 0); // ! FIXME: bad code :) export const Roles = observer(({ server }: Props) => { const client = useContext(AppContext); const [role, setRole] = useState("default"); const { openScreen } = useIntermediate(); const roles = useMemo(() => server.roles ?? {}, [server]); if (role !== "default" && typeof roles[role] === "undefined") { useEffect(() => setRole("default"), [role]); return null; } const clientPermissions = client.servers.get(server._id)!.permission; const { name: roleName, colour: roleColour, hoist: roleHoist, rank: roleRank, permissions, } = roles[role] ?? {}; const getPermissions = useCallback( (id: string) => { return I32ToU32( id === "default" ? server.default_permissions : roles[id].permissions, ); }, [roles, server], ); const [perm, setPerm] = useState(getPermissions(role)); const [name, setName] = useState(roleName); const [hoist, setHoist] = useState(roleHoist); const [rank, setRank] = useState(roleRank); const [colour, setColour] = useState(roleColour); useEffect( () => setPerm(getPermissions(role)), [getPermissions, role, permissions], ); useEffect(() => setName(roleName), [role, roleName]); useEffect(() => setHoist(roleHoist), [role, roleHoist]); useEffect(() => setRank(roleRank), [role, roleRank]); useEffect(() => setColour(roleColour), [role, roleColour]); const modified = !isEqual(perm, getPermissions(role)) || !isEqual(name, roleName) || !isEqual(colour, roleColour) || !isEqual(hoist, roleHoist) || !isEqual(rank, roleRank); const save = () => { if (!isEqual(perm, getPermissions(role))) { server.setPermissions(role, { server: perm[0], channel: perm[1], }); } if ( !isEqual(name, roleName) || !isEqual(colour, roleColour) || !isEqual(hoist, roleHoist) || !isEqual(rank, roleRank) ) { server.editRole(role, { name, colour, hoist, rank }); } }; const deleteRole = () => { setRole("default"); server.deleteRole(role); }; return (

openScreen({ id: "special_input", type: "create_role", server, callback: (id) => setRole(id), }) } />
{["default", ...Object.keys(roles)].map((id) => { if (id === "default") { return ( setRole("default")}> ); } return ( setRole(id)} style={{ color: roles[id].colour }}> {roles[id].name} ); })}

{role === "default" ? ( ) : ( roles[role].name )}

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

setName(e.currentTarget.value) } contrast />

Role Colour

setColour(value)} />

Role Options

setHoist(v)} description="Display this role above others."> Hoist Role

)}
{Object.keys(ServerPermission).map((key) => { if (key === "View") return; const value = ServerPermission[ key as keyof typeof ServerPermission ]; return ( 0} onChange={() => setPerm([perm[0] ^ value, perm[1]]) } disabled={!(clientPermissions & value)} description={ }> ); })}
{Object.keys(ChannelPermission).map((key) => { if (key === "ManageChannel") return; const value = ChannelPermission[ key as keyof typeof ChannelPermission ]; return ( >> 0) & value) > 0} onChange={() => setPerm([perm[0], perm[1] ^ value]) } disabled={key === "View" || (!(clientPermissions & value))} description={ }> ); })}
{role !== "default" && ( )}
{role !== "default" && ( <>
Experimental Role Ranking

setRank(parseInt(e.currentTarget.value)) } contrast />

)}
); });