@jbrowse/core
Version:
JBrowse 2 core libraries used by plugins
67 lines (66 loc) • 2.3 kB
JavaScript
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);
}
},
}));
}