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'