Update database schema and synchronization logic

- Add `useEffect` in `ScribeLeftBar` for handling book state changes.
- Extend `BooksSyncContext` with new properties and stricter typings.
- Refine `Repositories` to include `lastUpdate` handling for synchronization processes.
- Add comprehensive `fetchComplete*` repository methods for retrieving entity-specific sync data.
- Enhance offline logic for chapters, characters, locations, and world synchronization.
- Improve error handling across IPC handlers and repositories.
This commit is contained in:
natreex
2025-12-15 20:55:24 -05:00
parent bb331b5c22
commit 64c7cb6243
23 changed files with 1609 additions and 79 deletions

View File

@@ -33,7 +33,7 @@ import OfflineProvider from "@/context/OfflineProvider";
import OfflineContext from "@/context/OfflineContext";
import OfflinePinSetup from "@/components/offline/OfflinePinSetup";
import OfflinePinVerify from "@/components/offline/OfflinePinVerify";
import {SyncedBook} from "@/lib/models/SyncedBook";
import {SyncedBook, BookSyncCompare, compareBookSyncs} from "@/lib/models/SyncedBook";
import {BooksSyncContext} from "@/context/BooksSyncContext";
const messagesMap = {
@@ -64,8 +64,8 @@ function ScribeContent() {
const [serverSyncedBooks, setServerSyncedBooks] = useState<SyncedBook[]>([]);
const [localSyncedBooks, setLocalSyncedBooks] = useState<SyncedBook[]>([]);
const [booksToSyncFromServer, setBooksToSyncFromServer] = useState<SyncedBook[]>([]);
const [booksToSyncToServer, setBooksToSyncToServer] = useState<SyncedBook[]>([]);
const [bookSyncDiffsFromServer, setBookSyncDiffsFromServer] = useState<BookSyncCompare[]>([]);
const [bookSyncDiffsToServer, setBookSyncDiffsToServer] = useState<BookSyncCompare[]>([]);
const [serverOnlyBooks, setServerOnlyBooks] = useState<SyncedBook[]>([]);
const [localOnlyBooks, setLocalOnlyBooks] = useState<SyncedBook[]>([]);
@@ -165,17 +165,36 @@ function ScribeContent() {
}
}, [currentBook]);
useEffect(():void => {
setBooksToSyncFromServer(serverSyncedBooks.filter((serverBook: SyncedBook):boolean => {
const localBook: SyncedBook | undefined = localSyncedBooks.find((localBook: SyncedBook):boolean => localBook.id === serverBook.id);
console.log('localBook from setBookToSyncFromServer',localBook);
console.log('serverBook from setBookToSyncFromServer',serverBook);
return !localBook || localBook.lastUpdate < serverBook.lastUpdate;
}))
setBooksToSyncToServer(localSyncedBooks.filter((localBook: SyncedBook):boolean => {
const serverBook: SyncedBook | undefined = serverSyncedBooks.find((serverBook: SyncedBook):boolean => serverBook.id === localBook.id);
return !serverBook || serverBook.lastUpdate < localBook.lastUpdate;
}))
useEffect((): void => {
const diffsFromServer: BookSyncCompare[] = [];
const diffsToServer: BookSyncCompare[] = [];
serverSyncedBooks.forEach((serverBook: SyncedBook): void => {
const localBook: SyncedBook | undefined = localSyncedBooks.find((book: SyncedBook): boolean => book.id === serverBook.id);
if (!localBook) {
return;
}
const diff: BookSyncCompare | null = compareBookSyncs(serverBook, localBook);
if (diff) {
diffsFromServer.push(diff);
}
});
localSyncedBooks.forEach((localBook: SyncedBook): void => {
const serverBook: SyncedBook | undefined = serverSyncedBooks.find((book: SyncedBook): boolean => book.id === localBook.id);
if (!serverBook) {
return;
}
const diff: BookSyncCompare | null = compareBookSyncs(localBook, serverBook);
if (diff) {
diffsToServer.push(diff);
}
});
setBookSyncDiffsFromServer(diffsFromServer);
setBookSyncDiffsToServer(diffsToServer);
setServerOnlyBooks(serverSyncedBooks.filter((serverBook: SyncedBook):boolean => !localSyncedBooks.find((localBook: SyncedBook):boolean => localBook.id === serverBook.id)))
setLocalOnlyBooks(localSyncedBooks.filter((localBook: SyncedBook):boolean => !serverSyncedBooks.find((serverBook: SyncedBook):boolean => serverBook.id === localBook.id)))
}, [localSyncedBooks, serverSyncedBooks]);
@@ -488,7 +507,7 @@ function ScribeContent() {
return (
<SessionContext.Provider value={{session: session, setSession: setSession}}>
<BooksSyncContext.Provider value={{serverSyncedBooks, localSyncedBooks, booksToSyncFromServer, booksToSyncToServer, serverOnlyBooks, localOnlyBooks}}>
<BooksSyncContext.Provider value={{serverSyncedBooks, localSyncedBooks, booksToSyncFromServer:bookSyncDiffsFromServer, booksToSyncToServer:bookSyncDiffsToServer, setServerOnlyBooks, setLocalOnlyBooks, serverOnlyBooks, localOnlyBooks}}>
<BookContext.Provider value={{book: currentBook, setBook: setCurrentBook}}>
<ChapterContext.Provider value={{chapter: currentChapter, setChapter: setCurrentChapter}}>
<AIUsageContext.Provider value={{