feat(settings): configure notification center
This commit is contained in:
@@ -120,6 +120,7 @@ import {
|
||||
buildTargetedAccountCheck,
|
||||
projectAccountRows,
|
||||
resolveHistoryRetentionSelection,
|
||||
normalizeNotificationNumberField,
|
||||
sortAccountRows,
|
||||
formatAccountContextHeading,
|
||||
type AccountAddOption,
|
||||
@@ -279,7 +280,7 @@ interface RendererSettingsDraft extends RendererSettings {
|
||||
notifyUrl: string;
|
||||
}
|
||||
|
||||
function createSettingsDraft(settings: RendererSettings, current?: RendererSettingsDraft): RendererSettingsDraft {
|
||||
export function createSettingsDraft(settings: RendererSettings, current?: RendererSettingsDraft): RendererSettingsDraft {
|
||||
return {
|
||||
...settings,
|
||||
archivePasswordList: current?.archivePasswordList || "",
|
||||
@@ -5311,6 +5312,11 @@ export function App(): ReactElement {
|
||||
setBool(fieldId as keyof RendererSettingsDraft, value);
|
||||
return;
|
||||
}
|
||||
const notificationNumber = normalizeNotificationNumberField(fieldId, value);
|
||||
if (notificationNumber !== undefined) {
|
||||
setNum(fieldId as keyof RendererSettingsDraft, notificationNumber);
|
||||
return;
|
||||
}
|
||||
const numericLimits: Partial<Record<keyof RendererSettingsDraft, [number, number, number]>> = {
|
||||
maxParallel: [1, 50, 1],
|
||||
retryLimit: [0, 99, 0],
|
||||
|
||||
@@ -16,6 +16,9 @@ const pairs = [
|
||||
["In den Infobereich minimieren", "Minimize to tray"], ["Vor dem Löschen nachfragen", "Confirm before deleting"], ["Download-Liste mitsichern", "Include download list in backup"],
|
||||
["Ferndiagnose-Einstellungen mitsichern", "Include remote diagnostics settings in backup"], ["Webhook-Adresse", "Webhook address"], ["Discord-Erwähnung (optional)", "Discord mention (optional)"],
|
||||
["Melden, wenn ein Paket fertig ist", "Notify when a package completes"], ["Melden, wenn ein Paket fehlschlägt", "Notify when a package fails"], ["Melden, wenn alles fertig ist", "Notify when everything completes"],
|
||||
["Erfolgsmeldungen senden", "Send success notifications"], ["Gesammelt (alle 2 Minuten)", "Grouped (every 2 minutes)"], ["Jedes Paket einzeln", "Each package individually"],
|
||||
["Melden, wenn der gesamte Lauf fertig ist", "Notify when the entire run completes"], ["Melden, wenn die Restmenge unterschritten wird", "Notify when the remaining amount falls below the threshold"], ["Restmengenschwelle (GB)", "Remaining amount threshold (GB)"],
|
||||
["Melden, wenn Downloads stillstehen", "Notify when downloads stall"], ["Stillstand bestätigen nach (Sek.)", "Confirm stall after (sec.)"], ["Frühestens erneut melden nach (Min.)", "Notify again after at least (min.)"], ["Melden, wenn Downloads wieder laufen", "Notify when downloads resume"],
|
||||
["Quelle und Zeitpunkt der Update-Prüfung.", "Update source and check timing."], ["Aktualisierung", "Update"], ["Beim Start nach Updates suchen", "Check for updates on startup"], ["Update-Quelle", "Update source"],
|
||||
["Jetzt nach einer neuen Version suchen", "Check for a new version now"], ["Nach Updates suchen", "Check for updates"], ["Quelle im Format Benutzer/Repository.", "Source in owner/repository format."],
|
||||
["Update verfügbar", "Update available"], ["Eine neue Version ist bereit. Klicke hier, um sie zu installieren.", "A new version is ready. Click here to install it."], ["Update installieren", "Install update"],
|
||||
|
||||
@@ -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 }
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user