/** * getPhoneNumber 全局频率控制 * * 微信原生层对 getPhoneNumber API 有调用频率限制,短时间内多次调用会报: * [渲染层错误] invoke getPhoneNumber too frequently * * 本模块提供模块级(跨页面)的时间戳锁,配合各页面的 useRef 同步锁 + 条件渲染使用。 */ /** 上次 getPhoneNumber 回调触发的时间戳(ms) */ let lastPhoneAuthTime = 0 /** 冷却期(ms),在此期间不允许再次触发 getPhoneNumber */ const PHONE_AUTH_COOLDOWN = 8000 /** * 检查当前是否在冷却期内。 * 在渲染 getPhoneNumber 按钮前调用此函数,若在冷却期内则不渲染 openType。 */ export function isPhoneAuthCoolingDown(): boolean { if (lastPhoneAuthTime === 0) return false return Date.now() - lastPhoneAuthTime < PHONE_AUTH_COOLDOWN } /** 记录一次 getPhoneNumber 回调已触发(在 onGetPhoneNumber 回调入口调用) */ export function markPhoneAuthCalled(): void { lastPhoneAuthTime = Date.now() } /** 获取冷却期剩余时间(ms),用于设置 unlock 延迟 */ export function getPhoneAuthCooldownRemaining(): number { if (lastPhoneAuthTime === 0) return 0 const remaining = PHONE_AUTH_COOLDOWN - (Date.now() - lastPhoneAuthTime) return remaining > 0 ? remaining : 0 }