import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { Button } from "@/components/ui/button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { dataExtractionGoalDescription, extractedInformationSchemaDescription, navigationGoalDescription, navigationPayloadDescription, urlDescription, webhookCallbackUrlDescription, } from "../data/descriptionHelperContent"; import { Textarea } from "@/components/ui/textarea"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { getClient } from "@/api/AxiosClient"; import { useToast } from "@/components/ui/use-toast"; import { InfoCircledIcon } from "@radix-ui/react-icons"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; import { ToastAction } from "@radix-ui/react-toast"; import { Link } from "react-router-dom"; import fetchToCurl from "fetch-to-curl"; import { apiBaseUrl } from "@/util/env"; import { useCredentialGetter } from "@/hooks/useCredentialGetter"; import { useApiCredential } from "@/hooks/useApiCredential"; const createNewTaskFormSchema = z.object({ url: z.string().url({ message: "Invalid URL", }), webhookCallbackUrl: z.string().optional(), // url maybe, but shouldn't be validated as one navigationGoal: z.string().optional(), dataExtractionGoal: z.string().optional(), navigationPayload: z.string().optional(), extractedInformationSchema: z.string().optional(), }); export type CreateNewTaskFormValues = z.infer; type Props = { initialValues: CreateNewTaskFormValues; }; function createTaskRequestObject(formValues: CreateNewTaskFormValues) { return { url: formValues.url, webhook_callback_url: formValues.webhookCallbackUrl ?? "", navigation_goal: formValues.navigationGoal ?? "", data_extraction_goal: formValues.dataExtractionGoal ?? "", proxy_location: "NONE", error_code_mapping: null, navigation_payload: formValues.navigationPayload ?? "", extracted_information_schema: formValues.extractedInformationSchema ?? "", }; } function CreateNewTaskForm({ initialValues }: Props) { const queryClient = useQueryClient(); const { toast } = useToast(); const credentialGetter = useCredentialGetter(); const apiCredential = useApiCredential(); const form = useForm({ resolver: zodResolver(createNewTaskFormSchema), defaultValues: initialValues, }); const mutation = useMutation({ mutationFn: async (formValues: CreateNewTaskFormValues) => { const taskRequest = createTaskRequestObject(formValues); const client = await getClient(credentialGetter); return client.post< ReturnType, { data: { task_id: string } } >("/tasks", taskRequest); }, onError: (error) => { toast({ variant: "destructive", title: "Error", description: error.message, }); }, onSuccess: (response) => { toast({ title: "Task Created", description: `${response.data.task_id} created successfully.`, action: ( ), }); queryClient.invalidateQueries({ queryKey: ["tasks"], }); }, }); function onSubmit(values: CreateNewTaskFormValues) { mutation.mutate(values); } return (
(
URL*

{urlDescription}

)} /> (
Webhook Callback URL

{webhookCallbackUrlDescription}

)} /> (
Navigation Goal

{navigationGoalDescription}