import React, { useEffect, useMemo, useState } from 'react'; import { View, Text, StyleSheet, TouchableOpacity, Image, ActivityIndicator, Alert, } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { MaterialCommunityIcons } from '@expo/vector-icons'; import { useRouter, useLocalSearchParams } from 'expo-router'; import { qrcodeApi } from '../../services/authService'; import { spacing, fontSizes, borderRadius, useAppColors, type AppColors } from '../../theme'; import { AppBackButton } from '../../components/common'; function createQrCodeConfirmStyles(colors: AppColors) { return StyleSheet.create({ container: { flex: 1, backgroundColor: colors.background.default, }, header: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', paddingHorizontal: spacing.md, paddingVertical: spacing.sm, backgroundColor: colors.background.paper, borderBottomWidth: 1, borderBottomColor: colors.divider, }, closeButton: { padding: spacing.sm, }, headerTitle: { fontSize: fontSizes.lg, fontWeight: '600', color: colors.text.primary, }, placeholder: { width: 40, }, content: { flex: 1, padding: spacing.lg, justifyContent: 'center', }, infoCard: { backgroundColor: colors.background.paper, borderRadius: borderRadius.lg, padding: spacing.xl, alignItems: 'center', marginBottom: spacing.xl, shadowColor: colors.chat.shadow, shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.1, shadowRadius: 4, elevation: 3, }, infoText: { fontSize: fontSizes.md, color: colors.text.secondary, marginBottom: spacing.lg, }, userInfo: { alignItems: 'center', }, avatar: { width: 80, height: 80, borderRadius: 40, marginBottom: spacing.md, }, avatarPlaceholder: { width: 80, height: 80, borderRadius: 40, backgroundColor: colors.background.disabled, justifyContent: 'center', alignItems: 'center', marginBottom: spacing.md, }, nickname: { fontSize: fontSizes.lg, fontWeight: '600', color: colors.text.primary, }, buttonContainer: { gap: spacing.md, }, button: { paddingVertical: spacing.md, paddingHorizontal: spacing.xl, borderRadius: borderRadius.md, alignItems: 'center', }, confirmButton: { backgroundColor: colors.primary.main, }, confirmButtonText: { color: colors.text.inverse, fontSize: fontSizes.md, fontWeight: '600', }, cancelButton: { backgroundColor: colors.background.paper, borderWidth: 1, borderColor: colors.divider, }, cancelButtonText: { color: colors.text.secondary, fontSize: fontSizes.md, }, loadingContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', }, loadingText: { marginTop: spacing.md, fontSize: fontSizes.md, color: colors.text.secondary, }, errorContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', padding: spacing.xl, }, errorText: { marginTop: spacing.md, fontSize: fontSizes.md, color: colors.text.secondary, textAlign: 'center', }, backButton: { marginTop: spacing.xl, paddingVertical: spacing.md, paddingHorizontal: spacing.xl, backgroundColor: colors.primary.main, borderRadius: borderRadius.md, }, backButtonText: { color: colors.text.inverse, fontSize: fontSizes.md, fontWeight: '600', }, }); } export const QRCodeConfirmScreen: React.FC = () => { const router = useRouter(); const colors = useAppColors(); const styles = useMemo(() => createQrCodeConfirmStyles(colors), [colors]); const { sessionId: sessionIdParam } = useLocalSearchParams<{ sessionId?: string }>(); const sessionId = sessionIdParam || ''; const [loading, setLoading] = useState(false); const [userInfo, setUserInfo] = useState<{ id: string; nickname: string; avatar: string } | null>(null); const [error, setError] = useState(null); useEffect(() => { if (!sessionId) return; void handleScan(); }, [sessionId]); const handleScan = async () => { try { setLoading(true); const response = await qrcodeApi.scan(sessionId); setUserInfo(response.user); } catch (err: any) { const errorMsg = err.response?.data?.message || '扫码失败'; setError(errorMsg); Alert.alert('扫码失败', errorMsg, [{ text: '确定', onPress: () => router.back() }]); } finally { setLoading(false); } }; const handleConfirm = async () => { try { setLoading(true); await qrcodeApi.confirm(sessionId); Alert.alert('登录成功', '网页端已登录', [{ text: '确定', onPress: () => router.back() }]); } catch (err: any) { const errorMsg = err.response?.data?.message || '确认登录失败'; Alert.alert('登录失败', errorMsg); } finally { setLoading(false); } }; const handleCancel = async () => { try { await qrcodeApi.cancel(sessionId); } catch { // 忽略取消错误 } router.back(); }; if (loading && !userInfo) { return ( 正在扫码... ); } if (error) { return ( {error} router.back()}> 返回 ); } return ( 确认登录 您正在登录网页端 {userInfo && ( {userInfo.avatar ? ( ) : ( )} {userInfo.nickname} )} {loading ? ( ) : ( 确认登录 )} 取消 ); }; export default QRCodeConfirmScreen;