page.js 5.2 KB

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