From ffb1ba81080c5af1832e02c1f447c6c9cd0566ce Mon Sep 17 00:00:00 2001 From: Tianrong Zhang Date: Thu, 11 Jun 2026 23:35:43 -0400 Subject: [PATCH] Harden filter import: item-level validation and user feedback importFromAyuGram now skips individual malformed entries (missing id/text) instead of crashing, and validates the top-level structure properly. Import shows a toast on success, empty result, or parse failure. --- .../left/settings/SettingsAyuLike.tsx | 15 +++++++---- src/util/ayuLike/messageFilters.ts | 25 ++++++++++++------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/components/left/settings/SettingsAyuLike.tsx b/src/components/left/settings/SettingsAyuLike.tsx index 46e55c3dc..30f02d873 100644 --- a/src/components/left/settings/SettingsAyuLike.tsx +++ b/src/components/left/settings/SettingsAyuLike.tsx @@ -33,7 +33,7 @@ const SettingsAyuLike = ({ messageFilters, onReset, }: OwnProps & StateProps) => { - const { setSharedSettingOption } = getActions(); + const { setSharedSettingOption, showNotification } = getActions(); const fileInputRef = useRef(); const [isClearConfirmOpen, openClearConfirm, closeClearConfirm] = useFlag(false); @@ -59,11 +59,16 @@ const SettingsAyuLike = ({ reader.onload = () => { try { const imported = importFromAyuGram(JSON.parse(reader.result as string)); - setSharedSettingOption({ - ayuLike: { hideSponsoredMessages, messageFilters: imported }, - }); + if (imported.length === 0) { + showNotification({ message: 'No valid filter rules found in file' }); + } else { + setSharedSettingOption({ + ayuLike: { hideSponsoredMessages, messageFilters: imported }, + }); + showNotification({ message: `Imported ${imported.length} filter rules` }); + } } catch { - // Silently ignore malformed files — user will see no change + showNotification({ message: 'Invalid file: not a valid AyuGram filter export' }); } // Reset so the same file can be re-imported e.target.value = ''; diff --git a/src/util/ayuLike/messageFilters.ts b/src/util/ayuLike/messageFilters.ts index dbeff25ec..ba177b426 100644 --- a/src/util/ayuLike/messageFilters.ts +++ b/src/util/ayuLike/messageFilters.ts @@ -47,16 +47,23 @@ interface AyuGramExport { export function importFromAyuGram(json: unknown): MessageFilterRule[] { const data = json as AyuGramExport; - if (!Array.isArray(data?.filters)) throw new Error('Invalid AyuGram export format'); + if (!data || typeof data !== 'object' || !Array.isArray(data.filters)) { + throw new Error('Invalid AyuGram export format'); + } - return data.filters.map((f) => ({ - id: f.id, - enabled: Boolean(f.enabled), - reversed: Boolean(f.reversed), - caseInsensitive: Boolean(f.caseInsensitive), - regex: f.text, - chatIds: f.dialogId ? [String(f.dialogId)] : undefined, - })); + return data.filters.flatMap((f) => { + if (!f || typeof f !== 'object') return []; + if (typeof f.id !== 'string' || !f.id) return []; + if (typeof f.text !== 'string' || !f.text) return []; + return [{ + id: f.id, + enabled: Boolean(f.enabled), + reversed: Boolean(f.reversed), + caseInsensitive: Boolean(f.caseInsensitive), + regex: f.text, + chatIds: f.dialogId ? [String(f.dialogId)] : undefined, + }]; + }); } export function exportToAyuGram(rules: MessageFilterRule[]): string {