diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-12-07 23:34:03 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-12-07 23:34:03 +0900 |
| commit | 0c042ac89fc0822fcbe09c48702857faa5494ae1 (patch) | |
| tree | ea1f1d180f747613343040d441a07f92b2760840 /src/client/pages | |
| parent | ae5a0bb97fbf013417a6962f7e077f0408b2a951 (diff) | |
| download | kioku-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/pages')
| -rw-r--r-- | src/client/pages/HomePage.test.tsx | 7 | ||||
| -rw-r--r-- | src/client/pages/HomePage.tsx | 10 |
2 files changed, 12 insertions, 5 deletions
diff --git a/src/client/pages/HomePage.test.tsx b/src/client/pages/HomePage.test.tsx index 4dd4a81..f75f88d 100644 --- a/src/client/pages/HomePage.test.tsx +++ b/src/client/pages/HomePage.test.tsx @@ -1,13 +1,14 @@ /** * @vitest-environment jsdom */ +import "fake-indexeddb/auto"; import { cleanup, render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { Router } from "wouter"; import { memoryLocation } from "wouter/memory-location"; import { apiClient } from "../api/client"; -import { AuthProvider } from "../stores"; +import { AuthProvider, SyncProvider } from "../stores"; import { HomePage } from "./HomePage"; vi.mock("../api/client", () => ({ @@ -89,7 +90,9 @@ function renderWithProviders(path = "/") { return render( <Router hook={hook}> <AuthProvider> - <HomePage /> + <SyncProvider> + <HomePage /> + </SyncProvider> </AuthProvider> </Router>, ); diff --git a/src/client/pages/HomePage.tsx b/src/client/pages/HomePage.tsx index fb13422..debc935 100644 --- a/src/client/pages/HomePage.tsx +++ b/src/client/pages/HomePage.tsx @@ -4,6 +4,7 @@ import { ApiClientError, apiClient } from "../api"; import { CreateDeckModal } from "../components/CreateDeckModal"; import { DeleteDeckModal } from "../components/DeleteDeckModal"; import { EditDeckModal } from "../components/EditDeckModal"; +import { SyncStatusIndicator } from "../components/SyncStatusIndicator"; import { useAuth } from "../stores"; interface Deck { @@ -70,9 +71,12 @@ export function HomePage() { }} > <h1>Kioku</h1> - <button type="button" onClick={logout}> - Logout - </button> + <div style={{ display: "flex", alignItems: "center", gap: "1rem" }}> + <SyncStatusIndicator /> + <button type="button" onClick={logout}> + Logout + </button> + </div> </header> <main> |
