import { Plus } from "@styled-icons/boxicons-regular"; import isEqual from "lodash.isequal"; import { Servers } from "revolt.js/dist/api/objects"; import { ChannelPermission, ServerPermission, } from "revolt.js/dist/api/permissions"; import styles from "./Panes.module.scss"; import { Text } from "preact-i18n"; import { useContext, useEffect, useState } from "preact/hooks"; import { useIntermediate } from "../../../context/intermediate/Intermediate"; import { AppContext } from "../../../context/revoltjs/RevoltClient"; import Button from "../../../components/ui/Button"; import Checkbox from "../../../components/ui/Checkbox"; import IconButton from "../../../components/ui/IconButton"; import InputBox from "../../../components/ui/InputBox"; import Overline from "../../../components/ui/Overline"; import Tip from "../../../components/ui/Tip"; import ButtonItem from "../../../components/navigation/items/ButtonItem"; interface Props { server: Servers.Server; } const I32ToU32 = (arr: number[]) => arr.map((x) => x >>> 0); // ! FIXME: bad code :) export function Roles({ server }: Props) { const [role, setRole] = useState("default"); const { openScreen } = useIntermediate(); const client = useContext(AppContext); const roles = server.roles ?? {}; if (role !== "default" && typeof roles[role] === "undefined") { useEffect(() => setRole("default")); return null; } const v = (id: string) => I32ToU32( id === "default" ? server.default_permissions : roles[id].permissions, ); const [perm, setPerm] = useState(v(role)); useEffect(() => setPerm(v(role)), [role, roles[role]?.permissions]); const modified = !isEqual(perm, v(role)); const save = () => client.servers.setPermissions(server._id, role, { server: perm[0], channel: perm[1], }); const deleteRole = () => { setRole("default"); client.servers.deleteRole(server._id, role); }; return (