import { useState, useCallback, useRef } from 'react' import { FolderButton } from '../folder-button' import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, } from '../../basic/dropdown-menu' import { FolderPermissionDialog } from './folder-permission-dialog' import { FolderLine, FolderFillLine, TimeLine } from '../../basic/icons-inline' import type { FolderPermissionConfig, InputPropsWithWebkitDirectory } from './types' const MOCK_HISTORY_FOLDERS = ['~/Projects/spark-design-app', '~/Documents/workspace', '~/Desktop/demo', '~/code/my-app'] const iconClass = 'mr-2 w-4 h-4 shrink-0' export interface ChatInputFolderSelectorProps { disabled: boolean folderButtonLabel: string folderPermission?: FolderPermissionConfig onFolderButtonClick?: () => void onFolderClear?: () => void onFolderSelect: (files: FileList) => void hasFolderSelected: boolean dataStyle?: string dataTheme?: string folderIcon?: React.ReactNode folderOpenIcon?: React.ReactNode historyIcon?: React.ReactNode subMenuArrowIcon?: React.ReactNode folderFillIcon?: React.ReactNode closeIcon?: React.ReactNode } export function ChatInputFolderSelector({ disabled, folderButtonLabel, folderPermission, onFolderButtonClick, onFolderClear, onFolderSelect, hasFolderSelected, dataStyle, dataTheme, folderIcon = , folderOpenIcon = , historyIcon = , subMenuArrowIcon, folderFillIcon, closeIcon, }: ChatInputFolderSelectorProps) { const enableFolderPermissionDialog = folderPermission?.enable ?? false const folderPermissionProjectName = folderPermission?.projectName ?? '04_代码' const [folderPermissionOpen, setFolderPermissionOpen] = useState(false) const [folderPermissionAlwaysAllow, setFolderPermissionAlwaysAllow] = useState(false) const [folderMenuOpen, setFolderMenuOpen] = useState(false) const folderInputRef = useRef(null) const handleFolderButtonClick = onFolderButtonClick ?? (() => {}) const openFolderPicker = () => { folderInputRef.current?.click() } const handleFolderClear = () => { if (folderInputRef.current) folderInputRef.current.value = '' onFolderClear?.() } const requestFolderPermission = useCallback((mode: 'once' | 'always') => { if (mode === 'always') setFolderPermissionAlwaysAllow(true) setFolderPermissionOpen(false) setFolderMenuOpen(true) }, []) const handleFolderMenuOpenChange = (next: boolean) => { if (!enableFolderPermissionDialog) { setFolderMenuOpen(next) return } if (!next) { setFolderMenuOpen(false) return } if (folderPermissionAlwaysAllow) { setFolderMenuOpen(true) return } setFolderPermissionOpen(true) setFolderMenuOpen(false) } const handleFolderInputChange = (e: React.ChangeEvent) => { const files = e.target.files if (files && files.length > 0) onFolderSelect(files) } if (onFolderButtonClick) { return ( ) } return ( <> {folderIcon} Add folder {hasFolderSelected && ( {folderOpenIcon} Replace folder )} {historyIcon} Recent folders {MOCK_HISTORY_FOLDERS.map((path) => ( {}}> {path} ))} {enableFolderPermissionDialog && ( requestFolderPermission('once')} onAllowAlways={() => requestFolderPermission('always')} /> )} ) } ChatInputFolderSelector.displayName = 'ChatInputFolderSelector'