import { Label } from "@/components/ui/label" import { Input } from "@/components/ui/input" import { Checkbox } from "@/components/ui/checkbox" import { Query } from "@kevisual/query" import { QueryRouterServer } from "@kevisual/router" import { nanoid } from "nanoid" export type RouterViewItem = RouterViewApi | RouterViewContext | RouterViewWorker; type RouteViewBase = { id: string; title: string; description: string; enabled?: boolean; } export type RouterViewApi = { type: 'api', api: { url: string, // 已初始化的query实例,不需要编辑配置 query?: Query } } & RouteViewBase; export type RouterViewContext = { type: 'context', context: { key: string, // 从context中获取router,不需要编辑配置 router?: QueryRouterServer } } & RouteViewBase; export type RouterViewWorker = { type: 'worker', worker: { type: 'Worker' | 'SharedWorker' | 'serviceWorker', url: string, // 已初始化的worker实例,不需要编辑配置 worker?: Worker | SharedWorker | ServiceWorker, /** * worker选项 * default: { type: 'module' } */ workerOptions?: { type: 'module' | 'classic' } } } & RouteViewBase; interface DataItemFormProps { item: RouterViewItem onChange: (item: any) => void onRemove: () => void } export const DataItemForm = ({ item, onChange, onRemove }: DataItemFormProps) => { const handleChange = (field: string, value: any) => { if (field === 'type') { const newItem: RouterViewItem = { ...item, type: value } if (value === 'api' && !('api' in item)) { (newItem as RouterViewApi).api = { url: '' } } else if (value === 'context' && !('context' in item)) { (newItem as RouterViewContext).context = { key: '' } } else if (value === 'worker' && !('worker' in item)) { (newItem as RouterViewWorker).worker = { type: 'Worker', url: '', workerOptions: { type: 'module' } } } if (!newItem.id) { newItem.id = nanoid(16) } onChange(newItem) } else { onChange({ ...item, [field]: value }) } } const handleNestedChange = (parent: string, field: string, value: any) => { const parentValue = item[parent as keyof RouterViewItem] as Record | undefined const newParentValue: Record = { ...(parentValue || {}), [field]: value } onChange({ ...item, [parent]: newParentValue }) } const handleNestedDeepChange = (parent: string, nestedParent: string, field: string, value: any) => { const parentValue = item[parent as keyof RouterViewItem] as Record | undefined const nestedValue = parentValue?.[nestedParent] as Record | undefined const newNestedValue: Record = { ...(nestedValue || {}), [field]: value } const newParentValue: Record = { ...(parentValue || {}), [nestedParent]: newNestedValue } onChange({ ...item, [parent]: newParentValue }) } return (

数据项配置

handleChange('title', e.target.value)} placeholder="输入标题" />
handleChange('enabled', checked)} />
{(item.type === 'api') && (
handleNestedChange('api', 'url', e.target.value)} placeholder="输入 API 地址" />
)} {item.type === 'context' && (
handleNestedChange('context', 'key', e.target.value)} placeholder="输入 Context Key" />
)} {item.type === 'worker' && (
handleNestedChange('worker', 'url', e.target.value)} placeholder="输入 Worker URL" />
)}
) }