feat(v027): settings:autostart-set 정식 + 채널 이름 통일

This commit is contained in:
altair823
2026-05-07 02:28:17 +09:00
parent 39bbf8f443
commit ce6c5ea756
6 changed files with 80 additions and 28 deletions

View File

@@ -39,8 +39,8 @@ export interface SettingsIpcDeps {
/**
* v0.2.7 설정 페이지 IPC 핸들러.
*
* - 자동 실행: 임시 채널명 (`settings:get-autostart` / `settings:set-autostart`).
* Task 22 에서 정식 이름 (`settings:autostart-state` / `settings:autostart-set`) 으로 rename 예정.
* - 자동 실행 (Task 22 통일): `settings:autostart-state` (조회) / `settings:autostart-set` (변경).
* 둘 다 `{ openAtLogin, diagnostic }` 반환 — diagnostic 은 withArgs/noArgs/execPath/registry 진단.
* args=['--hidden'] 명시 — 자동 실행 시 백그라운드 모드로 시작 (Quick Capture only).
*
* - 백업/내보내기/복원/동기화/사용 로그 (Task 10): 기존 `src/main/index.ts` 트레이 callback
@@ -48,24 +48,19 @@ export interface SettingsIpcDeps {
* 복사. 트레이 callback 자체 제거는 Task 16 (Phase 3) — 본 task 에선 잔류 (의도적 중복).
*/
export function registerSettingsApi(deps?: SettingsIpcDeps): void {
ipcMain.handle('settings:get-autostart', () => {
const r = app.getLoginItemSettings({ args: ['--hidden'] });
return { openAtLogin: r.openAtLogin };
});
ipcMain.handle('settings:set-autostart', (_e, open: boolean) => {
app.setLoginItemSettings({ openAtLogin: open, args: ['--hidden'] });
const r = app.getLoginItemSettings({ args: ['--hidden'] });
return { openAtLogin: r.openAtLogin };
});
// v0.2.7 F12 deeper fix (Task 21) — 진단 정보 포함된 정식 autostart 상태 조회.
// Task 22 에서 옛 'settings:get-autostart' 를 제거하고 본 채널로 통일 예정.
// v0.2.7 F12 deeper fix (Task 21~22) — 진단 정보 포함된 autostart 상태 조회/변경.
// 옛 'settings:get-autostart' / 'settings:set-autostart' 채널은 본 통일에서 제거됨.
ipcMain.handle('settings:autostart-state', async () => {
const diag = await collectAutostartState();
return { openAtLogin: diag.withArgs.openAtLogin, diagnostic: diag };
});
ipcMain.handle('settings:autostart-set', async (_e, open: boolean) => {
app.setLoginItemSettings({ openAtLogin: open, args: ['--hidden'] });
const diag = await collectAutostartState();
return { openAtLogin: diag.withArgs.openAtLogin, diagnostic: diag };
});
// v0.2.7 정보 섹션 (Task 11) — 트레이 showAboutDialog 의 detail 형식 그대로 (clipboard 일관성).
// 트레이 showAboutDialog 자체 제거는 Task 25 (Phase 6 cleanup) — 본 task 는 추가만.
ipcMain.handle('settings:get-app-info', () => ({

View File

@@ -58,9 +58,9 @@ const api: InklingApi = {
ipcRenderer.on('inbox:navigate', listener);
return () => ipcRenderer.off('inbox:navigate', listener);
},
// v0.2.7 자동 실행 (임시 채널 — Task 22 에서 settings:autostart-state / settings:autostart-set 으로 rename)
getAutostart: () => ipcRenderer.invoke('settings:get-autostart'),
setAutostart: (open: boolean) => ipcRenderer.invoke('settings:set-autostart', open),
// v0.2.7 자동 실행 (Task 22 통일) — 진단 정보 포함 응답
getAutostart: () => ipcRenderer.invoke('settings:autostart-state'),
setAutostart: (open: boolean) => ipcRenderer.invoke('settings:autostart-set', open),
// v0.2.7 백업/복원/동기화/텔레메트리 (Task 10) — 트레이 callback 의 IPC 대응
runBackup: () => ipcRenderer.invoke('settings:run-backup'),
runExport: () => ipcRenderer.invoke('settings:run-export'),

View File

@@ -1,29 +1,30 @@
import React, { useEffect, useState } from 'react';
import type { AutostartResponse } from '@shared/types';
import { inboxApi } from '../../api.js';
export function AutostartSection(): React.ReactElement {
const [openAtLogin, setOpenAtLogin] = useState<boolean | null>(null);
const [data, setData] = useState<AutostartResponse | null>(null);
useEffect(() => {
void (async () => {
const r = await inboxApi.getAutostart();
setOpenAtLogin(r.openAtLogin);
setData(r);
})();
}, []);
async function onToggle(e: React.ChangeEvent<HTMLInputElement>): Promise<void> {
const r = await inboxApi.setAutostart(e.target.checked);
setOpenAtLogin(r.openAtLogin);
setData(r);
}
if (openAtLogin === null) {
if (data === null) {
return <div style={{ fontSize: 12, color: '#666' }}> ...</div>;
}
return (
<div>
<label style={{ display: 'flex', gap: 8, alignItems: 'center', fontSize: 13 }}>
<input type="checkbox" checked={openAtLogin} onChange={onToggle} />
<input type="checkbox" checked={data.openAtLogin} onChange={onToggle} />
</label>
</div>

View File

@@ -57,6 +57,20 @@ export interface CaptureApi {
hide(): void;
}
// v0.2.7 F12 deeper fix — 자동 실행 진단 정보 (AutostartDiagnostic.collectAutostartState 결과).
export interface AutostartDiagnostic {
withArgs: { openAtLogin: boolean; executableWillLaunchAtLogin: boolean };
noArgs: { openAtLogin: boolean; executableWillLaunchAtLogin: boolean };
execPath: string;
registryPath?: string;
registryValue?: string | null;
}
export interface AutostartResponse {
openAtLogin: boolean;
diagnostic: AutostartDiagnostic;
}
export interface InboxApi {
listNotes(opts: { limit: number; cursor?: string }): Promise<Note[]>;
updateAiFields(
@@ -94,9 +108,9 @@ export interface InboxApi {
onOpenOllamaSettings(cb: () => void): () => void;
// v0.2.7 Task 13 — 외부 (트레이 등) 에서 view 전환 요청 구독.
onNavigate(cb: (view: 'inbox' | 'trash' | 'settings') => void): () => void;
// v0.2.7 자동 실행 (임시 채널 — Task 22 에서 정식 이름으로 rename)
getAutostart(): Promise<{ openAtLogin: boolean }>;
setAutostart(open: boolean): Promise<{ openAtLogin: boolean }>;
// v0.2.7 자동 실행 (Task 22 통일) — 진단 정보 포함 응답
getAutostart(): Promise<AutostartResponse>;
setAutostart(open: boolean): Promise<AutostartResponse>;
// v0.2.7 백업 / 복원 / 동기화 / 텔레메트리 — 트레이 callback 의 IPC 대응 (Task 10)
runBackup(): Promise<{ ok: true }>;
runExport(): Promise<{ ok: true }>;