import { useQueryClient } from "@tanstack/react-query"; import { AnimatePresence, motion } from "motion/react"; import { useState } from "react"; import { FormProvider, useForm } from "react-hook-form"; import { toast } from "sonner"; import { useUpdateSettingsMutation } from "@/app/api/mutations/useUpdateSettingsMutation"; import { useGetOllamaModelsQuery } from "@/app/api/queries/useGetModelsQuery"; import { useGetSettingsQuery } from "@/app/api/queries/useGetSettingsQuery"; import type { ProviderHealthResponse } from "@/app/api/queries/useProviderHealthQuery"; import OllamaLogo from "@/components/icons/ollama-logo"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { useAuth } from "@/contexts/auth-context"; import { OllamaSettingsForm, type OllamaSettingsFormData, } from "./ollama-settings-form"; import { useRouter } from "next/navigation"; const OllamaSettingsDialog = ({ open, setOpen, }: { open: boolean; setOpen: (open: boolean) => void; }) => { const { isAuthenticated, isNoAuthMode } = useAuth(); const queryClient = useQueryClient(); const [isValidating, setIsValidating] = useState(false); const [validationError, setValidationError] = useState(null); const router = useRouter(); const { data: settings = {} } = useGetSettingsQuery({ enabled: isAuthenticated || isNoAuthMode, }); const isOllamaConfigured = settings.providers?.ollama?.configured === true; const methods = useForm({ mode: "onSubmit", defaultValues: { endpoint: isOllamaConfigured ? settings.providers?.ollama?.endpoint : "http://localhost:11434", }, }); const { handleSubmit, watch } = methods; const endpoint = watch("endpoint"); const { refetch: validateCredentials } = useGetOllamaModelsQuery( { endpoint: endpoint, }, { enabled: false, }, ); const settingsMutation = useUpdateSettingsMutation({ onSuccess: () => { // Update provider health cache to healthy since backend validated the setup const healthData: ProviderHealthResponse = { status: "healthy", message: "Provider is configured and working correctly", provider: "ollama", }; queryClient.setQueryData(["provider", "health"], healthData); toast.message("Ollama successfully configured", { description: "You can now access the provided language and embedding models.", duration: Infinity, closeButton: true, icon: , action: { label: "Settings", onClick: () => { router.push("/settings?focusLlmModel=true"); }, }, }); setOpen(false); }, }); const onSubmit = async (data: OllamaSettingsFormData) => { // Clear any previous validation errors setValidationError(null); // Validate endpoint by fetching models setIsValidating(true); const result = await validateCredentials(); setIsValidating(false); if (result.isError) { setValidationError(result.error); return; } settingsMutation.mutate({ ollama_endpoint: data.endpoint, }); }; return (
Ollama Setup
{settingsMutation.isError && (

{settingsMutation.error?.message}

)}
); }; export default OllamaSettingsDialog;