Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2019
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.38 KB | None | 0 0
  1. const hasPropCond = (onboardingDataPropName) => ({
  2. type: 'hasProp',
  3. onboardingDataPropName
  4. });
  5.  
  6. const notHasPropCond = (
  7. onboardingDataPropName,
  8. validator
  9. ) => ({
  10. type: 'notHasProp',
  11. onboardingDataPropName,
  12. validator
  13. });
  14.  
  15. const nextStageEvents = (
  16. prop,
  17. target
  18. ) => ({
  19. '': {
  20. cond: hasPropCond(prop),
  21. target
  22. },
  23. COMPLETE: {
  24. actions: assign({ [prop]: (ctx, e) => true })
  25. }
  26. });
  27.  
  28. const takePhotoStages = (propName, targetState) => ({
  29. OnboardingVerificationInstructions: {
  30. on: {
  31. TAKE_PHOTO: {
  32. target: 'OnboardingVerificationPhoto'
  33. }
  34. }
  35. },
  36. OnboardingVerificationPhoto: {
  37. on: {
  38. COMPLETE: {
  39. target: 'OnboardingVerficationPhotoPreview'
  40. }
  41. }
  42. },
  43. OnboardingVerficationPhotoPreview: {
  44. on: {
  45. COMPLETE: {
  46. target: targetState,
  47. actions: assign({ [propName]: true })
  48. },
  49. RETAKE: {
  50. target: 'OnboardingVerificationPhoto'
  51. }
  52. }
  53. }
  54. });
  55.  
  56. const states = {
  57. Start: {
  58. initial: 'Splash',
  59. states: {
  60. Splash: {
  61. on: {
  62. COMPLETE: [
  63. {
  64. cond: notHasPropCond('__disabled'),
  65. target: '#onboarding.OnboardingApplying'
  66. },
  67. {
  68. cond: hasPropCond('__disabled'),
  69. target: 'OnboardingUnavailable'
  70. }
  71. ]
  72. }
  73. },
  74. OnboardingUnavailable: {
  75. on: {}
  76. }
  77. }
  78. },
  79. OnboardingApplying: {
  80. on: {
  81. ...nextStageEvents('__applying', 'OnboardingPrivacy')
  82. }
  83. },
  84. OnboardingPrivacy: {
  85. on: {
  86. ...nextStageEvents('__privacy', 'OnboardingAccountFees')
  87. }
  88. },
  89. OnboardingAccountFees: {
  90. id: 'OnboardingAccountFees',
  91. on: {
  92. ...nextStageEvents('__accountFees', 'Terms')
  93. }
  94. },
  95. Terms: {
  96. initial: 'Picker',
  97. states: {
  98. Picker: {
  99. on: {
  100. '': [
  101. {
  102. cond: hasPropCond('__upcomingTerms'),
  103. target: 'OnboardingTermsAndConditions'
  104. },
  105. {
  106. cond: notHasPropCond('__upcomingTerms'),
  107. target: 'OnboardingUpcomingTermsAndConditions'
  108. }
  109. ]
  110. }
  111. },
  112. OnboardingTermsAndConditions: {
  113. on: {
  114. ...nextStageEvents('__terms', '#OnboardingFirstName')
  115. }
  116. },
  117. OnboardingUpcomingTermsAndConditions: {
  118. on: {
  119. ...nextStageEvents('__upcomingTerms', '#OnboardingAccountFees')
  120. }
  121. }
  122. }
  123. },
  124. OnboardingFirstName: {
  125. id: 'OnboardingFirstName',
  126. on: {
  127. ...nextStageEvents('firstName', 'OnboardingLastName')
  128. }
  129. },
  130. OnboardingLastName: {
  131. on: {
  132. ...nextStageEvents('lastName', 'OnboardingDateOfBirth')
  133. }
  134. },
  135. OnboardingDateOfBirth: {
  136. on: {
  137. ...nextStageEvents('dateOfBirth', 'PhoneNumber')
  138. }
  139. },
  140. PhoneNumber: {
  141. initial: 'Picker',
  142. states: {
  143. Picker: {
  144. on: {
  145. '': [
  146. {
  147. cond: notHasPropCond('mobileNumber'),
  148. target: 'OnboardingPhoneNumber'
  149. },
  150. {
  151. cond: notHasPropCond('__confirmMobileNumber'),
  152. target: 'OnboardingPhoneNumberConfirm'
  153. },
  154. {
  155. cond: hasPropCond('__confirmMobileNumber'),
  156. target: '#onboarding.OnboardingEmail'
  157. }
  158. ]
  159. }
  160. },
  161. OnboardingPhoneNumber: {
  162. on: {
  163. ...nextStageEvents('mobileNumber', 'Picker')
  164. }
  165. },
  166. OnboardingPhoneNumberConfirm: {
  167. on: {
  168. ...nextStageEvents('__confirmMobileNumber', 'Picker'),
  169. ALREADY_REGISTERED: {
  170. target: 'OnboardingDuplicateFeatureLogin'
  171. },
  172. RESEND_CODE: {
  173. target: 'OnboardingResendCode'
  174. }
  175. }
  176. },
  177. OnboardingResendCode: {
  178. on: {}
  179. },
  180. OnboardingDuplicateFeatureLogin: {
  181. on: {
  182. LOGIN: {
  183. target: 'OnboardingAccessingBoAccount'
  184. }
  185. }
  186. },
  187. OnboardingAccessingBoAccount: {
  188. on: {
  189. RECOVER: {
  190. target: 'RecoverEmail'
  191. }
  192. }
  193. },
  194. // Just a dead end for now
  195. RecoverEmail: {
  196. on: {}
  197. }
  198. }
  199. },
  200. OnboardingEmail: {
  201. on: {
  202. ...nextStageEvents('email', 'Address')
  203. }
  204. },
  205. Address: {
  206. initial: 'Picker',
  207. states: {
  208. Picker: {
  209. on: {
  210. '': [
  211. {
  212. cond: notHasPropCond('addressPostcode'),
  213. target: 'Postcode'
  214. },
  215. {
  216. cond: notHasPropCond('__addressComplete'),
  217. target: 'OnboardingAddress'
  218. },
  219. {
  220. cond: hasPropCond('__addressComplete'),
  221. target: 'OnboardingConfirmAddress'
  222. }
  223. ]
  224. }
  225. },
  226. Postcode: {
  227. initial: 'Picker',
  228. states: {
  229. Picker: {
  230. on: {
  231. '': [
  232. {
  233. cond: notHasPropCond('addressPostcode'),
  234. target: 'OnboardingPostcode'
  235. },
  236. {
  237. cond: notHasPropCond('__addressComplete'),
  238. target: 'OnboardingPostcodeResults'
  239. }
  240. ]
  241. }
  242. },
  243. OnboardingPostcode: {
  244. on: {
  245. ...nextStageEvents('addressPostcode', 'Picker')
  246. }
  247. },
  248. OnboardingPostcodeResults: {
  249. on: {
  250. ...nextStageEvents('__addressComplete', '#onboarding.Address'),
  251. MANUAL_ENTRY: {
  252. target: '#onboarding.Address.OnboardingAddress'
  253. }
  254. }
  255. }
  256. }
  257. },
  258. OnboardingAddress: {
  259. on: {
  260. ...nextStageEvents('__addressComplete', 'Picker')
  261. }
  262. },
  263. OnboardingConfirmAddress: {
  264. on: {
  265. ...nextStageEvents(
  266. '__confirmAddress',
  267. '#onboarding.OnboardingNationality'
  268. ),
  269. EDIT_ADDRESS: {
  270. target: 'Picker',
  271. actions: assign({ __addressComplete: (_ctx, _e) => false })
  272. }
  273. }
  274. }
  275. }
  276. },
  277. OnboardingNationality: {
  278. on: {
  279. ...nextStageEvents('nationalities', 'OnboardingTax', val => {
  280. if (Array.isArray(val)) {
  281. return val.length > 0;
  282. }
  283. return false;
  284. }),
  285. INVALID_NATIONALITY: {
  286. target: 'OnboardingDenied'
  287. }
  288. }
  289. },
  290. OnboardingTax: {
  291. on: {
  292. ...nextStageEvents('taxResidencies', 'PassCode'),
  293. INVALID_TAX: {
  294. target: 'OnboardingDenied'
  295. }
  296. }
  297. },
  298. OnboardingDenied: {
  299. on: {}
  300. },
  301. PassCode: {
  302. initial: 'Picker',
  303. states: {
  304. Picker: {
  305. on: {
  306. '': [
  307. {
  308. cond: notHasPropCond('__passCode'),
  309. target: 'OnboardingPassCode'
  310. },
  311. {
  312. cond: notHasPropCond('__passCodeConfirm'),
  313. target: 'OnboardingPassCodeConfirm'
  314. },
  315. {
  316. cond: hasPropCond('__passCodeConfirm'),
  317. target: '#onboarding.OnboardingNotifications'
  318. }
  319. ]
  320. }
  321. },
  322. OnboardingPassCode: {
  323. on: {
  324. ...nextStageEvents('__passCode', 'Picker')
  325. }
  326. },
  327. OnboardingPassCodeConfirm: {
  328. on: {
  329. ...nextStageEvents('__passCodeConfirm', 'Picker')
  330. }
  331. }
  332. }
  333. },
  334. OnboardingNotifications: {
  335. on: {
  336. COMPLETE: {
  337. target: 'OnboardingFSCS'
  338. }
  339. }
  340. },
  341. OnboardingFSCS: {
  342. on: {
  343. COMPLETE: {
  344. target: 'HooyuApi'
  345. }
  346. }
  347. },
  348. HooyuApi: {
  349. initial: 'OnboardingVerificationHome',
  350. states: {
  351. OnboardingVerificationHome: {
  352. on: {
  353. ENTER_ID: {
  354. target: 'ID',
  355. cond: notHasPropCond('__idPhoto')
  356. },
  357. ENTER_ADDRESS: {
  358. target: 'ADDRESS',
  359. cond: notHasPropCond('__addressPhoto')
  360. },
  361. ENTER_SELFIE: {
  362. target: 'SELFIE',
  363. cond: notHasPropCond('__selfiePhoto')
  364. },
  365. '': [
  366. {
  367. target: 'OnboardingVerificationWaiting',
  368. cond: context =>
  369. context.__idPhoto &&
  370. context.__addressPhoto &&
  371. context.__selfiePhoto &&
  372. !context.__hooyuVerificationComplete
  373. },
  374. {
  375. target: '#onboarding.OnboardingSuccess',
  376. cond: context =>
  377. context.__idPhoto &&
  378. context.__addressPhoto &&
  379. context.__selfiePhoto &&
  380. context.__hooyuVerificationComplete
  381. }
  382. ]
  383. }
  384. },
  385. ID: {
  386. initial: 'OnboardingVerificationOfficialID',
  387. states: {
  388. OnboardingVerificationOfficialID: {
  389. on: {
  390. TAKE_PHOTO: {
  391. target: 'OnboardingVerificationInstructions'
  392. },
  393. COMPLETE: {
  394. target: 'OnboardingVerificationOfficialIDCountry'
  395. }
  396. }
  397. },
  398. OnboardingVerificationOfficialIDCountry: {
  399. on: {
  400. TAKE_PHOTO: {
  401. target: 'OnboardingVerificationInstructions'
  402. }
  403. }
  404. },
  405. ...takePhotoStages(
  406. '__idPhoto',
  407. '#onboarding.HooyuApi.OnboardingVerificationHome'
  408. )
  409. }
  410. },
  411. ADDRESS: {
  412. initial: 'OnboardingVerificationProofAddress',
  413. states: {
  414. OnboardingVerificationProofAddress: {
  415. on: {
  416. COMPLETE: {
  417. target: 'OnboardingVerificationProofAddressSelection'
  418. }
  419. }
  420. },
  421. OnboardingVerificationProofAddressSelection: {
  422. on: {
  423. COMPLETE: {
  424. target: 'OnboardingVerficationProofOfAddressChecklist'
  425. }
  426. }
  427. },
  428. OnboardingVerficationProofOfAddressChecklist: {
  429. on: {
  430. TAKE_PHOTO: {
  431. target: 'OnboardingVerificationInstructions'
  432. }
  433. }
  434. },
  435. ...takePhotoStages(
  436. '__addressPhoto',
  437. '#onboarding.HooyuApi.OnboardingVerificationHome'
  438. )
  439. }
  440. },
  441. SELFIE: {
  442. initial: 'OnboardingVerificationSelfie',
  443. states: {
  444. OnboardingVerificationSelfie: {
  445. on: {
  446. TAKE_PHOTO: {
  447. target: 'OnboardingVerificationInstructions'
  448. }
  449. }
  450. },
  451. ...takePhotoStages(
  452. '__selfiePhoto',
  453. '#onboarding.HooyuApi.OnboardingVerificationHome'
  454. )
  455. }
  456. },
  457. // this polls for success
  458. OnboardingVerificationWaiting: {
  459. on: {
  460. FAIL: {
  461. target: 'OnboardingVerificationHome'
  462. },
  463. N_1: {
  464. target: '#onboarding.Start',
  465. actions: assign((_ctx, _e) => ({ ...emptyContext }))
  466. },
  467. COMPLETE: {
  468. target: '#onboarding.HooyuApi.OnboardingVerificationHome',
  469. actions: assign({
  470. __hooyuVerificationComplete: (_ctx, _e) => true
  471. })
  472. }
  473. }
  474. }
  475. }
  476. },
  477. OnboardingSuccess: {
  478. on: {
  479. COMPLETE: {
  480. target: 'PostOnboardingMarketingOptIn'
  481. }
  482. }
  483. },
  484. PostOnboardingMarketingOptIn: {
  485. on: {
  486. COMPLETE: {
  487. target: 'PostOnboardingEmail'
  488. }
  489. }
  490. },
  491. PostOnboardingEmailVerified: {
  492. on: {
  493. N_0: {
  494. target: 'App'
  495. },
  496. N_1: {
  497. target: 'PostOnboardingSupport'
  498. }
  499. }
  500. },
  501. PostOnboardingSupport: {
  502. on: {
  503. N_0: {
  504. target: 'PostOnboardingWelcome'
  505. }
  506. }
  507. },
  508. PostOnboardingTour: {
  509. on: {
  510. N_0: {
  511. target: 'PostOnboardingWelcome'
  512. }
  513. }
  514. },
  515. PostOnboardingLivingStatus: {
  516. on: {
  517. N_0: {
  518. target: 'PostOnboardingEmployment'
  519. }
  520. }
  521. },
  522. PostOnboardingEmployment: {
  523. on: {
  524. N_0: {
  525. target: 'PostOnboardingOccupation'
  526. },
  527. N_1: {
  528. target: 'PostOnboardingIncome'
  529. }
  530. }
  531. },
  532. PostOnboardingOccupation: {
  533. on: {
  534. N_0: {
  535. target: 'PostOnboardingIncome'
  536. }
  537. }
  538. },
  539. PostOnboardingIncome: {
  540. on: {
  541. N_0: {
  542. target: 'PostOnboardingSums'
  543. }
  544. }
  545. },
  546. PostOnboardingSums: {
  547. on: {
  548. N_0: {
  549. target: 'PostOnboardingCalculator'
  550. }
  551. }
  552. },
  553. PostOnboardingCalculator: {
  554. on: {
  555. N_0: {
  556. target: 'PostOnboardingAddMoney'
  557. }
  558. }
  559. },
  560. PostOnboardingAddMoney: {
  561. on: {
  562. N_0: {
  563. target: 'App'
  564. }
  565. }
  566. },
  567. PostOnboardingEmail: {
  568. on: {
  569. N_0: {
  570. target: 'PostOnboardingEmailEdit'
  571. },
  572. N_1: {
  573. target: 'PostOnboardingEmailSent'
  574. }
  575. }
  576. },
  577. PostOnboardingEmailSent: {
  578. on: {
  579. N_0: {
  580. target: 'PostOnboardingEmailIncorrect'
  581. },
  582. N_1: {
  583. target: 'ExternalOpenEmail'
  584. }
  585. }
  586. },
  587. ExternalOpenEmail: {
  588. on: {
  589. N_0: {
  590. target: 'PostOnboardingEmailVerified'
  591. }
  592. }
  593. },
  594. PostOnboardingWelcome: {
  595. on: {
  596. N_0: {
  597. target: 'PostOnboardingLivingStatus'
  598. },
  599. N_1: {
  600. target: 'PostOnboardingTour'
  601. }
  602. }
  603. },
  604. PostOnboardingEmailIncorrect: {
  605. on: {
  606. N_0: {
  607. target: 'PostOnboardingEmailEdit'
  608. },
  609. N_1: {
  610. target: 'PostOnboardingSupport'
  611. },
  612. N_2: {
  613. target: 'PostOnboardingEmailSent'
  614. }
  615. }
  616. },
  617. PostOnboardingEmailVerifiedRoute: {
  618. on: {
  619. N_0: {
  620. target: 'App'
  621. },
  622. N_1: {
  623. target: 'PostOnboardingSupport'
  624. }
  625. }
  626. },
  627. PostOnboardingEmailEdit: {
  628. on: {
  629. N_0: {
  630. target: 'PostOnboardingEmailSent'
  631. }
  632. }
  633. },
  634. App: {
  635. on: {}
  636. }
  637. };
  638.  
  639. const onboardingMachine = Machine(
  640. {
  641. id: 'onboarding',
  642. initial: 'Start',
  643. context: {
  644. firstName: true,
  645. lastName: true,
  646. dateOfBirth: true,
  647. mobileCountryCode: true,
  648. mobileNumber: true,
  649. email: true,
  650. addressLine1: undefined,
  651. addressLine2: undefined,
  652. addressLine3: undefined,
  653. addressTown: undefined,
  654. addressCounty: undefined,
  655. addressCountry: undefined,
  656. addressPostcode: true,
  657. equifaxAddressId: undefined,
  658. nationalities: ['one'],
  659. taxResidencies: ['one'],
  660. hooyuUrl: undefined,
  661. documents: [],
  662. mobileNumberConfirmed: false,
  663. upcomingTermsAndConditionsAcknowledged: null,
  664. error: null,
  665. verification: null,
  666. // different
  667. applying: false,
  668. confirmAddress: false,
  669. terms: false,
  670. privacy: false,
  671. accountFees: false,
  672. addressPostcodeResults: false,
  673. __applying: true,
  674. __privacy: true,
  675. __accountFees: true,
  676. __upcomingTerms: true,
  677. __terms: true,
  678. __addressComplete: true,
  679. __passCode: true,
  680. __passCodeConfirm: true,
  681. __confirmMobileNumber: true,
  682. __confirmAddress: true,
  683. },
  684. states
  685. },
  686. {
  687. guards: {
  688. hasProp: (context, _event, guard) => {
  689. const cond = guard.cond;
  690. const val = context[cond.onboardingDataPropName];
  691. if (Array.isArray(val)) {
  692. return val.length > 0;
  693. }
  694. return !!context[cond.onboardingDataPropName];
  695. },
  696.  
  697. notHasProp: (context, _event, guard) => {
  698. const cond = guard.cond;
  699. const val = context[cond.onboardingDataPropName];
  700. if (Array.isArray(val)) {
  701. return val.length === 0;
  702. }
  703. return !context[cond.onboardingDataPropName];
  704. }
  705. }
  706. }
  707. );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement