Remove CharacterComponent and CharacterDetail components
- Deleted `CharacterComponent` and `CharacterDetail` files from the project. - Refactored related logic to improve code maintainability and reduce redundancy.
This commit is contained in:
@@ -9,6 +9,20 @@ import {CompleteBook} from '@/lib/models/Book';
|
||||
import {BookSyncCompare, SyncedBook} from '@/lib/models/SyncedBook';
|
||||
import {useTranslations} from 'next-intl';
|
||||
|
||||
interface RemovedItemRecord {
|
||||
removal_id: string;
|
||||
table_name: string;
|
||||
entity_id: string;
|
||||
book_id: string | null;
|
||||
user_id: string;
|
||||
deleted_at: number;
|
||||
}
|
||||
|
||||
interface SyncedBooksResponse {
|
||||
books: SyncedBook[];
|
||||
tombstones: RemovedItemRecord[];
|
||||
}
|
||||
|
||||
export default function useSyncBooks() {
|
||||
const t = useTranslations();
|
||||
const {session} = useContext(SessionContext);
|
||||
@@ -23,7 +37,9 @@ export default function useSyncBooks() {
|
||||
setLocalOnlyBooks,
|
||||
setServerOnlyBooks,
|
||||
setServerSyncedBooks,
|
||||
setLocalSyncedBooks
|
||||
setLocalSyncedBooks,
|
||||
setBooksToSyncFromServer,
|
||||
setBooksToSyncToServer
|
||||
} = useContext(BooksSyncContext);
|
||||
|
||||
async function upload(bookId: string): Promise<boolean> {
|
||||
@@ -115,6 +131,9 @@ export default function useSyncBooks() {
|
||||
errorMessage(t('bookCard.syncFromServerError'));
|
||||
return false;
|
||||
}
|
||||
setBooksToSyncFromServer((prev: BookSyncCompare[]): BookSyncCompare[] =>
|
||||
prev.filter((book: BookSyncCompare): boolean => book.id !== bookId)
|
||||
);
|
||||
return true;
|
||||
} catch (e: unknown) {
|
||||
if (e instanceof Error) {
|
||||
@@ -147,6 +166,9 @@ export default function useSyncBooks() {
|
||||
errorMessage(t('bookCard.syncToServerError'));
|
||||
return false;
|
||||
}
|
||||
setBooksToSyncToServer((prev: BookSyncCompare[]): BookSyncCompare[] =>
|
||||
prev.filter((book: BookSyncCompare): boolean => book.id !== bookId)
|
||||
);
|
||||
return true;
|
||||
} catch (e: unknown) {
|
||||
if (e instanceof Error) {
|
||||
@@ -172,8 +194,39 @@ export default function useSyncBooks() {
|
||||
if (!isCurrentlyOffline()) {
|
||||
if (offlineMode.isDatabaseInitialized) {
|
||||
localBooksResponse = await window.electron.invoke<SyncedBook[]>('db:books:synced');
|
||||
|
||||
// Get lastOnlineTimestamp from localStorage (or 0 if not set)
|
||||
const lastOnlineStr: string | null = localStorage.getItem('lastOnlineTimestamp');
|
||||
const lastOnlineTimestamp: number = lastOnlineStr ? parseInt(lastOnlineStr, 10) : 0;
|
||||
|
||||
// Get local tombstones since lastOnlineTimestamp via IPC
|
||||
const localTombstones: RemovedItemRecord[] = await window.electron.invoke<RemovedItemRecord[]>(
|
||||
'db:tombstones:since',
|
||||
lastOnlineTimestamp
|
||||
);
|
||||
|
||||
// Call server with POST and tombstones
|
||||
const serverResponse: SyncedBooksResponse = await System.authPostToServer<SyncedBooksResponse>(
|
||||
'books/synced',
|
||||
{ lastOnlineTimestamp, tombstones: localTombstones },
|
||||
session.accessToken,
|
||||
lang
|
||||
);
|
||||
|
||||
serverBooksResponse = serverResponse.books;
|
||||
|
||||
// Apply server tombstones locally via IPC
|
||||
await window.electron.invoke<void>('db:tombstones:apply:books', serverResponse.tombstones);
|
||||
} else {
|
||||
// No local DB but online - just get server books without tombstones
|
||||
const serverResponse: SyncedBooksResponse = await System.authPostToServer<SyncedBooksResponse>(
|
||||
'books/synced',
|
||||
{ lastOnlineTimestamp: 0, tombstones: [] },
|
||||
session.accessToken,
|
||||
lang
|
||||
);
|
||||
serverBooksResponse = serverResponse.books;
|
||||
}
|
||||
serverBooksResponse = await System.authGetQueryToServer<SyncedBook[]>('books/synced', session.accessToken, lang);
|
||||
} else {
|
||||
if (offlineMode.isDatabaseInitialized) {
|
||||
localBooksResponse = await window.electron.invoke<SyncedBook[]>('db:books:synced');
|
||||
|
||||
Reference in New Issue
Block a user