- 新增全局隐私协议授权管理器 privacyManager,统一管理弹窗显示和授权结果 - 用 PrivacyModal 组件替代原先 Taro.showModal 实现,使用 open-type="agreePrivacyAuthorization" 的 Button 触发微信认可的隐私授权 - 在 app.tsx 中注册 onNeedPrivacyAuthorization 回调,通过 privacyManager.show 弹出隐私弹窗 - 登录和注册页面 useDidShow 钩子调用 ensurePrivacyAuthorized 函数预检隐私授权状态,避免授权失败 - 修复登录/注册接口调用,统一使用 request.post + SERVER_API_URL,修正错误接口地址及导入问题 - 新增隐私弹窗样式和逻辑,实现用户同意或拒绝后的正确流程处理 - 解决微信基础库 3.16.1+ 强制隐私协议授权导致敏感 API 调用失败问题
57 lines
1.9 KiB
TypeScript
57 lines
1.9 KiB
TypeScript
import { useEffect, useState } from 'react'
|
|
import Taro from '@tarojs/taro'
|
|
import { View, Button, Text } from '@tarojs/components'
|
|
import { privacyManager } from '@/utils/privacy'
|
|
import './index.scss'
|
|
|
|
/**
|
|
* 微信隐私协议授权弹窗(基础库 3.16.1+ 强制)
|
|
* 必须使用 open-type="agreePrivacyAuthorization" 的 Button 组件,
|
|
* 用户点击后微信才会真正认为隐私协议已授权,后续敏感 API 才能调用。
|
|
*/
|
|
const PrivacyModal = () => {
|
|
const [visible, setVisible] = useState(false)
|
|
const [contractName, setContractName] = useState(privacyManager.getPrivacyContractName())
|
|
|
|
useEffect(() => {
|
|
privacyManager.setShowCallback((show) => {
|
|
setVisible(show)
|
|
if (show) {
|
|
setContractName(privacyManager.getPrivacyContractName())
|
|
}
|
|
})
|
|
}, [])
|
|
|
|
if (!visible) return null
|
|
|
|
return (
|
|
<View className='privacy-modal'>
|
|
<View className='privacy-modal__mask' />
|
|
<View className='privacy-modal__content'>
|
|
<Text className='privacy-modal__title'>隐私协议授权</Text>
|
|
<Text className='privacy-modal__desc'>
|
|
{`为提供完整服务,需您同意 ${contractName}。点击同意后可继续使用手机号快捷登录、相册等功能。`}
|
|
</Text>
|
|
<View className='privacy-modal__footer'>
|
|
<Button
|
|
className='privacy-modal__btn'
|
|
onClick={() => privacyManager.disagree()}
|
|
>
|
|
拒绝
|
|
</Button>
|
|
<Button
|
|
className='privacy-modal__btn privacy-modal__btn--primary'
|
|
openType='agreePrivacyAuthorization'
|
|
onAgreePrivacyAuthorization={() => privacyManager.agree()}
|
|
onDisagreePrivacyAuthorization={() => privacyManager.disagree()}
|
|
>
|
|
同意
|
|
</Button>
|
|
</View>
|
|
</View>
|
|
</View>
|
|
)
|
|
}
|
|
|
|
export default PrivacyModal
|