Created
June 16, 2020 19:29
-
-
Save AndreAffonso/aba1b79b5f33cc33ed60a2b0bb97e3e3 to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| const STEPS = { | |
| INITIAL: "INITIAL", | |
| LICENSE_PLATE: "LICENSE_PLATE", | |
| BRAND_NEW_CAR: "BRAND_NEW_CAR", | |
| CAR_MODEL: "CAR_MODEL", | |
| CEP: "CEP", | |
| ADDRESS: "ADDRESS", | |
| CPF: "CPF", | |
| EMAIL: "EMAIL", | |
| QUOTE: "QUOTE", | |
| DONE: "DONE", | |
| WAITING_LIST: "WAITING_LIST", | |
| WAITING_LIST_SUCCESS: "WAITING_LIST_SUCCESS", | |
| NOT_COVERED_QUOTATION: "NOT_COVERED_QUOTATION", | |
| }; | |
| const ACTIONS = { | |
| START_QUOTATION: "START_QUOTATION", | |
| FORM_SUBMIT: "FORM_SUBMIT", | |
| NOT_SUPPORTED: "NOT_SUPPORTED", | |
| ERROR: "ERROR", | |
| SUCCESS: "SUCCESS", | |
| BACK_TO_CAR_MODEL: "BACK_TO_CAR_MODEL", | |
| SKIP: "SKIP", | |
| BEFORE: "BEFORE", | |
| STOP_LOADING: "STOP_LOADING", | |
| START_LOADING: "START_LOADING", | |
| PERSIST_FORM_DATA: "PERSIST_FORM_DATA", | |
| PERSIST_ERROR: "PERSIST_ERROR", | |
| RESET_ERROR: "RESET_ERROR", | |
| RESET_CONTEXT: "RESET_CONTEXT", | |
| RESET_MACHINE: "RESET_MACHINE", | |
| INCREMENT_PROGRESS_UI: "INCREMENT_PROGRESS_UI", | |
| DECREMENT_PROGRESS_UI: "DECREMENT_PROGRESS_UI", | |
| NOT_COVERED_QUOTATION: "NOT_COVERED_QUOTATION", | |
| }; | |
| const STEPS_CONFIG = { | |
| [STEPS.INITIAL]: { | |
| TITLE: null, | |
| PATH: "/seguro-auto", | |
| }, | |
| [STEPS.LICENSE_PLATE]: { | |
| TITLE: "Qual é seu carro?", | |
| PATH: "/seguro-auto/cotacao/placa", | |
| }, | |
| [STEPS.BRAND_NEW_CAR]: { | |
| TITLE: "Seu carro é 0km?", | |
| PATH: "/seguro-auto/cotacao/carro-zero", | |
| }, | |
| [STEPS.CAR_MODEL]: { | |
| TITLE: "Qual é o seu carro?", | |
| PATH: "/seguro-auto/cotacao/modelo", | |
| }, | |
| [STEPS.CEP]: { | |
| TITLE: "Qual seu endereço?", | |
| PATH: "/seguro-auto/cotacao/cep", | |
| }, | |
| [STEPS.ADDRESS]: { | |
| TITLE: "Qual seu endereço?", | |
| PATH: "/seguro-auto/cotacao/endereco", | |
| }, | |
| [STEPS.CPF]: { | |
| TITLE: "Qual seu CPF?", | |
| PATH: "/seguro-auto/cotacao/cpf", | |
| }, | |
| [STEPS.EMAIL]: { | |
| TITLE: "Qual é seu email?", | |
| PATH: "/seguro-auto/cotacao/email", | |
| }, | |
| [STEPS.QUOTE]: { | |
| TITLE: null, | |
| PATH: "/seguro-auto/cotacao/calculando-valores", | |
| }, | |
| [STEPS.DONE]: { | |
| TITLE: null, | |
| PATH: "/seguro-auto/cotacao/valores", | |
| }, | |
| [STEPS.WAITING_LIST]: { | |
| TITLE: null, | |
| PATH: null, | |
| }, | |
| [STEPS.WAITING_LIST_SUCCESS]: { | |
| TITLE: null, | |
| PATH: null, | |
| }, | |
| [STEPS.NOT_COVERED_QUOTATION]: { | |
| TITLE: null, | |
| PATH: | |
| "/seguro-auto/cotacao/valores?lista-de-espera=endereco-nao-disponivel", | |
| }, | |
| }; | |
| const WAITING_LIST_STATUS = "422"; | |
| const quotationMachine = Machine( | |
| { | |
| id: "quotation-auto", | |
| initial: STEPS.INITIAL, | |
| context: { | |
| isLoading: false, | |
| error: "", | |
| uiStepProgress: 1, | |
| formData: { | |
| quoteId: null, | |
| licensePlate: "", | |
| isZeroKm: null, | |
| "ship-zip": "", | |
| "ship-address": "", | |
| number: "", | |
| "ship-city": "", | |
| neighborhood: "", | |
| brand: null, | |
| year: null, | |
| model: null, | |
| cpf: "", | |
| isAuctioned: null, | |
| }, | |
| }, | |
| states: { | |
| [STEPS.INITIAL]: { | |
| on: { | |
| [ACTIONS.START_QUOTATION]: { | |
| target: STEPS.LICENSE_PLATE, | |
| }, | |
| [ACTIONS.SKIP]: { | |
| target: STEPS.WAITING_LIST, | |
| }, | |
| }, | |
| }, | |
| [STEPS.LICENSE_PLATE]: { | |
| on: { | |
| [ACTIONS.FORM_SUBMIT]: { | |
| actions: [ACTIONS.START_LOADING, ACTIONS.RESET_ERROR], | |
| }, | |
| [ACTIONS.ERROR]: { | |
| actions: [ACTIONS.STOP_LOADING, ACTIONS.PERSIST_ERROR], | |
| }, | |
| [ACTIONS.SKIP]: { | |
| target: STEPS.CAR_MODEL, | |
| actions: ACTIONS.INCREMENT_PROGRESS_UI, | |
| }, | |
| [ACTIONS.SUCCESS]: { | |
| target: STEPS.CAR_MODEL, | |
| actions: [ACTIONS.PERSIST_FORM_DATA, ACTIONS.INCREMENT_PROGRESS_UI], | |
| }, | |
| }, | |
| exit: [ACTIONS.STOP_LOADING, ACTIONS.RESET_ERROR], | |
| }, | |
| [STEPS.CAR_MODEL]: { | |
| on: { | |
| [ACTIONS.BEFORE]: { | |
| target: STEPS.LICENSE_PLATE, | |
| actions: ACTIONS.DECREMENT_PROGRESS_UI, | |
| }, | |
| [ACTIONS.FORM_SUBMIT]: { | |
| actions: [ACTIONS.START_LOADING], | |
| }, | |
| [ACTIONS.ERROR]: { | |
| actions: [ACTIONS.STOP_LOADING, ACTIONS.PERSIST_ERROR], | |
| }, | |
| [ACTIONS.SUCCESS]: { | |
| target: STEPS.BRAND_NEW_CAR, | |
| actions: [ACTIONS.PERSIST_FORM_DATA], | |
| }, | |
| [ACTIONS.SKIP]: { | |
| target: STEPS.CEP, | |
| actions: [ACTIONS.PERSIST_FORM_DATA, ACTIONS.INCREMENT_PROGRESS_UI], | |
| }, | |
| }, | |
| exit: [ACTIONS.STOP_LOADING, ACTIONS.RESET_ERROR], | |
| }, | |
| [STEPS.BRAND_NEW_CAR]: { | |
| on: { | |
| [ACTIONS.BEFORE]: { | |
| target: STEPS.CAR_MODEL, | |
| }, | |
| [ACTIONS.FORM_SUBMIT]: { | |
| actions: [ACTIONS.START_LOADING], | |
| }, | |
| [ACTIONS.NOT_SUPPORTED]: { | |
| target: STEPS.WAITING_LIST, | |
| }, | |
| [ACTIONS.ERROR]: { | |
| actions: [ACTIONS.STOP_LOADING, ACTIONS.PERSIST_ERROR], | |
| }, | |
| [ACTIONS.SUCCESS]: { | |
| target: STEPS.CEP, | |
| actions: [ACTIONS.PERSIST_FORM_DATA, ACTIONS.INCREMENT_PROGRESS_UI], | |
| }, | |
| }, | |
| exit: [ACTIONS.STOP_LOADING, ACTIONS.RESET_ERROR], | |
| }, | |
| [STEPS.CEP]: { | |
| on: { | |
| [ACTIONS.BEFORE]: { | |
| target: STEPS.CAR_MODEL, | |
| actions: [ACTIONS.DECREMENT_PROGRESS_UI], | |
| }, | |
| [ACTIONS.BACK_TO_CAR_MODEL]: { | |
| target: STEPS.CAR_MODEL, | |
| actions: [ACTIONS.DECREMENT_PROGRESS_UI], | |
| }, | |
| [ACTIONS.FORM_SUBMIT]: { | |
| actions: [ACTIONS.START_LOADING], | |
| }, | |
| [ACTIONS.SKIP]: { | |
| target: STEPS.ADDRESS, | |
| }, | |
| [ACTIONS.ERROR]: { | |
| actions: [ACTIONS.STOP_LOADING, ACTIONS.PERSIST_ERROR], | |
| }, | |
| [ACTIONS.SUCCESS]: { | |
| target: STEPS.CPF, | |
| actions: [ACTIONS.PERSIST_FORM_DATA, ACTIONS.INCREMENT_PROGRESS_UI], | |
| }, | |
| }, | |
| exit: [ACTIONS.STOP_LOADING, ACTIONS.RESET_ERROR], | |
| }, | |
| [STEPS.ADDRESS]: { | |
| on: { | |
| [ACTIONS.BEFORE]: { | |
| target: STEPS.CEP, | |
| }, | |
| [ACTIONS.FORM_SUBMIT]: { | |
| actions: [ACTIONS.START_LOADING], | |
| }, | |
| [ACTIONS.ERROR]: { | |
| actions: [ACTIONS.STOP_LOADING, ACTIONS.PERSIST_ERROR], | |
| }, | |
| [ACTIONS.SUCCESS]: { | |
| target: STEPS.CPF, | |
| actions: [ACTIONS.PERSIST_FORM_DATA, ACTIONS.INCREMENT_PROGRESS_UI], | |
| }, | |
| }, | |
| exit: [ACTIONS.STOP_LOADING, ACTIONS.RESET_ERROR], | |
| }, | |
| [STEPS.CPF]: { | |
| on: { | |
| [ACTIONS.BEFORE]: { | |
| target: STEPS.CEP, | |
| actions: [ACTIONS.DECREMENT_PROGRESS_UI], | |
| }, | |
| [ACTIONS.FORM_SUBMIT]: { | |
| actions: [ACTIONS.START_LOADING], | |
| }, | |
| [ACTIONS.NOT_SUPPORTED]: { | |
| target: STEPS.WAITING_LIST, | |
| }, | |
| [ACTIONS.ERROR]: { | |
| actions: [ACTIONS.STOP_LOADING, ACTIONS.PERSIST_ERROR], | |
| }, | |
| [ACTIONS.SUCCESS]: { | |
| target: STEPS.EMAIL, | |
| actions: [ACTIONS.PERSIST_FORM_DATA, ACTIONS.INCREMENT_PROGRESS_UI], | |
| }, | |
| }, | |
| exit: [ACTIONS.STOP_LOADING, ACTIONS.RESET_ERROR], | |
| }, | |
| [STEPS.EMAIL]: { | |
| on: { | |
| [ACTIONS.BEFORE]: { | |
| target: STEPS.CPF, | |
| actions: [ACTIONS.DECREMENT_PROGRESS_UI], | |
| }, | |
| [ACTIONS.FORM_SUBMIT]: { | |
| actions: [ACTIONS.START_LOADING], | |
| }, | |
| [ACTIONS.ERROR]: { | |
| actions: [ACTIONS.STOP_LOADING, ACTIONS.PERSIST_ERROR], | |
| }, | |
| [ACTIONS.SUCCESS]: { | |
| target: STEPS.QUOTE, | |
| actions: [ACTIONS.PERSIST_FORM_DATA], | |
| }, | |
| [ACTIONS.SKIP]: { | |
| target: STEPS.QUOTE, | |
| }, | |
| }, | |
| exit: [ACTIONS.STOP_LOADING, ACTIONS.RESET_ERROR], | |
| }, | |
| [STEPS.QUOTE]: { | |
| entry: [ACTIONS.START_LOADING], | |
| on: { | |
| [ACTIONS.SUCCESS]: { | |
| target: [STEPS.DONE], | |
| actions: [ACTIONS.PERSIST_FORM_DATA], | |
| }, | |
| [ACTIONS.NOT_SUPPORTED]: { | |
| target: STEPS.WAITING_LIST_SUCCESS, | |
| }, | |
| [ACTIONS.ERROR]: { | |
| actions: [ACTIONS.STOP_LOADING, ACTIONS.PERSIST_ERROR], | |
| }, | |
| [ACTIONS.NOT_COVERED_QUOTATION]: { | |
| target: [STEPS.NOT_COVERED_QUOTATION], | |
| }, | |
| [ACTIONS.RESET_MACHINE]: { | |
| target: [STEPS.INITIAL], | |
| actions: [ACTIONS.RESET_CONTEXT], | |
| }, | |
| }, | |
| exit: [ACTIONS.STOP_LOADING], | |
| }, | |
| [STEPS.WAITING_LIST]: { | |
| on: { | |
| [ACTIONS.FORM_SUBMIT]: { | |
| actions: [ACTIONS.START_LOADING], | |
| }, | |
| [ACTIONS.SUCCESS]: { | |
| target: [STEPS.WAITING_LIST_SUCCESS], | |
| }, | |
| [ACTIONS.ERROR]: { | |
| actions: [ACTIONS.STOP_LOADING, ACTIONS.PERSIST_ERROR], | |
| }, | |
| [ACTIONS.RESET_MACHINE]: { | |
| target: [STEPS.INITIAL], | |
| actions: [ACTIONS.RESET_CONTEXT], | |
| }, | |
| }, | |
| exit: [ACTIONS.STOP_LOADING, ACTIONS.RESET_ERROR], | |
| }, | |
| [STEPS.WAITING_LIST_SUCCESS]: { | |
| on: { | |
| [ACTIONS.RESET_MACHINE]: { | |
| target: [STEPS.INITIAL], | |
| actions: [ACTIONS.RESET_CONTEXT], | |
| }, | |
| }, | |
| }, | |
| [STEPS.NOT_COVERED_QUOTATION]: { | |
| on: { | |
| [ACTIONS.SKIP]: { | |
| target: [STEPS.WAITING_LIST], | |
| }, | |
| [ACTIONS.RESET_MACHINE]: { | |
| target: [STEPS.INITIAL], | |
| actions: [ACTIONS.RESET_CONTEXT], | |
| }, | |
| }, | |
| }, | |
| [STEPS.DONE]: { | |
| on: { | |
| [ACTIONS.RESET_MACHINE]: { | |
| target: [STEPS.INITIAL], | |
| actions: [ACTIONS.RESET_CONTEXT], | |
| }, | |
| }, | |
| }, | |
| }, | |
| }, | |
| { | |
| actions: { | |
| // action implementations | |
| [ACTIONS.START_LOADING]: assign({ | |
| isLoading: (_, event) => true, | |
| }), | |
| [ACTIONS.STOP_LOADING]: assign({ | |
| isLoading: (_, event) => false, | |
| }), | |
| [ACTIONS.PERSIST_ERROR]: assign({ | |
| error: (_, { payload }) => payload, | |
| }), | |
| [ACTIONS.PERSIST_FORM_DATA]: assign({ | |
| formData: (context, { payload }) => { | |
| const { formData } = context; | |
| return { ...formData, ...payload }; | |
| }, | |
| }), | |
| [ACTIONS.INCREMENT_PROGRESS_UI]: assign({ | |
| uiStepProgress: (context, event) => context.uiStepProgress + 1, | |
| }), | |
| [ACTIONS.DECREMENT_PROGRESS_UI]: assign({ | |
| uiStepProgress: (context, event) => context.uiStepProgress - 1, | |
| }), | |
| [ACTIONS.RESET_CONTEXT]: assign({ | |
| uiStepProgress: (context, event) => 1, | |
| formData: (_, event) => ({ | |
| licensePlate: "", | |
| isZeroKm: null, | |
| cep: "", | |
| "ship-address": "", | |
| number: "", | |
| "ship-city": "", | |
| neighborhood: "", | |
| brand: null, | |
| year: null, | |
| model: null, | |
| cpf: "", | |
| email: "", | |
| isAuctioned: null, | |
| }), | |
| error: (_, event) => "", | |
| isLoading: (_, event) => false, | |
| }), | |
| [ACTIONS.RESET_ERROR]: assign({ | |
| error: (_, event) => "", | |
| }), | |
| }, | |
| } | |
| ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment