From e38b925c2af322593d5299fc5a06f5af1ed815c6 Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Fri, 19 Dec 2025 00:32:59 +0200 Subject: [PATCH] refact: migrate all add connector page to jotai+tnstack --- .../connectors/[connector_id]/page.tsx | 32 +++++++++---------- .../researcher/[[...chat_id]]/page.tsx | 10 ++---- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/page.tsx index 07578b874..b038e04ff 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/[connector_id]/page.tsx @@ -1,6 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; +import { useAtomValue } from "jotai"; import { ArrowLeft, Check, Info, Loader2 } from "lucide-react"; import { motion } from "motion/react"; import { useParams, useRouter } from "next/navigation"; @@ -8,6 +9,8 @@ import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; +import { updateConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; +import { connectorsAtom } from "@/atoms/connectors/connector-query.atoms"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; @@ -21,10 +24,8 @@ import { FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; -import { - type SearchSourceConnector, - useSearchSourceConnectors, -} from "@/hooks/use-search-source-connectors"; +import type { EnumConnectorName } from "@/contracts/enums/connector"; +import type { SearchSourceConnector } from "@/hooks/use-search-source-connectors"; // Define the form schema with Zod const apiConnectorFormSchema = z.object({ @@ -87,7 +88,8 @@ export default function EditConnectorPage() { const searchSpaceId = params.search_space_id as string; const connectorId = parseInt(params.connector_id as string, 10); - const { connectors, updateConnector } = useSearchSourceConnectors(false, parseInt(searchSpaceId)); + const { data: connectors = [] } = useAtomValue(connectorsAtom); + const { mutateAsync: updateConnector } = useAtomValue(updateConnectorMutationAtom); const [connector, setConnector] = useState(null); const [isLoading, setIsLoading] = useState(true); const [isSubmitting, setIsSubmitting] = useState(false); @@ -101,14 +103,12 @@ export default function EditConnectorPage() { }, }); - // Find connector in the list useEffect(() => { const currentConnector = connectors.find((c) => c.id === connectorId); if (currentConnector) { setConnector(currentConnector); - // Check if connector type is supported const apiKeyField = getApiKeyFieldName(currentConnector.connector_type); if (apiKeyField) { form.reset({ @@ -116,14 +116,12 @@ export default function EditConnectorPage() { api_key: currentConnector.config[apiKeyField] || "", }); } else { - // Redirect if not a supported connector type toast.error("This connector type is not supported for editing"); router.push(`/dashboard/${searchSpaceId}/connectors`); } setIsLoading(false); } else if (!isLoading && connectors.length > 0) { - // If connectors are loaded but this one isn't found toast.error("Connector not found"); router.push(`/dashboard/${searchSpaceId}/connectors`); } @@ -137,18 +135,20 @@ export default function EditConnectorPage() { try { const apiKeyField = getApiKeyFieldName(connector.connector_type); - // Only update the API key if a new one was provided const updatedConfig = { ...connector.config }; if (values.api_key) { updatedConfig[apiKeyField] = values.api_key; } - await updateConnector(connectorId, { - name: values.name, - connector_type: connector.connector_type, - config: updatedConfig, - is_indexable: connector.is_indexable, - last_indexed_at: connector.last_indexed_at, + await updateConnector({ + id: connectorId, + data: { + name: values.name, + connector_type: connector.connector_type as EnumConnectorName, + config: updatedConfig, + is_indexable: connector.is_indexable, + last_indexed_at: connector.last_indexed_at, + }, }); toast.success("Connector updated successfully!"); diff --git a/surfsense_web/app/dashboard/[search_space_id]/researcher/[[...chat_id]]/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/researcher/[[...chat_id]]/page.tsx index 196f565a9..f61ead843 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/researcher/[[...chat_id]]/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/researcher/[[...chat_id]]/page.tsx @@ -7,11 +7,11 @@ import { useEffect, useMemo, useRef } from "react"; import { createChatMutationAtom, updateChatMutationAtom } from "@/atoms/chats/chat-mutation.atoms"; import { activeChatAtom } from "@/atoms/chats/chat-query.atoms"; import { activeChatIdAtom } from "@/atoms/chats/ui.atoms"; +import { connectorsAtom } from "@/atoms/connectors/connector-query.atoms"; import { documentTypeCountsAtom } from "@/atoms/documents/document-query.atoms"; import ChatInterface from "@/components/chat/ChatInterface"; import type { Document } from "@/contracts/types/document.types"; import { useChatState } from "@/hooks/use-chat"; -import { useSearchSourceConnectors } from "@/hooks/use-search-source-connectors"; export default function ResearcherPage() { const { search_space_id } = useParams(); @@ -57,14 +57,10 @@ export default function ResearcherPage() { })); }, [documentTypeCountsData]); - const { connectors: searchConnectors } = useSearchSourceConnectors( - false, - Number(search_space_id) - ); + const { data: searchConnectors } = useAtomValue(connectorsAtom); - // Filter for non-indexable connectors (live search) const liveSearchConnectors = useMemo( - () => searchConnectors.filter((connector) => !connector.is_indexable), + () => searchConnectors?.filter((connector) => !connector.is_indexable) ?? [], [searchConnectors] );