2단계 페이지 진입 즉시 설치를 시작하고, 음악·사진을 1번부터 카드 그리드로 한눈에 볼 수 있게 만든다. 다운로드는 % 게이지로, 완료/실패는 색상으로 표시. - main: prep/item/package phase 의 ProgressEvent 를 renderer 로 송신 - music.ts: yt-dlp stdout 의 [download] X% 라인을 파싱해 onProgress 호출 - preload: onProgress 채널 구독 함수 노출 - renderer: 다음 버튼 제거, prep chip + music/image 카드 그리드 + 빌드 상태 - styles: progressCard / prepChip / progressGrid 스타일 추가 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
47 lines
1.8 KiB
TypeScript
47 lines
1.8 KiB
TypeScript
import { contextBridge, ipcRenderer } from 'electron'
|
|
import type { RpFetchedPack } from './types.js'
|
|
|
|
const api = {
|
|
/** manifest 와 각 음악퀴즈의 file/list/<key>.json 까지 한 번에 로드. */
|
|
loadPacks: (manifestUrl?: string): Promise<RpFetchedPack[]> =>
|
|
ipcRenderer.invoke('rp:packs:load', manifestUrl),
|
|
/** 음악퀴즈 키를 선택. */
|
|
selectPack: (packKey: string): Promise<void> =>
|
|
ipcRenderer.invoke('rp:packs:select', packKey),
|
|
|
|
/** 리소스팩 빌드/설치 시작. 완료 또는 취소될 때까지 resolve 되지 않을 수 있음. */
|
|
startInstall: (): Promise<{ resourcepackPath: string }> =>
|
|
ipcRenderer.invoke('rp:install:start'),
|
|
/** 진행 중인 설치 취소. 임시 파일 정리 후 종료. */
|
|
cancelInstall: (): Promise<void> =>
|
|
ipcRenderer.invoke('rp:install:cancel'),
|
|
|
|
/** %appdata%/.minecraft/resourcepacks/ 폴더를 OS 파일 탐색기로 연다. */
|
|
openResourcepackFolder: (): Promise<void> =>
|
|
ipcRenderer.invoke('rp:finish:openFolder'),
|
|
/** 프로그램 종료. */
|
|
quit: (): Promise<void> => ipcRenderer.invoke('rp:quit'),
|
|
|
|
/** 로그 스트림 구독. */
|
|
onLog: (handler: (line: string) => void): (() => void) => {
|
|
const listener = (_event: unknown, line: string) => handler(line)
|
|
ipcRenderer.on('log', listener)
|
|
return () => ipcRenderer.removeListener('log', listener)
|
|
},
|
|
|
|
/** 설치 진행 이벤트 구독. payload 구조는 renderer 가 알아서 분기. */
|
|
onProgress: (handler: (payload: unknown) => void): (() => void) => {
|
|
const listener = (_event: unknown, payload: unknown) => handler(payload)
|
|
ipcRenderer.on('progress', listener)
|
|
return () => ipcRenderer.removeListener('progress', listener)
|
|
}
|
|
}
|
|
|
|
contextBridge.exposeInMainWorld('rpInstaller', api)
|
|
|
|
declare global {
|
|
interface Window {
|
|
rpInstaller: typeof api
|
|
}
|
|
}
|