diff --git a/android/src/components/MemoryBrowser.tsx b/android/src/components/MemoryBrowser.tsx index f57ba1b..1cebfe0 100644 --- a/android/src/components/MemoryBrowser.tsx +++ b/android/src/components/MemoryBrowser.tsx @@ -37,9 +37,11 @@ interface Props { title?: string; /** Style-Erweiterung fuer den Container. */ flatStyle?: boolean; + /** Wenn gesetzt: kein eigenes DetailModal mounten — Parent kuemmert sich. */ + onOpenMemory?: (id: string) => void; } -export const MemoryBrowser: React.FC = ({ restrictToIds, title, flatStyle }) => { +export const MemoryBrowser: React.FC = ({ restrictToIds, title, flatStyle, onOpenMemory }) => { const [items, setItems] = useState([]); const [filtered, setFiltered] = useState([]); const [loading, setLoading] = useState(false); @@ -82,38 +84,35 @@ export const MemoryBrowser: React.FC = ({ restrictToIds, title, flatStyle setFiltered(out); }, [items, q, typeFilter, pinnedFilter, restrictToIds]); + const [showNewMemoryDialog, setShowNewMemoryDialog] = useState(false); + const [newMemoryTitle, setNewMemoryTitle] = useState(''); + const onAddNew = () => { - Alert.prompt( - 'Neue Memory', - 'Titel:', - [ - { text: 'Abbrechen', style: 'cancel' }, - { - text: 'Anlegen', - onPress: async (title?: string) => { - const t = (title || '').trim(); - if (!t) return; - try { - const m = await brainApi.saveMemory({ - type: 'fact', title: t, - content: '(noch leer — bitte editieren)', - }); - load(); - setOpenId(m.id); - } catch (e: any) { - Alert.alert('Fehler', String(e?.message || e)); - } - }, - }, - ], - 'plain-text', - ); + setNewMemoryTitle(''); + setShowNewMemoryDialog(true); + }; + + const confirmAddNew = async () => { + const t = newMemoryTitle.trim(); + if (!t) { setShowNewMemoryDialog(false); return; } + setShowNewMemoryDialog(false); + try { + const m = await brainApi.saveMemory({ + type: 'fact', title: t, + content: '(noch leer — bitte editieren)', + }); + load(); + if (onOpenMemory) onOpenMemory(m.id); + else setOpenId(m.id); + } catch (e: any) { + Alert.alert('Fehler', String(e?.message || e)); + } }; const renderItem = ({ item }: { item: Memory }) => { const attCount = (item.attachments || []).length; return ( - setOpenId(item.id)}> + onOpenMemory ? onOpenMemory(item.id) : setOpenId(item.id)}> {item.pinned ? '📌 ' : ''}{item.title || '(ohne Titel)'} @@ -202,12 +201,42 @@ export const MemoryBrowser: React.FC = ({ restrictToIds, title, flatStyle - { setOpenId(null); load(); }} - onDeleted={() => { setOpenId(null); load(); }} - /> + {/* Eigenes DetailModal nur wenn der Parent kein Callback uebergibt + (vermeidet Modal-in-Modal-Stacking auf Android). */} + {!onOpenMemory && ( + { setOpenId(null); load(); }} + onDeleted={() => { setOpenId(null); load(); }} + /> + )} + + {/* "Neue Memory"-Dialog (Alert.prompt ist iOS-only, daher eigenes Modal) */} + setShowNewMemoryDialog(false)}> + + + Neue Memory anlegen + Titel: + + + setShowNewMemoryDialog(false)} style={{padding:8}}> + Abbrechen + + + Anlegen + + + + + ); }; diff --git a/android/src/screens/ChatScreen.tsx b/android/src/screens/ChatScreen.tsx index 0b42cec..b72ff76 100644 --- a/android/src/screens/ChatScreen.tsx +++ b/android/src/screens/ChatScreen.tsx @@ -1933,7 +1933,7 @@ const ChatScreen: React.FC = () => { Alle Memories aus der DB - + { setInboxVisible(false); setMemoryDetailId(id); }} />