import { Stack, Text, Group, Button, Select, Modal, TextInput, Badge, } from '@mantine/core'; import { useState, useCallback, forwardRef, type ComponentPropsWithoutRef, } from 'react'; import { Save, File, Plus } from 'lucide-react'; import type { ConfigFile } from '@/types'; import styles from '@/styles/layout.module.css'; interface ConfigFileManagerProps { configFiles: ConfigFile[]; selectedFile: string | null; onFileSelection: (fileName: string) => Promise; onCreateNewConfig: (configName: string) => Promise; onSaveConfig: () => void; onLoadConfigFiles: () => Promise; } interface SelectItemProps extends ComponentPropsWithoutRef<'div'> { label: string; extension: string; } const getBadgeColor = (extension: string) => { switch (extension.toLowerCase()) { case '.kcpps': return 'blue'; case '.kcppt': return 'green'; default: return 'gray'; } }; const SelectItem = forwardRef( ({ label, extension, ...others }, ref) => (
{label} {extension}
) ); SelectItem.displayName = 'SelectItem'; export const ConfigFileManager = ({ configFiles, selectedFile, onFileSelection, onCreateNewConfig, onSaveConfig, }: ConfigFileManagerProps) => { const [configModalOpened, setConfigModalOpened] = useState(false); const [newConfigName, setNewConfigName] = useState(''); const existingConfigNames = configFiles.map((file) => { const extension = file.name.split('.').pop() || ''; return file.name.replace(`.${extension}`, '').toLowerCase(); }); const trimmedConfigName = newConfigName.trim(); const configNameExists = trimmedConfigName && existingConfigNames.includes(trimmedConfigName.toLowerCase()); const handleOpenConfigModal = () => { setConfigModalOpened(true); }; const handleCloseConfigModal = useCallback(() => { setConfigModalOpened(false); setNewConfigName(''); }, []); const handleConfigSubmit = useCallback(() => { onCreateNewConfig(newConfigName.trim()); setConfigModalOpened(false); setNewConfigName(''); }, [newConfigName, onCreateNewConfig]); const selectData = configFiles.map((file) => { const extension = file.name.split('.').pop() || ''; const nameWithoutExtension = file.name.replace(`.${extension}`, ''); return { value: file.name, label: nameWithoutExtension, extension: `.${extension}`, }; }); return ( <> Configuration