| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- import lzString from 'lz-string'
- import { defineStore } from 'pinia'
- import { ref } from 'vue'
- import { getWxQcCode } from '@/api/receiveCoupon'
- import { parseUrlParams } from '@/utils/index'
- export const useInviteCodeStore = defineStore('inviteCode', () => {
- const inviteCode = ref({
- compressedImage: '',
- imageType: '',
- shareData: {},
- shareKey: 'CCShareId',
- })
- const setInviteCode = (baseImg) => {
- // 移除data:前缀
- const pureBase64 = baseImg.split(',')[1] || baseImg
- // 压缩
- const compressed = lzString.compress(pureBase64)
- inviteCode.value.compressedImage = compressed
- inviteCode.value.imageType = baseImg.split(';')[0].split(':')[1]
- uni.setStorageSync('inviteCode', inviteCode.value)
- }
- const getInviteCode = () => {
- return new Promise<string>((resolve, reject) => {
- let compressed, type
- if (inviteCode.value.imageType && inviteCode.value.compressedImage) {
- compressed = inviteCode.value.compressedImage
- type = inviteCode.value.imageType
- }
- else if (uni.getStorageSync('inviteCode')) {
- compressed = uni.getStorageSync('inviteCode').compressedImage
- type = uni.getStorageSync('inviteCode').imageType
- }
- else {
- reject(new Error('没有邀请码'))
- return
- }
- // 解压
- const decompressed = lzString.decompress(compressed)
- resolve(`data:${type};base64,${decompressed}`)
- })
- }
- const fetchInviteCode = async () => {
- const res = await getWxQcCode({
- shareType: 'INVITE',
- sharePath: 'pages/home/home',
- width: 290,
- })
- const contentType = res.header['Content-Type'] || res.header['content-type']
- const contentData = res.header['x-content-data'] || res.header['x-content-data']
- if (contentType && contentType.includes('image')) {
- // 返回的是图片
- // 将arraybuffer转换为base64
- const arrayBuffer = res.data
- const base64 = uni.arrayBufferToBase64(arrayBuffer)
- const imageUrl = `data:image/jpeg;base64,${base64}`
- const params = parseUrlParams(contentData)
- console.log(params, '获取到的参数')
- inviteCode.value.shareData = params
- setInviteCode(imageUrl)
- }
- else {
- // 返回的是错误信息
- try {
- // 尝试将arraybuffer转换为字符串
- const decoder = new TextDecoder('utf-8')
- const errorText = decoder.decode(new Uint8Array(res.data))
- const errorData = JSON.parse(errorText)
- throw new Error(errorData.errmsg || '获取小程序码失败')
- }
- catch (e) {
- console.log(e, '获取小程序码失败,请检查access_token')
- // throw new Error('获取小程序码失败,请检查access_token')
- }
- }
- }
- const isFetchInviteCode = () => {
- if ((inviteCode.value.compressedImage && inviteCode.value.imageType) || uni.getStorageSync('inviteCode')) {
- console.log('当前用户已有小程序码')
- return true
- }
- else {
- fetchInviteCode()
- }
- }
- return {
- inviteCode,
- getInviteCode,
- isFetchInviteCode
- }
- }, {
- persist: true,
- })
|