"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")}
);
};