UNPKG

@jbrowse/core

Version:

JBrowse 2 core libraries used by plugins

67 lines (66 loc) 2.3 kB
import { lazy } from 'react'; import { types } from '@jbrowse/mobx-state-tree'; import { observable } from 'mobx'; const ErrorMessageStackTraceDialog = lazy(() => import("./ErrorMessageStackTraceDialog.js")); export default function SnackbarModel() { return types .model({}) .volatile(() => ({ snackbarMessages: observable.array(), })) .views(self => ({ get snackbarMessageSet() { return new Map(self.snackbarMessages.map(s => [s.message, s])); }, })) .actions(self => ({ notify(message, level, action) { const actions = action ? Array.isArray(action) ? action : [action] : undefined; this.pushSnackbarMessage(message, level, actions); if (level === 'info' || level === 'success') { setTimeout(() => { this.removeSnackbarMessage(message); }, 5000); } }, notifyError(errorMessage, error, extra, action) { const reportAction = { name: 'report', onClick: () => { self.queueDialog((onClose) => [ ErrorMessageStackTraceDialog, { onClose, error, extra, }, ]); }, }; const actions = action ? [reportAction, action] : [reportAction]; this.pushSnackbarMessage(errorMessage, 'error', actions); }, pushSnackbarMessage(message, level, actions) { if (actions?.length || !self.snackbarMessageSet.has(message)) { self.snackbarMessages.push({ message, level, actions, }); } }, popSnackbarMessage() { return self.snackbarMessages.pop(); }, removeSnackbarMessage(message) { const element = self.snackbarMessageSet.get(message); if (element !== undefined) { self.snackbarMessages.remove(element); } }, })); }