"use client"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from "@/components/ui/alert-dialog"; import { DAY_OF_WEEK_OPTIONS, SCHEDULE_TIME_OPTIONS, type ScheduledRebootInput, type SettingsBackend, } from "@/modules/settings/components/panel/types"; import { InfoBanner, SectionDivider, Toggle } from "@/modules/settings/components/panel/controls"; import { SETTINGS_PANEL_INSET } from "@/modules/settings/components/panel/surface"; import { AlertTriangle, Loader2, Power, RefreshCw } from "@/components/icons/platform-icons"; import { useEffect, useState } from "react"; import { cn } from "@/lib/utils"; type PowerSectionProps = { power: SettingsBackend["power"]; onRebootNow: () => Promise; onShutdownNow: () => Promise; onSaveScheduledReboot: (input: ScheduledRebootInput) => Promise; onFactoryReset: () => Promise; }; const selectCls = "h-8 w-36 cursor-pointer appearance-none rounded-lg border border-glass-border bg-background/55 px-3 text-xs text-foreground focus:border-primary/40 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50"; function PreferenceRow({ label, description, children, }: { label: string; description?: string; children: React.ReactNode; }) { return (
{label}
{description && (
{description}
)}
{children}
); } export function PowerSection({ power, onRebootNow, onShutdownNow, onSaveScheduledReboot, onFactoryReset, }: PowerSectionProps) { const rebooting = power.reboot.isPending; const shuttingDown = power.shutdown.isPending; const resetting = power.factoryReset.isPending; const scheduledReboot = power.scheduledReboot; const [scheduleEnabled, setScheduleEnabled] = useState(scheduledReboot.enabled); const [scheduleFrequency, setScheduleFrequency] = useState(scheduledReboot.frequency); const [scheduleDayOfWeek, setScheduleDayOfWeek] = useState(scheduledReboot.dayOfWeek); const [scheduleTime, setScheduleTime] = useState(scheduledReboot.time); useEffect(() => { setScheduleEnabled(scheduledReboot.enabled); setScheduleFrequency(scheduledReboot.frequency); setScheduleDayOfWeek(scheduledReboot.dayOfWeek); setScheduleTime(scheduledReboot.time); }, [scheduledReboot.dayOfWeek, scheduledReboot.enabled, scheduledReboot.frequency, scheduledReboot.time]); const scheduleDirty = scheduleEnabled !== scheduledReboot.enabled || scheduleFrequency !== scheduledReboot.frequency || scheduleDayOfWeek !== scheduledReboot.dayOfWeek || scheduleTime !== scheduledReboot.time; const scheduleDisabled = scheduledReboot.isLoading || scheduledReboot.isPending; return (
{/* ── Power Management ── */} {power.reboot.error && } {power.shutdown.error && }
Reboot server? All running Docker containers and services will be temporarily stopped and restarted. This takes about 30–60 seconds. Cancel void onRebootNow()} disabled={rebooting} > {rebooting ? <>Rebooting… : "Reboot now"} Shut down server? This powers the machine off completely. You will need to start it again manually before Homeio becomes available. Cancel void onShutdownNow()} disabled={shuttingDown} > {shuttingDown ? <>Shutting down… : "Shutdown now"}
{/* ── Scheduled Reboot ── */} {scheduledReboot.error && }
setScheduleEnabled((v) => !v)} disabled={scheduleDisabled} />
{scheduleFrequency === "weekly" && ( )}
{scheduleEnabled ? `Reboot will run ${scheduleFrequency === "daily" ? "daily" : `every ${scheduleDayOfWeek}`} at ${scheduleTime}.` : "Scheduled reboot is disabled."}
{/* ── Factory Reset ── */} {power.factoryReset.error && }
Factory reset server
Wipes all data and returns Homeio to a clean state
Factory reset server? This is destructive. Homeio will remove Docker containers, images, volumes, custom networks, reset the database, wipe /DATA, recreate a clean data root, and reboot. After reset, you will need to register a new user. Cancel void onFactoryReset()} disabled={resetting} > {resetting ? <>Resetting… : "Factory reset"}
); }