Created
April 16, 2020 09:30
-
-
Save RafalFilipek/ed8097a9977278f4393af9359c16d67b 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
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