Files
digital-pilates/components/PrivacyConsentModal.tsx
richarjiang 3312250f2d feat: 添加教练功能和更新用户界面
- 新增教练页面,用户可以与教练进行互动和咨询
- 更新首页,切换到教练 tab 并传递名称参数
- 优化个人信息页面,添加注销帐号和退出登录功能
- 更新隐私政策和用户协议的链接,确保用户在使用前同意相关条款
- 修改今日训练页面标题为“开始训练”,提升用户体验
- 删除不再使用的进度条组件,简化代码结构
2025-08-15 21:38:19 +08:00

193 lines
4.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { PRIVACY_POLICY_URL, USER_AGREEMENT_URL } from '@/constants/Agree';
import React from 'react';
import {
Dimensions,
Linking,
Modal,
StyleSheet,
Text,
TouchableOpacity,
View
} from 'react-native';
const { width } = Dimensions.get('window');
interface PrivacyConsentModalProps {
visible: boolean;
onAgree: () => void;
onDisagree: () => void;
}
export default function PrivacyConsentModal({
visible,
onAgree,
onDisagree,
}: PrivacyConsentModalProps) {
const handleUserAgreementPress = () => {
Linking.openURL(USER_AGREEMENT_URL);
};
const handlePrivacyPolicyPress = () => {
Linking.openURL(PRIVACY_POLICY_URL);
};
return (
<Modal
visible={visible}
transparent
animationType="fade"
statusBarTranslucent
>
<View style={styles.overlay}>
<View style={styles.container}>
<Text style={styles.title}></Text>
<View style={styles.contentContainer}>
<Text style={styles.description}>
"同意并继续"
</Text>
<View style={styles.linksContainer}>
<TouchableOpacity onPress={handleUserAgreementPress}>
<Text style={styles.link}></Text>
</TouchableOpacity>
<Text style={styles.and}> </Text>
<TouchableOpacity onPress={handlePrivacyPolicyPress}>
<Text style={styles.link}></Text>
</TouchableOpacity>
</View>
<Text style={styles.description}>
</Text>
<View style={styles.viewFullContainer}>
<Text style={styles.viewFull}> </Text>
<TouchableOpacity onPress={handleUserAgreementPress}>
<Text style={styles.link}></Text>
</TouchableOpacity>
<Text style={styles.viewFull}> </Text>
<TouchableOpacity onPress={handlePrivacyPolicyPress}>
<Text style={styles.link}></Text>
</TouchableOpacity>
</View>
</View>
<TouchableOpacity style={styles.agreeButton} onPress={onAgree}>
<Text style={styles.agreeButtonText}></Text>
</TouchableOpacity>
<TouchableOpacity style={styles.disagreeButton} onPress={onDisagree}>
<Text style={styles.disagreeButtonText}>退</Text>
</TouchableOpacity>
</View>
</View>
</Modal>
);
}
const styles = StyleSheet.create({
overlay: {
flex: 1,
backgroundColor: 'rgba(0, 0, 0, 0.5)',
justifyContent: 'center',
alignItems: 'center',
paddingHorizontal: 20,
},
container: {
backgroundColor: 'white',
borderRadius: 20,
padding: 24,
width: width * 0.85,
maxWidth: 400,
alignItems: 'center',
},
iconContainer: {
marginBottom: 20,
alignItems: 'center',
},
characterContainer: {
position: 'relative',
alignItems: 'center',
},
iconText: {
fontSize: 48,
marginBottom: 8,
},
balloons: {
position: 'absolute',
top: -5,
right: -25,
flexDirection: 'row',
gap: 4,
},
balloon: {
width: 12,
height: 16,
borderRadius: 6,
},
title: {
fontSize: 20,
fontWeight: '600',
color: '#1F2937',
marginBottom: 20,
textAlign: 'center',
},
contentContainer: {
marginBottom: 24,
},
description: {
fontSize: 14,
color: '#6B7280',
lineHeight: 20,
textAlign: 'center',
},
linksContainer: {
flexDirection: 'row',
justifyContent: 'center',
alignItems: 'center',
flexWrap: 'wrap',
},
link: {
fontSize: 14,
color: '#8B5FE6',
textDecorationLine: 'underline',
},
and: {
fontSize: 14,
color: '#6B7280',
},
viewFullContainer: {
flexDirection: 'row',
justifyContent: 'center',
alignItems: 'center',
flexWrap: 'wrap',
marginTop: 4,
},
viewFull: {
fontSize: 14,
color: '#6B7280',
},
agreeButton: {
backgroundColor: '#8B5FE6',
borderRadius: 25,
paddingVertical: 14,
paddingHorizontal: 40,
width: '100%',
marginBottom: 12,
},
agreeButtonText: {
color: 'white',
fontSize: 16,
fontWeight: '600',
textAlign: 'center',
},
disagreeButton: {
paddingVertical: 14,
paddingHorizontal: 40,
},
disagreeButtonText: {
color: '#9CA3AF',
fontSize: 16,
fontWeight: '500',
textAlign: 'center',
},
});