chahinebrini
22385d7d67
feat(stripe,onboarding): tier-rename + TTS audio button in lyra bubble
## Stripe Checkout Rename
Alte Legacy-Tier-Namen 'standard/pro' (von alter Tier-Struktur) waren
irreführend — heute heißt es 'pro/legend'. Cleanup:
- ENV-Var-Namen: STRIPE_PRICE_<PLAN>_<BILLING> (computed) statt
hardcoded STANDARD/PRO Mapping. Erwartet:
STRIPE_PRICE_PRO_MONTHLY
STRIPE_PRICE_PRO_YEARLY
STRIPE_PRICE_LEGEND_MONTHLY
STRIPE_PRICE_LEGEND_YEARLY
- 'quarterly' billing entfernt (Strategist-Verdict: nur monthly + yearly,
'2 Monate gratis' bei yearly).
- metadata enthält jetzt billing zusätzlich zu plan.
Webhook-Audit: bereits korrekt (mapped session.metadata.plan → pro/legend/free
via simple switch).
User-Action benötigt (Stripe Test-Dashboard):
- 4 Products + Prices anlegen mit 14-Tage-Trial
- Pricing pro Strategist: Pro 3,99/Mo + 39,90/Yr (2mo gratis),
Legend 7,99/Mo + 79,90/Yr
- Webhook-Endpoint: https://staging.rebreak.org/api/stripe/webhook
(Events: checkout.session.completed, customer.subscription.{updated,deleted})
- ENV-Vars (incl. STRIPE_WEBHOOK_SECRET) in Infisical pflegen
## TTS Audio-Button in LyraBubble
DiGA-Accessibility: Screen-Reader-Alternative + Lese-Hürden-Mitigation.
- lib/lyraSpeech.ts: one-shot TTS-Helper (vereinfacht aus SosTtsQueue)
- Fetch /api/coach/speak mit Auth-Token
- Bytes → Base64 → temp-file → expo-av Audio.Sound
- Stop-fn: abortet in-flight fetch + unloaded sound
- Status-callback: idle | loading | playing
- LyraBubble: Audio-Button rechts oben (orange Pill, 34×34)
- Icon: volume-medium / hourglass / stop je nach status
- Auto-stop bei text-change (Slide-Switch) + unmount
- A11y-Labels in 4 Sprachen (audio_play / audio_loading / audio_stop)
Bubble-paddingRight erhöht auf 50 für Button-Platz.
## Locales
de/en/fr/ar: onboarding.lyra.audio_play / audio_loading / audio_stop
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 20:51:11 +02:00
..
2026-05-17 19:58:56 +02:00
2026-05-16 08:50:12 +02:00
2026-05-13 23:23:45 +02:00
2026-05-15 23:37:28 +02:00
2026-05-16 00:44:44 +02:00
2026-05-11 15:43:10 +02:00
2026-05-10 23:59:25 +02:00
2026-05-16 05:26:52 +02:00
2026-05-17 20:51:11 +02:00
2026-05-15 23:31:26 +02:00
2026-05-16 00:25:18 +02:00
2026-05-11 15:43:10 +02:00
2026-05-12 21:47:18 +02:00
2026-05-11 14:52:42 +02:00
2026-05-12 19:41:56 +02:00
2026-05-06 07:13:43 +02:00
2026-05-15 23:31:26 +02:00
2026-05-06 07:13:43 +02:00
2026-05-15 23:55:57 +02:00
2026-05-11 15:43:10 +02:00
2026-05-15 21:16:22 +02:00
2026-05-06 07:13:43 +02:00
2026-05-16 02:03:53 +02:00
2026-05-06 07:13:43 +02:00
2026-05-06 07:13:43 +02:00
2026-05-10 23:59:25 +02:00
2026-05-12 22:12:29 +02:00
2026-05-13 16:15:54 +02:00
2026-05-06 07:13:43 +02:00
2026-05-11 15:43:10 +02:00
2026-05-11 15:43:10 +02:00
2026-05-17 15:44:32 +02:00
2026-05-16 01:08:14 +02:00
2026-05-09 14:51:02 +02:00
2026-05-12 21:37:46 +02:00
2026-05-17 19:05:37 +02:00
2026-05-16 11:24:45 +02:00
2026-05-09 17:54:34 +02:00
2026-05-13 23:23:45 +02:00
2026-05-09 14:51:02 +02:00
2026-05-11 15:43:10 +02:00
2026-05-11 15:43:10 +02:00