UNPKG

@mic-rexjs/usecases-react

Version:

React-based solution for use usecases of Clean Architecture

66 lines (65 loc) 2.25 kB
import { createUseCase } from '@mic-rexjs/usecases'; import { ArgumentTypes } from '../../enums/ArgumentTypes'; import { createContext } from 'react'; import { Statuses } from '../../enums/Statuses'; export const contextUseCase = createUseCase(() => { const referenceMap = new Map(); const defaultUseCaseContext = createContext(null); return () => { const createContextValue = (store, reducers, statuses) => { if ((statuses & Statuses.EntityEnabled) === Statuses.EntityEnabled) { return { store, reducers, statuses, }; } return { reducers, statuses }; }; const registerUseCase = (usecase, argumentTypes) => { if (referenceMap.has(usecase)) { const reference = referenceMap.get(usecase); const { value, times } = reference; referenceMap.set(usecase, { value, times: times + 1, }); return value; } if ((argumentTypes & ArgumentTypes.Entity) !== ArgumentTypes.Entity) { return defaultUseCaseContext; } const context = createContext(null); referenceMap.set(usecase, { value: context, times: 1, }); return context; }; const unregisterUseCase = (usecase, argumentTypes) => { if ((argumentTypes & ArgumentTypes.Entity) !== ArgumentTypes.Entity) { return false; } if (!referenceMap.has(usecase)) { return false; } const reference = referenceMap.get(usecase); const { value, times } = reference; if (times === 1) { referenceMap.delete(usecase); } else { referenceMap.set(usecase, { value, times: times - 1, }); } return true; }; return { createContextValue, registerUseCase, unregisterUseCase, }; }; });