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 (