const confirmed = document.querySelector("#confirmed");
|
const validateButton = document.querySelector("#validate");
|
const startButton = document.querySelector("#start");
|
const retryButton = document.querySelector("#retry");
|
const cancelButton = document.querySelector("#cancel");
|
const phase = document.querySelector("#phase");
|
const progress = document.querySelector("#progress");
|
const detail = document.querySelector("#detail");
|
let startUiLease = false;
|
|
function render(state) {
|
if (!state) return;
|
phase.textContent = `状态:${state.phase}`;
|
progress.value = Number.isInteger(state.progress) ? state.progress : 0;
|
detail.textContent = state.error_code
|
? `错误码:${state.error_code}`
|
: state.formal_filename
|
? `已完成:${state.formal_filename}`
|
: "";
|
const active = ["CHECKING", "DOWNLOADING", "MERGING", "VALIDATING", "PUBLISHING"].includes(state.phase);
|
cancelButton.hidden = !active;
|
retryButton.hidden = state.phase !== "FAILED";
|
retryButton.disabled = startUiLease;
|
validateButton.disabled = active || startUiLease;
|
startButton.disabled = startUiLease || state.phase !== "READY";
|
}
|
|
async function call(action) {
|
const response = await chrome.runtime.sendMessage({action});
|
if (!response?.ok) {
|
render({phase: "FAILED", progress: 0, error_code: response?.error_code || "E_EXTENSION"});
|
return null;
|
}
|
render(response.state);
|
return response.state;
|
}
|
|
async function callStart(action) {
|
if (startUiLease) return;
|
startUiLease = true;
|
startButton.disabled = true;
|
retryButton.disabled = true;
|
validateButton.disabled = true;
|
try {
|
await call(action);
|
} finally {
|
startUiLease = false;
|
}
|
}
|
|
validateButton.addEventListener("click", async () => {
|
if (!confirmed.checked) {
|
render({phase: "FAILED", progress: 0, error_code: "E_VISIBLE_CONFIRMATION"});
|
return;
|
}
|
const state = await call("validate");
|
startButton.disabled = state?.phase !== "READY";
|
});
|
|
startButton.addEventListener("click", () => callStart("start"));
|
retryButton.addEventListener("click", async () => {
|
if (!confirmed.checked) {
|
render({phase: "FAILED", progress: 0, error_code: "E_VISIBLE_CONFIRMATION"});
|
return;
|
}
|
await callStart("retry");
|
});
|
cancelButton.addEventListener("click", () => call("cancel"));
|
|
call("status");
|
setInterval(() => call("status"), 1000);
|