inviteQCCode.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import lzString from 'lz-string'
  2. import { defineStore } from 'pinia'
  3. import { ref } from 'vue'
  4. import { getWxQcCode } from '@/api/receiveCoupon'
  5. import { parseUrlParams } from '@/utils/index'
  6. export const useInviteCodeStore = defineStore('inviteCode', () => {
  7. const inviteCode = ref({
  8. compressedImage: '',
  9. imageType: '',
  10. shareData: {},
  11. shareKey: 'CCShareId',
  12. })
  13. const setInviteCode = (baseImg) => {
  14. // 移除data:前缀
  15. const pureBase64 = baseImg.split(',')[1] || baseImg
  16. // 压缩
  17. const compressed = lzString.compress(pureBase64)
  18. inviteCode.value.compressedImage = compressed
  19. inviteCode.value.imageType = baseImg.split(';')[0].split(':')[1]
  20. uni.setStorageSync('inviteCode', inviteCode.value)
  21. }
  22. const getInviteCode = () => {
  23. return new Promise<string>((resolve, reject) => {
  24. let compressed, type
  25. if (inviteCode.value.imageType && inviteCode.value.compressedImage) {
  26. compressed = inviteCode.value.compressedImage
  27. type = inviteCode.value.imageType
  28. }
  29. else if (uni.getStorageSync('inviteCode')) {
  30. compressed = uni.getStorageSync('inviteCode').compressedImage
  31. type = uni.getStorageSync('inviteCode').imageType
  32. }
  33. else {
  34. reject(new Error('没有邀请码'))
  35. return
  36. }
  37. // 解压
  38. const decompressed = lzString.decompress(compressed)
  39. resolve(`data:${type};base64,${decompressed}`)
  40. })
  41. }
  42. const fetchInviteCode = async () => {
  43. const res = await getWxQcCode({
  44. shareType: 'INVITE',
  45. sharePath: 'pages/home/home',
  46. width: 290,
  47. })
  48. const contentType = res.header['Content-Type'] || res.header['content-type']
  49. const contentData = res.header['x-content-data'] || res.header['x-content-data']
  50. if (contentType && contentType.includes('image')) {
  51. // 返回的是图片
  52. // 将arraybuffer转换为base64
  53. const arrayBuffer = res.data
  54. const base64 = uni.arrayBufferToBase64(arrayBuffer)
  55. const imageUrl = `data:image/jpeg;base64,${base64}`
  56. const params = parseUrlParams(contentData)
  57. console.log(params, '获取到的参数')
  58. inviteCode.value.shareData = params
  59. setInviteCode(imageUrl)
  60. }
  61. else {
  62. // 返回的是错误信息
  63. try {
  64. // 尝试将arraybuffer转换为字符串
  65. const decoder = new TextDecoder('utf-8')
  66. const errorText = decoder.decode(new Uint8Array(res.data))
  67. const errorData = JSON.parse(errorText)
  68. throw new Error(errorData.errmsg || '获取小程序码失败')
  69. }
  70. catch (e) {
  71. console.log(e, '获取小程序码失败,请检查access_token')
  72. // throw new Error('获取小程序码失败,请检查access_token')
  73. }
  74. }
  75. }
  76. const isFetchInviteCode = () => {
  77. if ((inviteCode.value.compressedImage && inviteCode.value.imageType) || uni.getStorageSync('inviteCode')) {
  78. console.log('当前用户已有小程序码')
  79. return true
  80. }
  81. else {
  82. fetchInviteCode()
  83. }
  84. }
  85. return {
  86. inviteCode,
  87. getInviteCode,
  88. isFetchInviteCode
  89. }
  90. }, {
  91. persist: true,
  92. })