import React, { useState } from 'react'; import { View, Text, StyleSheet, Modal, Platform, KeyboardAvoidingView, TouchableOpacity, ActivityIndicator, TextInput, ViewStyle } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; import Animated, { FadeInDown } from 'react-native-reanimated'; import { BlurView } from 'expo-blur'; import { GlassCard, GlassButton } from '../../../components/ui'; import { colors, spacing, radius, typography } from '../../../theme'; interface DangerZoneProps { onDeleteRelationship?: () => Promise; onDeleteAccount: () => Promise; hasRelationship?: boolean; } export const DangerZone: React.FC = ({ onDeleteRelationship, onDeleteAccount, hasRelationship = false }) => { const [showDeleteRelationshipModal, setShowDeleteRelationshipModal] = useState(false); const [showDeleteAccountModal, setShowDeleteAccountModal] = useState(false); const [deleteConfirmText, setDeleteConfirmText] = useState(""); const [isDeletingRelationship, setIsDeletingRelationship] = useState(false); const [isDeletingAccount, setIsDeletingAccount] = useState(false); const handleDeleteRelationship = async () => { if (deleteConfirmText !== "DELETE" || !onDeleteRelationship) return; setIsDeletingRelationship(true); try { await onDeleteRelationship(); setShowDeleteRelationshipModal(false); setDeleteConfirmText(""); } catch (error) { // Error handling relies on parent throwing or managing its own alerts } finally { setIsDeletingRelationship(false); } }; const handleDeleteAccount = async () => { if (deleteConfirmText !== "DELETE") return; setIsDeletingAccount(true); try { await onDeleteAccount(); // No need to close modal - user will be signed out } catch (error) { // Error handling relies on parent throwing or managing its own alerts setIsDeletingAccount(false); } }; const closeRelationshipModal = () => { if (!isDeletingRelationship) { setShowDeleteRelationshipModal(false); setDeleteConfirmText(""); } }; const closeAccountModal = () => { if (!isDeletingAccount) { setShowDeleteAccountModal(false); setDeleteConfirmText(""); } }; return ( <> Danger Zone {/* Delete Relationship - only show if in a relationship */} {hasRelationship && onDeleteRelationship && ( Delete Relationship Data Delete your relationship including all matches, chats, and shared photos. Your account will remain. setShowDeleteRelationshipModal(true)} icon={} style={styles.dangerButton} > Delete )} {/* Delete Account - always show */} Delete Account Permanently delete your account and all associated data. This cannot be undone. setShowDeleteAccountModal(true)} icon={} style={styles.dangerButton} > Delete {/* Delete Relationship Modal */} Delete Relationship Data? This action cannot be undone. This will permanently delete: Your couple connection All matches and responses All chat messages All shared photos Type DELETE to confirm: Cancel {isDeletingRelationship ? ( ) : ( <> Delete )} {/* Delete Account Modal */} Delete Account? This action cannot be undone. This will permanently delete: Your account and profile {hasRelationship && ( <> Your relationship data All chat messages and photos )} Your encryption keys All cloud-stored data Type DELETE to confirm: Cancel {isDeletingAccount ? ( ) : ( <> Delete Account )} ); }; const styles = StyleSheet.create({ section: { paddingHorizontal: spacing.lg, marginBottom: spacing.lg, }, dangerSectionTitle: { ...typography.caption1, color: colors.error, textTransform: "uppercase", letterSpacing: 1.5, marginBottom: spacing.sm, marginLeft: spacing.xs, }, dangerCard: { borderColor: 'rgba(231, 76, 60, 0.3)', borderWidth: 1, }, dangerCardSpacing: { marginTop: spacing.md, }, dangerContent: { gap: spacing.md, }, dangerInfo: { flexDirection: "row", alignItems: "flex-start", }, dangerIconContainer: { width: 44, height: 44, borderRadius: 22, backgroundColor: colors.errorLight, justifyContent: "center", alignItems: "center", }, dangerTextContainer: { flex: 1, marginLeft: spacing.md, }, dangerTitle: { ...typography.headline, color: colors.text, marginBottom: spacing.xs, }, dangerDescription: { ...typography.subhead, color: colors.textSecondary, lineHeight: 20, }, dangerButton: { alignSelf: "flex-end", }, // Modal styles modalOverlay: { flex: 1, backgroundColor: "rgba(0, 0, 0, 0.7)", justifyContent: "center", alignItems: "center", padding: spacing.lg, }, modalContent: { width: "100%", maxWidth: 400, padding: spacing.xl, backgroundColor: colors.backgroundLight, borderRadius: radius.xl, borderWidth: 1, borderColor: colors.glass.border, }, modalHeader: { alignItems: "center", marginBottom: spacing.lg, }, modalIconContainer: { width: 64, height: 64, borderRadius: 32, backgroundColor: colors.errorLight, justifyContent: "center", alignItems: "center", marginBottom: spacing.md, }, modalTitle: { ...typography.title2, color: colors.text, textAlign: "center", }, modalDescription: { ...typography.body, color: colors.textSecondary, marginBottom: spacing.lg, textAlign: "center", }, deleteList: { backgroundColor: "rgba(231, 76, 60, 0.1)", borderRadius: radius.lg, padding: spacing.md, gap: spacing.sm, marginBottom: spacing.xl, borderWidth: 1, borderColor: 'rgba(231, 76, 60, 0.2)', }, deleteListItem: { flexDirection: "row", alignItems: "center", gap: spacing.sm, }, deleteListText: { ...typography.subhead, color: colors.text, }, confirmLabel: { ...typography.subhead, color: colors.textSecondary, marginBottom: spacing.xs, textAlign: "center", }, confirmKeyword: { fontWeight: "bold", color: colors.error, }, confirmInput: { backgroundColor: colors.glass.background, borderRadius: radius.md, borderWidth: 1, borderColor: colors.error, padding: spacing.md, ...typography.body, color: colors.text, textAlign: 'center', marginBottom: spacing.xl, }, modalButtons: { flexDirection: "row", gap: spacing.md, }, cancelButton: { flex: 1, backgroundColor: colors.glass.backgroundLight, paddingVertical: spacing.md, borderRadius: radius.md, alignItems: "center", borderWidth: 1, borderColor: colors.glass.borderLight, }, cancelButtonText: { ...typography.body, color: colors.textSecondary, fontWeight: "600", }, deleteButton: { flex: 1, backgroundColor: colors.error, paddingVertical: spacing.md, borderRadius: radius.md, alignItems: "center", flexDirection: "row", justifyContent: "center", gap: spacing.xs, }, deleteButtonDisabled: { opacity: 0.5, }, deleteButtonText: { ...typography.body, color: colors.text, fontWeight: "600", }, });