Initial commit
This commit is contained in:
commit
84436e7998
20 files changed
+2746
No files matched your search
@@ -0,0 +1,205 @@
|
||||
document.addEventListener("DOMContentLoaded", async () => {
|
||||
// Load current settings
|
||||
await loadSettings();
|
||||
|
||||
// Set up event listeners
|
||||
setupEventListeners();
|
||||
});
|
||||
|
||||
async function loadSettings() {
|
||||
try {
|
||||
const settings = await chrome.runtime.sendMessage({
|
||||
action: "getSettings",
|
||||
});
|
||||
|
||||
// Update UI with current settings
|
||||
const domainValue = settings.xgetDomain || "";
|
||||
document.getElementById("domainInput").value = domainValue;
|
||||
|
||||
// Only enable the toggle if domain is set
|
||||
const enabledValue = settings.enabled && domainValue.trim() !== "";
|
||||
document.getElementById("enabledToggle").checked = enabledValue;
|
||||
|
||||
// Update platform toggles
|
||||
document.getElementById("ghToggle").checked = settings.enabledPlatforms.gh;
|
||||
document.getElementById("glToggle").checked = settings.enabledPlatforms.gl;
|
||||
document.getElementById("hfToggle").checked = settings.enabledPlatforms.hf;
|
||||
|
||||
// Show status if domain is missing
|
||||
if (!domainValue && settings.enabled) {
|
||||
showStatus("Please configure your Xget domain", "error");
|
||||
} else if (domainValue && enabledValue) {
|
||||
showStatus("Extension is active and ready", "success");
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error loading settings:", error);
|
||||
showStatus("Error loading settings", "error");
|
||||
}
|
||||
}
|
||||
|
||||
function setupEventListeners() {
|
||||
// Enable/disable toggle
|
||||
document
|
||||
.getElementById("enabledToggle")
|
||||
.addEventListener("change", handleEnableToggle);
|
||||
|
||||
// Domain input
|
||||
document
|
||||
.getElementById("domainInput")
|
||||
.addEventListener("input", debounce(handleDomainChange, 500));
|
||||
document
|
||||
.getElementById("domainInput")
|
||||
.addEventListener("blur", validateDomain);
|
||||
|
||||
// Platform toggles
|
||||
document.getElementById("ghToggle").addEventListener("change", saveSettings);
|
||||
document.getElementById("glToggle").addEventListener("change", saveSettings);
|
||||
document.getElementById("hfToggle").addEventListener("change", saveSettings);
|
||||
}
|
||||
|
||||
async function saveSettings() {
|
||||
try {
|
||||
const domainValue = document.getElementById("domainInput").value.trim();
|
||||
const enabledValue = document.getElementById("enabledToggle").checked;
|
||||
|
||||
// Prevent enabling if no domain is set
|
||||
if (enabledValue && !domainValue) {
|
||||
document.getElementById("enabledToggle").checked = false;
|
||||
showStatus("Cannot enable extension without a domain", "error");
|
||||
return;
|
||||
}
|
||||
|
||||
const settings = {
|
||||
enabled: document.getElementById("enabledToggle").checked,
|
||||
xgetDomain: domainValue,
|
||||
enabledPlatforms: {
|
||||
gh: document.getElementById("ghToggle").checked,
|
||||
gl: document.getElementById("glToggle").checked,
|
||||
hf: document.getElementById("hfToggle").checked,
|
||||
},
|
||||
};
|
||||
|
||||
// Clean up domain URL
|
||||
if (settings.xgetDomain) {
|
||||
settings.xgetDomain = cleanupDomain(settings.xgetDomain);
|
||||
}
|
||||
|
||||
const response = await chrome.runtime.sendMessage({
|
||||
action: "saveSettings",
|
||||
settings: settings,
|
||||
});
|
||||
|
||||
if (response.success) {
|
||||
// Show appropriate status
|
||||
if (!settings.xgetDomain && settings.enabled) {
|
||||
showStatus("Please configure your Xget domain", "error");
|
||||
} else if (settings.xgetDomain && settings.enabled) {
|
||||
showStatus(
|
||||
"✅ Settings saved! Check page notifications for refresh button",
|
||||
"success"
|
||||
);
|
||||
} else {
|
||||
showStatus(
|
||||
"✅ Settings saved! Check page notifications for refresh button",
|
||||
"success"
|
||||
);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error saving settings:", error);
|
||||
showStatus("Error saving settings", "error");
|
||||
}
|
||||
}
|
||||
|
||||
function validateDomain() {
|
||||
const domain = document.getElementById("domainInput").value.trim();
|
||||
if (domain && !isValidDomain(domain)) {
|
||||
showStatus("Invalid domain format", "error");
|
||||
}
|
||||
}
|
||||
|
||||
function cleanupDomain(domain) {
|
||||
// Remove any protocol if accidentally included
|
||||
domain = domain.replace(/^https?:\/\//, "");
|
||||
|
||||
// Remove trailing slash
|
||||
domain = domain.replace(/\/$/, "");
|
||||
|
||||
return domain;
|
||||
}
|
||||
|
||||
function isValidDomain(domain) {
|
||||
// Remove protocol if present
|
||||
domain = domain.replace(/^https?:\/\//, "");
|
||||
|
||||
// Basic domain validation pattern
|
||||
const domainPattern =
|
||||
/^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
|
||||
|
||||
return domainPattern.test(domain) && domain.length <= 253;
|
||||
}
|
||||
|
||||
function isValidUrl(string) {
|
||||
try {
|
||||
new URL(string);
|
||||
return true;
|
||||
} catch (_) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function showStatus(message, type) {
|
||||
const statusElement = document.getElementById("status");
|
||||
statusElement.textContent = message;
|
||||
statusElement.className = `status ${type}`;
|
||||
statusElement.style.display = "block";
|
||||
|
||||
// Auto-hide success messages
|
||||
if (type === "success") {
|
||||
setTimeout(hideStatus, 3000);
|
||||
}
|
||||
}
|
||||
|
||||
function hideStatus() {
|
||||
const statusElement = document.getElementById("status");
|
||||
statusElement.style.display = "none";
|
||||
}
|
||||
|
||||
function debounce(func, wait) {
|
||||
let timeout;
|
||||
return function executedFunction(...args) {
|
||||
const later = () => {
|
||||
clearTimeout(timeout);
|
||||
func(...args);
|
||||
};
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(later, wait);
|
||||
};
|
||||
}
|
||||
|
||||
async function handleEnableToggle() {
|
||||
const enabledToggle = document.getElementById("enabledToggle");
|
||||
const domainInput = document.getElementById("domainInput");
|
||||
|
||||
if (enabledToggle.checked && !domainInput.value.trim()) {
|
||||
// Prevent enabling if no domain is set
|
||||
enabledToggle.checked = false;
|
||||
showStatus("Please configure your Xget domain before enabling", "error");
|
||||
return;
|
||||
}
|
||||
|
||||
await saveSettings();
|
||||
}
|
||||
|
||||
async function handleDomainChange() {
|
||||
const domainInput = document.getElementById("domainInput");
|
||||
const enabledToggle = document.getElementById("enabledToggle");
|
||||
|
||||
// If domain is cleared and extension is enabled, disable it
|
||||
if (!domainInput.value.trim() && enabledToggle.checked) {
|
||||
enabledToggle.checked = false;
|
||||
showStatus("Extension disabled: domain cleared", "error");
|
||||
}
|
||||
|
||||
await saveSettings();
|
||||
}
|
||||
Reference in new issue
Block a user