import { api } from "@/src/utils/api"; import * as z from "zod/v4"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { useEffect, useState } from "react"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/src/components/ui/form"; import { Button } from "@/src/components/ui/button"; import { useHasProjectAccess } from "@/src/features/rbac/utils/checkProjectAccess"; import { CodeMirrorEditor } from "@/src/components/editor"; import { type RouterOutput } from "@/src/utils/types"; const formSchema = z.object({ input: z.string().refine( (value) => { if (value === "") return true; try { JSON.parse(value); return true; } catch (error) { return false; } }, { message: "Invalid input. Please provide a JSON object or double-quoted string.", }, ), expectedOutput: z.string().refine( (value) => { if (value === "") return true; try { JSON.parse(value); return true; } catch (error) { return false; } }, { message: "Invalid input. Please provide a JSON object or double-quoted string.", }, ), metadata: z.string().refine( (value) => { if (value === "") return true; try { JSON.parse(value); return true; } catch (error) { return false; } }, { message: "Invalid input. Please provide a JSON object or double-quoted string.", }, ), }); export const EditDatasetItem = ({ projectId, datasetItem, }: { projectId: string; datasetItem: RouterOutput["datasets"]["itemById"]; }) => { const [formError, setFormError] = useState(null); const [hasChanges, setHasChanges] = useState(false); const hasAccess = useHasProjectAccess({ projectId: projectId, scope: "datasets:CUD", }); const utils = api.useUtils(); useEffect(() => { if (datasetItem) { form.reset({ input: datasetItem.input ? JSON.stringify(datasetItem.input, null, 2) : "", expectedOutput: datasetItem.expectedOutput ? JSON.stringify(datasetItem.expectedOutput, null, 2) : "", metadata: datasetItem.metadata ? JSON.stringify(datasetItem.metadata, null, 2) : "", }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [datasetItem?.id]); const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { input: "", expectedOutput: "", metadata: "", }, }); const updateDatasetItemMutation = api.datasets.updateDatasetItem.useMutation({ onSuccess: () => utils.datasets.invalidate(), onError: (error) => setFormError(error.message), }); function onSubmit(values: z.infer) { if (!!!datasetItem) return; updateDatasetItemMutation.mutate({ projectId: projectId, datasetId: datasetItem.datasetId, datasetItemId: datasetItem.id, input: values.input, expectedOutput: values.expectedOutput, metadata: values.metadata, }); setHasChanges(false); } return (
setHasChanges(true)} >
{formError ? (

Error: {formError}

) : null}
( Input { setHasChanges(true); field.onChange(v); }} editable={hasAccess} minHeight={200} /> )} /> ( Expected output { setHasChanges(true); field.onChange(v); }} editable={hasAccess} minHeight={200} /> )} />
( Metadata { setHasChanges(true); field.onChange(v); }} editable={hasAccess} minHeight={100} /> )} />
); };