perf(chat): debounce persisted writes and re-render only the streaming message

- the Zustand persist middleware serialized every saved session and wrote to AsyncStorage on each streamed token (appendToMessage -> set); writes are now debounced (400 ms) and flushed when the app leaves the foreground
- every token re-rendered every MessageBubble, re-parsing the Markdown of the whole conversation; rows are memoized so only the changed message renders (covered by MessageList.test.tsx)
This commit is contained in:
evandro committed 2026-10-10 04:28:38 -03:00
1 parent 200fb6afd7
commit 0e5b38fd15
6 files changed
+252 -13

No files matched your search

+2 -2
View File
@@ -1,7 +1,7 @@
import AsyncStorage from '@react-native-async-storage/async-storage';
import { create } from 'zustand';
import { createJSONStorage, persist } from 'zustand/middleware';
import { DEFAULT_SERVER_CONFIG, LMModel, ServerConfig } from '../services/types';
import { appStorage } from './debouncedStorage';
export interface ChatMessage {
id: string;
@@ -164,7 +164,7 @@ export const useAppStore = create<AppState>()(
}),
{
name: 'localaiapp-storage',
storage: createJSONStorage(() => AsyncStorage),
storage: createJSONStorage(() => appStorage),
partialize: (state) => ({
theme: state.theme,
serverConfig: state.serverConfig,