import { UserStatus as UserStatusType } from '@rocket.chat/core-typings'; import { Button, PositionAnimated, Options, useCursor, Box } from '@rocket.chat/fuselage'; import { useSetting, useTranslation } from '@rocket.chat/ui-contexts'; import type { ReactElement, ComponentProps } from 'react'; import React, { useRef, useCallback, useState, useMemo, useEffect } from 'react'; import { UserStatus } from './UserStatus'; type UserStatusMenuProps = { margin: ComponentProps['margin']; onChange: (type: UserStatusType) => void; initialStatus?: UserStatusType; optionWidth?: ComponentProps['width']; placement?: ComponentProps['placement']; }; const UserStatusMenu = ({ margin, onChange, initialStatus = UserStatusType.OFFLINE, optionWidth = undefined, placement = 'bottom-end', }: UserStatusMenuProps): ReactElement => { const t = useTranslation(); const [status, setStatus] = useState(initialStatus); const allowInvisibleStatus = useSetting('Accounts_AllowInvisibleStatusOption') as boolean; const options = useMemo(() => { const renderOption = (status: UserStatusType, label: string): ReactElement => ( {label} ); const statuses: Array<[value: UserStatusType, label: ReactElement]> = [ [UserStatusType.ONLINE, renderOption(UserStatusType.ONLINE, t('Online'))], [UserStatusType.AWAY, renderOption(UserStatusType.AWAY, t('Away'))], [UserStatusType.BUSY, renderOption(UserStatusType.BUSY, t('Busy'))], ]; if (allowInvisibleStatus) { statuses.push([UserStatusType.OFFLINE, renderOption(UserStatusType.OFFLINE, t('Offline'))]); } return statuses; }, [t, allowInvisibleStatus]); const [cursor, handleKeyDown, handleKeyUp, reset, [visible, hide, show]] = useCursor(-1, options, ([selected], [, hide]) => { setStatus(selected); reset(); hide(); }); const ref = useRef(null); const onClick = useCallback(() => { if (!ref?.current) { return; } ref.current.focus(); show(); ref.current.classList.add('focus-visible'); }, [show]); const handleSelection = useCallback( ([selected]) => { setStatus(selected); reset(); hide(); }, [hide, reset], ); useEffect(() => onChange(status), [status, onChange]); return ( <> ); }; export default UserStatusMenu;