82 lines
3.1 KiB
TypeScript
82 lines
3.1 KiB
TypeScript
import electron from 'electron';
|
|
import type { Tray as TrayType, MenuItemConstructorOptions } from 'electron';
|
|
const { app, Tray, Menu, nativeImage } = electron;
|
|
|
|
// v0.2.7 Phase 3 (Task 15) — showAboutDialog 제거됨.
|
|
// "Inkling 정보..." 트레이 항목이 사라짐 → 동일 기능은 설정 페이지의 InfoSection 이 담당.
|
|
// settings:get-app-info / settings:copy-app-info IPC 핸들러 (settingsApi.ts) 가 역할 인계.
|
|
|
|
/**
|
|
* v0.2.7 Phase 3 (Task 14) — 트레이 메뉴 슬림. 13 → 4 항목.
|
|
*
|
|
* 백업/내보내기/복원/동기화/사용 로그/Ollama 재확인/AI 재처리/Ollama 설정/자동실행/정보 →
|
|
* 모두 설정 페이지로 이전. 트레이는 4 항목만 노출:
|
|
* 1. 한 줄 적기 (showCapture)
|
|
* 2. 보관한 메모 보기 (showInbox)
|
|
* 3. 설정... (showSettings — 설정 페이지로 navigate)
|
|
* 4. 종료
|
|
*/
|
|
export interface TrayCallbacks {
|
|
showInbox: () => void;
|
|
showCapture: () => void;
|
|
showSettings: () => void;
|
|
}
|
|
|
|
/**
|
|
* v0.2.7 Phase 3 (Task 14) — TrayState 슬림. todayCount 만 잔류 (오늘 N번 잡아둠 라벨).
|
|
* ollamaOk / failedCount 메뉴 항목이 사라져 더 이상 필요 없음.
|
|
*/
|
|
export interface TrayState {
|
|
todayCount: number;
|
|
}
|
|
|
|
let tray: TrayType | null = null;
|
|
let _callbacks: TrayCallbacks | null = null;
|
|
let _state: TrayState = { todayCount: 0 };
|
|
|
|
function buildMenu(): electron.Menu {
|
|
const items: MenuItemConstructorOptions[] = [];
|
|
const cb = _callbacks;
|
|
if (!cb) {
|
|
// createTray 호출 전이면 빈 메뉴 (defensive)
|
|
return Menu.buildFromTemplate([{ label: '로딩 중...', enabled: false }]);
|
|
}
|
|
// F4-C: count > 0 시 비활성 라벨로 정체성 신호 노출. count = 0 시 메뉴를 자연스럽게 시작.
|
|
if (_state.todayCount > 0) {
|
|
items.push({ label: `오늘 ${_state.todayCount}번 잡아둠`, enabled: false });
|
|
items.push({ type: 'separator' });
|
|
}
|
|
items.push({ label: '한 줄 적기', click: cb.showCapture });
|
|
items.push({ label: '보관한 메모 보기', click: cb.showInbox });
|
|
items.push({ type: 'separator' });
|
|
items.push({ label: '설정...', click: cb.showSettings });
|
|
items.push({ type: 'separator' });
|
|
items.push({ label: '종료', click: () => { app.isQuitting = true; app.quit(); } });
|
|
return Menu.buildFromTemplate(items);
|
|
}
|
|
|
|
/**
|
|
* v0.2.6 C2 — 1-arg createTray. 기존 10 positional 폐기.
|
|
* v0.2.7 Phase 3 — TrayCallbacks 3-필드로 슬림.
|
|
*/
|
|
export function createTray(callbacks: TrayCallbacks): TrayType {
|
|
_callbacks = callbacks;
|
|
const icon = nativeImage.createEmpty();
|
|
tray = new Tray(icon);
|
|
tray.setToolTip(`Inkling — 오늘 ${_state.todayCount}`);
|
|
tray.setContextMenu(buildMenu());
|
|
tray.on('click', callbacks.showInbox);
|
|
return tray;
|
|
}
|
|
|
|
/**
|
|
* v0.2.6 C3 — 통합 state 갱신. partial 으로 받아 _state merge + 메뉴 재빌드.
|
|
* v0.2.7 Phase 3 — TrayState 가 todayCount 만 갖도록 슬림.
|
|
*/
|
|
export function refreshTray(state: Partial<TrayState>): void {
|
|
_state = { ..._state, ...state };
|
|
if (tray === null) return;
|
|
tray.setToolTip(`Inkling — 오늘 ${_state.todayCount}`);
|
|
tray.setContextMenu(buildMenu());
|
|
}
|