import { useState } from 'react'; import { Alert, Platform, Text, View } from 'react-native'; import { useTranslation } from 'react-i18next'; import { Ionicons } from '@expo/vector-icons'; import { useColors } from '../../../lib/theme'; import { apiFetch } from '../../../lib/api'; import { invalidateMe } from '../../../hooks/useMe'; import { protection } from '../../../lib/protection'; import { OnboardingShell } from '../OnboardingShell'; import { LyraBubble } from '../LyraBubble'; import { CTABar } from '../CTABar'; import { PermissionDeniedSheet } from '../../PermissionDeniedSheet'; export function ProtectionSlide({ onDone, current, total, }: { /** Wird gerufen wenn URL-Filter erfolgreich aktiviert wurde. */ onDone: () => void; current: number; total: number; }) { const { t } = useTranslation(); const colors = useColors(); const [activating, setActivating] = useState(false); const [permissionDeniedOpen, setPermissionDeniedOpen] = useState(false); async function activate() { if (activating) return; setActivating(true); try { const res = await protection.activateUrlFilter(); if (!res.enabled) { const isCodeFive = Platform.OS === 'ios' && typeof res.error === 'string' && /NEFilterErrorDomain:\s*5/i.test(res.error); if (isCodeFive) { setPermissionDeniedOpen(true); return; } Alert.alert( t('onboarding.protection.error_title'), res.error ?? t('onboarding.protection.error_unknown'), ); return; } // Schutz live → step='done' await apiFetch('/api/profile/me/onboarding-step', { method: 'PATCH', body: { step: 'done' }, }).catch(() => {}); invalidateMe(); onDone(); } catch (e: unknown) { Alert.alert( t('common.error'), e instanceof Error ? e.message : t('common.unknown_error'), ); } finally { setActivating(false); } } return ( } > {t('onboarding.protection.permission_note')} setPermissionDeniedOpen(false)} onRetry={async () => { const res = await protection.resetUrlFilter(); if (res.enabled) { await apiFetch('/api/profile/me/onboarding-step', { method: 'PATCH', body: { step: 'done' }, }).catch(() => {}); invalidateMe(); onDone(); } return res; }} /> ); } function ProtectionRow({ icon, title, desc, colors, }: { icon: keyof typeof Ionicons.glyphMap; title: string; desc: string; colors: import('../../../lib/theme').ColorScheme; }) { return ( {title} {desc} ); }