import { For, createMemo } from "solid-js"; import { Trans } from "@lingui-solid/solid/macro"; import { Channel } from "stoat.js"; import { styled } from "styled-system/jsx"; import { CategoryButton, Column, Text } from "@revolt/ui"; import { useSettingsNavigation } from "../../Settings"; /** * Count set bits * @param v Number * @returns Set bits */ function countBits(v: bigint) { let bits = 0; for (let i = 0n; i < 52n; i++) { if (((1n << i) & v) === 1n << i) { bits++; } } return bits; } /** * Menu to select what permission set to change */ export function ChannelPermissionsOverview(props: { context: Channel }) { const { navigate } = useSettingsNavigation(); const roles = createMemo(() => { const ordered = props.context.server?.orderedRoles; return { active: ordered?.filter( (role) => countBits(props.context.rolePermissions?.[role.id]?.a || 0n) > 0 || countBits(props.context.rolePermissions?.[role.id]?.d || 0n) > 0, ), unused: ordered?.filter( (role) => countBits(props.context.rolePermissions?.[role.id]?.a || 0n) === 0 && countBits(props.context.rolePermissions?.[role.id]?.d || 0n) === 0, ), }; }); return ( Affects all roles and users} onClick={() => navigate("permissions/default")} > Default Permissions Role Permissions {(role) => ( } action="chevron" onClick={() => navigate(`permissions/${role.id}`)} description={ Grants {countBits(props.context.rolePermissions![role.id].a)}{" "} permissions and denies{" "} {countBits(props.context.rolePermissions![role.id].d)}{" "} permissions } > {role.name} )} Unused Roles {(role) => ( } action="chevron" onClick={() => navigate(`permissions/${role.id}`)} description={No permissions set yet} > {role.name} )} ); } const RoleIcon = styled("div", { base: { width: "100%", height: "100%", aspectRatio: "1/1", borderRadius: "100%", }, });