diff --git a/installer/renderer.js b/installer/renderer.js index a7b712b..460e27e 100644 --- a/installer/renderer.js +++ b/installer/renderer.js @@ -654,8 +654,20 @@ function renderSubStep42(host, back, done) { host.querySelector('#back').addEventListener('click', back) nextBtn.addEventListener('click', done) - // 이미 설치됐다면 다시 돌리지 않음 - if (state.client.clientInstalled) { + // 이번에 실제로 보내야 할 payload. 이전 진입에서 같은 payload 로 이미 끝났으면 + // 다시 돌리지 않지만, packKey / installPlatform / skipMap 중 하나라도 다르면 + // (예: 참가자 → 싱글 로 뒤로가서 변경) 재설치한다. + var payload = { + packKey: state.selectedPackKey, + installPlatform: !!state.client.installPlatform, + // 참가자는 친구 서버에 접속만 하므로 클라이언트에 맵을 풀지 않는다. + skipMap: state.mode === 'multi' && state.role === 'participant' + } + var last = state.client.lastInstall + if (last + && last.packKey === payload.packKey + && last.installPlatform === payload.installPlatform + && last.skipMap === payload.skipMap) { msg.textContent = tt('step4.sub42.done') msg.classList.add('success') nextBtn.disabled = false @@ -665,17 +677,14 @@ function renderSubStep42(host, back, done) { // 페이지 진입 즉시 자동 설치 ;(async function () { try { - await installerApi.installClient({ - packKey: state.selectedPackKey, - installPlatform: !!state.client.installPlatform, - // 참가자는 친구 서버에 접속만 하므로 클라이언트에 맵을 풀지 않는다. - skipMap: state.mode === 'multi' && state.role === 'participant' - }) + await installerApi.installClient(payload) msg.textContent = tt('step4.sub42.done') msg.classList.add('success') - state.client.clientInstalled = true + state.client.lastInstall = payload nextBtn.disabled = false } catch (err) { + // 실패한 호출은 "마지막 성공" 기록에 남기지 않는다. 다음 진입 시 재시도. + state.client.lastInstall = null msg.textContent = tt('step4.sub42.failed', { message: (err && err.message) ? err.message : String(err) }) msg.classList.add('error') }