import { assign } from "xstate"; const FSM: any = { id: "setup", initial: "checkConfig", states: { checkConfig: { invoke: { src: "checkConfig", onDone: "checkUser", onError: "error", }, }, checkUser: { always: [ { cond: (ctx: any) => { console.log("check access token", ctx.user?.access_token); return ctx.user?.access_token; }, target: "connectToServer", }, { cond: (ctx: any) => { console.log("check guest", ctx.guest); return ctx.guest; }, target: "getGuestUser", }, { target: "login" }, ], }, getGuestUser: { entry: "getGuestUser", always: "login", }, login: { invoke: { src: "login", onDone: { target: "connectToServer", actions: assign({ user: (ctx: any, evt: any) => ({ ...ctx.user, ...evt.data }), }), }, onError: "error", }, }, connectToServer: { invoke: { src: "connectToServer", onDone: [ { cond: (ctx: any) => ctx.configKey, target: "getChatConfig", actions: assign((ctx: any, evt: any) => ({ ...ctx, ...evt.data })), }, { target: "completed", actions: assign((ctx: any, evt: any) => ({ ...ctx, ...evt.data })), }, ], onError: "error", }, }, getChatConfig: { invoke: [ { src: "getChatConfig", onDone: { target: "completed", actions: [ assign({ chatConfig: (_, evt: { data: any }) => evt.data }), ], }, onError: "error", }, ], }, completed: { type: "final", data: (ctx: any) => ctx, }, error: { entry: (ctx: any, event: any) => { console.log("error state entry action: " + JSON.stringify(event)); }, type: "final", }, }, }; export default FSM;