import { Drawer, DrawerBody, DrawerFooter, DrawerHeader } from '@nextui-org/drawer' import { Autocomplete, AutocompleteItem, Button, Checkbox, DrawerContent, Input, Select, SelectItem, } from '@nextui-org/react' import { message } from '@tauri-apps/plugin-dialog' import { ChevronDown, ChevronUp, RefreshCcwIcon } from 'lucide-react' import { useEffect, useMemo, useState } from 'react' import { createRemote } from '../../lib/rclone/api' import { getBackends } from '../../lib/rclone/api' import { useStore } from '../../lib/store' import { triggerTrayRebuild } from '../../lib/tray' import type { Backend, BackendOption } from '../../types/rclone' export default function RemoteCreateDrawer({ isOpen, onClose, }: { isOpen: boolean; onClose: () => void }) { const addRemote = useStore((state) => state.addRemote) const [config, setConfig] = useState>({}) const [showMoreOptions, setShowMoreOptions] = useState(false) const [isSaving, setIsSaving] = useState(false) const [backends, setBackends] = useState([]) useEffect(() => { getBackends().then((b) => { setBackends(b) }) }, []) const handleTypeChange = (e: React.ChangeEvent) => { const newType = e.target.value // preserve name when resetting type setConfig((prev) => ({ name: prev.name, type: newType })) } const renderField = (option: BackendOption) => { // Skip rendering if the field should be hidden if (option.Hide !== 0) return null // For S3 type, only show fields that match the current provider or have no provider specified if (config.type === 's3' && option.Provider && option.Provider !== config.provider) { return null } const fieldId = `field-${option.Name}` const fieldValue = config[option.Name] || option.DefaultStr switch (option.Type) { case 'bool': return (
setConfig({ ...config, [option.Name]: checked }) } > {option.Name} {option.Help.includes('\n') && (

{option.Help.split('\n').slice(1).join('\n')}

)}
// // setConfig({ ...config, [option.Name]: e.target.checked }) // } // autoComplete="off" // autoCapitalize="off" // autoCorrect="off" // spellCheck={false} // /> ) case 'string': { if (option.Examples && option.Examples.length > 0) { return ( { // console.log(value) setConfig({ ...config, [option.Name]: value }) }} > {(item) => ( {item.Help || item.Value} )} ) } return ( { // console.log(value) setConfig({ ...config, [option.Name]: value }) }} /> ) // if (option.Examples && option.Examples.length > 0) { // return ( // // ) // } // return ( // // setConfig({ ...config, [option.Name]: e.target.value }) // } // /> // ) } default: return null } } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setIsSaving(true) try { const formData = new FormData(e.currentTarget) const data: Record = {} // First collect all form values for (const [key, value] of formData.entries()) { if (value.toString().trim() === '') continue if ( e.currentTarget[key] instanceof HTMLInputElement && e.currentTarget[key].type === 'checkbox' ) { data[key] = (e.currentTarget[key] as HTMLInputElement).checked } else { data[key] = value.toString() } } const name = data.name as string const type = data.type as string const parameters = Object.fromEntries( Object.entries(data).filter(([key]) => key !== 'name' && key !== 'type') ) // Create the remote await createRemote(name, type, parameters) addRemote(name) onClose() await triggerTrayRebuild() } catch (error) { console.error('Failed to create remote:', error) await message(error instanceof Error ? error.message : 'Unknown error occurred', { title: 'Could not create remote', kind: 'error', }) } finally { setIsSaving(false) } } const currentBackend = useMemo(() => { if (!config.type) return null return backends.find((b) => b.Name === config.type) }, [config, backends]) const currentBackendFields = useMemo(() => { if (!currentBackend) return [] const options = (currentBackend?.Options as BackendOption[]).filter( (opt) => !opt.Provider || (opt.Provider.includes(config.provider) && !opt.Provider.startsWith('!')) ) || [] return options }, [config.provider, currentBackend]) return ( {(close) => ( <> Create Remote
setConfig({ ...config, name: value })} isRequired={true} autoComplete="off" autoCapitalize="off" autoCorrect="off" spellCheck={false} /> {/* Normal Fields */} {currentBackendFields .filter((opt) => !opt.Advanced) .map(renderField)} {/* Advanced Fields */} {currentBackendFields.some((opt) => opt.Advanced) && (
{showMoreOptions && (
{currentBackendFields .filter((opt) => opt.Advanced) .map(renderField)}
)}
)}
)}
) }