From 89391a807b41c59ad1aeec159ff760375fc10e18 Mon Sep 17 00:00:00 2001 From: chahinebrini Date: Mon, 1 Jun 2026 10:25:35 +0200 Subject: [PATCH] fix: Arabic STT + DM scroll + info sheet FormSheet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit STT (Arabic): - Deepgram hat nova-2-general ar/tr-Support eingestellt (400 Bad Request) - Fix: einheitlich nova-3 für alle Sprachen inkl. ar/tr - Stale Kommentar aus 2026-05-30 entfernt DM scroll-to-bottom: - onLayout auf FlatList hinzugefügt → zusätzlicher scrollToEnd nach initialem Layout-Pass (Android-specific race condition) - onOpenImage im FlatList-Renderer auf Lightbox verdrahtet (war () => {}) Info-Sheet: - Modal(pageSheet) → FormSheet mit initialHeightPct={0.85} - Nutzt jetzt unsere eigene Sheet-Komponente konsistent Co-Authored-By: Claude Sonnet 4.6 --- apps/rebreak-native/app/dm.tsx | 179 +++++++++----------- backend/server/api/coach/transcribe.post.ts | 26 +-- 2 files changed, 89 insertions(+), 116 deletions(-) diff --git a/apps/rebreak-native/app/dm.tsx b/apps/rebreak-native/app/dm.tsx index 2ef4de2..d24e03d 100644 --- a/apps/rebreak-native/app/dm.tsx +++ b/apps/rebreak-native/app/dm.tsx @@ -28,6 +28,7 @@ import * as FileSystem from 'expo-file-system/legacy'; import { apiFetch } from '../lib/api'; import { ChatBubble, type ChatMsg, type MessageReaction } from '../components/chat/ChatBubble'; import { DmChatBackground } from '../components/chat/DmChatBackground'; +import { FormSheet } from '../components/FormSheet'; import { useDmRealtime } from '../hooks/useChatRealtime'; import { useColors } from '../lib/theme'; import { useThemeStore } from '../stores/theme'; @@ -532,7 +533,7 @@ export default function DmScreen() { onLike={toggleLike} onReact={toggleReaction} onDelete={deleteMessage} - onOpenImage={() => {}} + onOpenImage={(url) => setLightboxUri(url)} /> )} keyExtractor={(m) => m.id} @@ -545,6 +546,7 @@ export default function DmScreen() { keyboardDismissMode="interactive" keyboardShouldPersistTaps="handled" onContentSizeChange={() => flatListRef.current?.scrollToEnd({ animated: false })} + onLayout={() => flatListRef.current?.scrollToEnd({ animated: false })} /> )} @@ -706,103 +708,90 @@ function DmInfoSheet({ ); return ( - - - {/* Header */} - - - {t('chat.info')} - - - - - - - - {/* Partner-Karte */} - - {partner?.avatar ? ( - - ) : ( - - - {partner?.nickname?.[0]?.toUpperCase() ?? '?'} - - - )} - - - {partner?.nickname ?? '…'} - - - {t('dm.view_profile', { defaultValue: 'Profil anzeigen' })} - - - - - - - - {/* Geteilte Medien */} - - - {t('dm.shared_media', { defaultValue: 'Geteilte Medien' })} - {sharedMedia.length > 0 && ( - - {' '}{sharedMedia.length} - - )} - - - - {sharedMedia.length === 0 ? ( - - - - {t('dm.no_shared_media', { defaultValue: 'Keine geteilten Medien' })} - - + + + {/* Partner-Karte */} + + {partner?.avatar ? ( + ) : ( - - {[...sharedMedia].reverse().map((m) => ( - onImagePress(m.attachmentUrl!)} - > - - - ))} + + + {partner?.nickname?.[0]?.toUpperCase() ?? '?'} + )} - - - + + + {partner?.nickname ?? '…'} + + + {t('dm.view_profile')} + + + + + + + + {/* Geteilte Medien */} + + + {t('dm.shared_media')} + + {sharedMedia.length > 0 && ( + + {sharedMedia.length} + + )} + + + {sharedMedia.length === 0 ? ( + + + + {t('dm.no_shared_media')} + + + ) : ( + + {[...sharedMedia].reverse().map((m) => ( + onImagePress(m.attachmentUrl!)} + > + + + ))} + + )} + + ); } diff --git a/backend/server/api/coach/transcribe.post.ts b/backend/server/api/coach/transcribe.post.ts index f3f75b2..c8680e0 100644 --- a/backend/server/api/coach/transcribe.post.ts +++ b/backend/server/api/coach/transcribe.post.ts @@ -84,34 +84,18 @@ export default defineEventHandler(async (event) => { ); // Deepgram language mapping. - // Live-Diagnose (2026-05-30): nova-3 lehnt language=ar (und tr) mit - // 400 "No such model/language/tier combination found" ab — entgegen - // der vorherigen Annahme. Fallback für ar/tr: nova-2-general - // (multilingual auto-detect). Für alle anderen Sprachen bleibt nova-3 - // (bessere Genauigkeit, diskrete language-codes). + // Stand 2026-06-01: nova-3 unterstützt alle Sprachen inkl. ar/tr. + // nova-2-general hat ar/tr-Support eingestellt ("No such model/language/tier + // combination found") — daher einheitlich nova-3 für alle Sprachen. const deepgramLang = language && ["de", "en", "tr", "ar", "fr", "es", "pt", "it"].includes(language) ? language : "de"; - // nova-2-general unterstützt language=ar/tr (im Gegensatz zu nova-3). - // Ohne expliziten language-Param fällt nova-2 auf Auto-Detect zurück und - // misdetektiert arabisches Audio oft als Englisch (phonetisches Transcript - // wie "salam alaikum" statt "السلام عليكم") — Lyra antwortet dann nicht - // auf Arabisch. Mit language=ar wird der korrekte Acoustic-Model-Pfad - // verwendet und die Schrift bleibt arabisch. - const needsGeneralModel = ["ar", "tr"].includes(deepgramLang); - const deepgramUrl = needsGeneralModel - ? `https://api.deepgram.com/v1/listen?language=${deepgramLang}&model=nova-2-general` - : `https://api.deepgram.com/v1/listen?language=${deepgramLang}&model=nova-3`; + const deepgramUrl = `https://api.deepgram.com/v1/listen?language=${deepgramLang}&model=nova-3`; - console.log( - "[transcribe] language:", - deepgramLang, - "model:", - needsGeneralModel ? "nova-2-general" : "nova-3", - ); + console.log("[transcribe] language:", deepgramLang, "model: nova-3"); try { const response = await fetch(deepgramUrl, {