import { TextField } from '@mui/material' import { useLockFn } from 'ahooks' import { nanoid } from 'nanoid' import { forwardRef, useImperativeHandle, useState } from 'react' import { useForm, Controller } from 'react-hook-form' import { useTranslation } from 'react-i18next' import { BaseDialog } from '@/components/base' import { useVerge } from '@/hooks/use-verge' import type { IVergeTestItem_Deserialize, IVergeTestItem_Serialize, } from '@/services/bindings' import { showNotice } from '@/services/notice-service' interface Props { onChange: (uid: string, patch?: Partial) => void } export interface TestViewerRef { create: () => void edit: (item: IVergeTestItem) => void } // create or edit the test item export const TestViewer = forwardRef( ({ onChange }, ref) => { const { t } = useTranslation() const [open, setOpen] = useState(false) const [openType, setOpenType] = useState<'new' | 'edit'>('new') const [loading, setLoading] = useState(false) const { verge, patchVerge } = useVerge() const testList = verge?.test_list ?? [] const { control, ...formIns } = useForm({ defaultValues: { name: '', icon: '', url: '', }, }) const patchTestList = async ( uid: string, patch: Partial, ) => { const newList = testList.map((x) => { if (x.uid === uid) { return { uid: x.uid, name: patch.name === undefined ? x.name : patch.name, icon: patch.icon === undefined ? x.icon : patch.icon, url: patch.url === undefined ? x.url : patch.url, } } return x }) await patchVerge({ test_list: newList }) } useImperativeHandle(ref, () => ({ create: () => { setOpenType('new') setOpen(true) }, edit: (item) => { if (item) { Object.entries(item).forEach(([key, value]) => { formIns.setValue(key as any, value) }) } setOpenType('edit') setOpen(true) }, })) const handleOk = useLockFn( formIns.handleSubmit(async (form) => { setLoading(true) try { if (!form.name) { throw new Error(t('tests.modals.test.errors.nameRequired')) } if (!form.url) { throw new Error(t('tests.modals.test.errors.urlRequired')) } if (openType === 'new') { const uid = nanoid() const item: IVergeTestItem_Serialize = { uid, name: form.name ?? null, icon: form.icon ?? null, url: form.url ?? null, } const newList = [...testList, item] await patchVerge({ test_list: newList }) onChange(uid) } else { if (!form.uid) { throw new Error(t('tests.modals.test.errors.uidMissing')) } const uid = form.uid await patchTestList(uid, form) onChange(uid, form) } setOpen(false) setLoading(false) setTimeout(() => formIns.reset(), 500) } catch (err: any) { showNotice.error('tests.modals.test.errors.saveFailed', err) setLoading(false) } }), ) const handleClose = () => { setOpen(false) setTimeout(() => formIns.reset(), 500) } const text = { fullWidth: true, size: 'small', margin: 'normal', variant: 'outlined', autoComplete: 'off', autoCorrect: 'off', } as const return ( ( )} /> ( )} /> ( )} /> ) }, )