Adds the original NestJS backends (backend, audio-backend), Expo mobile app, and Astro landing page as-is from the standalone memoro repo. These are not yet migrated to monorepo standards (migration tracked in memory/CLAUDE.md). Also adds eslint.config.mjs ignore for apps/*/apps/audio-backend/** and .prettierignore entries for legacy memoro dirs. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
18 KiB
Subscription Page - Ausführliche Dokumentation
Übersicht
Die Subscription Page ist ein vollständiges Abo-/Kaufsystem mit RevenueCat Integration für In-App-Käufe. Diese Dokumentation beschreibt alle Komponenten, Dateien und Abhängigkeiten, die benötigt werden, um die Subscription Page in einer anderen App zu implementieren.
1. Hauptkomponenten
1.1 Screen-Komponente
Datei: app/(protected)/subscription.tsx
Dies ist die Haupt-Route-Komponente. Sie:
- Prüft, ob der Benutzer ein B2B-Benutzer ist (RevenueCat deaktiviert)
- Zeigt entweder die B2B-Nachricht oder die normale Subscription Page
- Konfiguriert den Header mit SubscriptionMenu
- Verwaltet Screen-Tracking und Onboarding-Toasts
Abhängigkeiten:
SubscriptionPage(Hauptseite)SubscriptionPageSkeleton(Ladeseite)SubscriptionMenu(Menü mit Restore Purchases)B2BSubscriptionMessage(Nachricht für B2B-Benutzer)authService.shouldDisableRevenueCat()(B2B-Prüfung)
1.2 Haupt-Subscription-Page
Datei: features/subscription/SubscriptionPage.tsx
Die zentrale Komponente mit folgenden Funktionen:
- Zeigt Abonnements (monatlich/jährlich) und Einmal-Pakete
- Filtert nach Individual/Team/Enterprise
- Verwaltet Billing-Zyklus (monatlich/jährlich) mit Toggle
- Zeigt Usage und Kosten-Übersicht
- Integriert RevenueCat für echte Käufe
- Legacy-Subscription-Support
Wichtige Features:
- Sticky BillingToggle beim Scrollen
- Expandierbare Abschnitte für größere Pläne
- RevenueCat Integration mit Fallback zu JSON-Daten
- B2B-User-Detection
- Analytics-Tracking
2. UI-Komponenten
2.1 SubscriptionCard
Datei: features/subscription/SubscriptionCard.tsx
Zeigt einen einzelnen Abo-Plan mit:
- Plan-Name und Preisgestaltung
- Monatliche Mana-Menge
- Visuelles Mana-Icon mit tier-spezifischer Farbe und Größe
- Current Plan Badge
- Legacy Plan Badge
- Buy Button
Design-System:
- Tier-spezifische Farben (Free: Grau, Small-Giant: Blauabstufungen)
- 3-Spalten-Layout: Icon, Mana-Menge, Preis
- Responsive Design
2.2 PackageCard
Datei: features/subscription/PackageCard.tsx
Zeigt Einmal-Käufe (Mana Potions) mit:
- Package-Name
- Mana-Menge
- Preis
- Visuelles Mana-Icon mit package-spezifischer Farbe
- Buy Button
Ähnliches Design wie SubscriptionCard mit angepassten Farben für Pakete.
2.3 SubscriptionButton
Datei: features/subscription/SubscriptionButton.tsx
Wiederverwendbarer Button für Käufe mit:
- 3 Varianten: primary, secondary, accent
- Links- und Rechts-Icons
- Hover-States (Web)
- Disabled-State
- Theme-aware Farben
2.4 BillingToggle
Datei: features/subscription/BillingToggle.tsx
Toggle zwischen monatlich/jährlich mit:
- Discount-Badge für Jahres-Abo
- Theme-aware Design
- Accent-Farbe für Auswahl
2.5 CostCard
Datei: features/subscription/CostCard.tsx
Zeigt Mana-Kosten für verschiedene Aktionen:
- Liste von Aktionen mit Icons
- Mana-Kosten pro Aktion
- i18n-Support für Übersetzungen
2.6 UsageCard
Datei: features/subscription/UsageCard.tsx
Zeigt Nutzungsstatistiken (muss noch gelesen werden für vollständige Details)
2.7 SubscriptionMenu
Datei: features/subscription/SubscriptionMenu.tsx
Dropdown-Menü mit:
- Restore Purchases
- Contact Support
- Platform-spezifische Implementierungen (Native: @react-native-menu/menu, Web: Modal)
2.8 B2BSubscriptionMessage
Datei: features/subscription/B2BSubscriptionMessage.tsx
Zeigt Nachricht für B2B-Benutzer mit:
- Organisation-Info
- Plan-Info
- Rolle
- Kontakt-Administrator-Hinweis
2.9 SubscriptionPageSkeleton
Datei: features/subscription/SubscriptionPageSkeleton.tsx
Loading-State mit Skeleton-Komponenten
2.10 ManaIcon
Datei: features/subscription/ManaIcon.tsx (muss erstellt werden oder vorhanden sein)
Icon-Komponente für Mana-Visualisierung
3. Services & Daten
3.1 subscriptionService.ts
Datei: features/subscription/subscriptionService.ts
Zentraler Service für RevenueCat Integration:
Funktionen:
initializeRevenueCat()- SDK initialisierenidentifyUser(userId)- User identifizierenresetUser()- User auf anonym setzengetOfferings()- Verfügbare Angebote holengetSubscriptionData()- Alle Subscription-Daten (mit Fallback zu JSON)getCustomerInfo()- Kunden-InfohasActiveSubscription()- Prüft aktives AbopurchaseSubscription(id, cycle)- Abo kaufenpurchaseManaPackage(id)- Paket kaufenrestorePurchases()- Käufe wiederherstellen
Plattform-Support:
- iOS: Native RevenueCat SDK
- Android: Native RevenueCat SDK
- Web: RevenueCat Web SDK (
revenueCatWebService)
3.2 revenueCatManager.ts
Datei: features/subscription/revenueCatManager.ts
Manager für bedingte RevenueCat-Initialisierung:
- Prüft B2B-Status
- Deaktiviert RevenueCat für B2B-Benutzer
- Singleton-Pattern
- Fallback für B2B-Benutzer
3.3 revenueCatWebService.ts
Datei: features/subscription/services/revenueCatWebService.ts
Web-spezifischer Service für RevenueCat Web SDK (muss gelesen werden)
3.4 subscriptionData.json
Datei: features/subscription/subscriptionData.json
Fallback-Daten und Master-Daten-Quelle mit:
Subscriptions:
free- Free Tier (150 Mana/Monat)Mana_Stream_Small_v1- Klein monatlich (600 Mana, 5.99€)Mana_Stream_Small_Yearly_v1- Klein jährlich (600 Mana, 47.99€)Mana_Stream_Medium_v1- Mittel monatlich (1500 Mana, 14.99€)Mana_Stream_Medium_Yearly_v1- Mittel jährlich (1500 Mana, 119.99€)Mana_Stream_Large_v1- Groß monatlich (3000 Mana, 29.99€)Mana_Stream_Large_Yearly_v1- Groß jährlich (3000 Mana, 239.99€)Mana_Stream_Giant_v1- Riesig monatlich (5000 Mana, 49.99€)Mana_Stream_Giant_Yearly_v1- Riesig jährlich (5000 Mana, 399.99€)
Legacy Subscriptions:
- Alte Plan-IDs für bestehende Kunden (Mini, Plus, Pro, Ultra)
- iOS und Android Legacy-IDs
Packages (Einmal-Käufe):
Mana_Potion_Small_v1- 350 Mana, 4.99€Mana_Potion_Medium_v1- 700 Mana, 9.99€Mana_Potion_Large_v1- 1400 Mana, 19.99€Mana_Potion_Giant_v2- 2800 Mana, 39.99€
3.5 appCosts.json
Datei: features/subscription/appCosts.json
Mana-Kosten für verschiedene App-Aktionen (muss gelesen werden)
3.6 usageData.json
Datei: features/subscription/usageData.json
Nutzungsdaten für UsageCard (muss gelesen werden)
3.7 productIds.ts
Datei: features/subscription/productIds.ts
Mapping zwischen App-IDs und Store-Produkt-IDs (muss gelesen werden)
3.8 subscriptionTypes.ts
Datei: features/subscription/subscriptionTypes.ts
TypeScript-Typen für Subscription-System (muss gelesen werden)
3.9 useSubscriptionData.ts
Datei: features/subscription/useSubscriptionData.ts
React Hook zum Laden von Subscription-Daten
4. Abhängigkeiten (npm packages)
4.1 RevenueCat
{
"react-native-purchases": "^x.x.x",
"@revenuecat/purchases-js": "^x.x.x"
}
4.2 Weitere Dependencies
react-i18next- Internationalisierungexpo-router- Navigation@react-native-menu/menu- Native Menüs@expo/vector-icons- Icons
5. Theme & Styling
5.1 Theme Provider
Context: features/theme/ThemeProvider
Benötigt für:
isDark- Dark Mode DetectionthemeVariant- Theme-Variantentw- Tailwind-Klassencolors- Theme-Farben
5.2 Tailwind Config
Datei: tailwind.config.js
Enthält Theme-Farben für:
pageBackgroundcontentBackgroundborder- Theme-Varianten (z.B. Lume, Stone, etc.)
5.3 Konsistente Farben
Mana Accent Color: #4287f5 (Blau)
Tier Colors (Subscriptions):
- Free:
#F5F5F5(Grau) - Small:
#E3F2FD/#2196F3(Hell-Blau) - Medium:
#BBDEFB/#1976D2(Mittel-Blau) - Large:
#90CAF9/#1565C0(Dunkel-Blau) - Giant:
#64B5F6/#0D47A1(Sehr-Dunkel-Blau)
6. Authentication & User Settings
6.1 authService
Service: features/auth/services/authService
Benötigte Methoden:
shouldDisableRevenueCat()- Prüft B2B-StatusgetB2BInfo()- Holt B2B-Informationen
6.2 userSettingsService
Service: features/settings/services/userSettingsService
Benötigte Methoden:
getAllSettings()- Holt alle User-Settings inkl.subscription_plan_id
7. Analytics
7.1 Analytics Tracking
Service: features/analytics
Events:
subscription_page- Screen Viewsubscription_purchase_attempted- Kauf gestartetsubscription_purchased- Kauf erfolgreichsubscription_restore_attempted- Restore gestartetsubscription_restore_completed- Restore erfolgreich
8. Credits System
8.1 CreditContext
Context: features/credits/CreditContext
Benötigte Methoden:
refreshCredits()- Credits nach Kauf aktualisieren
9. Weitere Features
9.1 Header Context
Context: features/menus/HeaderContext
Für dynamische Header-Konfiguration:
updateConfig()- Header-Konfiguration ändern
9.2 Onboarding Context
Context: features/onboarding/contexts/OnboardingContext
Für Page-Onboarding:
showPageOnboardingToast()- Toast anzeigencleanupPageToast()- Toast cleanup
9.3 Support Email
Utility: features/support/utils/emailSupport
Methode:
openSupportEmail()- E-Mail-Client öffnen mit vorgefüllten Daten
10. iOS & Android Konfiguration
10.1 iOS (Xcode)
- RevenueCat SDK in Podfile
- StoreKit Configuration für Testing
- In-App Purchase Capability
10.2 Android (Google Play Console)
- In-App Products konfiguriert
- Subscription Products erstellt
- RevenueCat mit Play Store verbunden
10.3 RevenueCat Dashboard
- Products/Offerings konfiguriert
- Entitlements definiert (z.B. "premium")
- App Stores verbunden (iOS/Android)
- Webhooks (optional)
11. Environment Variables
Benötigte Keys:
# iOS
EXPO_PUBLIC_REVENUECAT_IOS_KEY=appl_xxxxx
# Android
EXPO_PUBLIC_REVENUECAT_ANDROID_KEY=goog_xxxxx
# Web (Production)
EXPO_PUBLIC_REVENUECAT_WEB_PUBLIC_KEY_PROD=rcb_xxxxx
# Web (Development)
EXPO_PUBLIC_REVENUECAT_WEB_PUBLIC_KEY_DEV=rcb_xxxxx
12. Migrations & Upgrades
12.1 Legacy Plan Mapping
Datei: features/migration/utils/subscriptionPlanMapping.ts
Mappt alte Plan-IDs zu neuen Plan-IDs für Bestandskunden.
12.2 Plan ID Mapping
Die App verwendet eine Mapping-Funktion mapDatabasePlanIdToUIPlanId() in SubscriptionPage.tsx, die:
- Legacy iOS IDs zu aktuellen IDs mapped
- Legacy Android IDs zu aktuellen IDs mapped
- Neue RevenueCat IDs verarbeitet
13. Translation Keys (i18n)
Benötigte Translation Keys:
{
"subscription": {
"title": "Buy Mana",
"subscriptions": "Subscriptions",
"one_time_purchases": "One-time Purchases",
"monthly": "Monthly",
"yearly": "Yearly",
"yearly_discount": "-{{percentage}}",
"per_month": "pro Monat",
"per_year": "pro Jahr",
"mana": "Mana",
"mana_amount": "{{amount}} Mana",
"mana_costs": "Mana Costs",
"one_time": "Einmalig",
"buy": "Buy",
"popular": "Popular",
"current_plan": "Current Plan",
"legacy_plan": "Legacy Plan",
"your_plan": "Your Plan",
"your_legacy_plan": "Your Legacy Plan",
"show_larger_plans": "Show Larger Plans",
"show_larger_packages": "Show Larger Packages",
"individual": "Individual",
"team": "Team",
"enterprise": "Enterprise",
"restore_purchases": "Restore Purchases",
"contact_support": "Contact Support",
"subscribe_success_title": "Successfully Subscribed!",
"subscribe_success_message": "You have successfully subscribed to the {{planName}} plan.",
"purchase_success_title": "Successfully Purchased!",
"purchase_success_message": "You have successfully purchased the {{packageName}} package with {{manaAmount}} Mana.",
"subscribe_error_title": "Subscription Error",
"subscribe_error_message": "An error occurred while completing the subscription. Please try again later.",
"purchase_error_title": "Purchase Error",
"purchase_error_message": "An error occurred while purchasing the package. Please try again later.",
"restore_title": "Restore Purchases",
"restore_message": "Your purchases are being restored...",
"restore_success": "Success",
"restore_success_message": "Your purchases have been successfully restored.",
"failed_to_load": "Failed to load subscription data",
"b2b": {
"title": "Enterprise Account",
"message": "You have an enterprise account with managed billing.",
"organization": "Organization",
"plan": "Plan",
"role": "Role",
"contact_admin": "For billing questions, please contact your organization administrator."
}
},
"common": {
"ok": "OK"
}
}
14. Dateistruktur zum Kopieren
Mindest-Set an Dateien:
app/(protected)/
└── subscription.tsx # Route Screen
features/subscription/
├── SubscriptionPage.tsx # Haupt-Page
├── SubscriptionCard.tsx # Abo-Card
├── PackageCard.tsx # Paket-Card
├── SubscriptionButton.tsx # Button
├── BillingToggle.tsx # Monatlich/Jährlich Toggle
├── CostCard.tsx # Kosten-Übersicht
├── UsageCard.tsx # Nutzungs-Übersicht
├── SubscriptionMenu.tsx # Menü
├── SubscriptionPageSkeleton.tsx # Loading State
├── B2BSubscriptionMessage.tsx # B2B Nachricht
├── ManaIcon.tsx # Mana Icon
├── subscriptionData.json # Master-Daten
├── appCosts.json # Kosten-Daten
├── usageData.json # Nutzungs-Daten
├── subscriptionService.ts # RevenueCat Service
├── revenueCatManager.ts # RC Manager
├── productIds.ts # Produkt-ID Mapping
├── subscriptionTypes.ts # TypeScript Types
├── useSubscriptionData.ts # React Hook
└── services/
└── revenueCatWebService.ts # Web Service
features/migration/utils/
└── subscriptionPlanMapping.ts # Legacy Mapping
Abhängige Services (bereits vorhanden):
features/auth/services/
└── authService.ts # B2B Check
features/settings/services/
└── userSettingsService.ts # User Settings
features/theme/
└── ThemeProvider.tsx # Theme Context
features/analytics/
└── (analytics services) # Analytics
features/credits/
└── CreditContext.tsx # Credits
features/menus/
└── HeaderContext.tsx # Header
features/onboarding/contexts/
└── OnboardingContext.tsx # Onboarding
features/support/utils/
└── emailSupport.ts # Support Email
15. Implementierungs-Schritte
Schritt 1: Dateien kopieren
- Alle Dateien aus
features/subscription/kopieren - Route-Datei
app/(protected)/subscription.tsxkopieren
Schritt 2: Dependencies installieren
npm install react-native-purchases @revenuecat/purchases-js @react-native-menu/menu
Schritt 3: RevenueCat konfigurieren
- RevenueCat Account erstellen
- App in RevenueCat Dashboard hinzufügen
- Products/Offerings erstellen
- API Keys in
.envhinzufügen
Schritt 4: Store Products konfigurieren
- iOS: In-App Purchases in App Store Connect erstellen
- Android: In-App Products in Google Play Console erstellen
- Produkt-IDs in
productIds.tsanpassen
Schritt 5: Abhängige Services anpassen
- Auth Service mit B2B-Check erweitern (falls benötigt)
- User Settings Service mit subscription_plan_id erweitern
- Credits System implementieren
Schritt 6: Theme & Styling anpassen
- Theme Provider prüfen
- Tailwind Config anpassen
- Farben nach Bedarf ändern
Schritt 7: Translations hinzufügen
- Alle i18n-Keys aus Abschnitt 13 hinzufügen
- Übersetzungen für alle Sprachen erstellen
Schritt 8: Testing
- iOS Sandbox Testing
- Android Testing
- Web Testing
- Restore Purchases testen
- Legacy Plan Migration testen
16. Besonderheiten & Best Practices
16.1 Platform-Spezifische Implementierungen
- Web nutzt
@revenuecat/purchases-js - Mobile nutzt
react-native-purchases - Conditional Imports für Plattformen
16.2 Error Handling
- User Cancellation wird separat behandelt
- Keine Error-Alert bei User Cancellation
- Detailliertes Error-Logging für Debugging
16.3 B2B Support
- RevenueCat wird für B2B-Benutzer deaktiviert
- B2B-Nachricht statt normale Subscription Page
- Separate B2B-Daten aus authService
16.4 Legacy Support
- Alte Plan-IDs werden zu neuen mapped
- Legacy-Badge für Bestandskunden
- Legacy Plans sind nicht mehr kaufbar
16.5 Analytics
- Alle wichtigen Events werden getrackt
- Plan-Details werden mitgesendet
- User-Verhalten wird gemessen
16.6 Credits Refresh
- Credits werden 3 Sekunden nach Kauf aktualisiert
- Delay sorgt für Backend-Synchronisation
16.7 Sticky Toggle
- BillingToggle wird beim Scrollen sticky
- Smooth Animation
- Verbessert UX beim Vergleich von Plänen
17. Troubleshooting
Problem: RevenueCat SDK nicht initialisiert
Lösung: API Keys prüfen, Plattform prüfen
Problem: Produkte nicht gefunden
Lösung: Store-Konfiguration prüfen, Product IDs prüfen
Problem: Käufe funktionieren nicht
Lösung: Sandbox-Accounts prüfen (iOS), Test-Karten prüfen (Android)
Problem: Legacy Plans werden nicht erkannt
Lösung: Plan-Mapping in mapDatabasePlanIdToUIPlanId() prüfen
Problem: Credits werden nicht aktualisiert
Lösung: Backend-Webhook prüfen, Credits-Refresh-Delay erhöhen
18. Weitere Hinweise
Testing-Umgebungen
- iOS: Sandbox-Accounts in TestFlight
- Android: Test-Tracks in Play Console
- Web: Development-Keys verwenden
Production Deployment
- API Keys für Production setzen
- Store-Reviews für In-App Purchases durchführen
- RevenueCat Webhooks konfigurieren
- Analytics Monitoring aktivieren
Maintenance
- Regelmäßig RevenueCat Dashboard prüfen
- Failed Purchases monitoren
- Subscription Churn analysieren
- Legacy Plans migrieren
Stand: 2025-10-17 Version: 1.0 Autor: Dokumentation basierend auf Memoro-App-Code