Files
digital-pilates/components/PrivacyConsentModal.tsx
richarjiang 72e75b602e feat: 更新心情记录功能和界面
- 调整启动画面中的图片宽度,提升视觉效果
- 移除引导页面相关组件,简化应用结构
- 新增心情统计页面,支持用户查看和分析心情数据
- 优化心情卡片组件,增强用户交互体验
- 更新登录页面标题,提升品牌一致性
- 新增心情日历和编辑功能,支持用户记录和管理心情
2025-08-21 17:59:22 +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}>Sealife</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',
},
});