/* eslint-disable react/no-array-index-key */ import React, { useState, MouseEventHandler, ReactNode } from 'react'; import FocusTrap from 'focus-trap-react'; import { Box, Button, Chip, Text, RectCords, PopOut, Menu, Scroll, toRem, config, color, } from 'folds'; import { SequenceCard } from '../../../components/sequence-card'; import { SequenceCardStyle } from '../styles.css'; import { getPowers, getTagIconSrc, usePowerLevelTags } from '../../../hooks/usePowerLevelTags'; import { SettingTile } from '../../../components/setting-tile'; import { getPermissionPower, IPowerLevels } from '../../../hooks/usePowerLevels'; import { useRoom } from '../../../hooks/useRoom'; import { PowerColorBadge, PowerIcon } from '../../../components/power'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication'; import { stopPropagation } from '../../../utils/keyboard'; import { PermissionGroup } from './types'; type PeekPermissionsProps = { powerLevels: IPowerLevels; power: number; permissionGroups: PermissionGroup[]; children: (handleOpen: MouseEventHandler, opened: boolean) => ReactNode; }; function PeekPermissions({ powerLevels, power, permissionGroups, children }: PeekPermissionsProps) { const [menuCords, setMenuCords] = useState(); const handleOpen: MouseEventHandler = (evt) => { setMenuCords(evt.currentTarget.getBoundingClientRect()); }; return ( setMenuCords(undefined), clickOutsideDeactivates: true, escapeDeactivates: stopPropagation, }} > {permissionGroups.map((group, groupIndex) => ( {group.name}
{group.items.map((item, itemIndex) => { const requiredPower = getPermissionPower(powerLevels, item.location); const hasPower = requiredPower <= power; return ( {hasPower ? '✅' : '❌'} {item.name} ); })}
))}
} > {children(handleOpen, !!menuCords)}
); } type PowersProps = { powerLevels: IPowerLevels; permissionGroups: PermissionGroup[]; onEdit?: () => void; }; export function Powers({ powerLevels, permissionGroups, onEdit }: PowersProps) { const mx = useMatrixClient(); const useAuthentication = useMediaAuthentication(); const room = useRoom(); const [powerLevelTags] = usePowerLevelTags(room, powerLevels); return ( ) } /> {getPowers(powerLevelTags).map((power) => { const tag = powerLevelTags[power]; const tagIconSrc = tag.icon && getTagIconSrc(mx, useAuthentication, tag.icon); return ( {(openMenu, opened) => ( } after={tagIconSrc && } > {tag.name} )} ); })} ); }