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 (

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

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

{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]]) } 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"} description={ }> ); })}
{role !== "default" && ( )}
); }