import { useCallback, useRef, useState } from 'react'; import { OnDragEndResponder } from '@hello-pangea/dnd'; import { Key } from 'ts-key-enum'; import { IconChevronLeft, IconTag } from '@/ui/display/icon'; import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader'; import { DropdownMenuInput } from '@/ui/layout/dropdown/components/DropdownMenuInput'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator'; import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { useRecoilScopedValue } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedValue'; import { ViewFieldsVisibilityDropdownSection } from '@/views/components/ViewFieldsVisibilityDropdownSection'; import { useView } from '@/views/hooks/useView'; import { useViewInternalStates } from '@/views/hooks/useViewInternalStates'; import { useTableColumns } from '../../hooks/useTableColumns'; import { TableRecoilScopeContext } from '../../states/recoil-scope-contexts/TableRecoilScopeContext'; import { hiddenTableColumnsScopedSelector } from '../../states/selectors/hiddenTableColumnsScopedSelector'; import { visibleTableColumnsScopedSelector } from '../../states/selectors/visibleTableColumnsScopedSelector'; import { TableOptionsHotkeyScope } from '../../types/TableOptionsHotkeyScope'; type TableOptionsMenu = 'fields'; export const TableOptionsDropdownContent = () => { const { setViewEditMode, handleViewNameSubmit } = useView(); const { viewEditMode, currentView } = useViewInternalStates(); const { closeDropdown } = useDropdown(); const [currentMenu, setCurrentMenu] = useState( undefined, ); const viewEditInputRef = useRef(null); const visibleTableColumns = useRecoilScopedValue( visibleTableColumnsScopedSelector, TableRecoilScopeContext, ); const hiddenTableColumns = useRecoilScopedValue( hiddenTableColumnsScopedSelector, TableRecoilScopeContext, ); const { handleColumnVisibilityChange, handleColumnReorder } = useTableColumns(); const handleSelectMenu = (option: TableOptionsMenu) => { const name = viewEditInputRef.current?.value; handleViewNameSubmit(name); setCurrentMenu(option); }; const handleReorderField: OnDragEndResponder = useCallback( (result) => { if (!result.destination || result.destination.index === 0) { return; } const reorderFields = Array.from(visibleTableColumns); const [removed] = reorderFields.splice(result.source.index, 1); reorderFields.splice(result.destination.index, 0, removed); handleColumnReorder(reorderFields); }, [visibleTableColumns, handleColumnReorder], ); const resetMenu = () => setCurrentMenu(undefined); useScopedHotkeys( Key.Escape, () => { closeDropdown(); }, TableOptionsHotkeyScope.Dropdown, ); useScopedHotkeys( Key.Enter, () => { const name = viewEditInputRef.current?.value; handleViewNameSubmit(name); resetMenu(); setViewEditMode('none'); closeDropdown(); }, TableOptionsHotkeyScope.Dropdown, ); return ( <> {!currentMenu && ( <> handleSelectMenu('fields')} LeftIcon={IconTag} text="Fields" /> {/*onImport && ( )*/} )} {currentMenu === 'fields' && ( <> Fields {hiddenTableColumns.length > 0 && ( <> )} )} ); };