"use client"; import { useState, useEffect, useCallback } from "react"; import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; import { tomorrow } from "react-syntax-highlighter/dist/esm/styles/prism"; import { Button } from "./ui/button"; import type { Script } from "../../types/script"; interface TextViewerProps { scriptName: string; isOpen: boolean; onClose: () => void; script?: Script | null; } interface ScriptContent { mainScript?: string; installScript?: string; alpineMainScript?: string; alpineInstallScript?: string; } export function TextViewer({ scriptName, isOpen, onClose, script, }: TextViewerProps) { const [scriptContent, setScriptContent] = useState({}); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const [activeTab, setActiveTab] = useState<"main" | "install">("main"); const [selectedVersion, setSelectedVersion] = useState<"default" | "alpine">( "default", ); // Extract slug from script name (remove .sh extension) const slug = scriptName.replace(/\.sh$/, "").replace(/^alpine-/, ""); // Get default and alpine install methods const defaultMethod = script?.install_methods?.find( (method) => method.type === "default", ); const alpineMethod = script?.install_methods?.find( (method) => method.type === "alpine", ); // Check if alpine variant exists const hasAlpineVariant = !!alpineMethod; // Get script paths from install_methods const defaultScriptPath = defaultMethod?.script; const alpineScriptPath = alpineMethod?.script; // Determine if install scripts exist (only for ct/ scripts typically) const hasInstallScript = defaultScriptPath?.startsWith("ct/") ?? alpineScriptPath?.startsWith("ct/"); // Get script names for display const defaultScriptName = scriptName.replace(/^alpine-/, ""); const loadScriptContent = useCallback(async () => { setIsLoading(true); setError(null); try { // Build fetch requests based on actual script paths from install_methods const requests: Promise[] = []; const requestTypes: Array< "default-main" | "default-install" | "alpine-main" | "alpine-install" > = []; // Default main script (ct/, vm/, tools/, etc.) if (defaultScriptPath) { requests.push( fetch( `/api/trpc/scripts.getScriptContent?input=${encodeURIComponent(JSON.stringify({ json: { path: defaultScriptPath } }))}`, ), ); requestTypes.push("default-main"); } // Default install script (only for ct/ scripts) if (hasInstallScript && defaultScriptPath?.startsWith("ct/")) { requests.push( fetch( `/api/trpc/scripts.getScriptContent?input=${encodeURIComponent(JSON.stringify({ json: { path: `install/${slug}-install.sh` } }))}`, ), ); requestTypes.push("default-install"); } // Alpine main script if (hasAlpineVariant && alpineScriptPath) { requests.push( fetch( `/api/trpc/scripts.getScriptContent?input=${encodeURIComponent(JSON.stringify({ json: { path: alpineScriptPath } }))}`, ), ); requestTypes.push("alpine-main"); } // Alpine install script (only for ct/ scripts) if ( hasAlpineVariant && hasInstallScript && alpineScriptPath?.startsWith("ct/") ) { requests.push( fetch( `/api/trpc/scripts.getScriptContent?input=${encodeURIComponent(JSON.stringify({ json: { path: `install/alpine-${slug}-install.sh` } }))}`, ), ); requestTypes.push("alpine-install"); } const responses = await Promise.allSettled(requests); const content: ScriptContent = {}; // Process responses based on their types await Promise.all( responses.map(async (response, index) => { if (response.status === "fulfilled" && response.value.ok) { try { const data = (await response.value.json()) as { result?: { data?: { json?: { success?: boolean; content?: string } }; }; }; const type = requestTypes[index]; if ( data.result?.data?.json?.success && data.result.data.json.content ) { switch (type) { case "default-main": content.mainScript = data.result.data.json.content; break; case "default-install": content.installScript = data.result.data.json.content; break; case "alpine-main": content.alpineMainScript = data.result.data.json.content; break; case "alpine-install": content.alpineInstallScript = data.result.data.json.content; break; } } } catch { // Ignore errors } } }), ); setScriptContent(content); } catch (err) { setError( err instanceof Error ? err.message : "Failed to load script content", ); } finally { setIsLoading(false); } }, [ defaultScriptPath, alpineScriptPath, slug, hasAlpineVariant, hasInstallScript, ]); useEffect(() => { if (isOpen && scriptName) { void loadScriptContent(); } }, [isOpen, scriptName, loadScriptContent]); const handleBackdropClick = (e: React.MouseEvent) => { if (e.target === e.currentTarget) { onClose(); } }; if (!isOpen) return null; return (
{/* Header */}

Script Viewer: {defaultScriptName}

{hasAlpineVariant && (
)} {/* Boolean logic intentionally uses || for truthiness checks - eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing */} {((selectedVersion === "default" && Boolean( scriptContent.mainScript ?? scriptContent.installScript, )) || (selectedVersion === "alpine" && Boolean( scriptContent.alpineMainScript ?? scriptContent.alpineInstallScript, ))) && (
{hasInstallScript && ( )}
)}
{/* Content */}
{isLoading ? (
Loading script content...
) : error ? (
Error: {error}
) : (
{activeTab === "main" && (selectedVersion === "default" && scriptContent.mainScript ? ( {scriptContent.mainScript} ) : selectedVersion === "alpine" && scriptContent.alpineMainScript ? ( {scriptContent.alpineMainScript} ) : (
{selectedVersion === "default" ? "Default script not found" : "Alpine script not found"}
))} {activeTab === "install" && (selectedVersion === "default" && scriptContent.installScript ? ( {scriptContent.installScript} ) : selectedVersion === "alpine" && scriptContent.alpineInstallScript ? ( {scriptContent.alpineInstallScript} ) : (
{selectedVersion === "default" ? "Default install script not found" : "Alpine install script not found"}
))}
)}
); }