"use client"; import { zodResolver } from "@hookform/resolvers/zod"; import { useMutation } from "@tanstack/react-query"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; import { formatFileSize } from "@turbostarter/ai/pdf/utils"; import { useTranslation } from "@turbostarter/i18n"; import { Button } from "@turbostarter/ui-web/button"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "@turbostarter/ui-web/card"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@turbostarter/ui-web/form"; import { Icons } from "@turbostarter/ui-web/icons"; import { Input } from "@turbostarter/ui-web/input"; import { pathsConfig } from "~/config/paths"; import { authClient } from "~/lib/auth/client"; import { useAIError } from "~/modules/common/hooks/use-ai-error"; import { pdf } from "../lib/api"; import { useUpload } from "./hooks/use-upload"; import { getFileName } from "./utils"; import type { FileInput } from "./utils"; const formSchema = z.object({ name: z.string().min(1).max(255), }); interface PdfUploadConfirmProps { readonly file: FileInput; readonly onCancel: () => void; } export const PdfUploadConfirm = ({ file, onCancel }: PdfUploadConfirmProps) => { const { onError } = useAIError(); const { t } = useTranslation(["common", "ai"]); const { data: session, isPending: isSessionLoading } = authClient.useSession(); const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { name: getFileName(file) ?? "", }, }); const router = useRouter(); const upload = useUpload(); const createChat = useMutation({ ...pdf.mutations.chats.create, onSuccess: (data) => { toast.success(t("pdf.upload.success")); if (data?.id) { return router.push(pathsConfig.apps.pdf.chat(data.id)); } }, onError, }); // Show sign-in prompt for non-authenticated users if (!isSessionLoading && !session?.user) { return ( {t("pdf.upload.signIn.title")} {t("pdf.upload.signIn.description")} ); } const data = [ { title: t("file"), value: "url" in file ? file.url : `./${file.name}`, }, { title: t("size"), value: formatFileSize(file.size), }, { title: t("type"), value: "PDF", }, ]; async function onSubmit(values: z.infer) { const { path } = await upload.mutateAsync({ file, ...values, }); await createChat.mutateAsync({ json: { ...values, path, }, }); } if (form.formState.isSubmitting || form.formState.isSubmitSuccessful) { return ( {t("pdf.upload.loading.title")} {t("pdf.upload.loading.description")} ); } return ( {t("pdf.upload.confirm.title")} {t("pdf.upload.confirm.description")}
(
{t("name")}:
)} /> {data.map(({ title, value }) => (
{title}: {value}
))}
); };