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((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, })