let currentUser = null;
document.addEventListener('DOMContentLoaded', function() {
checkAuth();
loadUserProfile();
loadRecentActivity();
setInterval(loadRecentActivity, 30000);
});
function checkAuth() {
const token = localStorage.getItem('dashx_token');
const user = JSON.parse(localStorage.getItem('dashx_user') || '{}');
if (!token) {
window.location.href = '/auth';
return;
}
currentUser = user;
}
async function updateCustomApiKey() {
const customApiKey = document.getElementById('customApiKeyInput').value.trim();
if (!customApiKey) {
Swal.fire({
icon: "error",
title: "Missing API Key",
text: "Please enter a custom API key"
});
return;
}
try {
const token = localStorage.getItem('dashx_token');
const response = await fetch('/api/user/profile', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({ customApiKey })
});
const result = await response.json();
if (result.success) {
Swal.fire({
title: "API Key Updated!",
text: "Your custom API key has been set successfully",
icon: "success"
});
document.getElementById('customApiKeyInput').value = '';
loadUserProfile();
loadRecentActivity();
} else {
Swal.fire({
icon: "error",
title: "Update Failed",
text: result.error
});
}
} catch (error) {
Swal.fire({
icon: "error",
title: "Network Error",
text: "Please try again later"
});
}
}
async function loadUserProfile() {
try {
const token = localStorage.getItem('dashx_token');
const response = await fetch('/api/user/profile', {
headers: { 'Authorization': `Bearer ${token}` }
});
if (response.ok) {
const result = await response.json();
if (result.success) {
const user = result.user;
updateProfileDisplay(user);
}
} else {
logout();
}
} catch (error) {
console.error('Error loading profile:', error);
logout();
}
}
async function loadRecentActivity() {
try {
const token = localStorage.getItem('dashx_token');
const response = await fetch('/api/user/activities', {
headers: { 'Authorization': `Bearer ${token}` }
});
if (response.ok) {
const result = await response.json();
if (result.success) {
updateRecentActivity(result.activities);
}
}
} catch (error) {
console.error('Error loading activities:', error);
}
}
function updateRecentActivity(activities) {
const activityList = document.getElementById('recentActivity');
if (activities.length === 0) {
activityList.innerHTML = `
No recent activity
`;
return;
}
const activityIcons = {
'api_key_generated': 'fas fa-key',
'limit_updated': 'fas fa-chart-line',
'profile_updated': 'fas fa-user-edit',
'redeem_code_used': 'fas fa-gift',
'premium_activated': 'fas fa-crown',
'api_request': 'fas fa-code'
};
activityList.innerHTML = activities.map(activity => `
${activity.description}
${activity.timeAgo}
`).join('');
}
function updateProfileDisplay(user) {
const usernameEl = document.getElementById('profileUsername');
const emailEl = document.getElementById('profileEmail');
const apikeyEl = document.getElementById('profileApiKey');
const requestsEl = document.getElementById('profileRequests');
const todayEl = document.getElementById('profileRequestsToday');
const limitEl = document.getElementById('profileLimit');
const roleEl = document.getElementById('profileRole');
const premiumBadge = document.getElementById('premiumBadge');
const adminBadge = document.getElementById('adminBadge');
const profileImage = document.getElementById('profileImage');
const defaultAvatar = document.getElementById('defaultAvatar');
if (usernameEl) usernameEl.textContent = user.username;
if (emailEl) emailEl.textContent = user.email;
if (apikeyEl) apikeyEl.textContent = user.apikey;
if (requestsEl) requestsEl.textContent = user.requests;
if (todayEl) todayEl.textContent = user.requestsToday;
if (user.profileUrl && profileImage && defaultAvatar) {
profileImage.src = user.profileUrl;
profileImage.style.display = 'block';
defaultAvatar.style.display = 'none';
profileImage.onerror = function() {
profileImage.style.display = 'none';
defaultAvatar.style.display = 'block';
};
}
if (limitEl) {
if (user.role === 'admin' && user.limit >= 9999) {
limitEl.textContent = '9999';
limitEl.style.fontSize = '2rem';
limitEl.style.color = '#853030';
} else {
limitEl.textContent = user.limit;
}
}
if (roleEl) {
roleEl.className = 'badge';
if (user.role === 'admin') {
roleEl.innerHTML = ' Admin';
roleEl.classList.add('admin');
if (adminBadge) adminBadge.style.display = 'inline-block';
} else {
if (user.userRole) {
switch(user.userRole) {
case 'cheap':
roleEl.innerHTML = ' Cheap';
roleEl.classList.add('cheap', 'glow-cheap');
break;
case 'premium':
roleEl.innerHTML = ' Premium';
roleEl.classList.add('premium', 'glow-premium');
break;
case 'vip':
roleEl.innerHTML = ' VIP';
roleEl.classList.add('vip', 'glow-vip');
break;
case 'supreme':
roleEl.innerHTML = ' Supreme';
roleEl.classList.add('supreme', 'glow-supreme');
break;
default:
roleEl.innerHTML = ' User';
roleEl.classList.add('user');
}
} else {
roleEl.innerHTML = ' User';
roleEl.classList.add('user');
}
}
}
if (user.premium || user.role === 'admin' || user.userRole) {
if (premiumBadge) {
premiumBadge.style.display = 'inline-block';
premiumBadge.innerHTML = ' Premium';
}
const premiumFeatures = document.getElementById('premiumFeatures');
if (premiumFeatures) premiumFeatures.style.display = 'block';
}
if (user.roleExpiresAt) {
const expiryDiv = document.getElementById('roleExpiry');
const expiryDate = document.getElementById('roleExpiryDate');
if (expiryDiv && expiryDate) {
expiryDiv.style.display = 'block';
const expDate = new Date(user.roleExpiresAt);
expiryDate.textContent = expDate.toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
});
const daysLeft = Math.ceil((expDate - new Date()) / (1000 * 60 * 60 * 24));
if (daysLeft <= 7) {
expiryDiv.style.color = '#ff6b6b';
expiryDiv.innerHTML = ` Expires in ${daysLeft} days: `;
document.getElementById('roleExpiryDate').textContent = expDate.toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
});
}
}
}
updateUsageProgress(user.requestsToday, user.limit);
}
function updateUsageProgress(current, limit) {
const progressFill = document.getElementById('usageProgress');
const progressText = document.getElementById('usageText');
if (!progressFill || !progressText) return;
if (limit >= 9999) {
progressFill.style.width = '0%';
progressFill.style.background = 'linear-gradient(90deg, #853030, #292727)';
progressText.textContent = `${current} / 9999`;
return;
}
const percentage = Math.min((current / limit) * 100, 100);
progressFill.style.width = percentage + '%';
progressText.textContent = `${current} / ${limit}`;
if (percentage >= 90) {
progressFill.style.background = 'linear-gradient(90deg, #ff6b6b, #ee5a52)';
} else if (percentage >= 70) {
progressFill.style.background = 'linear-gradient(90deg, #f093fb, #f5576c)';
} else {
progressFill.style.background = 'linear-gradient(90deg, #853030, #292727)';
}
}
function copyApiKey() {
const apiKey = document.getElementById('profileApiKey').textContent;
navigator.clipboard.writeText(apiKey).then(() => {
Swal.fire({
title: "Copied!",
text: "API key copied to clipboard",
icon: "success",
timer: 1500,
showConfirmButton: false
});
}).catch(() => {
Swal.fire({
icon: "error",
title: "Copy Failed",
text: "Could not copy to clipboard"
});
});
}
async function updateUsername() {
const newUsername = document.getElementById('newUsername').value.trim();
if (!newUsername) {
Swal.fire({
icon: "error",
title: "Missing Username",
text: "Please enter a new username"
});
return;
}
try {
const token = localStorage.getItem('dashx_token');
const response = await fetch('/api/user/profile', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({ username: newUsername })
});
const result = await response.json();
if (result.success) {
Swal.fire({
title: "Username Updated!",
text: "Your username has been updated successfully",
icon: "success"
});
document.getElementById('newUsername').value = '';
loadUserProfile();
loadRecentActivity();
} else {
Swal.fire({
icon: "error",
title: "Update Failed",
text: result.error
});
}
} catch (error) {
Swal.fire({
icon: "error",
title: "Network Error",
text: "Please try again later"
});
}
}
async function updateProfileUrl() {
const profileUrl = document.getElementById('profileUrlInput').value.trim();
try {
const token = localStorage.getItem('dashx_token');
const response = await fetch('/api/user/profile', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({ profileUrl })
});
const result = await response.json();
if (result.success) {
Swal.fire({
title: "Profile Updated!",
text: "Your profile picture has been updated successfully",
icon: "success"
});
document.getElementById('profileUrlInput').value = '';
loadUserProfile();
loadRecentActivity();
} else {
Swal.fire({
icon: "error",
title: "Update Failed",
text: result.error
});
}
} catch (error) {
Swal.fire({
icon: "error",
title: "Network Error",
text: "Please try again later"
});
}
}
async function regenerateApiKey() {
const result = await Swal.fire({
title: "Are you sure?",
text: "This will generate a new API key and invalidate the current one!",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#853030",
cancelButtonColor: "#292727",
confirmButtonText: "Yes, generate new key!",
cancelButtonText: "Cancel"
});
if (result.isConfirmed) {
try {
const token = localStorage.getItem('dashx_token');
const response = await fetch('/api/user/regenerate-key', {
method: 'POST',
headers: { 'Authorization': `Bearer ${token}` }
});
const apiResult = await response.json();
if (apiResult.success) {
Swal.fire({
title: "Key Regenerated!",
text: `New API Key: ${apiResult.apikey}`,
icon: "success"
});
loadUserProfile();
loadRecentActivity();
} else {
Swal.fire({
title: "Failed!",
text: apiResult.error,
icon: "error"
});
}
} catch (error) {
Swal.fire({
title: "Error!",
text: "Network error occurred",
icon: "error"
});
}
}
}
async function deleteAccount() {
const result = await Swal.fire({
title: "Are you sure?",
text: "You won't be able to revert this!",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#ff6b6b",
cancelButtonColor: "#853030",
confirmButtonText: "Yes, delete it!",
cancelButtonText: "Cancel"
});
if (result.isConfirmed) {
try {
const token = localStorage.getItem('dashx_token');
const response = await fetch('/api/user/account', {
method: 'DELETE',
headers: { 'Authorization': `Bearer ${token}` }
});
const apiResult = await response.json();
if (apiResult.success) {
await Swal.fire({
title: "Account Deleted!",
text: "Your account has been deleted.",
icon: "success"
});
logout();
} else {
Swal.fire({
title: "Failed!",
text: apiResult.error,
icon: "error"
});
}
} catch (error) {
Swal.fire({
title: "Error!",
text: "Network error occurred",
icon: "error"
});
}
}
}
function logout() {
localStorage.removeItem('dashx_token');
localStorage.removeItem('dashx_user');
window.location.href = '/';
}