diff --git a/surfsense_web/atoms/podcasts/podcast-mutation.atoms.ts b/surfsense_web/atoms/podcasts/podcast-mutation.atoms.ts index a44a15558..3a2403af7 100644 --- a/surfsense_web/atoms/podcasts/podcast-mutation.atoms.ts +++ b/surfsense_web/atoms/podcasts/podcast-mutation.atoms.ts @@ -1,7 +1,11 @@ import { atomWithMutation } from "jotai-tanstack-query"; import { toast } from "sonner"; import { activeSearchSpaceIdAtom } from "@/atoms/seach-spaces/seach-space-queries.atom"; -import type { DeletePodcastRequest, Podcast } from "@/contracts/types/podcast.types"; +import type { + DeletePodcastRequest, + GeneratePodcastRequest, + Podcast, +} from "@/contracts/types/podcast.types"; import { podcastsApiService } from "@/lib/apis/podcasts-api.service"; import { cacheKeys } from "@/lib/query-client/cache-keys"; import { queryClient } from "@/lib/query-client/client"; @@ -30,3 +34,17 @@ export const deletePodcastMutationAtom = atomWithMutation((get) => { }, }; }); + +export const generatePodcastMutationAtom = atomWithMutation((get) => { + const searchSpaceId = get(activeSearchSpaceIdAtom); + const authToken = localStorage.getItem("surfsense_bearer_token"); + const podcastsQueryParams = get(globalPodcastsQueryParamsAtom); + + return { + mutationKey: cacheKeys.podcasts.globalQueryParams(podcastsQueryParams), + enabled: !!searchSpaceId && !!authToken, + mutationFn: async (request: GeneratePodcastRequest) => { + return podcastsApiService.generatePodcast(request); + }, + }; +}); diff --git a/surfsense_web/components/chat/ChatPanel/ChatPanelContainer.tsx b/surfsense_web/components/chat/ChatPanel/ChatPanelContainer.tsx index aebb1068b..cb0fcb33e 100644 --- a/surfsense_web/components/chat/ChatPanel/ChatPanelContainer.tsx +++ b/surfsense_web/components/chat/ChatPanel/ChatPanelContainer.tsx @@ -1,11 +1,11 @@ "use client"; -import { useAtom, useAtomValue } from "jotai"; -import { LoaderIcon, PanelRight, TriangleAlert } from "lucide-react"; +import { useAtomValue } from "jotai"; +import { LoaderIcon, TriangleAlert } from "lucide-react"; import { toast } from "sonner"; import { activeChatAtom } from "@/atoms/chats/chat-query.atoms"; import { activeChathatUIAtom, activeChatIdAtom } from "@/atoms/chats/ui.atoms"; +import { generatePodcastMutationAtom } from "@/atoms/podcasts/podcast-mutation.atoms"; import type { GeneratePodcastRequest } from "@/contracts/types/podcast.types"; -import { podcastsApiService } from "@/lib/apis/podcasts-api.service"; import { cn } from "@/lib/utils"; import { ChatPanelView } from "./ChatPanelView"; @@ -16,19 +16,18 @@ export function ChatPanelContainer() { error: chatError, } = useAtomValue(activeChatAtom); const activeChatIdState = useAtomValue(activeChatIdAtom); - const authToken = localStorage.getItem("surfsense_bearer_token"); const { isChatPannelOpen } = useAtomValue(activeChathatUIAtom); + const { mutateAsync: generatePodcast, error: generatePodcastError } = useAtomValue( + generatePodcastMutationAtom + ); const handleGeneratePodcast = async (request: GeneratePodcastRequest) => { try { - if (!authToken) { - throw new Error("Authentication error. Please log in again."); - } - await podcastsApiService.generatePodcast(request); + generatePodcast(request); toast.success(`Podcast generation started!`); } catch (error) { toast.error("Error generating podcast. Please try again later."); - console.error("Error generating podcast:", JSON.stringify(error)); + console.error("Error generating podcast:", JSON.stringify(generatePodcastError)); } };