import React, { MouseEventHandler, useCallback, useMemo, useState } from 'react'; import { config, Box, MenuItem, Text, Icon, Icons, IconSrc, RectCords, PopOut, Menu, Button, Spinner, } from 'folds'; import { JoinRule } from 'matrix-js-sdk'; import FocusTrap from 'focus-trap-react'; import { useTranslation } from 'react-i18next'; import { stopPropagation } from '../utils/keyboard'; import { getRoomIconSrc } from '../utils/room'; export type ExtraJoinRules = 'knock_restricted'; export type ExtendedJoinRules = JoinRule | ExtraJoinRules; type JoinRuleIcons = Record; export const useJoinRuleIcons = (roomType?: string): JoinRuleIcons => useMemo( () => ({ [JoinRule.Invite]: getRoomIconSrc(Icons, roomType, JoinRule.Invite), [JoinRule.Knock]: getRoomIconSrc(Icons, roomType, JoinRule.Knock), knock_restricted: getRoomIconSrc(Icons, roomType, JoinRule.Restricted), [JoinRule.Restricted]: getRoomIconSrc(Icons, roomType, JoinRule.Restricted), [JoinRule.Public]: getRoomIconSrc(Icons, roomType, JoinRule.Public), [JoinRule.Private]: getRoomIconSrc(Icons, roomType, JoinRule.Private), }), [roomType] ); type JoinRuleLabels = Record; export const useRoomJoinRuleLabel = (): JoinRuleLabels => { const { t } = useTranslation(); return useMemo( () => ({ [JoinRule.Invite]: t('RoomSettings.join_invite_only'), [JoinRule.Knock]: t('RoomSettings.join_knock_invite'), knock_restricted: t('RoomSettings.join_space_members_or_knock'), [JoinRule.Restricted]: t('RoomSettings.join_space_members'), [JoinRule.Public]: t('RoomSettings.join_public'), [JoinRule.Private]: t('RoomSettings.join_invite_only'), }), [t] ); }; type JoinRulesSwitcherProps = { icons: JoinRuleIcons; labels: JoinRuleLabels; rules: T; value: T[number]; onChange: (value: T[number]) => void; disabled?: boolean; changing?: boolean; }; export function JoinRulesSwitcher({ icons, labels, rules, value, onChange, disabled, changing, }: JoinRulesSwitcherProps) { const { t } = useTranslation(); const [cords, setCords] = useState(); const handleOpenMenu: MouseEventHandler = (evt) => { setCords(evt.currentTarget.getBoundingClientRect()); }; const handleChange = useCallback( (selectedRule: ExtendedJoinRules) => { setCords(undefined); onChange(selectedRule); }, [onChange] ); return ( setCords(undefined), clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp', escapeDeactivates: stopPropagation, }} > {rules.map((rule) => ( handleChange(rule)} before={} disabled={disabled} > {labels[rule]} ))} } > ); }