/* 碰盏日记 - 邀请链路处理(邀请码模式,SDK v1.0.12) * * 后端规则:每次邀请都生成新的邀请码(一次性,不复用) * * 新流程: * 1. 邀请人调用 SendFriendRequest({ message }) 创建邀请 → 后端返回新的 inviteCode(好友请求ID) * 2. 分享链接携带 inviteCode、inviterNick;每次分享后重新生成新码供下次使用 * 3. 被邀请人打开小程序 → index.vue / friends.vue onLoad 收到 inviteCode → savePendingInvite 暂存 * 4. 被邀请人登录后调用 AcceptFriendRequest({ id: inviteCode }) 接受邀请,双方成为酒友 */ import { SendFriendRequest, AcceptFriendRequest } from './api' const INVITE_KEY = 'pending_invite' // 我收到的邀请(待接受) // 内存记录最近一次自己生成的邀请码(仅用于过滤自己点开自己的分享) let myLastCode = '' // 清理旧版本遗留的永久缓存键(旧方案曾永久缓存邀请码,新方案每次生成新码) try { uni.removeStorageSync('my_invite_code') } catch (e) { /* ignore */ } /** * 生成新的邀请码(用于分享) * 后端每次邀请都生成新码,故不做持久化缓存,每次调用都创建新邀请 * @returns {Promise} 邀请码,未登录或失败返回空字符串 */ export async function getMyInviteCode() { if (uni.getStorageSync('is_logged_in') !== 'true') return '' try { const res = await SendFriendRequest({ message: '邀请你成为酒友,一起记录饮酒生活 🍻' }) const code = res.data && res.data.inviteCode if (code !== undefined && code !== null && code !== '') { myLastCode = String(code) return myLastCode } } catch (e) { console.warn('[invite] 创建邀请码失败', e) } return '' } /** * 暂存收到的邀请(由分享落地页 onLoad 调用) * @param {string|number} inviteCode - 邀请码(好友请求ID) * @param {string} inviterNick - 邀请人昵称(用于提示文案) */ export function savePendingInvite(inviteCode, inviterNick) { if (!inviteCode) return try { // 自己分享给自己的邀请码,不处理(同一会话内自己点开自己的分享卡片) if (myLastCode && String(myLastCode) === String(inviteCode)) return uni.setStorageSync(INVITE_KEY, JSON.stringify({ inviteCode: String(inviteCode), // uni-app onLoad options 已自动解码,此处直接存储 inviterNick: inviterNick || '' })) } catch (e) { /* ignore */ } } /** * 接受暂存的邀请(已登录时调用) * 用邀请码调用 AcceptFriendRequest,成功后清除暂存 * @returns {Promise} 是否成功接受 */ export async function handlePendingInvite() { // 未登录时不处理,等登录完成后再调用 if (uni.getStorageSync('is_logged_in') !== 'true') return false let invite = null try { invite = JSON.parse(uni.getStorageSync(INVITE_KEY) || '') } catch (e) { /* ignore */ } if (!invite || !invite.inviteCode) return false try { await AcceptFriendRequest({ requestId: invite.inviteCode }) uni.removeStorageSync(INVITE_KEY) const nick = invite.inviterNick || '邀请人' uni.showToast({ title: `已接受邀请,和「${nick}」成为酒友 🍻`, icon: 'none', duration: 2500 }) return true } catch (e) { // 后端可能返回"已是好友/邀请已失效"等业务失败,同样清除暂存避免重复提示 uni.removeStorageSync(INVITE_KEY) console.warn('[invite] 接受邀请失败', e) return false } }