2026-04-05 20:26:51 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 身份认证设置页面
|
|
|
|
|
|
* 用户查看认证状态、提交认证申请
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
import React, { useEffect, useState } from 'react';
|
|
|
|
|
|
import {
|
|
|
|
|
|
View,
|
|
|
|
|
|
Text,
|
|
|
|
|
|
StyleSheet,
|
|
|
|
|
|
TouchableOpacity,
|
|
|
|
|
|
ScrollView,
|
|
|
|
|
|
Image,
|
|
|
|
|
|
Alert,
|
|
|
|
|
|
ActivityIndicator,
|
|
|
|
|
|
} from 'react-native';
|
|
|
|
|
|
import { SafeAreaView } from 'react-native-safe-area-context';
|
|
|
|
|
|
import { useRouter } from 'expo-router';
|
|
|
|
|
|
import { MaterialCommunityIcons } from '@expo/vector-icons';
|
|
|
|
|
|
import { useAppColors, type AppColors } from '../../theme';
|
|
|
|
|
|
import {
|
|
|
|
|
|
useVerificationStore,
|
|
|
|
|
|
useVerificationStatus,
|
|
|
|
|
|
useVerificationLoading,
|
2026-04-13 04:56:58 +08:00
|
|
|
|
} from '../../stores/auth';
|
2026-04-13 01:30:37 +08:00
|
|
|
|
import { showPrompt } from '@/services/ui';
|
2026-04-05 20:26:51 +08:00
|
|
|
|
import * as hrefs from '../../navigation/hrefs';
|
|
|
|
|
|
|
|
|
|
|
|
const STATUS_CONFIG = {
|
|
|
|
|
|
not_submitted: {
|
|
|
|
|
|
title: '未认证',
|
|
|
|
|
|
description: '完成身份认证,解锁更多专属功能',
|
|
|
|
|
|
icon: 'account-question-outline',
|
|
|
|
|
|
color: '#999',
|
|
|
|
|
|
},
|
|
|
|
|
|
pending: {
|
|
|
|
|
|
title: '审核中',
|
|
|
|
|
|
description: '您的认证申请正在审核中,请耐心等待',
|
|
|
|
|
|
icon: 'clock-outline',
|
|
|
|
|
|
color: '#FFA500',
|
|
|
|
|
|
},
|
|
|
|
|
|
approved: {
|
|
|
|
|
|
title: '已认证',
|
|
|
|
|
|
description: '您已完成身份认证',
|
|
|
|
|
|
icon: 'check-decagram',
|
|
|
|
|
|
color: '#4CAF50',
|
|
|
|
|
|
},
|
|
|
|
|
|
rejected: {
|
|
|
|
|
|
title: '认证失败',
|
|
|
|
|
|
description: '您的认证申请被拒绝,可以重新提交',
|
|
|
|
|
|
icon: 'close-circle-outline',
|
|
|
|
|
|
color: '#F44336',
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const IDENTITY_TEXT: Record<string, string> = {
|
|
|
|
|
|
general: '普通用户',
|
|
|
|
|
|
student: '在校学生',
|
|
|
|
|
|
teacher: '教职工',
|
2026-04-26 19:54:10 +08:00
|
|
|
|
staff: '官方工作人员',
|
2026-04-05 20:26:51 +08:00
|
|
|
|
alumni: '校友',
|
|
|
|
|
|
external: '外部人员',
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
export const VerificationSettingsScreen: React.FC = () => {
|
|
|
|
|
|
const colors = useAppColors();
|
|
|
|
|
|
const styles = createStyles(colors);
|
|
|
|
|
|
const router = useRouter();
|
|
|
|
|
|
const status = useVerificationStatus();
|
|
|
|
|
|
const loading = useVerificationLoading();
|
|
|
|
|
|
const { fetchStatus, reset } = useVerificationStore();
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
fetchStatus();
|
|
|
|
|
|
return () => {
|
|
|
|
|
|
reset();
|
|
|
|
|
|
};
|
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
|
|
const handleStartVerification = () => {
|
2026-04-07 15:58:51 +08:00
|
|
|
|
router.push(hrefs.hrefVerificationGuide());
|
2026-04-05 20:26:51 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleViewRecords = () => {
|
|
|
|
|
|
showPrompt({
|
|
|
|
|
|
title: '认证记录',
|
|
|
|
|
|
message: '认证记录功能即将上线',
|
|
|
|
|
|
type: 'info',
|
|
|
|
|
|
});
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
if (loading && !status) {
|
|
|
|
|
|
return (
|
|
|
|
|
|
<SafeAreaView style={styles.container}>
|
|
|
|
|
|
<View style={styles.loadingContainer}>
|
2026-04-11 04:27:22 +08:00
|
|
|
|
<ActivityIndicator size="large" color={colors.primary.main} />
|
2026-04-05 20:26:51 +08:00
|
|
|
|
</View>
|
|
|
|
|
|
</SafeAreaView>
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
<think>Let me analyze the staged changes to generate a proper conventional commit message.
Looking at the changes:
1. **New files**:
- `app/(app)/(tabs)/profile/account-deletion.tsx` - account deletion screen
- `app/(app)/(tabs)/profile/privacy-settings.tsx` - privacy settings screen
- `src/screens/profile/AccountDeletionScreen.tsx` - account deletion implementation
- `src/screens/profile/PrivacySettingsScreen.tsx` - privacy settings implementation
2. **Modified files**:
- Database changes: `LocalDataSource.ts`, `DatabaseManager.ts`, `DatabaseConfig.ts`, `MigrationManager.ts` - refactoring database layer (removing LockManager, simplified initialization, added retry logic)
- Auth store: `authStore.ts` - changed `initDatabase` to `switchDatabase`
- Auth service: `authService.ts` - added privacy settings and account deletion methods
- DTOs: `dto.ts` - added PrivacySettingsDTO, DeletionStatusDTO, VoteOptionDTO, VoteResultDTO types
- Navigation: `hrefs.ts` - added new href functions for privacy settings and account deletion
- Profile screens: `SettingsScreen.tsx`, `index.ts`, `_layout.tsx` - added new menu items and routes
- Various message screens - added keyboard handling props
- `app/_layout.tsx` - added CSS for mobile touch handling
- `CreatePostScreen.tsx` - fixed vote_options format
- `PostDetailScreen.tsx` - added type annotations for vote handling
- `MediaCacheManager.ts` - updated to use new expo-file-system API
- `VerificationSettingsScreen.tsx` - fixed type safety
- `AccountSecurityScreen.tsx` - styling refactoring
This is a multi-faceted change involving:
Database refactoring, new privacy/account deletion features, bug fixes, and UI improvements. The database changes appear to be refactoring without new functionality. The most significant changes are the privacy settings and account deletion features, plus bug fixes like the vote options format and mobile touch handling.
</think>
feat(profile): add privacy settings and account deletion screens
Add privacy settings and account deletion functionality with new screens and APIs. Refactor database initialization to use switchDatabase for user switching. Fix vote options format in post creation and add type safety to vote handling. Improve mobile touch handling in layout and message screens. Update media cache to use new expo-file-system API.
BREAKING CHANGE: Database initialization now uses switchDatabase instead of initDatabase for user switching
2026-04-08 16:48:19 +08:00
|
|
|
|
const statusKey = (status?.verification_status || 'not_submitted') as keyof typeof STATUS_CONFIG;
|
|
|
|
|
|
const statusConfig = STATUS_CONFIG[statusKey];
|
2026-04-05 20:26:51 +08:00
|
|
|
|
const identityText = IDENTITY_TEXT[status?.identity || 'general'];
|
|
|
|
|
|
|
|
|
|
|
|
return (
|
2026-04-11 04:27:22 +08:00
|
|
|
|
<SafeAreaView style={styles.container}>
|
|
|
|
|
|
<ScrollView
|
|
|
|
|
|
contentContainerStyle={styles.scrollContent}
|
|
|
|
|
|
showsVerticalScrollIndicator={false}
|
|
|
|
|
|
>
|
2026-04-05 20:26:51 +08:00
|
|
|
|
{/* 状态卡片 */}
|
|
|
|
|
|
<View style={styles.statusCard}>
|
|
|
|
|
|
<View style={[styles.statusIconContainer, { backgroundColor: statusConfig.color + '20' }]}>
|
|
|
|
|
|
<MaterialCommunityIcons
|
|
|
|
|
|
name={statusConfig.icon as any}
|
|
|
|
|
|
size={48}
|
|
|
|
|
|
color={statusConfig.color}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
<Text style={styles.statusTitle}>{statusConfig.title}</Text>
|
|
|
|
|
|
<Text style={styles.statusDescription}>{statusConfig.description}</Text>
|
|
|
|
|
|
|
|
|
|
|
|
{status?.verification_status === 'approved' && (
|
|
|
|
|
|
<View style={styles.identityBadge}>
|
2026-04-11 04:27:22 +08:00
|
|
|
|
<MaterialCommunityIcons name="check-circle" size={16} color={colors.primary.main} />
|
2026-04-05 20:26:51 +08:00
|
|
|
|
<Text style={styles.identityText}>{identityText}</Text>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
{status?.latest_record?.reject_reason && (
|
|
|
|
|
|
<View style={styles.rejectReasonContainer}>
|
|
|
|
|
|
<Text style={styles.rejectReasonLabel}>拒绝原因:</Text>
|
|
|
|
|
|
<Text style={styles.rejectReasonText}>
|
|
|
|
|
|
{status.latest_record.reject_reason}
|
|
|
|
|
|
</Text>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</View>
|
|
|
|
|
|
|
|
|
|
|
|
{/* 认证优势 */}
|
|
|
|
|
|
{status?.verification_status !== 'approved' && (
|
|
|
|
|
|
<View style={styles.benefitsSection}>
|
|
|
|
|
|
<Text style={styles.sectionTitle}>认证优势</Text>
|
|
|
|
|
|
<View style={styles.benefitsList}>
|
|
|
|
|
|
<View style={styles.benefitItem}>
|
|
|
|
|
|
<View style={styles.benefitIconContainer}>
|
|
|
|
|
|
<MaterialCommunityIcons
|
2026-04-07 15:58:51 +08:00
|
|
|
|
name="check-decagram"
|
2026-04-05 20:26:51 +08:00
|
|
|
|
size={24}
|
2026-04-11 04:27:22 +08:00
|
|
|
|
color={colors.primary.main}
|
2026-04-05 20:26:51 +08:00
|
|
|
|
/>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
<View style={styles.benefitContent}>
|
|
|
|
|
|
<Text style={styles.benefitTitle}>专属认证标识</Text>
|
|
|
|
|
|
<Text style={styles.benefitDescription}>
|
|
|
|
|
|
获得身份认证徽章,提升账号可信度
|
|
|
|
|
|
</Text>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
|
|
|
|
|
|
<View style={styles.benefitItem}>
|
|
|
|
|
|
<View style={styles.benefitIconContainer}>
|
|
|
|
|
|
<MaterialCommunityIcons
|
2026-04-07 15:58:51 +08:00
|
|
|
|
name="lock-open-outline"
|
2026-04-05 20:26:51 +08:00
|
|
|
|
size={24}
|
2026-04-11 04:27:22 +08:00
|
|
|
|
color={colors.primary.main}
|
2026-04-05 20:26:51 +08:00
|
|
|
|
/>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
<View style={styles.benefitContent}>
|
|
|
|
|
|
<Text style={styles.benefitTitle}>解锁专属频道</Text>
|
|
|
|
|
|
<Text style={styles.benefitDescription}>
|
|
|
|
|
|
访问仅限认证用户的专属内容和频道
|
|
|
|
|
|
</Text>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
|
|
|
|
|
|
<View style={styles.benefitItem}>
|
|
|
|
|
|
<View style={styles.benefitIconContainer}>
|
|
|
|
|
|
<MaterialCommunityIcons
|
2026-04-07 15:58:51 +08:00
|
|
|
|
name="account-group-outline"
|
2026-04-05 20:26:51 +08:00
|
|
|
|
size={24}
|
2026-04-11 04:27:22 +08:00
|
|
|
|
color={colors.primary.main}
|
2026-04-05 20:26:51 +08:00
|
|
|
|
/>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
<View style={styles.benefitContent}>
|
|
|
|
|
|
<Text style={styles.benefitTitle}>加入社群圈子</Text>
|
|
|
|
|
|
<Text style={styles.benefitDescription}>
|
|
|
|
|
|
加入需要身份认证的校友群、班级群等
|
|
|
|
|
|
</Text>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
{/* 操作按钮 */}
|
|
|
|
|
|
<View style={styles.actionSection}>
|
|
|
|
|
|
{(status?.verification_status === 'not_submitted' ||
|
|
|
|
|
|
status?.verification_status === 'rejected') && (
|
|
|
|
|
|
<TouchableOpacity
|
|
|
|
|
|
style={styles.primaryButton}
|
|
|
|
|
|
onPress={handleStartVerification}
|
|
|
|
|
|
activeOpacity={0.9}
|
|
|
|
|
|
>
|
2026-04-11 04:27:22 +08:00
|
|
|
|
<MaterialCommunityIcons name="shield-check-outline" size={20} color={colors.primary.contrast} />
|
2026-04-05 20:26:51 +08:00
|
|
|
|
<Text style={styles.primaryButtonText}>
|
|
|
|
|
|
{status?.verification_status === 'rejected' ? '重新认证' : '开始认证'}
|
|
|
|
|
|
</Text>
|
|
|
|
|
|
</TouchableOpacity>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
{status?.verification_status === 'pending' && (
|
|
|
|
|
|
<TouchableOpacity
|
|
|
|
|
|
style={styles.secondaryButton}
|
|
|
|
|
|
onPress={handleViewRecords}
|
|
|
|
|
|
activeOpacity={0.8}
|
|
|
|
|
|
>
|
2026-04-11 04:27:22 +08:00
|
|
|
|
<MaterialCommunityIcons name="file-document-outline" size={20} color={colors.primary.main} />
|
2026-04-05 20:26:51 +08:00
|
|
|
|
<Text style={styles.secondaryButtonText}>查看认证记录</Text>
|
|
|
|
|
|
</TouchableOpacity>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
{status?.verification_status === 'approved' && (
|
|
|
|
|
|
<>
|
|
|
|
|
|
<View style={styles.verifiedInfo}>
|
|
|
|
|
|
<View style={styles.verifiedInfoRow}>
|
|
|
|
|
|
<Text style={styles.verifiedInfoLabel}>认证身份</Text>
|
|
|
|
|
|
<Text style={styles.verifiedInfoValue}>{identityText}</Text>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
{status.latest_record?.real_name && (
|
|
|
|
|
|
<View style={styles.verifiedInfoRow}>
|
|
|
|
|
|
<Text style={styles.verifiedInfoLabel}>真实姓名</Text>
|
|
|
|
|
|
<Text style={styles.verifiedInfoValue}>
|
|
|
|
|
|
{status.latest_record.real_name}
|
|
|
|
|
|
</Text>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
)}
|
|
|
|
|
|
{status.latest_record?.department && (
|
|
|
|
|
|
<View style={styles.verifiedInfoRow}>
|
|
|
|
|
|
<Text style={styles.verifiedInfoLabel}>院系/部门</Text>
|
|
|
|
|
|
<Text style={styles.verifiedInfoValue}>
|
|
|
|
|
|
{status.latest_record.department}
|
|
|
|
|
|
</Text>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</View>
|
|
|
|
|
|
</>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</View>
|
|
|
|
|
|
|
|
|
|
|
|
{/* 帮助信息 */}
|
|
|
|
|
|
<View style={styles.helpSection}>
|
|
|
|
|
|
<Text style={styles.helpTitle}>遇到问题?</Text>
|
|
|
|
|
|
<Text style={styles.helpText}>
|
|
|
|
|
|
如果在认证过程中遇到问题,请联系客服或在设置中提交反馈
|
|
|
|
|
|
</Text>
|
|
|
|
|
|
</View>
|
|
|
|
|
|
</ScrollView>
|
2026-04-11 04:27:22 +08:00
|
|
|
|
</SafeAreaView>
|
2026-04-05 20:26:51 +08:00
|
|
|
|
);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
function createStyles(colors: AppColors) {
|
|
|
|
|
|
return StyleSheet.create({
|
|
|
|
|
|
container: {
|
|
|
|
|
|
flex: 1,
|
2026-04-11 04:27:22 +08:00
|
|
|
|
backgroundColor: colors.background.paper,
|
2026-04-05 20:26:51 +08:00
|
|
|
|
},
|
|
|
|
|
|
loadingContainer: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
},
|
|
|
|
|
|
header: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'space-between',
|
|
|
|
|
|
paddingHorizontal: 16,
|
|
|
|
|
|
paddingVertical: 12,
|
|
|
|
|
|
borderBottomWidth: StyleSheet.hairlineWidth,
|
|
|
|
|
|
borderBottomColor: colors.divider || '#E0E0E0',
|
|
|
|
|
|
},
|
|
|
|
|
|
backButton: {
|
|
|
|
|
|
width: 40,
|
|
|
|
|
|
height: 40,
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
},
|
|
|
|
|
|
headerTitle: {
|
|
|
|
|
|
fontSize: 18,
|
|
|
|
|
|
fontWeight: '600',
|
|
|
|
|
|
color: colors.text?.primary || '#333',
|
|
|
|
|
|
},
|
|
|
|
|
|
headerRight: {
|
|
|
|
|
|
width: 40,
|
|
|
|
|
|
},
|
|
|
|
|
|
scrollContent: {
|
|
|
|
|
|
flexGrow: 1,
|
|
|
|
|
|
padding: 24,
|
|
|
|
|
|
},
|
|
|
|
|
|
statusCard: {
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
paddingVertical: 32,
|
|
|
|
|
|
paddingHorizontal: 24,
|
2026-04-11 04:27:22 +08:00
|
|
|
|
backgroundColor: colors.background.default,
|
2026-04-05 20:26:51 +08:00
|
|
|
|
borderRadius: 16,
|
|
|
|
|
|
marginBottom: 24,
|
|
|
|
|
|
},
|
|
|
|
|
|
statusIconContainer: {
|
|
|
|
|
|
width: 96,
|
|
|
|
|
|
height: 96,
|
|
|
|
|
|
borderRadius: 48,
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
marginBottom: 16,
|
|
|
|
|
|
},
|
|
|
|
|
|
statusTitle: {
|
|
|
|
|
|
fontSize: 24,
|
|
|
|
|
|
fontWeight: '700',
|
|
|
|
|
|
color: colors.text?.primary || '#333',
|
|
|
|
|
|
marginBottom: 8,
|
|
|
|
|
|
},
|
|
|
|
|
|
statusDescription: {
|
|
|
|
|
|
fontSize: 15,
|
|
|
|
|
|
color: colors.text?.secondary || '#666',
|
|
|
|
|
|
textAlign: 'center',
|
|
|
|
|
|
lineHeight: 22,
|
|
|
|
|
|
},
|
|
|
|
|
|
identityBadge: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
2026-04-11 04:27:22 +08:00
|
|
|
|
backgroundColor: colors.primary.main + '15',
|
2026-04-05 20:26:51 +08:00
|
|
|
|
borderRadius: 20,
|
|
|
|
|
|
paddingVertical: 8,
|
|
|
|
|
|
paddingHorizontal: 16,
|
|
|
|
|
|
marginTop: 16,
|
|
|
|
|
|
},
|
|
|
|
|
|
identityText: {
|
|
|
|
|
|
fontSize: 14,
|
|
|
|
|
|
fontWeight: '600',
|
2026-04-11 04:27:22 +08:00
|
|
|
|
color: colors.primary.main,
|
2026-04-05 20:26:51 +08:00
|
|
|
|
marginLeft: 6,
|
|
|
|
|
|
},
|
|
|
|
|
|
rejectReasonContainer: {
|
|
|
|
|
|
marginTop: 16,
|
|
|
|
|
|
padding: 12,
|
2026-04-11 04:27:22 +08:00
|
|
|
|
backgroundColor: colors.error.light + '20',
|
2026-04-05 20:26:51 +08:00
|
|
|
|
borderRadius: 8,
|
|
|
|
|
|
width: '100%',
|
|
|
|
|
|
},
|
|
|
|
|
|
rejectReasonLabel: {
|
|
|
|
|
|
fontSize: 13,
|
|
|
|
|
|
fontWeight: '600',
|
2026-04-11 04:27:22 +08:00
|
|
|
|
color: colors.error.main,
|
2026-04-05 20:26:51 +08:00
|
|
|
|
marginBottom: 4,
|
|
|
|
|
|
},
|
|
|
|
|
|
rejectReasonText: {
|
|
|
|
|
|
fontSize: 13,
|
2026-04-11 04:27:22 +08:00
|
|
|
|
color: colors.error.dark,
|
2026-04-05 20:26:51 +08:00
|
|
|
|
lineHeight: 18,
|
|
|
|
|
|
},
|
|
|
|
|
|
benefitsSection: {
|
|
|
|
|
|
marginBottom: 24,
|
|
|
|
|
|
},
|
|
|
|
|
|
sectionTitle: {
|
|
|
|
|
|
fontSize: 17,
|
|
|
|
|
|
fontWeight: '600',
|
|
|
|
|
|
color: colors.text?.primary || '#333',
|
|
|
|
|
|
marginBottom: 16,
|
|
|
|
|
|
},
|
|
|
|
|
|
benefitsList: {
|
|
|
|
|
|
gap: 12,
|
|
|
|
|
|
},
|
|
|
|
|
|
benefitItem: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'flex-start',
|
2026-04-11 04:27:22 +08:00
|
|
|
|
backgroundColor: colors.background.default,
|
2026-04-05 20:26:51 +08:00
|
|
|
|
borderRadius: 12,
|
|
|
|
|
|
padding: 16,
|
|
|
|
|
|
},
|
|
|
|
|
|
benefitIconContainer: {
|
|
|
|
|
|
width: 48,
|
|
|
|
|
|
height: 48,
|
|
|
|
|
|
borderRadius: 12,
|
2026-04-11 04:27:22 +08:00
|
|
|
|
backgroundColor: colors.primary.main + '15',
|
2026-04-05 20:26:51 +08:00
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
marginRight: 12,
|
|
|
|
|
|
},
|
|
|
|
|
|
benefitContent: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
},
|
|
|
|
|
|
benefitTitle: {
|
|
|
|
|
|
fontSize: 15,
|
|
|
|
|
|
fontWeight: '600',
|
|
|
|
|
|
color: colors.text?.primary || '#333',
|
|
|
|
|
|
marginBottom: 4,
|
|
|
|
|
|
},
|
|
|
|
|
|
benefitDescription: {
|
|
|
|
|
|
fontSize: 13,
|
|
|
|
|
|
color: colors.text?.secondary || '#666',
|
|
|
|
|
|
lineHeight: 18,
|
|
|
|
|
|
},
|
|
|
|
|
|
actionSection: {
|
|
|
|
|
|
marginBottom: 24,
|
|
|
|
|
|
},
|
|
|
|
|
|
primaryButton: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
height: 56,
|
|
|
|
|
|
borderRadius: 14,
|
2026-04-11 04:27:22 +08:00
|
|
|
|
backgroundColor: colors.primary.main,
|
2026-04-05 20:26:51 +08:00
|
|
|
|
},
|
|
|
|
|
|
primaryButtonText: {
|
|
|
|
|
|
fontSize: 17,
|
|
|
|
|
|
fontWeight: '600',
|
2026-04-11 04:27:22 +08:00
|
|
|
|
color: colors.text.inverse,
|
2026-04-05 20:26:51 +08:00
|
|
|
|
marginLeft: 8,
|
|
|
|
|
|
},
|
|
|
|
|
|
secondaryButton: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
height: 56,
|
|
|
|
|
|
borderRadius: 14,
|
2026-04-11 04:27:22 +08:00
|
|
|
|
backgroundColor: colors.primary.main + '15',
|
2026-04-05 20:26:51 +08:00
|
|
|
|
borderWidth: 1,
|
2026-04-11 04:27:22 +08:00
|
|
|
|
borderColor: colors.primary.main,
|
2026-04-05 20:26:51 +08:00
|
|
|
|
},
|
|
|
|
|
|
secondaryButtonText: {
|
|
|
|
|
|
fontSize: 17,
|
|
|
|
|
|
fontWeight: '600',
|
2026-04-11 04:27:22 +08:00
|
|
|
|
color: colors.primary.main,
|
2026-04-05 20:26:51 +08:00
|
|
|
|
marginLeft: 8,
|
|
|
|
|
|
},
|
|
|
|
|
|
verifiedInfo: {
|
2026-04-11 04:27:22 +08:00
|
|
|
|
backgroundColor: colors.background.default,
|
2026-04-05 20:26:51 +08:00
|
|
|
|
borderRadius: 12,
|
|
|
|
|
|
padding: 16,
|
|
|
|
|
|
},
|
|
|
|
|
|
verifiedInfoRow: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
justifyContent: 'space-between',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
paddingVertical: 8,
|
|
|
|
|
|
},
|
|
|
|
|
|
verifiedInfoLabel: {
|
|
|
|
|
|
fontSize: 15,
|
|
|
|
|
|
color: colors.text?.secondary || '#666',
|
|
|
|
|
|
},
|
|
|
|
|
|
verifiedInfoValue: {
|
|
|
|
|
|
fontSize: 15,
|
|
|
|
|
|
fontWeight: '500',
|
|
|
|
|
|
color: colors.text?.primary || '#333',
|
|
|
|
|
|
},
|
|
|
|
|
|
helpSection: {
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
paddingVertical: 16,
|
|
|
|
|
|
},
|
|
|
|
|
|
helpTitle: {
|
|
|
|
|
|
fontSize: 15,
|
|
|
|
|
|
fontWeight: '600',
|
|
|
|
|
|
color: colors.text?.primary || '#333',
|
|
|
|
|
|
marginBottom: 8,
|
|
|
|
|
|
},
|
|
|
|
|
|
helpText: {
|
|
|
|
|
|
fontSize: 13,
|
|
|
|
|
|
color: colors.text?.hint || '#999',
|
|
|
|
|
|
textAlign: 'center',
|
|
|
|
|
|
lineHeight: 18,
|
|
|
|
|
|
},
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export default VerificationSettingsScreen;
|