"use client"; import { useState, useEffect, useRef } from "react"; import { useTranslation } from "react-i18next"; import { LoaderCircle, SquarePlus, FilePlus, BookText, Paperclip, Link, } from "lucide-react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import ResourceList from "@/components/Knowledge/ResourceList"; import Crawler from "@/components/Knowledge/Crawler"; import { Button } from "@/components/Internal/Button"; import { Form, FormControl, FormField, FormItem, FormLabel, } from "@/components/ui/form"; import { Textarea } from "@/components/ui/textarea"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import useDeepResearch from "@/hooks/useDeepResearch"; import useAiProvider from "@/hooks/useAiProvider"; import useKnowledge from "@/hooks/useKnowledge"; import useAccurateTimer from "@/hooks/useAccurateTimer"; import { useGlobalStore } from "@/store/global"; import { useSettingStore } from "@/store/setting"; import { useTaskStore } from "@/store/task"; import { useHistoryStore } from "@/store/history"; const formSchema = z.object({ topic: z.string().min(2), }); function Topic() { const { t } = useTranslation(); const fileInputRef = useRef(null); const taskStore = useTaskStore(); const { askQuestions } = useDeepResearch(); const { hasApiKey } = useAiProvider(); const { getKnowledgeFromFile } = useKnowledge(); const { formattedTime, start: accurateTimerStart, stop: accurateTimerStop, } = useAccurateTimer(); const [isThinking, setIsThinking] = useState(false); const [openCrawler, setOpenCrawler] = useState(false); const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { topic: taskStore.question, }, }); function handleCheck(): boolean { const { mode } = useSettingStore.getState(); if ((mode === "local" && hasApiKey()) || mode === "proxy") { return true; } else { const { setOpenSetting } = useGlobalStore.getState(); setOpenSetting(true); return false; } } async function handleSubmit(values: z.infer) { if (handleCheck()) { const { id, setQuestion } = useTaskStore.getState(); try { setIsThinking(true); accurateTimerStart(); if (id !== "") { createNewResearch(); form.setValue("topic", values.topic); } setQuestion(values.topic); await askQuestions(); } finally { setIsThinking(false); accurateTimerStop(); } } } function createNewResearch() { const { id, backup, reset } = useTaskStore.getState(); const { update } = useHistoryStore.getState(); if (id) update(id, backup()); reset(); form.reset(); } function openKnowledgeList() { const { setOpenKnowledge } = useGlobalStore.getState(); setOpenKnowledge(true); } async function handleFileUpload(files: FileList | null) { if (files) { for await (const file of files) { await getKnowledgeFromFile(file); } // Clear the input file to avoid processing the previous file multiple times if (fileInputRef.current) { fileInputRef.current.value = ""; } } } useEffect(() => { form.setValue("topic", taskStore.question); }, [taskStore.question, form]); return (

{t("research.topic.title")}

( {t("research.topic.topicLabel")}