import { useState } from 'react'; import { View, Text, TextInput, Pressable, Image, ActivityIndicator, } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { Ionicons } from '@expo/vector-icons'; import { useTranslation } from 'react-i18next'; import { isValidDomain, normalizeDomain, type Tier, } from '../../hooks/useCustomDomains'; import { useColors } from '../../lib/theme'; import { KeyboardAwareSheet } from '../KeyboardAwareSheet'; const COLLAPSED_HEIGHT = 600; type Props = { visible: boolean; tier: Tier; onClose: () => void; onAdd: (domain: string) => Promise<{ ok: boolean; error?: string; alreadyGlobal?: boolean }>; }; export function AddDomainSheet({ visible, tier, onClose, onAdd }: Props) { const { t } = useTranslation(); const colors = useColors(); const insets = useSafeAreaInsets(); const [input, setInput] = useState(''); const [confirmPermanent, setConfirmPermanent] = useState(false); const [adding, setAdding] = useState(false); const [error, setError] = useState(null); const valid = isValidDomain(input); const normalized = normalizeDomain(input); function close() { setInput(''); setConfirmPermanent(false); setError(null); onClose(); } async function handleAdd() { if (!valid || !confirmPermanent || adding) return; setAdding(true); setError(null); const result = await onAdd(input); setAdding(false); if (result.ok) { close(); return; } if (result.alreadyGlobal) { setError(t('blocker.add_sheet_already_global', { domain: normalized })); } else { setError(result.error ?? t('blocker.add_sheet_add_failed')); } } const warningText = tier.plan === 'free' ? t('blocker.add_sheet_warning_free') : t('blocker.add_sheet_warning_pro'); const header = ( {t('common.cancel')} {t('blocker.add_sheet_title')} ); return ( {/* Input */} {t('blocker.add_sheet_label')} { setInput(v); setError(null); }} placeholder={t('blocker.add_sheet_placeholder')} placeholderTextColor={colors.textMuted} autoCapitalize="none" autoCorrect={false} autoFocus keyboardType="url" returnKeyType="done" onSubmitEditing={handleAdd} style={{ backgroundColor: colors.surfaceElevated, borderRadius: 12, paddingHorizontal: 14, paddingVertical: 12, fontSize: 15, fontFamily: 'Nunito_400Regular', color: colors.text, }} /> {input && !valid && ( {t('blocker.add_sheet_invalid')} )} {/* Preview */} {valid && ( {normalized} )} {/* Warning */} {valid && ( {warningText} )} {/* Confirm-Checkbox */} {valid && ( setConfirmPermanent((v) => !v)} style={{ flexDirection: 'row', alignItems: 'flex-start', gap: 10, paddingVertical: 4, }} > {confirmPermanent && } {t('blocker.add_sheet_confirm_permanent')} )} {/* Error */} {error && ( {error} )} {/* Add-Button */} ({ opacity: pressed ? 0.85 : 1, marginBottom: insets.bottom > 0 ? 8 : 12, })} > {adding ? ( ) : ( {t('blocker.add_sheet_title')} )} ); }