page.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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 } from '@src/services/Tools';
  7. import { Common } from '../../../stores/common';
  8. import { My } from '../../../stores/my';
  9. export default class extends Page {
  10. initState() {
  11. return { state: 'wait' };
  12. }
  13. init() {
  14. this.wx = null;
  15. Common.readyWechat(window.location.href, ['chooseImage', 'getLocalImgData'])
  16. .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(() => {
  96. this.setState({ state: 'finish' });
  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 className="scan" src={this.state.front} name="scan1" onClick={() => {
  110. this.submitFront();
  111. }} />
  112. </div>
  113. <div className="id-card-2">
  114. <Assets name="IDcard2" />
  115. <Assets className="scan" src={this.state.back} name="scan2" onClick={() => {
  116. this.submitBack();
  117. }} />
  118. </div>
  119. </div>
  120. );
  121. }
  122. renderFinish() {
  123. return <div />;
  124. }
  125. renderView() {
  126. const { state } = this.state;
  127. switch (state) {
  128. case 'finish':
  129. return this.renderFinish();
  130. default:
  131. return this.renderWait();
  132. }
  133. }
  134. }