createYoltra
functionsignature
createYoltra<RM>(cfg): Yoltra<keyof RM & string, StateFromReducers<RM>, EMFromReducersStrict<RM>>One-call setup: create a store and its fully-typed React hooks together.
Type parameters
| Name | Type | Description |
|---|---|---|
RM | extends ReducersMapAny | Reducers map; state shape and event map are inferred from it. |
Parameters
cfg — object with:
| Name | Type | Description |
|---|---|---|
dedupWindowMs? | number | |
devtools? | { allowReplay?: boolean } | |
effects? | EffectSpec<DeepReadonly<StateFromReducers<RM>>, EMFromReducersStrict<RM>>[] | |
middleware? | MiddlewareFunction<DeepReadonly<StateFromReducers<RM>>, EMFromReducersStrict<RM>>[] | |
name | string | |
onEffectError? | (error: unknown, event: EventUnion<EMFromReducersStrict<RM>>) => void | |
reducer | RM |
Returns
Yoltra<keyof RM & string, StateFromReducers<RM>, EMFromReducersStrict<RM>> — The store, an optional StoreProvider, the raw StoreContext, and
the full set of typed hooks (useAtomicProp, useAtomicProps, useEmit,
useEvent, useSelector, useStore, shallowEqual).
Example
example
export const { store, useAtomicProp, useEmit } = createYoltra({
name: 'App',
reducer: {
counter: {
state: { value: 0 },
events: [['ui', 'increment']],
reducer: (s, e) => (e.type === 'increment' ? { value: s.value + e.payload } : s),
},
},
});
function Counter() {
const value = useAtomicProp({ reducer: 'counter', property: 'value' });
const emit = useEmit();
return <button onClick={() => emit('ui', 'increment', 1)}>{value}</button>;
}