import { Callout, Classes, Intent, Spinner, Toaster } from "@blueprintjs/core";
import { MythicComponent } from "@nteract/myths";
import React, { RefObject } from "react";
import { Dispatch } from "redux";
import styled from "styled-components";
import { initializeSystem } from "../myths/initialize-system";
import { NotificationAction, NotificationMessage, NotificationSystem } from "../types";
const FloatRight = styled.div`
float: right;
`;
const calloutStyle = {
margin: "-11px 0 -11px -11px",
background: "transparent",
};
const callbackOf = (action: NotificationAction, dispatch: Dispatch) => {
if ("callback" in action) {
return action.callback;
}
if ("dispatch" in action) {
return () => dispatch(action.dispatch);
}
}
export const blueprintjsNotificationSystem =
(toaster: Toaster, dispatch: Dispatch): NotificationSystem => ({
addNotification: (msg: NotificationMessage) => {
const intent = {
"in-progress": Intent.PRIMARY,
info: Intent.PRIMARY,
success: Intent.SUCCESS,
warning: Intent.WARNING,
error: Intent.DANGER,
}[msg.level ?? "info"];
toaster.show({
message: (
<>
{msg.level === "in-progress"
?
: null}
{msg.message}
>
),
action: msg.action
? {
icon: msg.action.icon ?? "arrow-right",
text: msg.action.label,
onClick: callbackOf(msg.action, dispatch),
}
: undefined,
timeout: msg.action || msg.level === "in-progress"
? 0
: 10_000,
}, msg.key);
},
});
const DoNotPrint =
styled.div`
@media print {
display: none;
}
`;
export const NotificationRoot =
initializeSystem.createConnectedComponent(
"NotificationRoot",
class extends MythicComponent<
typeof initializeSystem,
{ darkTheme?: boolean }
> {
toaster?: RefObject;
postConstructor(): void {
this.toaster = React.createRef();
}
componentDidMount(): void {
this.props.initializeSystem(
blueprintjsNotificationSystem(this.toaster!.current!, this.props.dispatch)
);
}
render(): JSX.Element {
return (
);
}
},
);