'use client'; import { useState, useEffect } from "react"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Button } from "@/components/ui/button" import { Progress } from "@/components/ui/progress" import { Download, Loader2, AlertCircle, CheckCircle2, Play } from "lucide-react" import { useOllamaDownload } from "@/hooks/use-ollama-download" import { useToast } from "@/hooks/use-toast" import { useOperatingSystem } from "@/hooks/use-operating-system" import type { OS } from "@/lib/download-utils" interface InstallModalProps { open: boolean; onCheckAgain: () => void; } export function InstallModal({ open, onCheckAgain }: InstallModalProps) { const { os: detectedOS } = useOperatingSystem(); const [activeTab, setActiveTab] = useState('mac'); const downloadState = useOllamaDownload(); const { toast } = useToast(); // Detectar OS e definir aba ativa quando modal abrir useEffect(() => { if (open && detectedOS) { setActiveTab(detectedOS); } }, [open, detectedOS]); // Resetar estado quando o modal abrir useEffect(() => { if (open) { downloadState.reset(); // Verificar se já existe download para a tab ativa downloadState.checkExistingDownload(activeTab); } else { // Parar verificação automática quando modal fechar downloadState.stopAutoCheck(); } }, [open, activeTab]); // Verificar download existente ao mudar de tab useEffect(() => { if (open) { downloadState.checkExistingDownload(activeTab); } }, [activeTab, open]); // Escutar evento de Ollama instalado useEffect(() => { if (!open) return; const handleOllamaInstalled = () => { // Ollama foi encontrado, verificar novamente para atualizar o estado onCheckAgain(); }; window.addEventListener('ollama-installed', handleOllamaInstalled); return () => { window.removeEventListener('ollama-installed', handleOllamaInstalled); }; }, [open, onCheckAgain]); // Mostrar toast quando houver erro useEffect(() => { if (downloadState.downloadError) { toast({ title: 'Erro no download', description: downloadState.downloadError, variant: 'destructive', }); } }, [downloadState.downloadError, toast]); const handleDownload = async (os: OS) => { await downloadState.handleDownload(os); }; const handleInstall = async () => { try { await downloadState.handleInstall(); // Toast será mostrado automaticamente via eventos de progresso } catch (error) { toast({ title: 'Erro ao executar instalador', description: error instanceof Error ? error.message : 'Erro desconhecido', variant: 'destructive', }); } }; const DownloadButton = ({ os, label }: { os: OS; label: string }) => { const isActive = activeTab === os; const isDownloading = downloadState.isDownloading && isActive; const hasDownloaded = downloadState.filePath !== null && isActive; if (hasDownloaded && !isDownloading) { return ( ); } return ( ); }; const DownloadProgress = ({ os }: { os: OS }) => { const isActive = activeTab === os; const isDownloading = downloadState.isDownloading && isActive; const hasDownloaded = downloadState.filePath !== null && isActive; const isInstalling = downloadState.isInstalling && isActive; const installStatus = downloadState.installStatus; if (!isDownloading && !hasDownloaded && !isInstalling) { return null; } return (
{isDownloading && ( <>
{downloadState.downloadStatus || 'Baixando...'} {downloadState.downloadProgress}%
)} {isInstalling && ( <>
{installStatus || 'Instalando...'}
)} {hasDownloaded && !isDownloading && !isInstalling && (

Download concluído

Clique em "Instalar Ollama" para iniciar a instalação automática.

)} {downloadState.isInstalled && !isInstalling && (

Instalação concluída!

{installStatus || 'Ollama foi instalado com sucesso.'}

)}
); }; return ( Ollama não encontrado Para usar o OllaHub, você precisa ter o Ollama instalado no seu sistema. Baixe e instale o Ollama usando os passos abaixo. setActiveTab(v as OS)} className="w-full"> macOS Linux Windows

1. Download e Instalação

{downloadState.downloadError && activeTab === 'mac' && (

Erro no download

{downloadState.downloadError}

)}

Após instalar, o Ollama será iniciado automaticamente. Se necessário, abra o terminal e digite ollama serve.

💡 Dica: Após concluir a instalação, você pode fechar qualquer janela de chat aberta pelo Ollama e continuar aqui no OllaHub.

Instalação via Terminal

curl -fsSL https://ollama.com/install.sh | sh

Ou baixar e instalar via interface

{downloadState.downloadError && activeTab === 'linux' && (

Erro no download

{downloadState.downloadError}

)}

Comando Manual

Ou consulte ollama.com/download/linux para instruções manuais.

💡 Dica: Após concluir a instalação, você pode fechar qualquer janela de chat aberta pelo Ollama e continuar aqui no OllaHub.

1. Download do Instalador

{downloadState.downloadError && activeTab === 'windows' && (

Erro no download

{downloadState.downloadError}

)}

Após clicar em "Instalar Ollama", o instalador será aberto. Siga as instruções na tela para completar a instalação.

💡 Dica: Após concluir a instalação, você pode fechar qualquer janela de chat aberta pelo Ollama e continuar aqui no OllaHub.

{/* Status de verificação automática */} {downloadState.isChecking && (

Verificando instalação do Ollama...

{downloadState.checkStatus || 'Aguardando instalação ser concluída...'}

Esta verificação continuará em segundo plano até encontrar o Ollama.

)}
) }