Files
AFFiNE-Mirror/packages/frontend/component/src/components/global-loading/index.jotai.ts
T
2023-11-10 03:25:05 +00:00

36 lines
893 B
TypeScript

import { atom } from 'jotai';
import { nanoid } from 'nanoid';
export type GlobalLoadingEvent = {
key?: string;
};
const globalLoadingEventsBaseAtom = atom<GlobalLoadingEvent[]>([]);
export const globalLoadingEventsAtom = atom<GlobalLoadingEvent[]>(get =>
get(globalLoadingEventsBaseAtom)
);
export const resolveGlobalLoadingEventAtom = atom(
null,
(_, set, key: string) => {
set(globalLoadingEventsBaseAtom, globalLoadingEvent =>
globalLoadingEvent.filter(notification => notification.key !== key)
);
}
);
export const pushGlobalLoadingEventAtom = atom<
null,
[GlobalLoadingEvent],
void
>(null, (_, set, newGlobalLoadingEvent) => {
newGlobalLoadingEvent.key = newGlobalLoadingEvent.key || nanoid();
set(globalLoadingEventsBaseAtom, globalLoadingEvents => [
// push to the top
{ ...newGlobalLoadingEvent },
...globalLoadingEvents,
]);
});