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