import { memo, useState, useMemo } from 'react'; import { Popover, Transition } from '@headlessui/react'; import { getLanguageFromExtension } from '~/shared/utils/getLanguageFromExtension'; import type { FileHistory } from '~/shared/types/actions'; import { toast } from '~/shared/components/ui/use-toast'; export const FileModifiedDropdown = memo( ({ fileHistory, onSelectFile, }: { fileHistory: Record; onSelectFile: (filePath: string) => void; }) => { const modifiedFiles = Object.entries(fileHistory); const hasChanges = modifiedFiles.length > 0; const [searchQuery, setSearchQuery] = useState(''); const filteredFiles = useMemo(() => { return modifiedFiles.filter(([filePath]) => filePath.toLowerCase().includes(searchQuery.toLowerCase())); }, [modifiedFiles, searchQuery]); return (
{({ open }: { open: boolean }) => ( <> File Changes {hasChanges && ( {modifiedFiles.length} )}
setSearchQuery(e.target.value)} className="w-full pl-8 pr-3 py-1.5 text-sm rounded-lg bg-bolt-elements-background-depth-1 border border-bolt-elements-borderColor focus:outline-none focus:ring-2 focus:ring-blue-500/50" />
{filteredFiles.length > 0 ? ( filteredFiles.map(([filePath, history]) => { const extension = filePath.split('.').pop() || ''; const language = getLanguageFromExtension(extension); return ( ); }) ) : (

{searchQuery ? 'No matching files' : 'No modified files'}

{searchQuery ? 'Try another search' : 'Changes will appear here as you edit'}

)}
{hasChanges && (
)} )}
); }, );