Advertisement
Guest User

Untitled

a guest
Aug 15th, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.47 KB | None | 0 0
  1. import { SideBySideLayout } from 'components/common';
  2. import {
  3. LoginLayoutManagerLoading, LoginLayoutState, LoginStateManager, LoginStrategy
  4. } from 'domains/user/LoginStateManager';
  5. import { LoginData, PersonData } from 'domains/user/models';
  6. import { UserStatus, UserStatusEntity, UserStatusStore } from 'domains/user/UserStatusStore';
  7. import { action, computed, observable } from 'mobx';
  8. import { observer } from 'mobx-react';
  9. import * as React from 'react';
  10. import { RouteComponentProps } from 'react-router';
  11. import { Inject } from 'utils/di';
  12. import { LoginForm, PersonDataForm, PhoneInput } from './components';
  13. import { InputMask } from './types';
  14.  
  15. @observer
  16. export class PageLogin extends React.Component<RouteComponentProps<any>> {
  17. @Inject(LoginStateManager)
  18. loginStateManager: LoginStateManager
  19. @Inject(UserStatusStore)
  20. userStatusStore: UserStatusStore
  21. @observable
  22. loginData: LoginData = new LoginData()
  23. @observable
  24. personData: PersonData = new PersonData()
  25.  
  26. phoneMaskOptions = {
  27. forceMaskOnFocus: true,
  28. mask: '+0 (000) 000-00-00',
  29. unmask: true,
  30. onAccept: this.handleMaskedInputChange
  31. }
  32.  
  33. constructor(props: RouteComponentProps<any>) {
  34. super(props)
  35.  
  36. this.handleMaskedInputChange = this.handleMaskedInputChange.bind(this)
  37. this.checkUser = this.checkUser.bind(this)
  38. }
  39.  
  40. @computed
  41. get formSectionComponent(): JSX.Element {
  42. if (!this.loginStateManager.state) {
  43. return this.renderPhoneInput()
  44. }
  45. const { title, tip, step, finalStep, name } = this.loginStateManager.state
  46.  
  47. return (
  48. <div>
  49. {!!(step && finalStep) && (
  50. <span>
  51. Шаг {step} из {finalStep}
  52. </span>
  53. )}
  54. {title && <h2>{title}</h2>}
  55. {tip && <p>{tip}</p>}
  56. {name === LoginLayoutState.REGISTRATION_PERSONAL_DATA ? (
  57. <PersonDataForm personData={this.personData} />
  58. ) : (
  59. <LoginForm loginData={this.loginData} />
  60. )}
  61. </div>
  62. )
  63. }
  64.  
  65. @computed
  66. get illustrationSectionComponent(): JSX.Element {
  67. if (!this.loginStateManager.state) {
  68. return <span>Start illustration</span>
  69. }
  70.  
  71. // здесь можно прописать компоненты для каждой секции в отдельности, в зависимости от состояния
  72. switch (this.loginStateManager.state.name) {
  73. case LoginLayoutState.PASSWORD:
  74. return <span>Иллюстрация для ввода пароля</span>
  75. default:
  76. return <span>Start form</span>
  77. }
  78. }
  79.  
  80. @computed
  81. get phoneIsValid() {
  82. return this.loginData.phone.length === 11
  83. }
  84.  
  85. @action.bound
  86. handleMaskedInputChange(value: string, masked: InputMask) {
  87. if (masked.el && masked.el.input) {
  88. const { name } = masked.el.input
  89.  
  90. this.loginData.set(name, value)
  91. }
  92. }
  93.  
  94. checkUser(): void {
  95. this.loginStateManager.setLoading(LoginLayoutManagerLoading.PAGE, { state: true })
  96.  
  97. this.userStatusStore.getStatus(this.loginData.phone).then((checkStatusEntity: UserStatusEntity) => {
  98. this.loginStateManager.resetLoading(LoginLayoutManagerLoading.PAGE)
  99. switch (checkStatusEntity.auth) {
  100. case UserStatus.PASSWORD:
  101. this.loginStateManager.setStrategy(LoginStrategy.OLD_USER)
  102. break
  103. case UserStatus.SMS:
  104. this.loginStateManager.setStrategy(LoginStrategy.OLD_USER_NOPASSWORD)
  105. break
  106. default:
  107. this.loginStateManager.setStrategy(LoginStrategy.NEW_USER)
  108. }
  109. })
  110. // TODO: добавить ошибку в catch, когда появятся макеты
  111. }
  112.  
  113. renderPhoneInput(): JSX.Element {
  114. return (
  115. <div>
  116. <h2>Введите свой номер телефона, чтобы войти или зарегистрироваться</h2>
  117. <PhoneInput maskOptions={this.phoneMaskOptions} value={this.loginData.phone} />
  118. <button type="button" onClick={this.checkUser} disabled={!this.phoneIsValid}>
  119. Продолжить
  120. </button>
  121. </div>
  122. )
  123. }
  124.  
  125. render(): JSX.Element {
  126. const { formLoading, illustrationLoading, pageLoading } = this.loginStateManager
  127.  
  128. return (
  129. <SideBySideLayout
  130. left={this.formSectionComponent}
  131. right={this.illustrationSectionComponent}
  132. leftLoading={formLoading}
  133. rightLoading={illustrationLoading}
  134. pageLoading={pageLoading}
  135. />
  136. )
  137. }
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement