page.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import React from 'react';
  2. import './index.less';
  3. import Page from '@src/containers/Page';
  4. import Assets from '@src/components/Assets';
  5. import { asyncSMessage } from '@src/services/AsyncTools';
  6. import { dataURLtoBlob, formatDate } from '@src/services/Tools';
  7. import Icon from '../../../components/Icon';
  8. import { Common } from '../../../stores/common';
  9. // import { User } from '../../../stores/user';
  10. import { My } from '../../../stores/my';
  11. export default class extends Page {
  12. initState() {
  13. return { state: 'wait' };
  14. }
  15. init() {
  16. this.wx = null;
  17. Common.readyWechat(window.location.href, ['chooseImage', 'getLocalImgData']).then(wx => {
  18. this.wx = wx;
  19. });
  20. }
  21. initData() {
  22. console.log(this.props.user);
  23. if (this.props.user.info.bindReal) {
  24. this.setState({ state: 'already' });
  25. }
  26. }
  27. submitFront() {
  28. const self = this;
  29. if (this.wx) {
  30. this.wx.chooseImage({
  31. count: 1, // 默认9
  32. sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
  33. sourceType: ['camera'], // 可以指定来源是相册还是相机,默认二者都有
  34. success(response) {
  35. wx.getLocalImgData({
  36. localId: response.localIds[0].toString(),
  37. success: res => {
  38. const { localData } = res;
  39. let imageBase64 = '';
  40. if (localData.indexOf('data:image') === 0) {
  41. // 苹果的直接赋值,默认生成'data:image/jpeg;base64,'的头部拼接
  42. imageBase64 = localData;
  43. } else {
  44. // 此处是安卓中的唯一得坑!在拼接前需要对localData进行换行符的全局替换
  45. // 此时一个正常的base64图片路径就完美生成赋值到img的src中了
  46. imageBase64 = `data:image/jpeg;base64,${localData.replace(/\n/g, '')}`;
  47. }
  48. self.setState({ front: imageBase64 });
  49. My.realFront(new File([dataURLtoBlob(imageBase64)], 'front.jpg'))
  50. .then(() => {
  51. self.front = true;
  52. self.submit();
  53. })
  54. .catch(err => {
  55. asyncSMessage(err.message, 'error');
  56. });
  57. },
  58. });
  59. },
  60. });
  61. }
  62. }
  63. submitBack() {
  64. const self = this;
  65. if (this.wx) {
  66. this.wx.chooseImage({
  67. count: 1, // 默认9
  68. sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
  69. sourceType: ['camera'], // 可以指定来源是相册还是相机,默认二者都有
  70. success(response) {
  71. wx.getLocalImgData({
  72. localId: response.localIds[0].toString(),
  73. success: res => {
  74. const { localData } = res;
  75. let imageBase64 = '';
  76. if (localData.indexOf('data:image') === 0) {
  77. // 苹果的直接赋值,默认生成'data:image/jpeg;base64,'的头部拼接
  78. imageBase64 = localData;
  79. } else {
  80. // 此处是安卓中的唯一得坑!在拼接前需要对localData进行换行符的全局替换
  81. // 此时一个正常的base64图片路径就完美生成赋值到img的src中了
  82. imageBase64 = `data:image/jpeg;base64,${localData.replace(/\n/g, '')}`;
  83. }
  84. self.setState({ back: imageBase64 });
  85. My.realBack(new File([dataURLtoBlob(imageBase64)], 'back.jpg'))
  86. .then(() => {
  87. self.back = true;
  88. self.submit();
  89. })
  90. .catch(err => {
  91. asyncSMessage(err.message, 'error');
  92. });
  93. },
  94. });
  95. },
  96. });
  97. }
  98. }
  99. submit() {
  100. if (!this.front || !this.back) {
  101. return;
  102. }
  103. My.realFinish().then((result) => {
  104. this.setState({ state: 'finish', data: result });
  105. });
  106. }
  107. renderWait() {
  108. return (
  109. <div>
  110. <div className="text">
  111. 请扫描您的居民身份证原件,领取30天VIP权限。
  112. <br />
  113. 千行将重视和保护您的隐私。
  114. </div>
  115. <div className="id-card-1">
  116. <Assets
  117. src={this.state.front}
  118. name={this.state.front ? '' : 'IDcard'}
  119. />
  120. <Assets
  121. className="scan"
  122. name='scan1'
  123. onClick={() => {
  124. this.submitFront();
  125. }}
  126. />
  127. </div>
  128. <div className="id-card-2">
  129. <Assets
  130. src={this.state.back}
  131. name={this.state.back ? '' : 'IDcard2'}
  132. />
  133. <Assets
  134. className="scan"
  135. name='scan2'
  136. onClick={() => {
  137. this.submitBack();
  138. }}
  139. />
  140. </div>
  141. </div>
  142. );
  143. }
  144. renderFinish() {
  145. const { data = {} } = this.state;
  146. const { record } = data;
  147. return (
  148. <div className="finish">
  149. <div className="icon">
  150. <Icon type="check-circle" />
  151. </div>
  152. <div className="title">认证完成!</div>
  153. <div className="desc">30天VIP权限已赠送至您的账户</div>
  154. <div className="desc">生效时间:{record.useStartTime && formatDate(record.useStartTime, 'YYYY-MM-DD')}</div>
  155. </div>
  156. );
  157. }
  158. renderAlready() {
  159. return (
  160. <div className="finish">
  161. <div className="icon">
  162. <Icon type="check-circle" />
  163. </div>
  164. <div className="title">已通过</div>
  165. </div>
  166. );
  167. }
  168. renderView() {
  169. const { state } = this.state;
  170. console.log(state);
  171. switch (state) {
  172. case 'already':
  173. return this.renderAlready();
  174. case 'finish':
  175. return this.renderFinish();
  176. default:
  177. return this.renderWait();
  178. }
  179. }
  180. }