import React, { useState } from 'react' import { ColumnDefinition, ColumnType, DropdownColumnProps, RowActionsConfig, } from '../types' import Block from '../../Primitives/Block/Block' import PrimitiveText from '../../Primitives/PrimitiveText/PrimitiveText' import { FOUNDATION_THEME } from '../../../tokens' import { Drawer, DrawerPortal, DrawerOverlay, DrawerContent, DrawerBody, DrawerTitle, NestedSingleSelectDrawer, } from '../../Drawer' import { ChevronRight } from 'lucide-react' import { Button } from '../../Button' import { ButtonType, ButtonSize, ButtonSubType } from '../../Button/types' import { useResponsiveTokens } from '../../../hooks/useResponsiveTokens' import type { TableTokenType } from '../dataTable.tokens' export interface MobileColumnDrawerProps> { isOpen: boolean onClose: () => void row: T rowIndex: number overflowColumns: ColumnDefinition[] getDisplayValue?: (value: unknown, column: ColumnDefinition) => unknown onFieldChange?: (field: keyof T, value: unknown) => void rowActions?: RowActionsConfig } const MobileColumnDrawer: React.FC< MobileColumnDrawerProps> > = ({ isOpen, onClose, row, rowIndex, overflowColumns, getDisplayValue, onFieldChange, rowActions, }) => { const tableToken = useResponsiveTokens('TABLE') const [nestedDrawerOpen, setNestedDrawerOpen] = useState(false) const [selectedDropdownColumn, setSelectedDropdownColumn] = useState<{ column: ColumnDefinition> value: DropdownColumnProps } | null>(null) /** * Renders cell value using the exact same logic as table cells * This ensures consistency between desktop table and mobile drawer */ const renderCellValue = ( column: ColumnDefinition>, value: unknown ): React.ReactNode => { if (column.renderCell) { try { // @ts-expect-error error may occur if renderCell is not defined for the column return column.renderCell(value, row, 0) } catch (error) { console.warn('Error in column renderCell function:', error) return value != null ? String(value) : '-' } } if (getDisplayValue) { try { const displayValue = getDisplayValue(value, column) return displayValue != null ? String(displayValue) : '-' } catch (error) { console.warn('Error in getDisplayValue function:', error) return value != null ? String(value) : '-' } } return value != null ? String(value) : '-' } const handleDropdownClick = ( column: ColumnDefinition>, value: DropdownColumnProps ) => { setSelectedDropdownColumn({ column, value }) setNestedDrawerOpen(true) } const handleDropdownValueChange = (newValue: string) => { if (selectedDropdownColumn && onFieldChange) { const updatedDropdownValue = { ...selectedDropdownColumn.value, selectedValue: newValue, } onFieldChange( selectedDropdownColumn.column.field, updatedDropdownValue ) } } const renderDrawerRow = ( column: ColumnDefinition> ) => { const value = row[column.field] const isDropdown = column.type === ColumnType.DROPDOWN const dropdownValue = isDropdown ? (value as DropdownColumnProps) : null const renderedValue = renderCellValue(column, value) return ( handleDropdownClick(column, dropdownValue) : undefined } > {/* Column Label */} {column.header} {typeof renderedValue === 'string' || typeof renderedValue === 'number' ? ( {renderedValue} ) : ( renderedValue )} {isDropdown && ( )} ) } return ( <> Insights {overflowColumns.map(renderDrawerRow)} {rowActions && (rowActions.slot1 || rowActions.slot2) && ( {rowActions.slot1 && !( (typeof rowActions.slot1 .hidden === 'function' ? rowActions.slot1.hidden( row, rowIndex ) : rowActions.slot1 .hidden) ?? false ) && (