import React, { useState, useEffect } from "react"; import { invoke } from "@tauri-apps/api/core"; import { ModelInfo } from "../../lib/types"; import ModelCard from "./ModelCard"; interface OnboardingProps { onModelSelected: () => void; } const Onboarding: React.FC = ({ onModelSelected }) => { const [availableModels, setAvailableModels] = useState([]); const [downloading, setDownloading] = useState(false); const [error, setError] = useState(null); useEffect(() => { loadModels(); }, []); const loadModels = async () => { try { const models: ModelInfo[] = await invoke("get_available_models"); // Only show downloadable models for onboarding setAvailableModels(models.filter((m) => !m.is_downloaded)); } catch (err) { console.error("Failed to load models:", err); setError("Failed to load available models"); } }; const handleDownloadModel = async (modelId: string) => { setDownloading(true); setError(null); // Immediately transition to main app - download will continue in footer onModelSelected(); try { await invoke("download_model", { modelId }); } catch (err) { console.error("Download failed:", err); setError(`Failed to download model: ${err}`); setDownloading(false); } }; const getRecommendedBadge = (modelId: string): boolean => { return modelId === "parakeet-tdt-0.6b-v3"; }; return (

To get started, choose a transcription model

{error && (

{error}

)}
{availableModels .filter((model) => getRecommendedBadge(model.id)) .map((model) => ( ))} {availableModels .filter((model) => !getRecommendedBadge(model.id)) .sort((a, b) => a.size_mb - b.size_mb) .map((model) => ( ))}
); }; export default Onboarding;