import { useState } from 'react'; import { ActivityIndicator, Text, TextInput, TouchableOpacity, View, } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; import { useTranslation } from 'react-i18next'; import { normalizeDomain, isValidDomain } from '../../hooks/useCustomDomains'; import { resolveVipCountry } from '../../hooks/useWebContentDomains'; import { useCuratedSuggest } from '../../hooks/useCuratedSuggest'; import { useColors } from '../../lib/theme'; import { FormSheet } from '../FormSheet'; type Props = { visible: boolean; onClose: () => void; }; export function SuggestCuratedSheet({ visible, onClose }: Props) { const { t } = useTranslation(); const colors = useColors(); const [input, setInput] = useState(''); const { state, suggest, reset } = useCuratedSuggest(); const loading = state === 'loading'; const done = state === 'success'; const normalized = normalizeDomain(input); const inputValid = isValidDomain(input); function close() { setInput(''); reset(); onClose(); } async function handleSubmit() { if (!inputValid || loading) return; const country = resolveVipCountry(); await suggest(normalized, country); } const errorMessage: string | null = (() => { switch (state) { case 'invalid_domain': return t('blocker.suggest_curated_error_invalid_domain'); case 'already_suggested': return t('blocker.suggest_curated_error_already_suggested'); case 'already_approved': return t('blocker.suggest_curated_error_already_approved'); case 'already_rejected': return t('blocker.suggest_curated_error_already_rejected'); case 'error': return t('blocker.suggest_curated_error_generic'); default: return null; } })(); const ctaEnabled = inputValid && !loading && !done; return ( {done ? ( {t('blocker.suggest_curated_success_title')} {t('blocker.suggest_curated_success_body')} {t('common.ok')} ) : ( <> {/* Explanation card */} {t('blocker.suggest_curated_explanation')} {/* Input */} {t('blocker.suggest_curated_input_label')} { setInput(v); if (state !== 'idle' && state !== 'loading') reset(); }} placeholder={t('blocker.suggest_curated_input_placeholder')} placeholderTextColor={colors.textMuted} keyboardType="url" autoCapitalize="none" autoCorrect={false} style={{ backgroundColor: colors.surfaceElevated, borderRadius: 10, padding: 12, fontSize: 14, fontFamily: 'Nunito_400Regular', color: colors.text, borderWidth: 1, borderColor: errorMessage ? '#dc2626' : colors.border, }} /> {errorMessage && ( {errorMessage} )} {/* CTA row */} {t('common.cancel')} {loading ? ( ) : ( {t('blocker.suggest_curated_cta')} )} )} ); }