// Slim Budget 데스크톱(Electron) 메인 프로세스.
// 라이브 사이트(https://app.sblog.kr)를 직접 로드한다 → 프론트 변경이 자동 반영(재설치 불필요),
// 같은 출처라 CORS 우회도 불필요. 배포된 웹 게이트가 Electron 을 감지해 안내페이지 대신 전체 앱을 띄운다.
const { app, BrowserWindow, shell } = require('electron')
const APP_URL = 'https://app.sblog.kr'
// 오프라인/로드 실패 시 안내 화면 (다시 시도 버튼)
function offlineHtml() {
const html = `
Slim Budget
연결할 수 없습니다
인터넷 연결을 확인해 주세요.
`
return 'data:text/html;charset=utf-8,' + encodeURIComponent(html)
}
function createWindow() {
const win = new BrowserWindow({
width: 1200,
height: 820,
minWidth: 360,
minHeight: 560,
backgroundColor: '#1a1a1a',
title: 'Slim Budget',
webPreferences: {
contextIsolation: true,
nodeIntegration: false,
},
})
// 기본 메뉴바 제거(앱 자체 내비게이션 사용)
win.removeMenu()
win.loadURL(APP_URL)
// 메인 프레임 로드 실패(오프라인 등) 시 안내 화면. -3(aborted, 리다이렉트 등)은 무시.
win.webContents.on('did-fail-load', (event, errorCode, errorDescription, validatedURL, isMainFrame) => {
if (isMainFrame && errorCode !== -3) win.loadURL(offlineHtml())
})
// 외부(앱 외 도메인) 링크는 기본 브라우저로, 앱 내 링크는 창에서 처리
win.webContents.setWindowOpenHandler(({ url }) => {
if (/^https?:\/\//i.test(url) && !url.startsWith(APP_URL)) {
shell.openExternal(url)
return { action: 'deny' }
}
return { action: 'allow' }
})
}
app.whenReady().then(() => {
createWindow()
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow()
})
})
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') app.quit()
})