'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'; interface TextViewerProps { scriptName: string; isOpen: boolean; onClose: () => void; } interface ScriptContent { ctScript?: string; installScript?: string; } export function TextViewer({ scriptName, isOpen, onClose }: TextViewerProps) { const [scriptContent, setScriptContent] = useState({}); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const [activeTab, setActiveTab] = useState<'ct' | 'install'>('ct'); // Extract slug from script name (remove .sh extension) const slug = scriptName.replace(/\.sh$/, ''); const loadScriptContent = useCallback(async () => { setIsLoading(true); setError(null); try { // Try to load from different possible locations const [ctResponse, toolsResponse, vmResponse, vwResponse, installResponse] = await Promise.allSettled([ fetch(`/api/trpc/scripts.getScriptContent?input=${encodeURIComponent(JSON.stringify({ json: { path: `ct/${scriptName}` } }))}`), fetch(`/api/trpc/scripts.getScriptContent?input=${encodeURIComponent(JSON.stringify({ json: { path: `tools/pve/${scriptName}` } }))}`), fetch(`/api/trpc/scripts.getScriptContent?input=${encodeURIComponent(JSON.stringify({ json: { path: `vm/${scriptName}` } }))}`), fetch(`/api/trpc/scripts.getScriptContent?input=${encodeURIComponent(JSON.stringify({ json: { path: `vw/${scriptName}` } }))}`), fetch(`/api/trpc/scripts.getScriptContent?input=${encodeURIComponent(JSON.stringify({ json: { path: `install/${slug}-install.sh` } }))}`) ]); const content: ScriptContent = {}; if (ctResponse.status === 'fulfilled' && ctResponse.value.ok) { const ctData = await ctResponse.value.json() as { result?: { data?: { json?: { success?: boolean; content?: string } } } }; if (ctData.result?.data?.json?.success) { content.ctScript = ctData.result.data.json.content; } } if (toolsResponse.status === 'fulfilled' && toolsResponse.value.ok) { const toolsData = await toolsResponse.value.json() as { result?: { data?: { json?: { success?: boolean; content?: string } } } }; if (toolsData.result?.data?.json?.success) { content.ctScript = toolsData.result.data.json.content; // Use ctScript field for tools scripts too } } if (vmResponse.status === 'fulfilled' && vmResponse.value.ok) { const vmData = await vmResponse.value.json() as { result?: { data?: { json?: { success?: boolean; content?: string } } } }; if (vmData.result?.data?.json?.success) { content.ctScript = vmData.result.data.json.content; // Use ctScript field for VM scripts too } } if (vwResponse.status === 'fulfilled' && vwResponse.value.ok) { const vwData = await vwResponse.value.json() as { result?: { data?: { json?: { success?: boolean; content?: string } } } }; if (vwData.result?.data?.json?.success) { content.ctScript = vwData.result.data.json.content; // Use ctScript field for VW scripts too } } if (installResponse.status === 'fulfilled' && installResponse.value.ok) { const installData = await installResponse.value.json() as { result?: { data?: { json?: { success?: boolean; content?: string } } } }; if (installData.result?.data?.json?.success) { content.installScript = installData.result.data.json.content; } } setScriptContent(content); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to load script content'); } finally { setIsLoading(false); } }, [scriptName, slug]); 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: {scriptName}

{scriptContent.ctScript && scriptContent.installScript && (
)}
{/* Content */}
{isLoading ? (
Loading script content...
) : error ? (
Error: {error}
) : (
{activeTab === 'ct' && scriptContent.ctScript ? ( {scriptContent.ctScript} ) : activeTab === 'install' && scriptContent.installScript ? ( {scriptContent.installScript} ) : (
{activeTab === 'ct' ? 'CT script not found' : 'Install script not found'}
)}
)}
); }