From d840247c980fb1c608ae50e247485246d7d56a41 Mon Sep 17 00:00:00 2001 From: chahinebrini Date: Fri, 15 May 2026 23:42:45 +0200 Subject: [PATCH] =?UTF-8?q?feat(native):=20help=20section=20=E2=80=94=20FA?= =?UTF-8?q?Q,=20Contact,=20About,=20Crisis=20pages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New route group app/help/ with 4 sub-pages navigable from settings. - help/faq.tsx: accordion with 8 Q&As (drafted by UI agent, see below) - help/contact.tsx: mailto:hilfe@rebreak.org with prefilled subject, address block (Rebreak placeholder — TODO verify legal entity name) - help/about.tsx: mission text + 3 fact rows (DiGA, Hetzner, DSGVO) - help/crisis.tsx: BZgA 0800 1 372 700, check-dein-spiel.de, anonyme-spieler.org, Telefonseelsorge 0800 111 0 111, emergency 112-box with error-color border treatment. Disclaimer at bottom. All pages use AppHeader showBack for correct back-button. All strings in help.* namespace in DE/EN/FR locales. FAQ answers drafted by UI agent — pending lyra-persona tone review: faq_a1 (what is Rebreak), faq_a2 (blocker), faq_a3 (Mac DNS), faq_a4 (cancel sub), faq_a5 (data), faq_a6 (bug report), faq_a7 (whitelist), faq_a8 (DiGA). FR locale: faq answers are DE-fallback text (TODO: translate properly). Contact address block: placeholder — TODO confirm legal entity + address. Co-Authored-By: Claude Sonnet 4.6 --- apps/rebreak-native/app/help/_layout.tsx | 18 ++ apps/rebreak-native/app/help/about.tsx | 137 +++++++++++++ apps/rebreak-native/app/help/contact.tsx | 107 ++++++++++ apps/rebreak-native/app/help/crisis.tsx | 250 +++++++++++++++++++++++ apps/rebreak-native/app/help/faq.tsx | 120 +++++++++++ 5 files changed, 632 insertions(+) create mode 100644 apps/rebreak-native/app/help/_layout.tsx create mode 100644 apps/rebreak-native/app/help/about.tsx create mode 100644 apps/rebreak-native/app/help/contact.tsx create mode 100644 apps/rebreak-native/app/help/crisis.tsx create mode 100644 apps/rebreak-native/app/help/faq.tsx diff --git a/apps/rebreak-native/app/help/_layout.tsx b/apps/rebreak-native/app/help/_layout.tsx new file mode 100644 index 0000000..5152bd8 --- /dev/null +++ b/apps/rebreak-native/app/help/_layout.tsx @@ -0,0 +1,18 @@ +import { Stack } from 'expo-router'; +import { useTranslation } from 'react-i18next'; +import { useColors } from '../../lib/theme'; + +export default function HelpLayout() { + const { t } = useTranslation(); + const colors = useColors(); + + return ( + + ); +} diff --git a/apps/rebreak-native/app/help/about.tsx b/apps/rebreak-native/app/help/about.tsx new file mode 100644 index 0000000..b06bfc4 --- /dev/null +++ b/apps/rebreak-native/app/help/about.tsx @@ -0,0 +1,137 @@ +import { Linking, ScrollView, Text, TouchableOpacity, View } from 'react-native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; +import { Ionicons } from '@expo/vector-icons'; +import { useTranslation } from 'react-i18next'; +import { useColors } from '../../lib/theme'; +import { AppHeader } from '../../components/AppHeader'; + +export default function AboutScreen() { + const { t } = useTranslation(); + const colors = useColors(); + const insets = useSafeAreaInsets(); + + return ( + + + + + + + {t('help.about_headline')} + + + {t('help.about_body')} + + + + + {( + [ + { icon: 'shield-checkmark-outline', label: t('help.about_fact_diga') }, + { icon: 'server-outline', label: t('help.about_fact_servers') }, + { icon: 'lock-closed-outline', label: t('help.about_fact_privacy') }, + ] as { icon: React.ComponentProps['name']; label: string }[] + ).map((item, i, arr) => ( + + + + + + {item.label} + + + ))} + + + Linking.openURL('https://rebreak.org')} + activeOpacity={0.7} + style={{ marginTop: 20, alignItems: 'center' }} + > + + rebreak.org + + + + + ); +} diff --git a/apps/rebreak-native/app/help/contact.tsx b/apps/rebreak-native/app/help/contact.tsx new file mode 100644 index 0000000..07bdfa6 --- /dev/null +++ b/apps/rebreak-native/app/help/contact.tsx @@ -0,0 +1,107 @@ +import { Linking, ScrollView, Text, View } from 'react-native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; +import { useTranslation } from 'react-i18next'; +import { useColors } from '../../lib/theme'; +import { AppHeader } from '../../components/AppHeader'; +import { Button } from '../../components/Button'; + +export default function ContactScreen() { + const { t } = useTranslation(); + const colors = useColors(); + const insets = useSafeAreaInsets(); + + return ( + + + + + + + {t('help.contact_email_label')} + + + {t('help.contact_email_desc')} + +