feat(settings): configure notification center

This commit is contained in:
Sucukdeluxe
2026-08-22 07:51:01 +02:00
parent b3f60eada8
commit 16679e73b5
9 changed files with 270 additions and 14 deletions
+34 -1
View File
@@ -270,6 +270,22 @@ export interface SettingsFormProjectionInput {
themeChoice?: "light" | "dark" | "system";
}
const NOTIFICATION_NUMBER_LIMITS = {
notifyRemainingThresholdGb: { min: 1, max: 100000, fallback: 50 },
notifyStallAfterSeconds: { min: 60, max: 3600, fallback: 90 },
notifyStallCooldownMinutes: { min: 5, max: 1440, fallback: 10 }
} as const;
export function normalizeNotificationNumberField(fieldId: string, value: unknown): number | undefined {
const limits = NOTIFICATION_NUMBER_LIMITS[fieldId as keyof typeof NOTIFICATION_NUMBER_LIMITS];
if (!limits) {
return undefined;
}
const parsed = Number(value);
const normalized = Number.isFinite(parsed) ? Math.floor(parsed) : limits.fallback;
return Math.max(limits.min, Math.min(limits.max, normalized));
}
export function buildSettingsFormViewModel({
settings,
section,
@@ -600,7 +616,24 @@ export function buildSettingsFormViewModel({
{ id: "notifyMention", kind: "text", label: "Discord-Erwähnung (optional)", value: settings.notifyMention },
{ id: "notifyOnPackageCompleted", kind: "switch", label: "Melden, wenn ein Paket fertig ist", value: settings.notifyOnPackageCompleted },
{ id: "notifyOnPackageFailed", kind: "switch", label: "Melden, wenn ein Paket fehlschlägt", value: settings.notifyOnPackageFailed },
{ id: "notifyOnRunFinished", kind: "switch", label: "Melden, wenn alles fertig ist", value: settings.notifyOnRunFinished }
{
id: "notifyPackageSuccessMode",
kind: "select",
label: "Erfolgsmeldungen senden",
value: settings.notifyPackageSuccessMode,
disabled: !settings.notifyOnPackageCompleted,
options: [
{ value: "digest", label: "Gesammelt (alle 2 Minuten)" },
{ value: "individual", label: "Jedes Paket einzeln" }
]
},
{ id: "notifyOnRunFinished", kind: "switch", label: "Melden, wenn der gesamte Lauf fertig ist", value: settings.notifyOnRunFinished },
{ id: "notifyOnRemainingBelow", kind: "switch", label: "Melden, wenn die Restmenge unterschritten wird", value: settings.notifyOnRemainingBelow },
{ id: "notifyRemainingThresholdGb", kind: "number", label: "Restmengenschwelle (GB)", value: String(settings.notifyRemainingThresholdGb), min: 1, max: 100000, disabled: !settings.notifyOnRemainingBelow },
{ id: "notifyOnDownloadStall", kind: "switch", label: "Melden, wenn Downloads stillstehen", value: settings.notifyOnDownloadStall },
{ id: "notifyStallAfterSeconds", kind: "number", label: "Stillstand bestätigen nach (Sek.)", value: String(settings.notifyStallAfterSeconds), min: 60, max: 3600, disabled: !settings.notifyOnDownloadStall },
{ id: "notifyStallCooldownMinutes", kind: "number", label: "Frühestens erneut melden nach (Min.)", value: String(settings.notifyStallCooldownMinutes), min: 5, max: 1440, disabled: !settings.notifyOnDownloadStall },
{ id: "notifyOnDownloadRecovery", kind: "switch", label: "Melden, wenn Downloads wieder laufen", value: settings.notifyOnDownloadRecovery, disabled: !settings.notifyOnDownloadStall }
]
}
]