index.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import {
  2. closeToast,
  3. Image,
  4. showFailToast,
  5. showLoadingToast,
  6. showSuccessToast,
  7. showToast
  8. } from 'vant'
  9. import { defineComponent, onMounted, reactive } from 'vue'
  10. import styles from './index.module.less'
  11. import content1 from './images/content1.png'
  12. import content2 from './images/content2.png'
  13. import qrcode from './images/qrcode.jpg'
  14. import html2canvas from 'html2canvas'
  15. import { promisefiyPostMessage, postMessage } from '@/helpers/native-message'
  16. export default defineComponent({
  17. name: 'follow-account',
  18. setup() {
  19. const imgs = reactive({
  20. saveLoading: false,
  21. image: null as any,
  22. shareLoading: false
  23. })
  24. const onSaveImg = async () => {
  25. // 判断是否在保存中...
  26. if (imgs.saveLoading) {
  27. return
  28. }
  29. imgs.saveLoading = true
  30. // 判断是否已经生成图片
  31. if (imgs.image) {
  32. saveImg()
  33. } else {
  34. const container: any = document.getElementById(`preview-container`)
  35. html2canvas(container, {
  36. allowTaint: true,
  37. useCORS: true,
  38. backgroundColor: null
  39. })
  40. .then(async (canvas) => {
  41. const url = canvas.toDataURL('image/png')
  42. imgs.image = url
  43. saveImg()
  44. })
  45. .catch(() => {
  46. closeToast()
  47. imgs.saveLoading = false
  48. })
  49. }
  50. }
  51. const saveImg = async () => {
  52. showLoadingToast({ message: '图片生成中...', forbidClick: true })
  53. setTimeout(() => {
  54. imgs.saveLoading = false
  55. }, 100)
  56. const res = await promisefiyPostMessage({
  57. api: 'savePicture',
  58. content: {
  59. base64: imgs.image
  60. }
  61. })
  62. if (res?.content?.status === 'success') {
  63. showSuccessToast('保存成功')
  64. } else {
  65. showFailToast('保存失败')
  66. }
  67. }
  68. onMounted(() => {
  69. postMessage({ api: 'setBarStatus', content: { status: 0 } })
  70. })
  71. return () => (
  72. <div class={styles.followAccount}>
  73. <Image src={content1} class={styles.content1} />
  74. <Image src={content2} class={styles.content2} />
  75. <div class={styles.saveQrcode} onClick={onSaveImg}></div>
  76. <div id="preview-container" class={styles.followQrcode}>
  77. <Image src={qrcode} />
  78. </div>
  79. </div>
  80. )
  81. }
  82. })