From 33addb304a4a3fed92d288e0ee5a4592b0b34e89 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 16 May 2026 03:11:00 +0900 Subject: [PATCH] fix(import): invalidate probe when URL input changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review P2: probe 성공 후 사용자가 URL 입력값을 다른 URL 로 바꿔도 "확인" 버튼이 여전히 활성화 상태였습니다. 그래서 A 로 probe → B 로 수정 → 확인을 누르면 B 가 probe 없이 바로 다운로드 시작됐습니다. 수정: - `lastProbedUrl` 로 마지막으로 probe 통과한 URL 기록. - ytUrl 의 input 이벤트에서 현재 값이 lastProbedUrl 과 다르면 ytStartBtn 을 disable 로 되돌리고 ytProbeBtn 을 다시 활성화. - ytStartBtn 클릭 핸들러에도 가드 추가: 클릭 시점에 URL ≠ lastProbedUrl 이면 안내 메시지와 함께 차단 (race condition 대비). 이제 "확인 누르기 전 가져오기 못 누르게" 요구사항이 어느 순서로 입력이 들어와도 만족됩니다. Co-Authored-By: Claude Opus 4.7 --- public/editor.js | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/public/editor.js b/public/editor.js index 27ff600..66d8d71 100644 --- a/public/editor.js +++ b/public/editor.js @@ -70,7 +70,19 @@ } // YouTube probe - // "확인" 누르기 전 "가져오기" 재클릭 방지: probe 클릭 시 disable, 실패시만 재활성화. + // "확인" 누르기 전 "가져오기" 재클릭 방지 + URL 변경 시 다시 probe 강제. + // 흐름: URL 입력 → 가져오기 → (성공 시) 확인 활성화 → 확인 클릭. + // URL 이 바뀌면 확인 비활성화로 돌아가고 가져오기 다시 활성화. + var lastProbedUrl = null + ytUrl.addEventListener('input', function () { + // 입력이 바뀌면 직전 probe 결과는 무효. + if (ytUrl.value.trim() !== lastProbedUrl) { + ytStartBtn.disabled = true + // probe 중이 아닐 때만 가져오기를 풀어준다 (probe 중간엔 잠금 유지). + ytProbeBtn.disabled = false + } + }) + ytProbeBtn.addEventListener('click', function () { var url = ytUrl.value.trim() if (!url) return @@ -102,7 +114,8 @@ } } if (!titleInput.value) titleInput.value = p.title - // 확인(start) 만 활성화, 가져오기는 잠금 유지 (확인 누르면 다운로드 시작 → redirect) + // 이 URL 에 한해 확인 활성화. URL 변경 감지용으로 마지막 probe URL 저장. + lastProbedUrl = url ytStartBtn.disabled = false }).catch(function (e) { probeInfo.textContent = '확인 실패: ' + e.message @@ -113,6 +126,13 @@ ytStartBtn.addEventListener('click', function () { var url = ytUrl.value.trim() if (!url) return + // 가드: URL 이 바뀐 채로 확인이 눌리는 경우 (이벤트 race) 차단. + if (url !== lastProbedUrl) { + probeInfo.textContent = 'URL 이 바뀌었습니다. "가져오기" 를 다시 눌러 확인하세요.' + ytStartBtn.disabled = true + ytProbeBtn.disabled = false + return + } // 중복 클릭 방지 ytStartBtn.disabled = true fetch('/op/folder/' + encodeURIComponent(folder) + '/video/youtube/start', {