statelyai / xstate-tools

Public monorepo for XState tooling
183 stars 40 forks source link

Machines with parametric send don't work #26

Open smarko82 opened 3 years ago

smarko82 commented 3 years ago

The following machine does not render anything in the visualizer...

export const loadingFSMSchema = createMachine({
  initial: 'idle',
  states: {
    idle: {
      entry: [actions.log((context) => '--- [loadingFSM] --- idle '), send((context) => 'aa')],
      after: {
        4000: {
          target: 'finalState',
          // actions: send('LOADING_COMPLETED'),
        },
      },
    },

    finalState: {
      entry: [actions.log('--- [loading FSM] --- finalState '), send('LOADING_COMPLETED')],
      type: 'final',
    },
  },
  on: {
    '*': {
      actions: actions.log('ahahahhdsjkl'),
    },
  },
});

Same machine does render if I don't use parametric send send((context) => ...):

export const loadingFSMSchema = createMachine({
  initial: 'idle',
  states: {
    idle: {
      entry: [actions.log((context) => '--- [loadingFSM] --- idle '), send('aa')],
      after: {
        4000: {
          target: 'finalState',
          // actions: send('LOADING_COMPLETED'),
        },
      },
    },

    finalState: {
      entry: [actions.log('--- [loading FSM] --- finalState '), send('LOADING_COMPLETED')],
      type: 'final',
    },
  },
  on: {
    '*': {
      actions: actions.log('ahahahhdsjkl'),
    },
  },
});
mattpocock commented 3 years ago

@smarko82 What do you mean by 'does not render anything'?

smarko82 commented 2 years ago

Here it's XState tool working with send("pippo") as entry action of idle state.

Screenshot 2021-12-01 at 12 42 57


Here it's XState tool not working (doesn't render anyithing) with send((context) => context.pippo) as entry action of idle state. It doesn't work also if I add context: { pippo: "foo" } as param to object passed to createMachine function.

Screenshot 2021-12-01 at 12 44 10

mogarick commented 2 years ago

I can add that when using entry:log("something") nothing gets rendered. It only happens for the entry that belongs to the initial state. So in the @smarko82 example, if I use

idle:{
  entry:log("something")
}

nothing renders. But if I change the code to:

idle:{
  entry:{ actions: log("something")}
}

it renders correctly.

mogarick commented 2 years ago

One more thing, using

entry:{ actions: log("something")}

causes a blank screen on the stately.ia visualizer page: Application error: a client-side exception has occurred (see the browser console for more information).

but if we use:

idle:{
  entry:log("something")
}

it works correctly. so we are in a mutually excluding workaround scenario.

And there's is another problem with the website visualizer: once your code provoques an error there is no way to fix it and the page enters in an error loop where you need to be fast enough to select all the code and delete it before the render triggers. That's because the visualizer tries to render the code as soon as it loads the page. A better way would be to let the user decide when to render the visualization so if an error occurs there is no error loop problem.

mattpocock commented 2 years ago

@mogarick Could you double-check it with this site? It will let you know if there's a parse error our side:

https://xstate-parser-example-site.vercel.app/

mogarick commented 2 years ago

ok. give me a minute then...

mogarick commented 2 years ago

entry:log("something)

image

entry:{actions:log("something")}

image

this last one shows "anonymous" for the entry, and with such value in the visualizer it throws the a client-side... error.

in the case of the vs-code extension, the no render scenario occurs when using the entry:log("something) and it works with the entry:{actions:log("something")}

mattpocock commented 2 years ago

Worth noting that entry: { actions: [] } is incorrect syntax. Missed that in the comments above.

mogarick commented 2 years ago

Got it.

I can confirm using entry:log("Entered signIn NavState) or entry: [log("Entered signIn NavState")], works on the website visualizer.

But then the problem is on the vs-code extension visualizer.

Using entry: {actions:log("Entered signIn NavState")}, renders but entry:log("Entered signIn NavState) doesn't. Neither entry: [log("Entered signIn NavState")],.

mogarick commented 2 years ago

Hi @mattpocock, About the error that occurs in the vs-code visualizer, should I open a new issue for better tracking purposes or leave this issue as the master one for that?

Thank you in advance.

mattpocock commented 2 years ago

Keep this here, I'll figure it out later. It's likely an issue with the viz as opposed to the vscode extension

mogarick commented 2 years ago

Hi @mattpocock,

Any news about this? :)

mattpocock commented 2 years ago

Apologies, doing more feature work than bug work at the moment ahead of a big release in early Feb. Will look to tackle some bugs then.