import type { App } from '../../shared/types' import { closeModal, openModal, rerenderModal } from '../components/modal' import { navigate } from '../router' import { selectedApp } from '../state' import { Button, Form, FormActions, FormError, FormField, FormInput, FormLabel } from '../styles' import { theme } from '../themes' let deleteAppError = '' let deleteAppDeleting = false let deleteAppTarget: App | null = null async function deleteApp(input: HTMLInputElement) { if (!deleteAppTarget) return const expected = `sudo rm ${deleteAppTarget.name}` const value = input.value.trim() if (value !== expected) { deleteAppError = `Type "${expected}" to confirm` rerenderModal() return } deleteAppDeleting = true deleteAppError = '' rerenderModal() try { const res = await fetch(`/api/sync/apps/${deleteAppTarget.name}`, { method: 'DELETE', }) if (!res.ok) { throw new Error(`Failed to delete app: ${res.statusText}`) } // Success - close modal and navigate to dashboard closeModal() if (selectedApp === deleteAppTarget.name) { navigate('/') } } catch (err) { deleteAppError = err instanceof Error ? err.message : 'Failed to delete app' deleteAppDeleting = false rerenderModal() } } export function openDeleteAppModal(app: App) { deleteAppError = '' deleteAppDeleting = false deleteAppTarget = app const expected = `sudo rm ${app.name}` openModal('Delete App', () => (
{ e.preventDefault() const input = (e.target as HTMLFormElement).querySelector('input') as HTMLInputElement deleteApp(input) }}>

This will permanently delete {app.name} from the server.

Type "{expected}" to confirm {deleteAppError && {deleteAppError}}
)) }