Skip to content

Instantly share code, notes, and snippets.

@RafalFilipek
Created June 2, 2020 11:04
Show Gist options
  • Save RafalFilipek/b1826f3294cda9575f0d55335dee4385 to your computer and use it in GitHub Desktop.
Save RafalFilipek/b1826f3294cda9575f0d55335dee4385 to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
const Options = {
actions: {
setErrorInfo: "setErrorInfo",
setInitializingData: "setInitializingData",
setOfferTypeGroup: "setOfferTypeGroup",
setOfferType: "setOfferType",
setProcedure: "setProcedure",
setOffer: "setOffer",
setShouldAddAnotherDevice: "setShouldAddAnotherDevice",
setSelectedProcesableContract: "setSelectedProcesableContract",
setIsUserLoggedIn: "setIsUserLoggedIn",
setIsUserVerified: "setIsUserVerified",
setHasOfferBeenBought: "setHasOfferBeenBought",
setHasAccountBeenChanged: "setHasAccountBeenChanged",
setAddressWithServices: "setAddressWithServices",
setFixMigrationProcedure: "setFixMigrationProcedure",
setSelectedAccount: "setSelectedAccount",
setLocationData: "setLocationData"
},
guards: {
isError: "isError",
isLoveOfferType: "isLoveOfferType",
isFixOfferType: "isFixOfferType",
hasOfferWithDevice: "hasOfferWithDevice",
isDataLDF: "isDataLDF",
isLoggedInWithoutSelectedAccount: "isLoggedInWithoutSelectedAccount",
mustBeVerifiedForDiscount: "mustBeVerifiedForDiscount",
isUserVerified: "isUserVerified",
isUserLoggedIn: "isUserLoggedIn",
isActivationProcedure: "isActivationProcedure",
isRetentionOrMnpProcedure: "isRetentionOrMnpProcedure",
shouldAddAnotherOffer: "shouldAddAnotherOffer",
hasOfferBeenBought: "hasOfferBeenBought",
isSelectedUpsellOffer: "isSelectedUpsellOffer",
hasUserAccountBeenChanged: "hasUserAccountBeenChanged",
isSelectedNewAddress: "isSelectedNewAddress",
isMaintenance: "isMaintenance"
},
services: {
initializingStep: "initializingStep",
offerTypeGroupsStep: "offerTypeGroupsStep",
offerTypesStep: "offerTypesStep",
proceduresStep: "proceduresStep",
offersStep: "offersStep",
summaryStep: "summaryStep",
authorizationStep: "authorizationStep",
verifyAndBuyStep: "verifyAndBuyStep",
procesableContractsStep: "procesableContractsStep",
changeAccountStep: "changeAccountStep",
loginStep: "loginStep",
addressesAndServicesStep: "addressesAndServicesStep",
fixMigrationProceduresStep: "fixMigrationProceduresStep",
accountsStep: "accountsStep",
locationStep: "locationStep"
}
};
const m = Machine({
strict: true,
id: `suflerMachine`,
context: {
config: {
market: 'B2C',
isMaintenance: false
},
user: {
isLoggedIn: false,
isVerified: false,
selectedAccount: null,
procesableContracts: []
},
offerTypeGroups: {
selectedOfferTypeGroup: null
},
offerTypes: {
selectedOfferType: null
},
location: {
data: null
},
offers: {
selectedOffer: null,
withDevice: false,
withDiscount: false
},
procedures: {
selectedProcedure: null
},
upsell: {
selectedUpsellOffer: null,
data: null
},
summary: {
shouldAddAnotherDevice: false
},
errorInfo: {
code: null
},
redirect: {
data: null
},
procesableContracts: {
selectedProcesableContract: null
},
verifyAndBuy: {
hasOfferBeenBought: null
},
changeAccount: {
hasAccountBeenChanged: false
},
addressesAndServices: {
selectedAddressWithServices: null,
selectedNewAddress: false
},
fixMigrationProcedure: {
selectedFixMigrationProcedure: null
}
},
initial: "initializing",
states: {
initializing: {
id: "initializing",
invoke: {
id: "step",
src: Options.services.initializingStep,
onDone: {
target: "initializingActionResolver",
actions: Options.actions.setInitializingData
},
onError: {
target: "error",
actions: Options.actions.setErrorInfo
}
}
},
initializingActionResolver: {
id: "initializingActionResolver",
on: {
"": [{
target: "#maintenance",
cond: Options.guards.isMaintenance
}, {
target: "#offerTypeGroups"
}]
}
},
offerTypeGroups: {
id: "offerTypeGroups",
invoke: {
id: "step",
src: Options.services.offerTypeGroupsStep,
onDone: {
actions: Options.actions.setOfferTypeGroup,
target: "#offerTypes"
},
onError: {
target: "#error"
}
}
},
offerTypes: {
id: "offerTypes",
invoke: {
id: "step",
src: Options.services.offerTypesStep,
onDone: {
actions: Options.actions.setOfferType,
target: "#offerTypesActionResolver"
},
onError: {
target: "#error"
}
}
},
offerTypesActionResolver: {
id: "offerTypesActionResolver",
initial: "init",
states: {
init: {
on: {
"": [{
target: "#upsell",
cond: Options.guards.isSelectedUpsellOffer
}, {
target: "fix",
cond: Options.guards.isFixOfferType
}, {
target: "#procedures"
}]
}
},
fix: {
on: {
"": [{
target: "#addressesAndServices",
cond: Options.guards.isUserLoggedIn
}, {
target: "#procedures"
}]
}
}
}
},
procedures: {
id: "procedures",
invoke: {
id: "step",
src: Options.services.proceduresStep,
onDone: {
actions: Options.actions.setProcedure,
target: "#proceduresActionsResolver"
},
onError: {
target: "#error"
}
}
},
proceduresActionsResolver: {
id: "proceduresActionsResolver",
initial: "init",
states: {
init: {
on: {
"": [{
target: "#upsell",
cond: Options.guards.isSelectedUpsellOffer
}, {
target: "fix",
cond: Options.guards.isFixOfferType
}, {
target: "#location",
cond: Options.guards.isLoveOfferType
}, {
target: "#offers",
cond: Options.guards.isActivationProcedure
}, {
target: "check",
cond: Options.guards.isRetentionOrMnpProcedure
}, {
target: "#authorization"
}]
}
},
fix: {
on: {
"": [{
target: "#location",
cond: Options.guards.isActivationProcedure
}, {
target: "#authorization"
}]
}
},
check: {
on: {
"": [{
target: "#procesableContracts",
cond: Options.guards.isUserLoggedIn
}, {
target: "#authorization"
}]
}
}
}
},
offers: {
id: "offers",
invoke: {
id: "step",
src: Options.services.offersStep,
onDone: {
actions: Options.actions.setOffer,
target: "#offersActionResolver"
},
onError: {
target: "#error"
}
}
},
offersActionResolver: {
id: "offersActionResolver",
initial: "init",
states: {
init: {
on: {
"": [{
target: "#redirect",
cond: Options.guards.hasOfferWithDevice
}, {
target: "#redirect",
cond: Options.guards.isFixOfferType
}, {
target: "#redirect",
cond: Options.guards.isLoveOfferType
}, {
target: "mobile"
}]
}
},
mobile: {
on: {
"": [{
target: "#redirect",
cond: Options.guards.isDataLDF
}, {
target: "#accounts",
cond: Options.guards.isLoggedInWithoutSelectedAccount
}, {
target: "#verifyAndBuy",
cond: Options.guards.mustBeVerifiedForDiscount
}, {
target: "#summary"
}]
}
}
}
},
summary: {
id: "summary",
invoke: {
id: "step",
src: Options.services.summaryStep,
onDone: {
actions: Options.actions.setShouldAddAnotherDevice,
target: "#summaryActionResolver"
},
onError: {
target: "#error"
}
}
},
summaryActionResolver: {
id: "summaryActionResolver",
on: {
"": [{
target: "#procedures",
cond: Options.guards.shouldAddAnotherOffer
}, {
target: "#redirect"
}]
}
},
changeAccount: {
id: "changeAccount",
invoke: {
id: "step",
src: Options.services.changeAccountStep,
onDone: {
actions: [Options.actions.setHasAccountBeenChanged, Options.actions.setSelectedAccount],
target: "#changeAccountActionResolver"
},
onError: {
target: "error"
}
}
},
changeAccountActionResolver: {
id: "changeAccountActionResolver",
on: {
"": [{
target: "#initializing",
cond: Options.guards.hasUserAccountBeenChanged
}, // @TODO czy to zadziała
{
target: "hist"
}]
}
},
accounts: {
id: "accounts",
invoke: {
id: "step",
src: Options.services.accountsStep,
// Gdzie dodać do koszyka? Tutaj, czy wewnątrz maszyny 'accounts'?
onDone: {
target: "#summary",
actions: Options.actions.setSelectedAccount
},
onError: {
target: "#error"
}
}
},
upsell: {
id: "upsell"
},
login: {
id: "login",
invoke: {
id: "step",
src: Options.services.loginStep,
onDone: {
target: "#loginActionResolver",
actions: Options.actions.setIsUserLoggedIn
},
onError: {
target: "error"
}
}
},
/*
* TODO:
* Po zalogowaniu przekierowanie na wybór konta MOBILE, dopiero potem do 'Initializing'
*/
loginActionResolver: {
id: "loginActionResolver",
on: {
"": [{
cond: Options.guards.isUserLoggedIn,
target: "#initializing"
}, // @TODO czy to zadziała
{
target: "#hist"
}]
}
},
authorization: {
id: "authorization",
invoke: {
src: Options.services.authorizationStep,
onDone: {
target: "#authorizationActionResolver",
actions: Options.actions.setIsUserLoggedIn
},
onError: {
target: "error"
}
}
},
authorizationActionResolver: {
id: "authorizationActionResolver",
type: "final",
// @TODO
on: {
"": [{
target: "#addressesAndServices",
cond: Options.guards.isFixOfferType
}, {
target: "#offers"
}]
}
},
procesableContracts: {
id: "procesableContracts",
invoke: {
id: "step",
src: Options.services.procesableContractsStep,
onDone: {
actions: Options.actions.setSelectedProcesableContract,
target: "#offers"
},
onError: {
target: "#error"
}
}
},
verifyAndBuy: {
id: "verifyAndBuy",
invoke: {
id: "step",
src: Options.services.verifyAndBuyStep,
onDone: {
target: "#verifyAndBuyActionResolver",
actions: [Options.actions.setIsUserVerified, Options.actions.setHasOfferBeenBought]
},
onError: {
target: "error"
}
}
},
verifyAndBuyActionResolver: {
id: "verifyAndBuyActionResolver",
on: {
"": [{
target: "#summary",
cond: Options.guards.hasOfferBeenBought
}, {
target: "#offers"
}]
}
},
addressesAndServices: {
id: "addressesAndServices",
invoke: {
id: "step",
src: Options.services.addressesAndServicesStep,
onDone: {
actions: Options.actions.setAddressWithServices,
target: "#addressesAndServicesActionResolver"
},
onError: {
target: "#error"
}
}
},
addressesAndServicesActionResolver: {
id: "addressesAndServicesActionResolver",
on: {
"": [{
target: "#location",
cond: Options.guards.isSelectedNewAddress
}, {
target: "#fixMigrationProcedures"
}]
}
},
fixMigrationProcedures: {
id: "fixMigrationProcedures",
invoke: {
id: "step",
src: Options.services.fixMigrationProceduresStep,
onDone: {
actions: Options.actions.setFixMigrationProcedure,
target: "#offers"
},
onError: {
target: "error"
}
}
},
location: {
id: "location",
invoke: {
id: "step",
src: Options.services.locationStep,
onDone: {
actions: Options.actions.setLocationData,
target: "#offers"
},
onError: {
target: "#error"
}
}
},
maintenance: {
id: "maintenance",
type: "final"
},
error: {
id: "error",
type: "final"
},
redirect: {
id: "redirect",
type: "final"
},
hist: {
id: "hist",
type: "history"
}
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment