@mic-rexjs/usecases-react
Version:
React-based solution for use usecases of Clean Architecture
78 lines • 2.22 kB
JavaScript
import { createUseCase } from '@mic-rexjs/usecases';
import { createContext } from 'react';
import { ArgumentTypes } from '../../enums/ArgumentTypes';
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 getUseCaseContext = usecase => {
if (!referenceMap.has(usecase)) {
return defaultUseCaseContext;
}
const _referenceMap$get = referenceMap.get(usecase),
value = _referenceMap$get.value;
return value;
};
const registerUseCase = (usecase, argumentTypes) => {
if (referenceMap.has(usecase)) {
const reference = referenceMap.get(usecase);
const value = reference.value,
times = reference.times;
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 = reference.value,
times = reference.times;
if (times === 1) {
referenceMap.delete(usecase);
} else {
referenceMap.set(usecase, {
value,
times: times - 1
});
}
return true;
};
return {
createContextValue,
getUseCaseContext,
registerUseCase,
unregisterUseCase
};
};
});