recoil-toolkit
Version:
32 lines (25 loc) • 925 B
text/typescript
import { atom, selector, selectorFamily, useRecoilValue, useResetRecoilState } from 'recoil';
import { ErrorAtom } from '../types';
export const ERRORS_STACK_SIZE = 100;
export const errorStack = atom<ErrorAtom[]>({
key: '@recoil-toolkit.errorStack',
default: [],
});
export const lastError = selector<ErrorAtom | undefined>({
key: '@recoil-toolkit.lastError',
get: ({ get }) => {
const e = get(errorStack);
return e.length > 0 ? e[e.length - 1] : undefined;
},
});
export const lastErrorType = selectorFamily<ErrorAtom | undefined, string>({
key: '@recoil-toolkit.lastErrorType',
get:
(key: string) =>
({ get }) =>
get(errorStack)
.filter(e => e.key === key)
.pop(),
});
export const useLastError = (key?: string) => useRecoilValue(key ? lastErrorType(key) : lastError);
export const useResetErrors = () => useResetRecoilState(errorStack);