Releases: statelyai/xstate
xstate@5.13.0
Minor Changes
-
#4832
148d8fcef
Thanks @cevr! -fromPromise
now passes a signal into its creator function.const logic = fromPromise(({ signal }) => fetch('https://api.example.com', { signal }) );
This will be called whenever the state transitions before the promise is resolved. This is useful for cancelling the promise if the state changes.
Patch Changes
-
#4876
3f6a73b56
Thanks @davidkpiano! - XState will now warn when calling built-in actions likeassign
,sendTo
,raise
,emit
, etc. directly inside of a custom action. See https://stately.ai/docs/actions#built-in-actions for more details.const machine = createMachine({ entry: () => { // Will warn: // "Custom actions should not call \`assign()\` directly, as it is not imperative. See https://stately.ai/docs/actions#built-in-actions for more details." assign({ // ... }); } });
xstate@5.12.0
Minor Changes
-
#4863
0696adc21
Thanks @davidkpiano! - Meta objects for state nodes and transitions can now be specified insetup({ types: … })
:const machine = setup({ types: { meta: {} as { layout: string; } } }).createMachine({ initial: 'home', states: { home: { meta: { layout: 'full' } } } }); const actor = createActor(machine).start(); actor.getSnapshot().getMeta().home; // => { layout: 'full' } // if in "home" state
@xstate/vue@3.1.2
Patch Changes
-
#4844
5aa6eb05c
Thanks @davidkpiano! - TheuseSelector(…)
hook from@xstate/react
is now compatible with stores from@xstate/store
.import { createStore } from '@xstate/store'; import { useSelector } from '@xstate/react'; const store = createStore( { count: 0 }, { inc: { count: (context) => context.count + 1 } } ); function Counter() { // Note that this `useSelector` is from `@xstate/react`, // not `@xstate/store/react` const count = useSelector(store, (state) => state.context.count); return ( <div> <button onClick={() => store.send({ type: 'inc' })}>{count}</button> </div> ); }
@xstate/svelte@3.0.3
Patch Changes
-
#4844
5aa6eb05c
Thanks @davidkpiano! - TheuseSelector(…)
hook from@xstate/react
is now compatible with stores from@xstate/store
.import { createStore } from '@xstate/store'; import { useSelector } from '@xstate/react'; const store = createStore( { count: 0 }, { inc: { count: (context) => context.count + 1 } } ); function Counter() { // Note that this `useSelector` is from `@xstate/react`, // not `@xstate/store/react` const count = useSelector(store, (state) => state.context.count); return ( <div> <button onClick={() => store.send({ type: 'inc' })}>{count}</button> </div> ); }
@xstate/react@4.1.1
Patch Changes
-
#4844
5aa6eb05c
Thanks @davidkpiano! - TheuseSelector(…)
hook from@xstate/react
is now compatible with stores from@xstate/store
.import { createStore } from '@xstate/store'; import { useSelector } from '@xstate/react'; const store = createStore( { count: 0 }, { inc: { count: (context) => context.count + 1 } } ); function Counter() { // Note that this `useSelector` is from `@xstate/react`, // not `@xstate/store/react` const count = useSelector(store, (state) => state.context.count); return ( <div> <button onClick={() => store.send({ type: 'inc' })}>{count}</button> </div> ); }
xstate@5.11.0
Minor Changes
-
#4806
f4e0ec48c
Thanks @davidkpiano! - Inline actor logic is now permitted when named actors are present. Defining inline actors will no longer cause a TypeScript error:const machine = setup({ actors: { existingActor: fromPromise(async () => { // ... }) } }).createMachine({ invoke: { src: fromPromise(async () => { // Inline actor }) // ... } });
xstate@5.10.0
Minor Changes
-
#4822
f7f1fbbf3
Thanks @davidkpiano! - Theclock
andlogger
specified in theoptions
object ofcreateActor(logic, options)
will now propagate to all actors created within the same actor system.import { setup, log, createActor } from 'xstate'; const childMachine = setup({ // ... }).createMachine({ // ... // Uses custom logger from root actor entry: log('something') }); const parentMachine = setup({ // ... }).createMachine({ // ... invoke: { src: childMachine } }); const actor = createActor(parentMachine, { logger: (...args) => { // custom logger for args } }); actor.start();
@xstate/store@0.0.3
Patch Changes
-
#4842
3a57f4c69
Thanks @davidkpiano! - Update README.md -
#4839
4a22edb90
Thanks @davidkpiano! - Update JS docs
@xstate/store@0.0.2
Patch Changes
-
#4752
8a32374e7
Thanks @davidkpiano! - Initial release of@xstate/store
import { createStore } from '@xstate/store'; const store = createStore( // initial context { count: 0, greeting: 'hello' }, // transitions { inc: { count: (context) => context.count + 1 }, updateBoth: { count: () => 42, greeting: 'hi' } } ); store.send({ type: 'inc' }); console.log(store.getSnapshot()); // Logs: // { // status: 'active', // context: { // count: 1, // greeting: 'hello' // } // }