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 { 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 { ...x, ...patch } } 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 = { ...form, uid } 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 ( ( )} /> ( )} /> ( )} /> ) }, )