ayanami
Version:
A better way to react with state
24 lines (23 loc) • 971 B
JavaScript
import { allActionSymbols } from '../symbols';
export function createActionDecorator(symbols) {
return () => (
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
target, propertyKey, descriptor) => {
addActionName(symbols, target.constructor, propertyKey);
return descriptor;
};
}
// eslint-disable-next-line @typescript-eslint/ban-types
function addActionName(symbols, constructor, actionName) {
const decoratedActionNames = Reflect.getMetadata(symbols.decorator, constructor) || [];
Reflect.defineMetadata(symbols.decorator, [...decoratedActionNames, actionName], constructor);
}
export function getActionNames(symbols, constructor) {
return Reflect.getMetadata(symbols.decorator, constructor) || [];
}
export function getAllActionNames(instance) {
return allActionSymbols.reduce((result, symbols) => [
...result,
...getActionNames(symbols, instance.constructor),
], []);
}