Files
proxy-switcher/popup.js
2025-08-12 22:49:47 +08:00

124 lines
4.1 KiB
JavaScript

// ========== 代理切换逻辑 ==========
const els = {
profileSelect: document.getElementById("profileSelect"),
applyBtn: document.getElementById("applyBtn"),
pacBlock: document.getElementById("pacBlock"),
pacUrl: document.getElementById("pacUrl"),
savePac: document.getElementById("savePac"),
customBlock: document.getElementById("customBlock"),
customScheme: document.getElementById("customScheme"),
customHost: document.getElementById("customHost"),
customPort: document.getElementById("customPort"),
customBypass: document.getElementById("customBypass"),
saveCustom: document.getElementById("saveCustom"),
// resetBtn: document.getElementById("resetBtn"),
};
// 下拉箭头展开/收起状态同步
function bindSelectOpenState(selectEl) {
if (!selectEl) return;
const wrapper = selectEl.closest(".select");
if (!wrapper) return;
// 点击时认为打开
selectEl.addEventListener("mousedown", () => wrapper.classList.add("open"));
// 获得焦点也可视为打开
selectEl.addEventListener("focus", () => wrapper.classList.add("open"));
// 失焦或变更后关闭
selectEl.addEventListener("blur", () => wrapper.classList.remove("open"));
selectEl.addEventListener("change", () => wrapper.classList.remove("open"));
}
bindSelectOpenState(els.profileSelect);
bindSelectOpenState(els.customScheme);
init();
async function init() {
const state = await sendMessage({ type: "getState" });
const profiles = state.profiles || [];
const activeProfileId = state.activeProfileId || "direct";
// 填充下拉
els.profileSelect.innerHTML = "";
for (const p of profiles) {
const opt = document.createElement("option");
opt.value = p.id;
opt.textContent = p.name;
if (p.id === activeProfileId) opt.selected = true;
els.profileSelect.appendChild(opt);
}
toggleBlocks();
// 回填 PAC、自定义
const pacProfile = profiles.find((p) => p.id === "pac");
if (els.pacUrl) els.pacUrl.value = pacProfile?.pacUrl || "";
const customProfile = profiles.find((p) => p.id === "custom");
if (customProfile) {
if (els.customScheme)
els.customScheme.value = customProfile.scheme || "http";
if (els.customHost) els.customHost.value = customProfile.host || "";
if (els.customPort) els.customPort.value = customProfile.port || "";
if (els.customBypass)
els.customBypass.value = (customProfile.bypassList || []).join(", ");
}
}
els.profileSelect?.addEventListener("change", toggleBlocks);
function toggleBlocks() {
const mode = els.profileSelect?.value;
const isPac = mode === "pac";
const isCustom = mode === "custom";
if (els.pacBlock) els.pacBlock.style.display = isPac ? "block" : "none";
if (els.customBlock)
els.customBlock.style.display = isCustom ? "block" : "none";
}
els.applyBtn?.addEventListener("click", async () => {
const profileId = els.profileSelect.value;
if (profileId === "custom") {
await sendMessage({
type: "updateCustomProxy",
scheme: els.customScheme?.value,
host: els.customHost?.value.trim(),
port: Number(els.customPort?.value) || 0,
bypassList: (els.customBypass?.value || "")
.split(",")
.map((s) => s.trim())
.filter(Boolean),
});
}
await sendMessage({ type: "applyProfileById", profileId });
window.close();
});
els.savePac?.addEventListener("click", async () => {
const pacUrl = (els.pacUrl?.value || "").trim();
await sendMessage({ type: "updatePacUrl", pacUrl });
});
els.saveCustom?.addEventListener("click", async () => {
await sendMessage({
type: "updateCustomProxy",
scheme: els.customScheme?.value,
host: els.customHost?.value.trim(),
port: Number(els.customPort?.value) || 0,
bypassList: (els.customBypass?.value || "")
.split(",")
.map((s) => s.trim())
.filter(Boolean),
});
});
// 重置按钮已移除,如需恢复可取消上方注释并启用以下代码
// els.resetBtn?.addEventListener("click", async () => {
// await sendMessage({ type: "resetProfiles" });
// await init();
// });
function sendMessage(msg) {
return new Promise((resolve) => chrome.runtime.sendMessage(msg, resolve));
}