Skip to content

Commit

Permalink
fix(event): timing of event subscribe
Browse files Browse the repository at this point in the history
  • Loading branch information
foreleven authored and JounQin committed Aug 22, 2019
1 parent b177708 commit 08fc419
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 40 deletions.
2 changes: 1 addition & 1 deletion example/src/services/TodoService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export class TodoService {
state: 'todo',
},
]);
}, 500);
}, 1);
});
}
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "stated-bean",
"version": "0.1.2-RC",
"version": "0.1.2-RC.1",
"repository": "git@github.com:mjolnirjs/stated-bean.git",
"license": "MIT",
"main": "dist/cjs",
Expand Down
5 changes: 2 additions & 3 deletions src/hooks/useContainer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,11 @@ export function useContainer(
const context = useContext(StatedBeanContext);

const [container] = useState(() => {
const c = new StatedBeanContainer(context.container, application);
c.register(...types);
return c;
return new StatedBeanContainer(context.container, application);
});

useEffect(() => {
console.log('stated-bean register,', (types || []).map(t => t.name));
container.register(...types);
}, [container, types]);
return container;
Expand Down
61 changes: 27 additions & 34 deletions src/hooks/useStatedBean.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,25 @@ export function useStatedBean<T extends ClassType>(
): InstanceType<T> {
const StateBeanContext = getStatedBeanContext();
const context = useContext(StateBeanContext);
const [, setVersion] = useState(0);
const [changeEvent] = useState(Symbol.for(type.name + '_changed'));

const beanChangeListener = useCallback(
(effect: EffectContext) => {
// console.log('receive change event', effect);
const field = effect.fieldMeta.name;
if (
option.dependentFields == null ||
option.dependentFields.length === 0 ||
option.dependentFields.includes(field)
) {
setVersion(prev => prev + 1);
}
},
[option.dependentFields],
);

const getContainer = useCallback(() => {
const [container] = useState<StatedBeanContainer | undefined>(() => {
let container;

if (option.scope === StatedBeanScope.CONTEXT) {
Expand All @@ -32,52 +49,28 @@ export function useStatedBean<T extends ClassType>(
container.register(type);
}

if (container !== undefined) {
container.on(changeEvent, beanChangeListener);
}
return container;
}, [option.scope, context.container, type]);
const [container, setContainer] = useState<StatedBeanContainer | undefined>(
() => getContainer(),
);
});

if (container === undefined) {
throw new Error('not found container');
}

const [bean, setBean] = useState(() =>
container.getBean<InstanceType<T>>(type),
);

useEffect(() => {
const container = getContainer();

if (container) {
setContainer(container);
container.register(type);
setBean(container.getBean<InstanceType<T>>(type));
}
}, [getContainer, type]);
const [bean] = useState(() => {
return container.getBean<InstanceType<T>>(type);
});

if (bean === undefined) {
throw new Error(`get bean[${type.name}] error`);
}

const [, setVersion] = useState(0);

useEffect(() => {
const changeEvent = Symbol.for(bean.constructor.name + '_changed');
const beanChangeListener = (effect: EffectContext) => {
// console.log('receive change event', effect);
const field = effect.fieldMeta.name;
if (
option.dependentFields == null ||
option.dependentFields.length === 0 ||
option.dependentFields.includes(field)
) {
setVersion(prev => prev + 1);
}
};
container.on(changeEvent, beanChangeListener);
return () => container.off(changeEvent, beanChangeListener);
}, [container, bean, option.dependentFields]);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

return bean;
}
2 changes: 1 addition & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"paths": {
"stated-bean": ["src"]
},
"sourceMap": true,
"inlineSourceMap": true,
"strict": true,
"stripInternal": true,
"target": "es5"
Expand Down

0 comments on commit 08fc419

Please sign in to comment.