@mic-rexjs/usecases-react
Version:
React-based solution for use usecases of Clean Architecture
66 lines (65 loc) • 2.25 kB
JavaScript
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,
};
};
});