diff options
author | crupest <crupest@outlook.com> | 2020-09-03 23:09:03 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-03 23:09:03 +0800 |
commit | 292e5551c5a83a08e9e3c7125567a75f265d4374 (patch) | |
tree | 923c0183f0df17217e2534b50c4f49303aec9dca /Timeline/ClientApp/src/app/services/alert.ts | |
parent | edfefcf9bdbf5ba186a8f2c7d021acf04dbbb329 (diff) | |
parent | c97e69f7c22cc93cca44d14ae3c499c30f7760b8 (diff) | |
download | timeline-292e5551c5a83a08e9e3c7125567a75f265d4374.tar.gz timeline-292e5551c5a83a08e9e3c7125567a75f265d4374.tar.bz2 timeline-292e5551c5a83a08e9e3c7125567a75f265d4374.zip |
Merge pull request #159 from crupest/dev
Development on front end.
Diffstat (limited to 'Timeline/ClientApp/src/app/services/alert.ts')
-rw-r--r-- | Timeline/ClientApp/src/app/services/alert.ts | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/Timeline/ClientApp/src/app/services/alert.ts b/Timeline/ClientApp/src/app/services/alert.ts new file mode 100644 index 00000000..e4c0e653 --- /dev/null +++ b/Timeline/ClientApp/src/app/services/alert.ts @@ -0,0 +1,61 @@ +import React from "react"; +import pull from "lodash/pull"; + +export interface AlertInfo { + type?: "primary" | "secondary" | "success" | "danger" | "warning" | "info"; + message: string | React.FC<unknown> | { type: "i18n"; key: string }; + dismissTime?: number | "never"; +} + +export interface AlertInfoEx extends AlertInfo { + id: number; +} + +export type AlertConsumer = (alerts: AlertInfoEx) => void; + +export class AlertService { + private consumers: AlertConsumer[] = []; + private savedAlerts: AlertInfoEx[] = []; + private currentId = 1; + + private produce(alert: AlertInfoEx): void { + for (const consumer of this.consumers) { + consumer(alert); + } + } + + registerConsumer(consumer: AlertConsumer): void { + this.consumers.push(consumer); + if (this.savedAlerts.length !== 0) { + for (const alert of this.savedAlerts) { + this.produce(alert); + } + this.savedAlerts = []; + } + } + + unregisterConsumer(consumer: AlertConsumer): void { + pull(this.consumers, consumer); + } + + push(alert: AlertInfo): void { + const newAlert: AlertInfoEx = { ...alert, id: this.currentId++ }; + if (this.consumers.length === 0) { + this.savedAlerts.push(newAlert); + } else { + this.produce(newAlert); + } + } +} + +export const alertService = new AlertService(); + +export function pushAlert(alert: AlertInfo): void { + alertService.push(alert); +} + +export const kAlertHostId = "alert-host"; + +export function getAlertHost(): HTMLElement | null { + return document.getElementById(kAlertHostId); +} |