import { useCallback, useContext, useState } from 'react'; import styled from '@emotion/styled'; import { useRecoilValue, useSetRecoilState } from 'recoil'; import { Key } from 'ts-key-enum'; import { Button } from '@/ui/button/components/Button'; import { ButtonGroup } from '@/ui/button/components/ButtonGroup'; import { DropdownMenuContainer } from '@/ui/dropdown/components/DropdownMenuContainer'; import { DropdownMenuItemsContainer } from '@/ui/dropdown/components/DropdownMenuItemsContainer'; import { IconChevronDown, IconPlus } from '@/ui/icon'; import { MenuItem } from '@/ui/menu-item/components/MenuItem'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { useRecoilScopedValue } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedValue'; import { useRecoilScopeId } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopeId'; import { currentViewIdScopedState } from '@/ui/view-bar/states/currentViewIdScopedState'; import { filtersScopedState } from '@/ui/view-bar/states/filtersScopedState'; import { savedFiltersFamilyState } from '@/ui/view-bar/states/savedFiltersFamilyState'; import { savedSortsFamilyState } from '@/ui/view-bar/states/savedSortsFamilyState'; import { canPersistFiltersScopedFamilySelector } from '@/ui/view-bar/states/selectors/canPersistFiltersScopedFamilySelector'; import { canPersistSortsScopedFamilySelector } from '@/ui/view-bar/states/selectors/canPersistSortsScopedFamilySelector'; import { sortsScopedState } from '@/ui/view-bar/states/sortsScopedState'; import { viewEditModeState } from '@/ui/view-bar/states/viewEditModeState'; import { ViewBarContext } from '../contexts/ViewBarContext'; const StyledContainer = styled.div` display: inline-flex; margin-right: ${({ theme }) => theme.spacing(2)}; position: relative; `; export type UpdateViewButtonGroupProps = { hotkeyScope: string; onViewEditModeChange?: () => void; }; export const UpdateViewButtonGroup = ({ hotkeyScope, onViewEditModeChange, }: UpdateViewButtonGroupProps) => { const [isDropdownOpen, setIsDropdownOpen] = useState(false); const { canPersistViewFields, onCurrentViewSubmit, ViewBarRecoilScopeContext, } = useContext(ViewBarContext); const recoilScopeId = useRecoilScopeId(ViewBarRecoilScopeContext); const currentViewId = useRecoilScopedValue( currentViewIdScopedState, ViewBarRecoilScopeContext, ); const filters = useRecoilScopedValue( filtersScopedState, ViewBarRecoilScopeContext, ); const setSavedFilters = useSetRecoilState( savedFiltersFamilyState(currentViewId), ); const canPersistFilters = useRecoilValue( canPersistFiltersScopedFamilySelector({ recoilScopeId, viewId: currentViewId, }), ); const sorts = useRecoilScopedValue( sortsScopedState, ViewBarRecoilScopeContext, ); const setSavedSorts = useSetRecoilState(savedSortsFamilyState(currentViewId)); const canPersistSorts = useRecoilValue( canPersistSortsScopedFamilySelector({ recoilScopeId, viewId: currentViewId, }), ); const setViewEditMode = useSetRecoilState(viewEditModeState); const canPersistView = currentViewId && (canPersistViewFields || canPersistFilters || canPersistSorts); const handleArrowDownButtonClick = useCallback(() => { setIsDropdownOpen((previousIsOpen) => !previousIsOpen); }, []); const handleCreateViewButtonClick = useCallback(() => { setViewEditMode({ mode: 'create', viewId: undefined }); onViewEditModeChange?.(); setIsDropdownOpen(false); }, [setViewEditMode, onViewEditModeChange]); const handleDropdownClose = useCallback(() => { setIsDropdownOpen(false); }, []); const handleViewSubmit = async () => { if (canPersistFilters) setSavedFilters(filters); if (canPersistSorts) setSavedSorts(sorts); await onCurrentViewSubmit?.(); }; useScopedHotkeys( [Key.Enter, Key.Escape], handleDropdownClose, hotkeyScope, [], ); if (!canPersistView) return null; return (