aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/client/sync/conflict.ts
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-12-07 23:34:03 +0900
committernsfisis <nsfisis@gmail.com>2025-12-07 23:34:03 +0900
commit0c042ac89fc0822fcbe09c48702857faa5494ae1 (patch)
treeea1f1d180f747613343040d441a07f92b2760840 /src/client/sync/conflict.ts
parentae5a0bb97fbf013417a6962f7e077f0408b2a951 (diff)
downloadkioku-0c042ac89fc0822fcbe09c48702857faa5494ae1.tar.gz
kioku-0c042ac89fc0822fcbe09c48702857faa5494ae1.tar.zst
kioku-0c042ac89fc0822fcbe09c48702857faa5494ae1.zip
feat(client): add sync status indicator component
Add SyncStatusIndicator component to display current sync state in the UI header. The component shows online/offline status, syncing progress, pending changes count, and sync errors. - Create SyncProvider context to wrap SyncManager for React components - Add SyncStatusIndicator component with visual status indicators - Integrate indicator into HomePage header - Add comprehensive tests for SyncStatusIndicator and SyncProvider - Update existing tests to include SyncProvider wrapper 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat (limited to 'src/client/sync/conflict.ts')
-rw-r--r--src/client/sync/conflict.ts24
1 files changed, 13 insertions, 11 deletions
diff --git a/src/client/sync/conflict.ts b/src/client/sync/conflict.ts
index 365ef3c..4e0e3ef 100644
--- a/src/client/sync/conflict.ts
+++ b/src/client/sync/conflict.ts
@@ -1,8 +1,5 @@
import type { LocalCard, LocalDeck } from "../db/index";
-import {
- localCardRepository,
- localDeckRepository,
-} from "../db/repositories";
+import { localCardRepository, localDeckRepository } from "../db/repositories";
import type { ServerCard, ServerDeck, SyncPullResult } from "./pull";
import type { SyncPushResult } from "./push";
@@ -39,10 +36,7 @@ export interface ConflictResolverOptions {
* Compare timestamps for LWW resolution
* Returns true if server data is newer or equal
*/
-function isServerNewer(
- serverUpdatedAt: Date,
- localUpdatedAt: Date,
-): boolean {
+function isServerNewer(serverUpdatedAt: Date, localUpdatedAt: Date): boolean {
return serverUpdatedAt.getTime() >= localUpdatedAt.getTime();
}
@@ -222,7 +216,10 @@ export class ConflictResolver {
const serverDeck = pullResult.decks.find((d) => d.id === deckId);
if (localDeck && serverDeck) {
- const resolution = await this.resolveDeckConflict(localDeck, serverDeck);
+ const resolution = await this.resolveDeckConflict(
+ localDeck,
+ serverDeck,
+ );
result.decks.push(resolution);
} else if (serverDeck) {
// Local doesn't exist, apply server data
@@ -239,7 +236,10 @@ export class ConflictResolver {
const serverCard = pullResult.cards.find((c) => c.id === cardId);
if (localCard && serverCard) {
- const resolution = await this.resolveCardConflict(localCard, serverCard);
+ const resolution = await this.resolveCardConflict(
+ localCard,
+ serverCard,
+ );
result.cards.push(resolution);
} else if (serverCard) {
// Local doesn't exist, apply server data
@@ -266,4 +266,6 @@ export function createConflictResolver(
/**
* Default conflict resolver using LWW (server wins) strategy
*/
-export const conflictResolver = new ConflictResolver({ strategy: "server_wins" });
+export const conflictResolver = new ConflictResolver({
+ strategy: "server_wins",
+});