Files
tyx_AI_xhs/apps/web/support-gate/support-gate.js
T

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();