Skip to content

Instantly share code, notes, and snippets.

@RafalFilipek
Created April 16, 2020 09:30
Show Gist options
  • Save RafalFilipek/ed8097a9977278f4393af9359c16d67b to your computer and use it in GitHub Desktop.
Save RafalFilipek/ed8097a9977278f4393af9359c16d67b to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
Machine({
strict: true,
id: "suflerMachine",
context: {
config: {
shouldLoadUserTransactions: false,
market: "B2C"
},
user: {
isLoggedIn: true,
isVerified: false,
selectedAccount: null,
procesableContracts: []
},
offerTypeGroups: {
selectedOfferTypeGroup: null
},
offerTypes: {
selectedOfferType: null
},
localization: {},
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: "initializingStep",
onDone: {
target: "offerTypeGroups",
actions: "setInitializingData"
},
onError: {
target: "error",
actions: "setErrorInfo"
}
}
},
offerTypeGroups: {
id: "offerTypeGroups",
invoke: {
id: "step",
src: "offerTypeGroupsStep",
onDone: {
actions: "setOfferTypeGroup",
target: "offerTypes"
},
onError: {
target: "error"
}
}
},
offerTypes: {
id: "offerTypes",
invoke: {
id: "step",
src: "offerTypesStep",
onDone: {
actions: "setOfferType",
target: "offerTypesActionResolver"
},
onError: {
target: "error"
}
}
},
offerTypesActionResolver: {
id: "offerTypesActionResolver",
initial: "init",
states: {
init: {
on: {
"": [{
target: "#upsell",
cond: "isSelectedUpsellOffer"
}, {
target: "fix",
cond: "isFixOfferType"
}, {
target: "#procedures"
}]
}
},
fix: {
on: {
"": [{
target: "#addressesAndServices",
cond: "isUserLoggedIn"
}, {
target: "#procedures"
}]
}
}
}
},
procedures: {
id: "procedures",
invoke: {
id: "step",
src: "proceduresStep",
onDone: {
actions: "setProcedure",
target: "proceduresActionsResolver"
},
onError: {
target: "error"
}
}
},
proceduresActionsResolver: {
id: "proceduresActionsResolver",
initial: "init",
states: {
init: {
on: {
"": [{
target: "#upsell",
cond: "isSelectedUpsellOffer"
}, {
target: "fix",
cond: "isFixOfferType"
}, {
target: "#offers",
cond: "isActivationProcedure"
}, {
target: "check",
cond: "isRetentionOrMnpProcedure"
}, {
target: "#authorization"
}]
}
},
fix: {
on: {
"": [{
target: "#localization",
cond: "isActivationProcedure"
}, {
target: "#authorization"
}]
}
},
check: {
on: {
"": [{
target: "#procesableContracts",
cond: "isUserLoggedIn"
}, {
target: "#authorization"
}]
}
}
}
},
offers: {
id: "offers",
invoke: {
id: "step",
src: "offersStep",
onDone: {
actions: "setOffer",
target: "offersActionResolver"
},
onError: {
target: "error"
}
}
},
offersActionResolver: {
id: "offersActionResolver",
initial: "init",
states: {
init: {
on: {
"": [{
target: "#redirect",
cond: "hasOfferWithDevice"
}, {
target: "#redirect",
cond: "isFixOfferType"
}, {
target: "mobile"
}]
}
},
mobile: {
on: {
"": [{
target: "#redirect",
cond: "isWithDeviceOrDataLDF"
}, {
target: "#accounts",
cond: "isLoggedInWithoutSelectedAccount"
}, {
target: "#verifyAndBuy",
cond: "mustBeVerifiedForDiscount"
}, {
target: "#summary"
}]
}
}
}
},
summary: {
id: "summary",
invoke: {
id: "step",
src: "summaryStep",
onDone: {
actions: "setShouldAddAnotherDevice",
target: "summaryActionResolver"
},
onError: {
target: "error"
}
}
},
summaryActionResolver: {
id: "summaryActionResolver",
on: {
"": [{
target: "procedures",
cond: "shouldAddAnotherOffer"
}, {
target: "redirect"
}]
}
},
maintenance: {
id: "maintenance"
},
changeAccount: {
id: "changeAccount",
invoke: {
id: "step",
src: "changeAccountStep",
data: context => ({
selectedAccount: context.user.selectedAccount,
transactions: context.user.procesableContracts
}),
onDone: {
actions: ["setHasAccountBeenChanged", "setSelectedAccount"],
target: "changeAccountActionResolver"
},
onError: {
target: "error"
}
}
},
changeAccountActionResolver: {
on: {
"": [{
target: "initializing",
cond: "hasUserAccountBeenChanged"
}, {
target: "hist"
}]
}
},
accounts: {
id: "accounts",
invoke: {
id: "step",
src: "accountsStep",
// Gdzie dodać do koszyka? Tutaj, czy wewnątrz maszyny 'accounts'?
onDone: {
target: "summary",
actions: "setSelectedAccount"
},
onError: {
target: "error"
}
}
},
upsell: {
id: "upsell"
},
login: {
id: "login",
invoke: {
id: "step",
src: "loginStep",
onDone: {
target: "loginActionResolver",
actions: "setIsUserLoggedIn"
},
onError: {
target: "error"
}
}
},
loginActionResolver: {
on: {
"": [{
cond: "isUserLoggedIn",
target: "initializing"
}, {
target: "hist"
}]
}
},
authorization: {
id: "authorization",
invoke: {
src: "authorizationStep",
onDone: {
target: "authorizationActionResolver",
actions: "setIsUserLoggedIn"
},
onError: {
target: "error"
}
}
},
authorizationActionResolver: {
id: "authorizationActionResolver",
type: "final"
},
procesableContracts: {
id: "procesableContracts",
invoke: {
id: "step",
src: "procesableContractsStep",
onDone: {
actions: "setSelectedProcesableContract",
target: "offers"
},
onError: {
target: "error"
}
}
},
verifyAndBuy: {
id: "verifyAndBuy",
invoke: {
id: "step",
src: "verifyAndBuyStep",
onDone: {
target: "verifyAndBuyActionResolver",
actions: ["setIsUserVerified", "setHasOfferBeenBought"]
},
onError: {
target: "error"
}
}
},
verifyAndBuyActionResolver: {
on: {
"": [{
target: "summary",
cond: "hasOfferBeenBought"
}, {
target: "offers"
}]
}
},
addressesAndServices: {
id: "addressesAndServices",
invoke: {
id: "step",
src: "addressesAndServicesStep",
onDone: {
actions: "setAddressWithServices",
target: "addressesAndServicesActionResolver"
},
onError: {
target: "error"
}
}
},
addressesAndServicesActionResolver: {
id: "addressesAndServicesActionResolver",
on: {
"": [{
target: "#localization",
cond: "isSelectedNewAddress"
}, {
target: "#fixMigrationProcedures"
}]
}
},
fixMigrationProcedures: {
id: "fixMigrationProcedures",
invoke: {
id: "step",
src: "fixMigrationProceduresStep",
onDone: {
actions: "setFixMigrationProcedure",
target: "offers"
},
onError: {
target: "error"
}
}
},
localization: {
id: "localization"
},
error: {
id: "error",
type: "final"
},
redirect: {
id: "redirect",
type: "final"
},
hist: {
type: "history"
}
}
}, {
actions: {
addToCart: () => {},
setErrorInfo: assign({
errorInfo: (_, event) => {
return {
code: event.data.code
};
}
}),
setInitializingData: assign({
user: (context, event) => {
return { ...context.user,
procesableContracts: event.data.procesableContracts,
selectedAccount: event.data.selectedAccount
};
}
}),
setOfferTypeGroup: assign({
offerTypeGroups: (_, event) => {
return {
selectedOfferTypeGroup: event.data.selectedOfferTypeGroup
};
}
}),
setOfferType: assign({
offerTypes: (_, event) => {
return {
selectedOfferType: event.data.selectedOfferType
};
},
upsell: (context, event) => {
return { ...context.upsell,
selectedUpsellOffer: event.data.selectedUpsellOffer
};
}
}),
setProcedure: assign({
procedures: (_, event) => {
return {
selectedProcedure: event.data.selectedProcedure
};
},
upsell: (context, event) => {
return { ...context.upsell,
selectedUpsellOffer: event.data.selectedUpsellOffer
};
}
}),
setOffer: assign({
offers: (_, event) => {
return {
selectedOffer: event.data.selectedOffer,
withDevice: event.data.shouldAddDeviceToOffer,
withDiscount: event.data.shouldApplyDiscounts
};
}
}),
setShouldAddAnotherDevice: assign({
summary: (_, event) => {
return {
shouldAddAnotherDevice: event.data.shouldAddAnotherOffer
};
}
}),
setSelectedProcesableContract: assign({
procesableContracts: (_, event) => {
return {
selectedProcesableContract: event.data.selectedProcesableContract
};
}
}),
setIsUserLoggedIn: assign({
user: (context, event) => ({ ...context.user,
isLoggedIn: event.data.isUserLoggedIn
})
}),
setIsUserVerified: assign({
user: (context, event) => ({ ...context.user,
isVerified: event.data.isUserVerified
})
}),
setHasOfferBeenBought: assign({
verifyAndBuy: (_, event) => ({
hasOfferBeenBought: event.data.hasOfferBeenBought
})
}),
setHasAccountBeenChanged: assign({
changeAccount: (context, event) => ({ ...context.changeAccount,
hasAccountBeenChanged: event.data.hasAccountBeenChanged
})
}),
setAddressWithServices: assign({
addressesAndServices: (_, event) => ({
selectedAddressWithServices: event.data.selectedAddressWithServices,
selectedNewAddress: event.data.selectedNewAddress
})
}),
setFixMigrationProcedure: assign({
fixMigrationProcedure: (_, event) => ({
selectedFixMigrationProcedure: event.data.selectedProcedure
})
}),
setSelectedAccount: assign({
user: (context, event) => ({ ...context.user,
selectedAccount: event.data.selectedAccount
})
})
},
guards: {
isError: (_, event, {
cond
}) => {
const isError = event.data.__type === "error";
if (isError && cond.code !== undefined) {
return cond.code === event.data.code;
}
return isError;
},
isFixOfferType: context => {
var _context$offerTypes$s;
return (_context$offerTypes$s = context.offerTypes.selectedOfferType) == null ? void 0 : _context$offerTypes$s.isFix;
},
hasOfferWithDevice: context => context.offers.withDevice,
isWithDeviceOrDataLDF: context => {
var _context$offerTypes$s2;
return context.offers.withDevice || ((_context$offerTypes$s2 = context.offerTypes.selectedOfferType) == null ? void 0 : _context$offerTypes$s2.type) === "DATA_LDF";
},
isLoggedInWithoutSelectedAccount: context => context.user.isLoggedIn && !context.user.selectedAccount,
mustBeVerifiedForDiscount: context => {
if (context.summary.shouldAddAnotherDevice) {
return false;
}
return !context.user.isVerified && context.offers.withDiscount;
},
isUserVerified: context => context.user.isVerified,
isUserLoggedIn: context => context.user.isLoggedIn,
isActivationProcedure: context => {
var _context$procedures$s;
return ((_context$procedures$s = context.procedures.selectedProcedure) == null ? void 0 : _context$procedures$s.type) === "ACTIVATION";
},
isRetentionOrMnpProcedure: context => {
var _context$procedures$s2, _context$procedures$s3;
return ((_context$procedures$s2 = context.procedures.selectedProcedure) == null ? void 0 : _context$procedures$s2.type) === "RETENTION" || ((_context$procedures$s3 = context.procedures.selectedProcedure) == null ? void 0 : _context$procedures$s3.type) === "MIGRATION_PRE_POST";
},
shouldAddAnotherOffer: context => context.summary.shouldAddAnotherDevice,
hasOfferBeenBought: context => context.verifyAndBuy.hasOfferBeenBought,
isSelectedUpsellOffer: context => !!context.upsell.selectedUpsellOffer,
hasUserAccountBeenChanged: context => context.changeAccount.hasAccountBeenChanged,
isSelectedNewAddress: context => context.addressesAndServices.selectedNewAddress
},
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment