95 lines
3.8 KiB
JavaScript
95 lines
3.8 KiB
JavaScript
const localAddress = "http://127.0.0.1:43121/";
|
|
const root = document.documentElement;
|
|
const gateTitle = document.querySelector("#gate-title");
|
|
const gateDescription = document.querySelector("#gate-description");
|
|
const statusCode = document.querySelector("#status-code");
|
|
const noBypass = document.querySelector("#no-bypass");
|
|
const reasonValue = document.querySelector("#reason-value");
|
|
const browserValue = document.querySelector("#browser-value");
|
|
const supportedValue = document.querySelector("#supported-value");
|
|
const retryButton = document.querySelector("#retry-button");
|
|
const copyButton = document.querySelector("#copy-button");
|
|
|
|
function browserLabel(fullVersionList) {
|
|
const known = fullVersionList?.find(({ brand }) =>
|
|
brand === "Google Chrome" || brand === "Microsoft Edge");
|
|
return known ? `${known.brand} ${known.version.split(".")[0]}` : "无法可靠识别";
|
|
}
|
|
|
|
function supportedLabel(supportedBrowsers) {
|
|
if (!Array.isArray(supportedBrowsers) || supportedBrowsers.length === 0) return "等待发布记录";
|
|
return supportedBrowsers.map(({ brand, major }) => `${brand} ${major}`).join(" / ");
|
|
}
|
|
|
|
function showBlocked(reason, supportedBrowsers, fullVersionList) {
|
|
root.dataset.supportStatus = "blocked";
|
|
gateTitle.textContent = "当前浏览器无法使用 Dada";
|
|
gateDescription.textContent = "本次 P0-A 发布仅支持当前这台 Windows 电脑上、已经完成验收的 Chrome 或 Edge 版本。当前环境无法可靠通过支持检查,因此不会加载任何产品功能。";
|
|
statusCode.hidden = false;
|
|
noBypass.hidden = false;
|
|
reasonValue.classList.add("danger");
|
|
reasonValue.textContent = reason;
|
|
browserValue.textContent = browserLabel(fullVersionList);
|
|
supportedValue.textContent = supportedLabel(supportedBrowsers);
|
|
}
|
|
|
|
async function checkSupport() {
|
|
root.dataset.supportStatus = "checking";
|
|
reasonValue.textContent = "identity_unavailable";
|
|
browserValue.textContent = "正在检测";
|
|
|
|
const userAgentData = navigator.userAgentData;
|
|
if (!userAgentData || typeof userAgentData.getHighEntropyValues !== "function") {
|
|
showBlocked("identity_unavailable", [], []);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const entropy = await userAgentData.getHighEntropyValues(["fullVersionList", "platform"]);
|
|
const body = {
|
|
brands: userAgentData.brands ?? [],
|
|
full_version_list: entropy.fullVersionList ?? [],
|
|
platform: entropy.platform ?? "",
|
|
};
|
|
const response = await fetch("/api/v1/support/check", {
|
|
body: JSON.stringify(body),
|
|
credentials: "same-origin",
|
|
headers: { "Content-Type": "application/json" },
|
|
method: "POST",
|
|
});
|
|
const result = await response.json();
|
|
if (response.ok && result.status === "supported") {
|
|
root.dataset.supportStatus = "supported";
|
|
gateTitle.textContent = "浏览器支持检查已通过";
|
|
gateDescription.textContent = "当前浏览器已通过 Dada 支持检查。";
|
|
statusCode.hidden = true;
|
|
noBypass.hidden = true;
|
|
reasonValue.classList.remove("danger");
|
|
reasonValue.textContent = "supported";
|
|
browserValue.textContent = `${result.browser.brand} ${result.browser.major}`;
|
|
supportedValue.textContent = supportedLabel(result.supported_browsers);
|
|
window.dispatchEvent(new CustomEvent("dada:support-ready"));
|
|
return;
|
|
}
|
|
showBlocked(
|
|
result.error?.details?.reason ?? "identity_unavailable",
|
|
result.error?.details?.supported_browsers ?? [],
|
|
body.full_version_list,
|
|
);
|
|
} catch {
|
|
showBlocked("identity_unavailable", [], []);
|
|
}
|
|
}
|
|
|
|
retryButton.addEventListener("click", () => void checkSupport());
|
|
copyButton.addEventListener("click", async () => {
|
|
try {
|
|
await navigator.clipboard.writeText(localAddress);
|
|
copyButton.textContent = "已复制本机地址";
|
|
} catch {
|
|
copyButton.textContent = localAddress;
|
|
}
|
|
});
|
|
|
|
void checkSupport();
|