feat(memory): Notizen-Inbox + Settings-Editor (Etappen 4+5)
Etappe 4 — 🗂️ Notizen-Inbox-Button neben der Lupe: - Statusleiste hat jetzt zwei Icons: 🗂️ Inbox + 🔍 Suche - Tap auf Inbox-Icon oeffnet ein Vollbild-Modal mit MemoryBrowser- Komponente. User sieht alle Memories aus der DB, kann suchen, filtern, neu anlegen, und in den Detail/Edit-Modus springen. Etappe 5 — Memory-Editor in App-Settings: - SETTINGS_SECTIONS um Eintrag 🧠 "Gedächtnis" erweitert - Sektion rendert MemoryBrowser (selbe Komponente wie Inbox) in einer 600px-Box — vom Diagnostic-Gehirn-Tab inspiriert, aber fuer's Handy optimiert - Beide Stellen recyclen MemoryBrowser+MemoryDetailModal aus Etappe 2/3 — kein doppelter Code MemoryBrowser (neue Komponente components/MemoryBrowser.tsx): - Lazy-Load aller Memories via brainApi.listMemories - Client-side Filter: Volltext-Suche (Title+Content+Category+Tags), Type-Dropdown, Pinned/Cold/Alle-Toggle - "+ Neu" Knopf mit Alert.prompt fuer Titel, automatisch type=fact, oeffnet danach den DetailModal zum Editieren des Contents - Item-Render mit Pinned-Marker, Anhang-Badge 📎N, Type-Label, Category, 2-Zeilen-Content-Preview - Tap auf Item oeffnet MemoryDetailModal → CRUD weiter dort Damit sind alle 5 Etappen aus Stefans Wunsch-Trio durch: - Bubble-Header dynamic (Etappe 1, committed gestern) - Tap-Modal mit Detail (Etappe 2) - Edit + Anhang-Upload im Modal (Etappe 3) - Notizen-Inbox-Button (Etappe 4) - Memory-Editor in Settings (Etappe 5) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -29,6 +29,7 @@ import { SvgUri } from 'react-native-svg';
|
||||
import { Dimensions } from 'react-native';
|
||||
import ZoomableImage from '../components/ZoomableImage';
|
||||
import MemoryDetailModal from '../components/MemoryDetailModal';
|
||||
import MemoryBrowser from '../components/MemoryBrowser';
|
||||
import rvs, { RVSMessage, ConnectionState } from '../services/rvs';
|
||||
import audioService from '../services/audio';
|
||||
import wakeWordService from '../services/wakeword';
|
||||
@@ -233,6 +234,7 @@ const ChatScreen: React.FC = () => {
|
||||
const [wakeWordState, setWakeWordState] = useState<'off' | 'armed' | 'conversing'>('off');
|
||||
const [fullscreenImage, setFullscreenImage] = useState<string | null>(null);
|
||||
const [memoryDetailId, setMemoryDetailId] = useState<string | null>(null);
|
||||
const [inboxVisible, setInboxVisible] = useState(false);
|
||||
const [searchQuery, setSearchQuery] = useState('');
|
||||
const [searchVisible, setSearchVisible] = useState(false);
|
||||
const [searchIndex, setSearchIndex] = useState(0); // welcher Treffer aktiv ist
|
||||
@@ -1594,7 +1596,10 @@ const ChatScreen: React.FC = () => {
|
||||
{connectionState === 'connected' ? 'Verbunden' :
|
||||
connectionState === 'connecting' ? 'Verbinde...' : 'Getrennt'}
|
||||
</Text>
|
||||
<TouchableOpacity onPress={() => setSearchVisible(!searchVisible)} style={{marginLeft: 'auto', paddingHorizontal: 8}}>
|
||||
<TouchableOpacity onPress={() => setInboxVisible(true)} style={{marginLeft: 'auto', paddingHorizontal: 6}} hitSlop={{top:8,bottom:8,left:6,right:6}}>
|
||||
<Text style={{fontSize: 18}}>\uD83D\uDDC2\uFE0F</Text>
|
||||
</TouchableOpacity>
|
||||
<TouchableOpacity onPress={() => setSearchVisible(!searchVisible)} style={{paddingHorizontal: 6}} hitSlop={{top:8,bottom:8,left:6,right:6}}>
|
||||
<Text style={{fontSize: 16}}>{'\uD83D\uDD0D'}</Text>
|
||||
</TouchableOpacity>
|
||||
</View>
|
||||
@@ -1833,6 +1838,21 @@ const ChatScreen: React.FC = () => {
|
||||
onDeleted={() => setMemoryDetailId(null)}
|
||||
/>
|
||||
|
||||
{/* Notizen-Inbox — Listet alle Memories aus dem aktuellen Chat (Special-Bubbles).
|
||||
Bestes-Aus-beiden-Welten: nur die Memory-IDs aus den memorySaved-Bubbles
|
||||
des aktuellen Chats, plus den vollen Browser darunter wenn der User mehr will. */}
|
||||
<Modal visible={inboxVisible} animationType="slide" onRequestClose={() => setInboxVisible(false)}>
|
||||
<View style={{flex:1, backgroundColor:'#0D0D1A'}}>
|
||||
<View style={{flexDirection:'row', alignItems:'center', padding:14, borderBottomWidth:1, borderBottomColor:'#1E1E2E'}}>
|
||||
<Text style={{color:'#FFD60A', fontWeight:'bold', fontSize:16, flex:1}}>🗂️ Notizen-Inbox</Text>
|
||||
<TouchableOpacity onPress={() => setInboxVisible(false)} hitSlop={{top:8,bottom:8,left:8,right:8}}>
|
||||
<Text style={{color:'#8888AA', fontSize:24}}>×</Text>
|
||||
</TouchableOpacity>
|
||||
</View>
|
||||
<MemoryBrowser />
|
||||
</View>
|
||||
</Modal>
|
||||
|
||||
{/* Bild-Vollbild Modal */}
|
||||
<Modal visible={!!fullscreenImage} transparent animationType="fade" onRequestClose={() => setFullscreenImage(null)}>
|
||||
<View style={styles.fullscreenOverlay}>
|
||||
|
||||
Reference in New Issue
Block a user