123 lines
4.3 KiB
JavaScript
123 lines
4.3 KiB
JavaScript
const $ = (id) => document.getElementById(id);
|
|
const settingsNotice = $("settingsNotice");
|
|
const settingsThemeSelect = $("settingsThemeSelect");
|
|
const settingsThemeName = $("settingsThemeName");
|
|
const currentUsernameInput = $("currentUsername");
|
|
const newUsernameInput = $("newUsername");
|
|
const usernamePasswordInput = $("usernamePassword");
|
|
const currentPasswordInput = $("currentPassword");
|
|
const newPasswordInput = $("newPassword");
|
|
const repeatPasswordInput = $("repeatPassword");
|
|
const usernameForm = $("usernameForm");
|
|
const passwordForm = $("passwordForm");
|
|
const settingsNavItems = document.querySelectorAll("[data-settings-view]");
|
|
const settingsPanels = document.querySelectorAll("[data-settings-panel]");
|
|
|
|
const themes = {
|
|
"fakegpt": {name: "FakeGPT"},
|
|
"fraud": {name: "Fraud"},
|
|
"germini": {name: "Germini"},
|
|
"slopilot": {name: "Slopilot"},
|
|
"beta-ai": {name: "Beta AI"},
|
|
"confusity": {name: "Confusity"}
|
|
};
|
|
|
|
async function request(url, data, method = "POST") {
|
|
try {
|
|
const res = await fetch(url, {
|
|
method,
|
|
headers: {"Content-Type": "application/json"},
|
|
body: data ? JSON.stringify(data) : undefined
|
|
});
|
|
return await res.json();
|
|
} catch {
|
|
return {error: "Network error - please try again."};
|
|
}
|
|
}
|
|
|
|
function setNotice(message, state = "") {
|
|
settingsNotice.textContent = message;
|
|
settingsNotice.className = state ? `status ${state}` : "status";
|
|
}
|
|
|
|
function applyTheme(themeKey, persist = true) {
|
|
const nextTheme = themes[themeKey] ? themeKey : "fakegpt";
|
|
document.body.dataset.theme = nextTheme;
|
|
document.title = "Settings";
|
|
settingsThemeSelect.value = nextTheme;
|
|
if (settingsThemeName) settingsThemeName.textContent = themes[nextTheme].name;
|
|
if (persist) localStorage.setItem("krishd-theme", nextTheme);
|
|
}
|
|
|
|
function setSettingsView(view) {
|
|
settingsNavItems.forEach((item) => item.classList.toggle("active", item.dataset.settingsView === view));
|
|
settingsPanels.forEach((panel) => panel.classList.toggle("active", panel.dataset.settingsPanel === view));
|
|
}
|
|
|
|
async function loadProfile() {
|
|
const res = await request("/settings/profile", null, "GET");
|
|
if (res.error) {
|
|
setNotice(res.error, "error");
|
|
return;
|
|
}
|
|
currentUsernameInput.value = res.username || "";
|
|
newUsernameInput.value = res.username || "";
|
|
setNotice("Settings loaded.");
|
|
}
|
|
|
|
usernameForm.addEventListener("submit", async (event) => {
|
|
event.preventDefault();
|
|
const username = newUsernameInput.value.trim();
|
|
const password = usernamePasswordInput.value;
|
|
if (!username || !password) {
|
|
setNotice("New username and current password are required.", "error");
|
|
return;
|
|
}
|
|
const res = await request("/settings/username", {username, password}, "PUT");
|
|
if (res.error) {
|
|
setNotice(res.error, "error");
|
|
return;
|
|
}
|
|
currentUsernameInput.value = res.username;
|
|
newUsernameInput.value = res.username;
|
|
usernamePasswordInput.value = "";
|
|
setNotice("Username updated.", "success");
|
|
});
|
|
|
|
passwordForm.addEventListener("submit", async (event) => {
|
|
event.preventDefault();
|
|
const currentPassword = currentPasswordInput.value;
|
|
const newPassword = newPasswordInput.value;
|
|
const repeatPassword = repeatPasswordInput.value;
|
|
if (!currentPassword || !newPassword || !repeatPassword) {
|
|
setNotice("Fill in all password fields.", "error");
|
|
return;
|
|
}
|
|
if (newPassword !== repeatPassword) {
|
|
setNotice("New passwords do not match.", "error");
|
|
return;
|
|
}
|
|
const res = await request("/settings/password", {currentPassword, newPassword}, "PUT");
|
|
if (res.error) {
|
|
setNotice(res.error, "error");
|
|
return;
|
|
}
|
|
currentPasswordInput.value = "";
|
|
newPasswordInput.value = "";
|
|
repeatPasswordInput.value = "";
|
|
setNotice("Password updated.", "success");
|
|
});
|
|
|
|
settingsThemeSelect.addEventListener("change", (event) => {
|
|
applyTheme(event.target.value);
|
|
setNotice("Theme updated.", "success");
|
|
});
|
|
|
|
settingsNavItems.forEach((item) => item.addEventListener("click", () => setSettingsView(item.dataset.settingsView)));
|
|
|
|
window.addEventListener("load", async () => {
|
|
applyTheme(localStorage.getItem("krishd-theme") || "fakegpt", false);
|
|
setSettingsView("personal");
|
|
await loadProfile();
|
|
});
|