'use client'; import { useState, useEffect } from 'react'; import type { Server } from '../../types/server'; import type { Script } from '../../types/script'; import { Button } from './ui/button'; import { ColorCodedDropdown } from './ColorCodedDropdown'; import { SettingsModal } from './SettingsModal'; import { ConfigurationModal, type EnvVars } from './ConfigurationModal'; import { useRegisterModal } from './modal/ModalStackProvider'; interface ExecutionModeModalProps { isOpen: boolean; onClose: () => void; onExecute: (mode: 'local' | 'ssh', server?: Server, envVars?: EnvVars) => void; scriptName: string; script?: Script | null; } export function ExecutionModeModal({ isOpen, onClose, onExecute, scriptName, script }: ExecutionModeModalProps) { useRegisterModal(isOpen, { id: 'execution-mode-modal', allowEscape: true, onClose }); const [servers, setServers] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [selectedServer, setSelectedServer] = useState(null); const [settingsModalOpen, setSettingsModalOpen] = useState(false); const [configModalOpen, setConfigModalOpen] = useState(false); const [configMode, setConfigMode] = useState<'default' | 'advanced'>('default'); useEffect(() => { if (isOpen) { void fetchServers(); } }, [isOpen]); // Auto-select server when exactly one server is available useEffect(() => { if (isOpen && !loading && servers.length === 1) { setSelectedServer(servers[0] ?? null); } }, [isOpen, loading, servers]); // Refresh servers when settings modal closes const handleSettingsModalClose = () => { setSettingsModalOpen(false); // Refetch servers to reflect any changes made in settings void fetchServers(); }; const fetchServers = async () => { setLoading(true); setError(null); try { const response = await fetch('/api/servers'); if (!response.ok) { throw new Error('Failed to fetch servers'); } const data = await response.json(); // Sort servers by name alphabetically const sortedServers = (data as Server[]).sort((a, b) => (a.name ?? '').localeCompare(b.name ?? '') ); setServers(sortedServers); } catch (err) { setError(err instanceof Error ? err.message : 'An error occurred'); } finally { setLoading(false); } }; const handleConfigModeSelect = (mode: 'default' | 'advanced') => { if (!selectedServer) { setError('Please select a server first'); return; } setConfigMode(mode); setConfigModalOpen(true); }; const handleConfigConfirm = (envVars: EnvVars) => { if (!selectedServer) return; setConfigModalOpen(false); onExecute('ssh', selectedServer, envVars); onClose(); }; const handleServerSelect = (server: Server | null) => { setSelectedServer(server); setError(null); // Clear error when server is selected }; if (!isOpen) return null; return ( <>
{/* Header */}

Select Server

{/* Content */}
{error && (

{error}

)} {loading ? (

Loading servers...

) : servers.length === 0 ? (

No servers configured

Add servers in Settings to execute scripts

) : servers.length === 1 ? ( /* Single Server Confirmation View */

Install Script Confirmation

Do you want to install "{scriptName}" on the following server?

{selectedServer?.name ?? 'Unnamed Server'}

{selectedServer?.ip}

{/* Configuration Mode Selection */}

Choose configuration mode:

{/* Action Buttons */}
) : ( /* Multiple Servers Selection View */

Select server to execute "{scriptName}"

{/* Server Selection */}
{/* Configuration Mode Selection - only show when server is selected */} {selectedServer && (

Choose configuration mode:

)} {/* Action Buttons */}
)}
{/* Server Settings Modal */} {/* Configuration Modal */} setConfigModalOpen(false)} onConfirm={handleConfigConfirm} script={script ?? null} server={selectedServer} mode={configMode} /> ); }