From 1386b63db2c2693311d647af03c6db267b0eeacc Mon Sep 17 00:00:00 2001 From: Denozordec Date: Wed, 8 Apr 2026 14:33:43 +0700 Subject: [PATCH] fix: improve input handling and validation for settings fields Updated the settings page to ensure proper handling of potentially undefined values by using the nullish coalescing operator. This change enhances the validation logic for various input fields, ensuring that only valid IPv4 and IPv6 addresses, as well as positive integers, are accepted. Additionally, improved user feedback by adding an error message when attempting to save settings with validation errors. --- web/src/routes/settings/+page.svelte | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/web/src/routes/settings/+page.svelte b/web/src/routes/settings/+page.svelte index c825699..07f307a 100644 --- a/web/src/routes/settings/+page.svelte +++ b/web/src/routes/settings/+page.svelte @@ -105,25 +105,25 @@ revision_retention_minutes: '' }; - const routerId = knownFields.bird_router_id.trim(); + const routerId = String(knownFields.bird_router_id ?? '').trim(); if (routerId && !isValidIPv4(routerId)) errors.bird_router_id = 'Введите корректный IPv4 адрес'; - const localV4 = knownFields.bird_local_ipv4.trim(); + const localV4 = String(knownFields.bird_local_ipv4 ?? '').trim(); if (localV4 && !isValidIPv4(localV4)) errors.bird_local_ipv4 = 'Введите корректный IPv4 адрес'; - const localV6 = knownFields.bird_local_ipv6.trim(); + const localV6 = String(knownFields.bird_local_ipv6 ?? '').trim(); if (localV6 && !isValidIPv6(localV6)) errors.bird_local_ipv6 = 'Введите корректный IPv6 адрес'; - const asn = knownFields.bird_local_asn.trim(); + const asn = String(knownFields.bird_local_asn ?? '').trim(); if (asn && !isPositiveInt(asn)) errors.bird_local_asn = 'ASN должен быть целым числом больше 0'; - const bgpV4 = knownFields.bird_bgp_source_ipv4.trim(); + const bgpV4 = String(knownFields.bird_bgp_source_ipv4 ?? '').trim(); if (bgpV4 && !isValidIPv4(bgpV4)) errors.bird_bgp_source_ipv4 = 'Введите корректный IPv4 адрес'; - const bgpV6 = knownFields.bird_bgp_source_ipv6.trim(); + const bgpV6 = String(knownFields.bird_bgp_source_ipv6 ?? '').trim(); if (bgpV6 && !isValidIPv6(bgpV6)) errors.bird_bgp_source_ipv6 = 'Введите корректный IPv6 адрес'; - const revisionRetentionMinutes = knownFields.revision_retention_minutes.trim(); + const revisionRetentionMinutes = String(knownFields.revision_retention_minutes ?? '').trim(); if (revisionRetentionMinutes) { const ttl = Number(revisionRetentionMinutes); if ( @@ -210,7 +210,7 @@ if (loadingSettings || savingSettings || hasValidationErrors) return false; const hasKnownValues = knownFieldKeys.some((key) => { - const value = knownFields[key].trim(); + const value = String(knownFields[key] ?? '').trim(); return value !== '' && !knownFieldErrors[key]; }); const hasAdditionalValues = additionalSettings.some((entry) => entry.key.trim() !== ''); @@ -219,11 +219,14 @@ }); async function saveApiSettings() { - if (!canSaveSettings) return; + if (!canSaveSettings) { + toast.error('Нечего сохранять или есть ошибки в полях'); + return; + } const payload: Record = {}; for (const key of knownFieldKeys) { - const value = knownFields[key].trim(); + const value = String(knownFields[key] ?? '').trim(); if (!value || knownFieldErrors[key]) continue; if (key === 'bird_local_asn' || key === 'revision_retention_minutes') payload[key] = Number(value); else payload[key] = value;