import React, { MouseEventHandler, useMemo, useState } from 'react'; import { Box, Button, config, Icon, Icons, Menu, MenuItem, PopOut, RectCords, Text } from 'folds'; import FocusTrap from 'focus-trap-react'; import { ImageUsage } from '../../plugins/custom-emoji'; import { stopPropagation } from '../../utils/keyboard'; export const useUsageStr = (): ((usage: ImageUsage[]) => string) => { const getUsageStr = (usage: ImageUsage[]): string => { const sticker = usage.includes(ImageUsage.Sticker); const emoticon = usage.includes(ImageUsage.Emoticon); if (sticker && emoticon) return 'Both'; if (sticker) return 'Sticker'; if (emoticon) return 'Emoji'; return 'Both'; }; return getUsageStr; }; type UsageSelectorProps = { selected: ImageUsage[]; onChange: (usage: ImageUsage[]) => void; }; export function UsageSelector({ selected, onChange }: UsageSelectorProps) { const getUsageStr = useUsageStr(); const selectedUsageStr = getUsageStr(selected); const isSelected = (usage: ImageUsage[]) => getUsageStr(usage) === selectedUsageStr; const allUsages: ImageUsage[][] = useMemo( () => [[ImageUsage.Emoticon], [ImageUsage.Sticker], [ImageUsage.Sticker, ImageUsage.Emoticon]], [] ); return ( {allUsages.map((usage) => ( onChange(usage)} > {getUsageStr(usage)} ))} ); } type UsageSwitcherProps = { usage: ImageUsage[]; canEdit?: boolean; onChange: (usage: ImageUsage[]) => void; }; export function UsageSwitcher({ usage, onChange, canEdit }: UsageSwitcherProps) { const getUsageStr = useUsageStr(); const [menuCords, setMenuCords] = useState(); const handleSelectUsage: MouseEventHandler = (event) => { setMenuCords(event.currentTarget.getBoundingClientRect()); }; return ( <> setMenuCords(undefined), clickOutsideDeactivates: true, isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown' || evt.key === 'ArrowRight', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp' || evt.key === 'ArrowLeft', escapeDeactivates: stopPropagation, }} > { setMenuCords(undefined); onChange(usg); }} /> } /> ); }