From 0ccff32262dcc101a6088fb67cd490675013e575 Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 23 Aug 2024 09:30:35 -0400 Subject: [PATCH] Avoid many snackbar messages --- packages/core/ui/SnackbarModel.tsx | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/packages/core/ui/SnackbarModel.tsx b/packages/core/ui/SnackbarModel.tsx index 8f3ac2cb45..fa45a44260 100644 --- a/packages/core/ui/SnackbarModel.tsx +++ b/packages/core/ui/SnackbarModel.tsx @@ -9,7 +9,6 @@ import { NotificationLevel, SnackAction } from '../util/types' import Report from '@mui/icons-material/Report' // lazies - const ErrorMessageStackTraceDialog = lazy( () => import('@jbrowse/core/ui/ErrorMessageStackTraceDialog'), ) @@ -28,8 +27,19 @@ export default function SnackbarModel() { return types .model({}) .volatile(() => ({ + /** + * #volatile + */ snackbarMessages: observable.array(), })) + .views(self => ({ + /** + * #getter + */ + get snackbarMessageSet() { + return new Map(self.snackbarMessages.map(s => [s.message, s])) + }, + })) .actions(self => ({ /** * #action @@ -42,6 +52,10 @@ export default function SnackbarModel() { }, 5000) } }, + + /** + * #action + */ notifyError(errorMessage: string, error?: unknown, extra?: unknown) { this.notify(errorMessage, 'error', { name: , @@ -66,7 +80,9 @@ export default function SnackbarModel() { level?: NotificationLevel, action?: SnackAction, ) { - return self.snackbarMessages.push({ message, level, action }) + if (action || !self.snackbarMessageSet.has(message)) { + self.snackbarMessages.push({ message, level, action }) + } }, /** * #action @@ -78,8 +94,8 @@ export default function SnackbarModel() { * #action */ removeSnackbarMessage(message: string) { - const element = self.snackbarMessages.find(f => f.message === message) - if (element) { + const element = self.snackbarMessageSet.get(message) + if (element !== undefined) { self.snackbarMessages.remove(element) } },