Landingpage mit Warteliste + Aktions-Code (5 statt 3 Gratis-Analysen)

- Webseite: neue Landingpage (Hero, Features, Warteliste-Anmeldung per
  Mail-Interim, FAQ); Datenschutz um Warteliste-Abschnitt ergänzt
- App: Aktions-Code-Einlösung in den Einstellungen (FRUEHSTART -> 5
  Gratis-Analysen), ScanScreen nutzt dynamisches Kontingent
- Newsletter-Dienst (Brevo/MailerLite) folgt: Formular-Embed ersetzt
  dann den Mail-Button, Datenschutz-Platzhalter ausfuellen

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
JUSNandClaude Fable 5 committed 2026-07-15 08:40:15 +02:00
1 parent 9dc1d8d87b
commit 8f9f988d57
6 files changed
+275 -44

No files matched your search

+62 -1
View File
@@ -8,7 +8,14 @@ import { Alert, ScrollView, StyleSheet, Text, TextInput, View } from 'react-nati
import * as Notifications from 'expo-notifications';
import { NativeStackScreenProps } from '@react-navigation/native-stack';
import { RootStackParamList } from '../types';
import { holeApiKey, speichereApiKey, loescheAlleDaten } from '../services/storage';
import {
BONUS_ANALYSEN,
holeApiKey,
holeBonusAktiv,
loeseBonusCodeEin,
loescheAlleDaten,
speichereApiKey,
} from '../services/storage';
import { NUTZT_PROXY } from '../services/claudeClient';
import { useAppStore } from '../store/useAppStore';
import { GrossButton } from '../components/GrossButton';
@@ -21,11 +28,31 @@ export function EinstellungenScreen({ navigation }: Props) {
const [apiKey, setApiKey] = useState('');
const [keyVorhanden, setKeyVorhanden] = useState(false);
const [gespeichert, setGespeichert] = useState(false);
const [bonusCode, setBonusCode] = useState('');
const [bonusAktiv, setBonusAktiv] = useState(false);
useEffect(() => {
holeApiKey().then((k) => setKeyVorhanden(!!k));
holeBonusAktiv().then(setBonusAktiv);
}, []);
const codeEinloesen = async () => {
const erfolg = await loeseBonusCodeEin(bonusCode);
if (erfolg) {
setBonusAktiv(true);
setBonusCode('');
Alert.alert(
'Code eingelöst! 🎉',
`Sie haben jetzt ${BONUS_ANALYSEN} kostenlose Brief-Analysen.`
);
} else {
Alert.alert(
'Code ungültig',
'Bitte prüfen Sie die Schreibweise. Den Code finden Sie in Ihrer Anmelde-E-Mail.'
);
}
};
const speichern = async () => {
await speichereApiKey(apiKey);
setKeyVorhanden(!!apiKey.trim());
@@ -94,6 +121,40 @@ export function EinstellungenScreen({ navigation }: Props) {
</>
)}
<Text style={styles.abschnittTitel}>Aktions-Code</Text>
{bonusAktiv ? (
<Text style={styles.text}>
<Text style={{ fontWeight: '700', color: farben.ampelGruen }}>
Code eingelöst ✓
</Text>{' '}
— Sie haben {BONUS_ANALYSEN} kostenlose Analysen.
</Text>
) : (
<>
<Text style={styles.hinweis}>
Sie haben sich auf behoerdenklar.pages.dev angemeldet? Lösen Sie
hier den Code aus Ihrer E-Mail ein.
</Text>
<TextInput
style={styles.eingabe}
placeholder="Code eingeben"
placeholderTextColor={farben.textSekundaer}
value={bonusCode}
onChangeText={setBonusCode}
autoCapitalize="characters"
autoCorrect={false}
accessibilityLabel="Aktions-Code eingeben"
/>
<GrossButton
titel="Code einlösen"
onPress={codeEinloesen}
deaktiviert={!bonusCode.trim()}
/>
</>
)}
<View style={styles.trenner} />
<Text style={styles.abschnittTitel}>Datenschutz</Text>
<View style={styles.karte}>
<Text style={styles.text}>