* refactor: ♻️ refactor isHosted && type clean up Change-Id: I4dfbad8a07607432801de78920ce42bf81e46498 * refactor: ♻️ code clean up Change-Id: I8f487a33d332a2acaff84397a97371b56ace28a1 * feat: 💄 lint Change-Id: I776b1a5e249bdb542f8e6da7cb2277821cf91094 * feat: ✨ ci type Change-Id: I486dde7bf60321238e9a394c40ad8cdb8bfc54c8 * feat: some code sugession Change-Id: I4761d057344b95a98e99068d312a42292977875b
56 lines
1.2 KiB
TypeScript
56 lines
1.2 KiB
TypeScript
import { orderBy } from "lodash";
|
|
import { observable, action, computed } from "mobx";
|
|
import { v4 as uuidv4 } from "uuid";
|
|
import { Toast, ToastOptions } from "~/types";
|
|
|
|
export default class ToastsStore {
|
|
@observable
|
|
toasts: Map<string, Toast> = new Map();
|
|
|
|
lastToastId: string;
|
|
|
|
@action
|
|
showToast = (
|
|
message: string,
|
|
options: ToastOptions = {
|
|
type: "info",
|
|
}
|
|
) => {
|
|
if (!message) {
|
|
return;
|
|
}
|
|
const lastToast = this.toasts.get(this.lastToastId);
|
|
|
|
if (lastToast?.message === message) {
|
|
this.toasts.set(this.lastToastId, {
|
|
...lastToast,
|
|
reoccurring: lastToast.reoccurring ? ++lastToast.reoccurring : 1,
|
|
});
|
|
return this.lastToastId;
|
|
}
|
|
|
|
const id = uuidv4();
|
|
const createdAt = new Date().toISOString();
|
|
this.toasts.set(id, {
|
|
id,
|
|
message,
|
|
createdAt,
|
|
type: options.type,
|
|
timeout: options.timeout,
|
|
action: options.action,
|
|
});
|
|
this.lastToastId = id;
|
|
return id;
|
|
};
|
|
|
|
@action
|
|
hideToast = (id: string) => {
|
|
this.toasts.delete(id);
|
|
};
|
|
|
|
@computed
|
|
get orderedData(): Toast[] {
|
|
return orderBy(Array.from(this.toasts.values()), "createdAt", "desc");
|
|
}
|
|
}
|