diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/airtable-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/airtable-connector/page.tsx index cc4330203..e4920159c 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/airtable-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/airtable-connector/page.tsx @@ -1,11 +1,13 @@ "use client"; +import { useAtomValue } from "jotai"; import { ArrowLeft, Check, ExternalLink, Loader2 } from "lucide-react"; import { motion } from "motion/react"; import Link from "next/link"; import { useParams, useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { toast } from "sonner"; +import { connectorsAtom } from "@/atoms/connectors/connector-query.atoms"; import { Button } from "@/components/ui/button"; import { Card, @@ -18,10 +20,6 @@ import { import { EnumConnectorName } from "@/contracts/enums/connector"; // import { IconBrandAirtable } from "@tabler/icons-react"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { - type SearchSourceConnector, - useSearchSourceConnectors, -} from "@/hooks/use-search-source-connectors"; import { authenticatedFetch } from "@/lib/auth-utils"; export default function AirtableConnectorPage() { @@ -31,18 +29,18 @@ export default function AirtableConnectorPage() { const [isConnecting, setIsConnecting] = useState(false); const [doesConnectorExist, setDoesConnectorExist] = useState(false); - const { fetchConnectors } = useSearchSourceConnectors(true, parseInt(searchSpaceId)); + const { data: connectors } = useAtomValue(connectorsAtom); useEffect(() => { - fetchConnectors(parseInt(searchSpaceId)).then((data) => { - const connector = data.find( - (c: SearchSourceConnector) => c.connector_type === EnumConnectorName.AIRTABLE_CONNECTOR + if (connectors) { + const connector = connectors.find( + (c) => c.connector_type === EnumConnectorName.AIRTABLE_CONNECTOR ); if (connector) { setDoesConnectorExist(true); } - }); - }, []); + } + }, [connectors]); const handleConnectAirtable = async () => { setIsConnecting(true); diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/baidu-search-api/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/baidu-search-api/page.tsx index 3e9f4898e..204925d26 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/baidu-search-api/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/baidu-search-api/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,7 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; +import { createConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { Button } from "@/components/ui/button"; import { @@ -38,7 +40,6 @@ import { import { Switch } from "@/components/ui/switch"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { useSearchSourceConnectors } from "@/hooks/use-search-source-connectors"; // Define the form schema with Zod const baiduSearchApiFormSchema = z.object({ @@ -61,7 +62,7 @@ export default function BaiduSearchApiPage() { const params = useParams(); const searchSpaceId = params.search_space_id as string; const [isSubmitting, setIsSubmitting] = useState(false); - const { createConnector } = useSearchSourceConnectors(); + const { mutateAsync: createConnector } = useAtomValue(createConnectorMutationAtom); // Initialize the form const form = useForm({ @@ -95,8 +96,8 @@ export default function BaiduSearchApiPage() { config.BAIDU_ENABLE_DEEP_SEARCH = values.enable_deep_search; } - await createConnector( - { + await createConnector({ + data: { name: values.name, connector_type: EnumConnectorName.BAIDU_SEARCH_API, config, @@ -106,8 +107,10 @@ export default function BaiduSearchApiPage() { indexing_frequency_minutes: null, next_scheduled_at: null, }, - parseInt(searchSpaceId) - ); + queryParams: { + search_space_id: searchSpaceId, + }, + }); toast.success("Baidu Search connector created successfully!"); diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/bookstack-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/bookstack-connector/page.tsx index 576fa4ebc..3fa634238 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/bookstack-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/bookstack-connector/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,7 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; +import { createConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; @@ -24,7 +26,6 @@ import { Input } from "@/components/ui/input"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { useSearchSourceConnectors } from "@/hooks/use-search-source-connectors"; // Define the form schema with Zod const bookstackConnectorFormSchema = z.object({ @@ -50,7 +51,7 @@ export default function BookStackConnectorPage() { const params = useParams(); const searchSpaceId = params.search_space_id as string; const [isSubmitting, setIsSubmitting] = useState(false); - const { createConnector } = useSearchSourceConnectors(); + const { mutateAsync: createConnector } = useAtomValue(createConnectorMutationAtom); // Initialize the form const form = useForm({ @@ -67,8 +68,8 @@ export default function BookStackConnectorPage() { const onSubmit = async (values: BookStackConnectorFormValues) => { setIsSubmitting(true); try { - await createConnector( - { + await createConnector({ + data: { name: values.name, connector_type: EnumConnectorName.BOOKSTACK_CONNECTOR, config: { @@ -82,8 +83,10 @@ export default function BookStackConnectorPage() { indexing_frequency_minutes: null, next_scheduled_at: null, }, - parseInt(searchSpaceId) - ); + queryParams: { + search_space_id: searchSpaceId, + }, + }); toast.success("BookStack connector created successfully!"); diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/clickup-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/clickup-connector/page.tsx index 2d5f6954c..319d333b4 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/clickup-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/clickup-connector/page.tsx @@ -1,6 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; +import { useAtomValue } from "jotai"; import { ArrowLeft, ExternalLink, Eye, EyeOff } from "lucide-react"; import Link from "next/link"; import { useParams, useRouter } from "next/navigation"; @@ -8,6 +9,7 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; +import { createConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { @@ -22,7 +24,6 @@ import { import { Input } from "@/components/ui/input"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { useSearchSourceConnectors } from "@/hooks/use-search-source-connectors"; // Define the form schema with Zod const clickupConnectorFormSchema = z.object({ @@ -41,7 +42,7 @@ export default function ClickUpConnectorPage() { const router = useRouter(); const params = useParams(); const searchSpaceId = params.search_space_id as string; - const { createConnector } = useSearchSourceConnectors(); + const { mutateAsync: createConnector } = useAtomValue(createConnectorMutationAtom); const [isLoading, setIsLoading] = useState(false); const [showApiToken, setShowApiToken] = useState(false); @@ -59,20 +60,23 @@ export default function ClickUpConnectorPage() { setIsLoading(true); try { - const connectorData = { - name: values.name, - connector_type: EnumConnectorName.CLICKUP_CONNECTOR, - is_indexable: true, - config: { - CLICKUP_API_TOKEN: values.api_token, + await createConnector({ + data: { + name: values.name, + connector_type: EnumConnectorName.CLICKUP_CONNECTOR, + is_indexable: true, + config: { + CLICKUP_API_TOKEN: values.api_token, + }, + last_indexed_at: null, + periodic_indexing_enabled: false, + indexing_frequency_minutes: null, + next_scheduled_at: null, }, - last_indexed_at: null, - periodic_indexing_enabled: false, - indexing_frequency_minutes: null, - next_scheduled_at: null, - }; - - await createConnector(connectorData, parseInt(searchSpaceId)); + queryParams: { + search_space_id: searchSpaceId, + }, + }); toast.success("ClickUp connector created successfully!"); router.push(`/dashboard/${searchSpaceId}/connectors`); diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/confluence-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/confluence-connector/page.tsx index c625f8900..7fcd03062 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/confluence-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/confluence-connector/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,7 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; +import { createConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; @@ -24,7 +26,6 @@ import { Input } from "@/components/ui/input"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { useSearchSourceConnectors } from "@/hooks/use-search-source-connectors"; // Define the form schema with Zod const confluenceConnectorFormSchema = z.object({ @@ -60,7 +61,7 @@ export default function ConfluenceConnectorPage() { const params = useParams(); const searchSpaceId = params.search_space_id as string; const [isSubmitting, setIsSubmitting] = useState(false); - const { createConnector } = useSearchSourceConnectors(); + const { mutateAsync: createConnector } = useAtomValue(createConnectorMutationAtom); // Initialize the form const form = useForm({ @@ -77,8 +78,8 @@ export default function ConfluenceConnectorPage() { const onSubmit = async (values: ConfluenceConnectorFormValues) => { setIsSubmitting(true); try { - await createConnector( - { + await createConnector({ + data: { name: values.name, connector_type: EnumConnectorName.CONFLUENCE_CONNECTOR, config: { @@ -92,8 +93,10 @@ export default function ConfluenceConnectorPage() { indexing_frequency_minutes: null, next_scheduled_at: null, }, - parseInt(searchSpaceId) - ); + queryParams: { + search_space_id: searchSpaceId, + }, + }); toast.success("Confluence connector created successfully!"); diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/discord-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/discord-connector/page.tsx index 1daa6bcd0..94ef849e2 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/discord-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/discord-connector/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,7 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; +import { createConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; import { Accordion, AccordionContent, @@ -37,7 +39,6 @@ import { Input } from "@/components/ui/input"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { useSearchSourceConnectors } from "@/hooks/use-search-source-connectors"; // Define the form schema with Zod const discordConnectorFormSchema = z.object({ @@ -58,7 +59,7 @@ export default function DiscordConnectorPage() { const params = useParams(); const searchSpaceId = params.search_space_id as string; const [isSubmitting, setIsSubmitting] = useState(false); - const { createConnector } = useSearchSourceConnectors(); + const { mutateAsync: createConnector } = useAtomValue(createConnectorMutationAtom); // Initialize the form const form = useForm({ @@ -73,8 +74,8 @@ export default function DiscordConnectorPage() { const onSubmit = async (values: DiscordConnectorFormValues) => { setIsSubmitting(true); try { - await createConnector( - { + await createConnector({ + data: { name: values.name, connector_type: EnumConnectorName.DISCORD_CONNECTOR, config: { @@ -86,8 +87,10 @@ export default function DiscordConnectorPage() { indexing_frequency_minutes: null, next_scheduled_at: null, }, - parseInt(searchSpaceId) - ); + queryParams: { + search_space_id: searchSpaceId, + }, + }); toast.success("Discord connector created successfully!"); router.push(`/dashboard/${searchSpaceId}/connectors`); diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/elasticsearch-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/elasticsearch-connector/page.tsx index e417995ed..15e03f3aa 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/elasticsearch-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/elasticsearch-connector/page.tsx @@ -2,6 +2,7 @@ import { zodResolver } from "@hookform/resolvers/zod"; import * as RadioGroup from "@radix-ui/react-radio-group"; +import { useAtomValue } from "jotai"; import { ArrowLeft, Check, Info, Loader2 } from "lucide-react"; import { motion } from "motion/react"; import { useParams, useRouter, useSearchParams } from "next/navigation"; @@ -9,7 +10,7 @@ import { useId, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; - +import { createConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; import { Accordion, AccordionContent, @@ -40,10 +41,8 @@ import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Separator } from "@/components/ui/separator"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; - import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { useSearchSourceConnectors } from "@/hooks/use-search-source-connectors"; // Define the form schema with Zod const elasticsearchConnectorFormSchema = z @@ -91,7 +90,7 @@ export default function ElasticsearchConnectorPage() { const authBasicId = useId(); const authApiKeyId = useId(); - const { createConnector } = useSearchSourceConnectors(); + const { mutateAsync: createConnector } = useAtomValue(createConnectorMutationAtom); // Initialize the form const form = useForm({ @@ -173,19 +172,21 @@ export default function ElasticsearchConnectorPage() { config.ELASTICSEARCH_MAX_DOCUMENTS = values.max_documents; } - const connectorPayload = { - name: values.name, - connector_type: EnumConnectorName.ELASTICSEARCH_CONNECTOR, - is_indexable: true, - last_indexed_at: null, - periodic_indexing_enabled: false, - indexing_frequency_minutes: null, - next_scheduled_at: null, - config, - }; - - // Use existing hook method - await createConnector(connectorPayload, searchSpaceIdNum); + await createConnector({ + data: { + name: values.name, + connector_type: EnumConnectorName.ELASTICSEARCH_CONNECTOR, + is_indexable: true, + last_indexed_at: null, + periodic_indexing_enabled: false, + indexing_frequency_minutes: null, + next_scheduled_at: null, + config, + }, + queryParams: { + search_space_id: searchSpaceId, + }, + }); toast.success("Elasticsearch connector created successfully!"); router.push(`/dashboard/${searchSpaceId}/connectors`); diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/github-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/github-connector/page.tsx index 833d716a8..a6c0c147b 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/github-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/github-connector/page.tsx @@ -1,6 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; +import { useAtomValue } from "jotai"; import { ArrowLeft, Check, CircleAlert, Github, Info, ListChecks, Loader2 } from "lucide-react"; import { motion } from "motion/react"; import { useParams, useRouter } from "next/navigation"; @@ -8,6 +9,7 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; +import { createConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; import { Accordion, AccordionContent, @@ -38,8 +40,6 @@ import { Input } from "@/components/ui/input"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -// Assuming useSearchSourceConnectors hook exists and works similarly -import { useSearchSourceConnectors } from "@/hooks/use-search-source-connectors"; import { authenticatedFetch, redirectToLogin } from "@/lib/auth-utils"; // Define the form schema with Zod for GitHub PAT entry step @@ -85,7 +85,7 @@ export default function GithubConnectorPage() { const [connectorName, setConnectorName] = useState("GitHub Connector"); const [validatedPat, setValidatedPat] = useState(""); // Store the validated PAT - const { createConnector } = useSearchSourceConnectors(); + const { mutateAsync: createConnector } = useAtomValue(createConnectorMutationAtom); // Initialize the form for PAT entry const form = useForm({ @@ -141,8 +141,8 @@ export default function GithubConnectorPage() { setIsCreatingConnector(true); try { - await createConnector( - { + await createConnector({ + data: { name: connectorName, // Use the stored name connector_type: EnumConnectorName.GITHUB_CONNECTOR, config: { @@ -155,8 +155,10 @@ export default function GithubConnectorPage() { indexing_frequency_minutes: null, next_scheduled_at: null, }, - parseInt(searchSpaceId) - ); + queryParams: { + search_space_id: searchSpaceId, + }, + }); toast.success("GitHub connector created successfully!"); router.push(`/dashboard/${searchSpaceId}/connectors`); diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-calendar-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-calendar-connector/page.tsx index 8179fbabc..6d4b05684 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-calendar-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-calendar-connector/page.tsx @@ -1,6 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; +import { useAtomValue } from "jotai"; import { ArrowLeft, Check, ExternalLink, Loader2 } from "lucide-react"; import { motion } from "motion/react"; import Link from "next/link"; @@ -9,6 +10,7 @@ import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; +import { connectorsAtom } from "@/atoms/connectors/connector-query.atoms"; import { Button } from "@/components/ui/button"; import { Card, @@ -20,10 +22,6 @@ import { } from "@/components/ui/card"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { - type SearchSourceConnector, - useSearchSourceConnectors, -} from "@/hooks/use-search-source-connectors"; import { authenticatedFetch } from "@/lib/auth-utils"; export default function GoogleCalendarConnectorPage() { @@ -33,19 +31,18 @@ export default function GoogleCalendarConnectorPage() { const [isConnecting, setIsConnecting] = useState(false); const [doesConnectorExist, setDoesConnectorExist] = useState(false); - const { fetchConnectors } = useSearchSourceConnectors(true, parseInt(searchSpaceId)); + const { data: connectors } = useAtomValue(connectorsAtom); useEffect(() => { - fetchConnectors(parseInt(searchSpaceId)).then((data) => { - const connector = data.find( - (c: SearchSourceConnector) => - c.connector_type === EnumConnectorName.GOOGLE_CALENDAR_CONNECTOR + if (connectors) { + const connector = connectors.find( + (c) => c.connector_type === EnumConnectorName.GOOGLE_CALENDAR_CONNECTOR ); if (connector) { setDoesConnectorExist(true); } - }); - }, []); + } + }, [connectors]); // Handle Google OAuth connection const handleConnectGoogle = async () => { diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-gmail-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-gmail-connector/page.tsx index 8659d937c..11db2fdcd 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-gmail-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/google-gmail-connector/page.tsx @@ -1,6 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; +import { useAtomValue } from "jotai"; import { ArrowLeft, Check, ExternalLink, Loader2 } from "lucide-react"; import { motion } from "motion/react"; import Link from "next/link"; @@ -9,6 +10,7 @@ import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; +import { connectorsAtom } from "@/atoms/connectors/connector-query.atoms"; import { Button } from "@/components/ui/button"; import { Card, @@ -20,10 +22,6 @@ import { } from "@/components/ui/card"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { - type SearchSourceConnector, - useSearchSourceConnectors, -} from "@/hooks/use-search-source-connectors"; import { authenticatedFetch } from "@/lib/auth-utils"; export default function GoogleGmailConnectorPage() { @@ -33,18 +31,18 @@ export default function GoogleGmailConnectorPage() { const [isConnecting, setIsConnecting] = useState(false); const [doesConnectorExist, setDoesConnectorExist] = useState(false); - const { fetchConnectors } = useSearchSourceConnectors(true, parseInt(searchSpaceId)); + const { data: connectors } = useAtomValue(connectorsAtom); useEffect(() => { - fetchConnectors(parseInt(searchSpaceId)).then((data) => { - const connector = data.find( - (c: SearchSourceConnector) => c.connector_type === EnumConnectorName.GOOGLE_GMAIL_CONNECTOR + if (connectors) { + const connector = connectors.find( + (c) => c.connector_type === EnumConnectorName.GOOGLE_GMAIL_CONNECTOR ); if (connector) { setDoesConnectorExist(true); } - }); - }, []); + } + }, [connectors]); // Handle Google OAuth connection const handleConnectGoogle = async () => { diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/jira-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/jira-connector/page.tsx index 6f4e31114..a0c22582b 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/jira-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/jira-connector/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,7 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; +import { createConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; import { Accordion, AccordionContent, @@ -37,7 +39,6 @@ import { Input } from "@/components/ui/input"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { useSearchSourceConnectors } from "@/hooks/use-search-source-connectors"; // Define the form schema with Zod const jiraConnectorFormSchema = z.object({ @@ -73,7 +74,7 @@ export default function JiraConnectorPage() { const params = useParams(); const searchSpaceId = params.search_space_id as string; const [isSubmitting, setIsSubmitting] = useState(false); - const { createConnector } = useSearchSourceConnectors(); + const { mutateAsync: createConnector } = useAtomValue(createConnectorMutationAtom); // Initialize the form const form = useForm({ @@ -90,8 +91,8 @@ export default function JiraConnectorPage() { const onSubmit = async (values: JiraConnectorFormValues) => { setIsSubmitting(true); try { - await createConnector( - { + await createConnector({ + data: { name: values.name, connector_type: EnumConnectorName.JIRA_CONNECTOR, config: { @@ -105,8 +106,10 @@ export default function JiraConnectorPage() { indexing_frequency_minutes: null, next_scheduled_at: null, }, - parseInt(searchSpaceId) - ); + queryParams: { + search_space_id: searchSpaceId, + }, + }); toast.success("Jira connector created successfully!"); diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linear-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linear-connector/page.tsx index 13df9a910..ba747bf6e 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linear-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linear-connector/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,7 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; +import { createConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; import { Accordion, AccordionContent, @@ -37,7 +39,6 @@ import { Input } from "@/components/ui/input"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { useSearchSourceConnectors } from "@/hooks/use-search-source-connectors"; // Define the form schema with Zod const linearConnectorFormSchema = z.object({ @@ -62,7 +63,7 @@ export default function LinearConnectorPage() { const params = useParams(); const searchSpaceId = params.search_space_id as string; const [isSubmitting, setIsSubmitting] = useState(false); - const { createConnector } = useSearchSourceConnectors(); + const { mutateAsync: createConnector } = useAtomValue(createConnectorMutationAtom); // Initialize the form const form = useForm({ @@ -77,8 +78,8 @@ export default function LinearConnectorPage() { const onSubmit = async (values: LinearConnectorFormValues) => { setIsSubmitting(true); try { - await createConnector( - { + await createConnector({ + data: { name: values.name, connector_type: EnumConnectorName.LINEAR_CONNECTOR, config: { @@ -90,8 +91,10 @@ export default function LinearConnectorPage() { indexing_frequency_minutes: null, next_scheduled_at: null, }, - parseInt(searchSpaceId) - ); + queryParams: { + search_space_id: searchSpaceId, + }, + }); toast.success("Linear connector created successfully!"); diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linkup-api/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linkup-api/page.tsx index c20c2b576..16c0700d7 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linkup-api/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/linkup-api/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,7 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; +import { createConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { Button } from "@/components/ui/button"; import { @@ -30,7 +32,6 @@ import { import { Input } from "@/components/ui/input"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { useSearchSourceConnectors } from "@/hooks/use-search-source-connectors"; // Define the form schema with Zod const linkupApiFormSchema = z.object({ @@ -50,7 +51,7 @@ export default function LinkupApiPage() { const params = useParams(); const searchSpaceId = params.search_space_id as string; const [isSubmitting, setIsSubmitting] = useState(false); - const { createConnector } = useSearchSourceConnectors(); + const { mutateAsync: createConnector } = useAtomValue(createConnectorMutationAtom); // Initialize the form const form = useForm({ @@ -65,8 +66,8 @@ export default function LinkupApiPage() { const onSubmit = async (values: LinkupApiFormValues) => { setIsSubmitting(true); try { - await createConnector( - { + await createConnector({ + data: { name: values.name, connector_type: EnumConnectorName.LINKUP_API, config: { @@ -78,8 +79,10 @@ export default function LinkupApiPage() { indexing_frequency_minutes: null, next_scheduled_at: null, }, - parseInt(searchSpaceId) - ); + queryParams: { + search_space_id: searchSpaceId, + }, + }); toast.success("Linkup API connector created successfully!"); diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/luma-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/luma-connector/page.tsx index 7d4b82b68..8e4924a73 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/luma-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/luma-connector/page.tsx @@ -1,6 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; +import { useAtomValue } from "jotai"; import { ArrowLeft, Check, Key, Loader2 } from "lucide-react"; import { motion } from "motion/react"; import Link from "next/link"; @@ -9,6 +10,8 @@ import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; +import { createConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; +import { connectorsAtom } from "@/atoms/connectors/connector-query.atoms"; import { Button } from "@/components/ui/button"; import { Card, @@ -30,10 +33,6 @@ import { import { Input } from "@/components/ui/input"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { - type SearchSourceConnector, - useSearchSourceConnectors, -} from "@/hooks/use-search-source-connectors"; // Define the form schema with Zod const lumaConnectorFormSchema = z.object({ @@ -55,10 +54,8 @@ export default function LumaConnectorPage() { const [isSubmitting, setIsSubmitting] = useState(false); const [doesConnectorExist, setDoesConnectorExist] = useState(false); - const { fetchConnectors, createConnector } = useSearchSourceConnectors( - true, - parseInt(searchSpaceId) - ); + const { data: connectors } = useAtomValue(connectorsAtom); + const { mutateAsync: createConnector } = useAtomValue(createConnectorMutationAtom); // Initialize the form const form = useForm({ @@ -70,28 +67,22 @@ export default function LumaConnectorPage() { }); useEffect(() => { - fetchConnectors(parseInt(searchSpaceId)) - .then((data) => { - if (data && Array.isArray(data)) { - const connector = data.find( - (c: SearchSourceConnector) => c.connector_type === EnumConnectorName.LUMA_CONNECTOR - ); - if (connector) { - setDoesConnectorExist(true); - } - } - }) - .catch((error) => { - console.error("Error fetching connectors:", error); - }); - }, [fetchConnectors, searchSpaceId]); + if (connectors) { + const connector = connectors.find( + (c) => c.connector_type === EnumConnectorName.LUMA_CONNECTOR + ); + if (connector) { + setDoesConnectorExist(true); + } + } + }, [connectors]); // Handle form submission const onSubmit = async (values: LumaConnectorFormValues) => { setIsSubmitting(true); try { - await createConnector( - { + await createConnector({ + data: { name: values.name, connector_type: EnumConnectorName.LUMA_CONNECTOR, config: { @@ -103,8 +94,10 @@ export default function LumaConnectorPage() { indexing_frequency_minutes: null, next_scheduled_at: null, }, - parseInt(searchSpaceId) - ); + queryParams: { + search_space_id: searchSpaceId, + }, + }); toast.success("Luma connector created successfully!"); diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/notion-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/notion-connector/page.tsx index 310c31811..160808e21 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/notion-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/notion-connector/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,7 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; +import { createConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; import { Accordion, AccordionContent, @@ -37,7 +39,6 @@ import { Input } from "@/components/ui/input"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { useSearchSourceConnectors } from "@/hooks/use-search-source-connectors"; // Define the form schema with Zod const notionConnectorFormSchema = z.object({ @@ -57,7 +58,7 @@ export default function NotionConnectorPage() { const params = useParams(); const searchSpaceId = params.search_space_id as string; const [isSubmitting, setIsSubmitting] = useState(false); - const { createConnector } = useSearchSourceConnectors(); + const { mutateAsync: createConnector } = useAtomValue(createConnectorMutationAtom); // Initialize the form const form = useForm({ @@ -72,8 +73,8 @@ export default function NotionConnectorPage() { const onSubmit = async (values: NotionConnectorFormValues) => { setIsSubmitting(true); try { - await createConnector( - { + await createConnector({ + data: { name: values.name, connector_type: EnumConnectorName.NOTION_CONNECTOR, config: { @@ -85,8 +86,10 @@ export default function NotionConnectorPage() { indexing_frequency_minutes: null, next_scheduled_at: null, }, - parseInt(searchSpaceId) - ); + queryParams: { + search_space_id: searchSpaceId, + }, + }); toast.success("Notion connector created successfully!"); diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/searxng/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/searxng/page.tsx index 9645a3657..aec72bbc7 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/searxng/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/searxng/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,7 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; +import { createConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { Button } from "@/components/ui/button"; import { @@ -31,7 +33,6 @@ import { Input } from "@/components/ui/input"; import { Switch } from "@/components/ui/switch"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { useSearchSourceConnectors } from "@/hooks/use-search-source-connectors"; const searxngFormSchema = z.object({ name: z.string().min(3, { @@ -67,7 +68,7 @@ export default function SearxngConnectorPage() { const params = useParams(); const searchSpaceId = params.search_space_id as string; const [isSubmitting, setIsSubmitting] = useState(false); - const { createConnector } = useSearchSourceConnectors(); + const { mutateAsync: createConnector } = useAtomValue(createConnectorMutationAtom); const form = useForm({ resolver: zodResolver(searxngFormSchema), @@ -115,8 +116,8 @@ export default function SearxngConnectorPage() { config.SEARXNG_VERIFY_SSL = false; } - await createConnector( - { + await createConnector({ + data: { name: values.name, connector_type: EnumConnectorName.SEARXNG_API, config, @@ -126,8 +127,10 @@ export default function SearxngConnectorPage() { indexing_frequency_minutes: null, next_scheduled_at: null, }, - parseInt(searchSpaceId) - ); + queryParams: { + search_space_id: searchSpaceId, + }, + }); toast.success("SearxNG connector created successfully!"); router.push(`/dashboard/${searchSpaceId}/connectors`); diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/serper-api/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/serper-api/page.tsx index 2574c8f44..69a0c2b81 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/serper-api/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/serper-api/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,7 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; +import { createConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { Button } from "@/components/ui/button"; import { @@ -30,7 +32,6 @@ import { import { Input } from "@/components/ui/input"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { useSearchSourceConnectors } from "@/hooks/use-search-source-connectors"; // Define the form schema with Zod const serperApiFormSchema = z.object({ @@ -50,7 +51,7 @@ export default function SerperApiPage() { const params = useParams(); const searchSpaceId = params.search_space_id as string; const [isSubmitting, setIsSubmitting] = useState(false); - const { createConnector } = useSearchSourceConnectors(); + const { mutateAsync: createConnector } = useAtomValue(createConnectorMutationAtom); // Initialize the form const form = useForm({ @@ -65,8 +66,8 @@ export default function SerperApiPage() { const onSubmit = async (values: SerperApiFormValues) => { setIsSubmitting(true); try { - await createConnector( - { + await createConnector({ + data: { name: values.name, connector_type: EnumConnectorName.SERPER_API, config: { @@ -78,8 +79,10 @@ export default function SerperApiPage() { indexing_frequency_minutes: null, next_scheduled_at: null, }, - parseInt(searchSpaceId) - ); + queryParams: { + search_space_id: searchSpaceId, + }, + }); toast.success("Serper API connector created successfully!"); diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/slack-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/slack-connector/page.tsx index 314ed8442..f3cf2ca6c 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/slack-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/slack-connector/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,7 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; +import { createConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; import { Accordion, AccordionContent, @@ -37,7 +39,6 @@ import { Input } from "@/components/ui/input"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { useSearchSourceConnectors } from "@/hooks/use-search-source-connectors"; // Define the form schema with Zod const slackConnectorFormSchema = z.object({ @@ -57,7 +58,7 @@ export default function SlackConnectorPage() { const params = useParams(); const searchSpaceId = params.search_space_id as string; const [isSubmitting, setIsSubmitting] = useState(false); - const { createConnector } = useSearchSourceConnectors(); + const { mutateAsync: createConnector } = useAtomValue(createConnectorMutationAtom); // Initialize the form const form = useForm({ @@ -72,8 +73,8 @@ export default function SlackConnectorPage() { const onSubmit = async (values: SlackConnectorFormValues) => { setIsSubmitting(true); try { - await createConnector( - { + await createConnector({ + data: { name: values.name, connector_type: EnumConnectorName.SLACK_CONNECTOR, config: { @@ -85,8 +86,10 @@ export default function SlackConnectorPage() { indexing_frequency_minutes: null, next_scheduled_at: null, }, - parseInt(searchSpaceId) - ); + queryParams: { + search_space_id: searchSpaceId, + }, + }); toast.success("Slack connector created successfully!"); diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/tavily-api/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/tavily-api/page.tsx index 40b98ca5c..a9ddd5a41 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/tavily-api/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/tavily-api/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,7 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; +import { createConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { Button } from "@/components/ui/button"; import { @@ -30,7 +32,6 @@ import { import { Input } from "@/components/ui/input"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { useSearchSourceConnectors } from "@/hooks/use-search-source-connectors"; // Define the form schema with Zod const tavilyApiFormSchema = z.object({ @@ -50,7 +51,7 @@ export default function TavilyApiPage() { const params = useParams(); const searchSpaceId = params.search_space_id as string; const [isSubmitting, setIsSubmitting] = useState(false); - const { createConnector } = useSearchSourceConnectors(); + const { mutateAsync: createConnector } = useAtomValue(createConnectorMutationAtom); // Initialize the form const form = useForm({ @@ -65,8 +66,8 @@ export default function TavilyApiPage() { const onSubmit = async (values: TavilyApiFormValues) => { setIsSubmitting(true); try { - await createConnector( - { + await createConnector({ + data: { name: values.name, connector_type: EnumConnectorName.TAVILY_API, config: { @@ -78,8 +79,10 @@ export default function TavilyApiPage() { indexing_frequency_minutes: null, next_scheduled_at: null, }, - parseInt(searchSpaceId) - ); + queryParams: { + search_space_id: searchSpaceId, + }, + }); toast.success("Tavily API connector created successfully!"); diff --git a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/webcrawler-connector/page.tsx b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/webcrawler-connector/page.tsx index 8edc34728..f99c66142 100644 --- a/surfsense_web/app/dashboard/[search_space_id]/connectors/add/webcrawler-connector/page.tsx +++ b/surfsense_web/app/dashboard/[search_space_id]/connectors/add/webcrawler-connector/page.tsx @@ -1,6 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; +import { useAtomValue } from "jotai"; import { ArrowLeft, Check, Globe, Loader2 } from "lucide-react"; import { motion } from "motion/react"; import Link from "next/link"; @@ -9,6 +10,8 @@ import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; +import { createConnectorMutationAtom } from "@/atoms/connectors/connector-mutation.atoms"; +import { connectorsAtom } from "@/atoms/connectors/connector-query.atoms"; import { Button } from "@/components/ui/button"; import { Card, @@ -31,10 +34,6 @@ import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { EnumConnectorName } from "@/contracts/enums/connector"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; -import { - type SearchSourceConnector, - useSearchSourceConnectors, -} from "@/hooks/use-search-source-connectors"; // Define the form schema with Zod const webcrawlerConnectorFormSchema = z.object({ @@ -55,10 +54,8 @@ export default function WebcrawlerConnectorPage() { const [isSubmitting, setIsSubmitting] = useState(false); const [doesConnectorExist, setDoesConnectorExist] = useState(false); - const { fetchConnectors, createConnector } = useSearchSourceConnectors( - true, - parseInt(searchSpaceId) - ); + const { data: connectors } = useAtomValue(connectorsAtom); + const { mutateAsync: createConnector } = useAtomValue(createConnectorMutationAtom); // Initialize the form const form = useForm({ @@ -71,22 +68,15 @@ export default function WebcrawlerConnectorPage() { }); useEffect(() => { - fetchConnectors(parseInt(searchSpaceId)) - .then((data) => { - if (data && Array.isArray(data)) { - const connector = data.find( - (c: SearchSourceConnector) => - c.connector_type === EnumConnectorName.WEBCRAWLER_CONNECTOR - ); - if (connector) { - setDoesConnectorExist(true); - } - } - }) - .catch((error) => { - console.error("Error fetching connectors:", error); - }); - }, [fetchConnectors, searchSpaceId]); + if (connectors) { + const connector = connectors.find( + (c) => c.connector_type === EnumConnectorName.WEBCRAWLER_CONNECTOR + ); + if (connector) { + setDoesConnectorExist(true); + } + } + }, [connectors]); // Handle form submission const onSubmit = async (values: WebcrawlerConnectorFormValues) => { @@ -104,8 +94,8 @@ export default function WebcrawlerConnectorPage() { config.INITIAL_URLS = values.initial_urls; } - await createConnector( - { + await createConnector({ + data: { name: values.name, connector_type: EnumConnectorName.WEBCRAWLER_CONNECTOR, config: config, @@ -115,8 +105,10 @@ export default function WebcrawlerConnectorPage() { indexing_frequency_minutes: null, next_scheduled_at: null, }, - parseInt(searchSpaceId) - ); + queryParams: { + search_space_id: searchSpaceId, + }, + }); toast.success("Webcrawler connector created successfully!");