fix(settings): sidebar_visible/width 영속화 — IPC + store hydration 추가

final code review 의 Important issue 대응. SettingsService 의 setSidebarVisible/
setSidebarWidth getter/setter 는 이미 있었지만 IPC handler + store hydration
missing 으로 매 launch 시 사이드바 닫힌 상태로 시작하던 회귀.

- settings:set-sidebar-visible / set-sidebar-width IPC 핸들러 추가
- InboxApi.getSettings 응답에 sidebar_visible/sidebar_width 포함
- preload 의 setSidebarVisible/setSidebarWidth invoke 노출
- store.loadInitial 가 settings.sidebar_visible/sidebar_width 로 hydrate
- store.toggleSidebar 가 IPC 호출하여 영속화
- test mock 에 setSidebarVisible/setSidebarWidth 추가

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
th-kim0823
2026-05-15 11:23:54 +09:00
parent cc11ee8cad
commit da6d296b77
6 changed files with 39 additions and 6 deletions

View File

@@ -56,6 +56,8 @@ vi.mock('../../src/renderer/inbox/api.js', () => ({
// v0.2.9 Cut B Task 12 — onboarding wizard 분기. default 는 onboarding_completed=true 라 wizard 미표시.
getSettings: vi.fn(async () => ({ onboarding_completed: true })),
setAiEnabled: vi.fn(async () => ({ ok: true as const })),
setSidebarVisible: vi.fn(async () => ({ ok: true as const })),
setSidebarWidth: vi.fn(async () => ({ ok: true as const })),
setOnboardingCompleted: vi.fn(async () => ({ ok: true as const })),
// v0.2.9 Cut B Task 16 — AiProviderSection 가 SettingsPage 렌더 시 호출.
getDisabledCount: vi.fn(async () => 0),
@@ -174,11 +176,12 @@ describe('App header — 3 tabs (v0.4)', () => {
});
it('Sidebar 컴포넌트가 렌더 트리에 포함됨 (sidebarVisible=true)', async () => {
useInbox.setState({ sidebarVisible: true, notebooks: [] });
// loadInitial 의 getSettings 가 sidebar_visible=true 반환 (Strict Mode 중복 호출 대비 mockResolvedValue).
vi.mocked(inboxApi.getSettings).mockResolvedValue({ onboarding_completed: true, sidebar_visible: true });
render(<App />);
await screen.findByRole('tab', { name: /Inbox/ });
// Sidebar renders an <aside> element when visible
expect(document.querySelector('aside')).not.toBeNull();
// loadInitial 비동기 hydrate 가 완료될 때까지 기다림
await waitFor(() => expect(document.querySelector('aside')).not.toBeNull());
});
});

View File

@@ -19,7 +19,9 @@ vi.mock('../../src/renderer/inbox/api.js', () => ({
listRecallCandidate: vi.fn(async () => null),
countsByStatus: mockCountsByStatus,
getSettings: vi.fn(async () => ({ ai_enabled: true })),
listByStatus: mockListByStatus
listByStatus: mockListByStatus,
setSidebarVisible: vi.fn(async () => ({ ok: true as const })),
setSidebarWidth: vi.fn(async () => ({ ok: true as const }))
},
notebookApi: {
list: vi.fn(async () => [