import { useEffect, useMemo, useState } from "react"; import type React from "react"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import { Button } from "@/components/button"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, } from "@/components/dialog"; import { SettingRow } from "@/components/section-card"; import { useConnectionDefaults } from "@/contexts/ConnectionDefaultsContext"; import { CURSOR_STYLES, TERMINAL_FONTS, TERMINAL_THEMES, } from "@/lib/terminal-themes"; import { fromTriState, toTriState, type RemoteDesktopDefaults, type TerminalDefaults, type TriState, } from "@/lib/connection-defaults"; const inputClass = "h-8 w-full border border-border bg-background px-2 text-xs outline-none focus:ring-1 focus:ring-ring"; const labelClass = "text-[10px] font-bold uppercase tracking-widest text-muted-foreground"; const RDP_TOGGLES = [ ["forceLossless", "hosts.guac.forceLossless", "hosts.guac.forceLosslessDesc"], ["enableWallpaper", "hosts.guac.wallpaper", "hosts.guac.wallpaperDesc"], [ "enableFontSmoothing", "hosts.guac.fontSmoothing", "hosts.guac.fontSmoothingDesc", ], [ "enableDesktopComposition", "hosts.guac.desktopComposition", "hosts.guac.desktopCompositionDesc", ], ["disableAudio", "hosts.guac.disableAudio", "hosts.guac.disableAudioDesc"], [ "enablePrinting", "hosts.guac.enablePrinting", "hosts.guac.enablePrintingDesc", ], [ "enableDrive", "hosts.guac.enableDriveRedirection", "hosts.guac.enableDriveRedirectionDesc", ], ["disableCopy", "hosts.guac.disableCopy", "hosts.guac.disableCopyDesc"], ["disablePaste", "hosts.guac.disablePaste", "hosts.guac.disablePasteDesc"], ] as const; function Field({ label, children, }: { label: string; children: React.ReactNode; }) { return (
{label} {children}
); } function TriStateSelect({ value, onChange, }: { value?: boolean; onChange: (value: boolean | undefined) => void; }) { const { t } = useTranslation(); return ( ); } export function ConnectionDefaultsSettings() { const { t } = useTranslation(); const defaults = useConnectionDefaults(); const [open, setOpen] = useState(false); const [tab, setTab] = useState<"terminal" | "rdp">("terminal"); const [terminal, setTerminal] = useState({}); const [rdp, setRdp] = useState({}); const [saving, setSaving] = useState(false); useEffect(() => { if (!defaults.ready) return; setTerminal(defaults.terminal); setRdp(defaults.rdp); }, [defaults.ready, defaults.terminal, defaults.rdp]); const configuredCount = useMemo(() => { const count = (source: Record) => Object.values(source).filter((value) => value !== undefined).length; return count(defaults.terminal) + count(defaults.rdp); }, [defaults.terminal, defaults.rdp]); const updateTerminal = ( key: K, value: TerminalDefaults[K], ) => setTerminal((current) => ({ ...current, [key]: value })); const updateRdp = ( key: K, value: RemoteDesktopDefaults[K], ) => setRdp((current) => ({ ...current, [key]: value })); async function save() { setSaving(true); try { await Promise.all([ defaults.saveDefaults("terminal", terminal), defaults.saveDefaults("rdp", rdp), ]); toast.success(t("newUi.sidebar.connectionDefaults.saved")); setOpen(false); } catch { toast.error(t("newUi.sidebar.connectionDefaults.saveFailed")); } finally { setSaving(false); } } const inheritLabel = t("newUi.sidebar.connectionDefaults.inherit"); return ( <> 0 ? String(configuredCount) : undefined} > {t("newUi.sidebar.connectionDefaults.title")} {t("newUi.sidebar.connectionDefaults.dialogDescription")}{" "} {t("hosts.docsLink")}
{( [ ["terminal", "newUi.sidebar.connectionDefaults.tabTerminal"], ["rdp", "newUi.sidebar.connectionDefaults.tabRemoteDesktop"], ] as const ).map(([id, labelKey]) => ( ))}
{tab === "terminal" ? (
updateTerminal( "fontSize", e.target.value ? Number(e.target.value) : undefined, ) } /> updateTerminal( "lineHeight", e.target.value ? Number(e.target.value) : undefined, ) } /> updateTerminal( "scrollback", e.target.value ? Number(e.target.value) : undefined, ) } />
updateTerminal("cursorBlink", value)} />
) : (
{RDP_TOGGLES.map(([key, labelKey, descriptionKey]) => ( updateRdp(key, value)} /> ))}
)}
); }