Я играл с частями @xstate/graph
, и этот пример настолько близок, насколько я получаю к тому, что вы хотите:
import { Machine } from "xstate"
import { getShortestPaths } from '@xstate/graph'
export const feedbackMachine = Machine({
id: 'feedback',
initial: 'question',
states: {
question: {
on: {
CLICK_GOOD: 'thanks',
CLICK_BAD: 'form',
CLOSE: 'closed',
ESC: 'closed',
REMOVE_ME: 'nope'
}
},
form: {
on: {
SUBMIT: 'thanks',
CLOSE: 'closed',
ESC: 'closed'
}
},
nope: {
on: {
}
},
thanks: {
on: {
CLOSE: 'closed',
ESC: 'closed'
}
},
closed: {
type: 'final'
}
}
})
const showPaths = () => {
const paths = getShortestPaths(feedbackMachine)
const states = Object.keys(paths).filter(k => paths[k].weight > 0)
console.log(states)
// [""thanks"", ""form"", ""closed"", ""nope""]
}
showPaths()
Как только вы удалите REMOVE_ME: 'nope'
из возможных переходов в вопросесостояние, вы должны увидеть результат как: [""thanks"", ""form"", ""closed""]
в showPaths
Я также вижу, что getEdges были недавно удалены из @xstate/graph
, поэтому я бы пока отказался от его использования.