import { cloneElement, type ComponentProps, useCallback, useRef } from 'react'; import { useTheme } from '@emotion/react'; import styled from '@emotion/styled'; import { IconButton } from '@/ui/button/components/IconButton'; import { DropdownMenuItem } from '@/ui/dropdown/components/DropdownMenuItem'; import { StyledDropdownMenu } from '@/ui/dropdown/components/StyledDropdownMenu'; import { StyledDropdownMenuItemsContainer } from '@/ui/dropdown/components/StyledDropdownMenuItemsContainer'; import type { ViewFieldMetadata } from '@/ui/editable-field/types/ViewField'; import { IconPlus } from '@/ui/icon'; import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; import { useRecoilScopedValue } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedValue'; import { useTableColumns } from '../hooks/useTableColumns'; import { TableRecoilScopeContext } from '../states/recoil-scope-contexts/TableRecoilScopeContext'; import { hiddenTableColumnsScopedSelector } from '../states/selectors/hiddenTableColumnsScopedSelector'; import type { ColumnDefinition } from '../types/ColumnDefinition'; const StyledColumnMenu = styled(StyledDropdownMenu)` font-weight: ${({ theme }) => theme.font.weight.regular}; `; type EntityTableColumnMenuProps = { onAddColumn?: () => void; onClickOutside?: () => void; } & ComponentProps<'div'>; export const EntityTableColumnMenu = ({ onAddColumn, onClickOutside = () => undefined, ...props }: EntityTableColumnMenuProps) => { const ref = useRef(null); const theme = useTheme(); const hiddenColumns = useRecoilScopedValue( hiddenTableColumnsScopedSelector, TableRecoilScopeContext, ); useListenClickOutside({ refs: [ref], callback: onClickOutside, }); const { handleColumnVisibilityChange } = useTableColumns(); const handleAddColumn = useCallback( (column: ColumnDefinition) => { onAddColumn?.(); handleColumnVisibilityChange(column); }, [handleColumnVisibilityChange, onAddColumn], ); return ( {hiddenColumns.map((column) => ( } onClick={() => handleAddColumn(column)} />, ]} > {column.icon && cloneElement(column.icon, { size: theme.icon.size.md, })} {column.label} ))} ); };