Spaces:
Running
Running
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>ChipFlow Commander - Login</title> | |
| <script src="https://cdn.tailwindcss.com"></script> | |
| <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script> | |
| </head> | |
| <body class="bg-gray-100"> | |
| <div class="min-h-screen flex items-center justify-center"> | |
| <div class="bg-white p-8 rounded-lg shadow-md w-full max-w-md"> | |
| <div class="text-center mb-8"> | |
| <h1 class="text-2xl font-bold text-gray-800">ChipFlow Commander</h1> | |
| <p class="text-gray-600">Admin & Owner Login</p> | |
| </div> | |
| <form id="loginForm"> | |
| <div class="mb-4"> | |
| <label class="block text-gray-700 mb-2">Username</label> | |
| <input type="text" name="username" class="w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500" required> | |
| </div> | |
| <div class="mb-6"> | |
| <label class="block text-gray-700 mb-2">Password</label> | |
| <input type="password" name="password" class="w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500" required> | |
| </div> | |
| <button type="submit" class="w-full bg-blue-600 hover:bg-blue-700 text-white py-2 px-4 rounded-lg font-bold transition"> | |
| Login | |
| </button> | |
| <div id="errorMessage" class="mt-4 text-red-500 text-sm hidden"></div> | |
| </form> | |
| </div> | |
| </div> | |
| <script> | |
| feather.replace(); | |
| document.getElementById('loginForm').addEventListener('submit', async function(e) { | |
| e.preventDefault(); | |
| const formData = new FormData(this); | |
| const errorElement = document.getElementById('errorMessage'); | |
| try { | |
| // Simulate API call | |
| const response = await fetch('/api/login', { | |
| method: 'POST', | |
| body: formData | |
| }); | |
| if (!response.ok) { | |
| const error = await response.json(); | |
| errorElement.textContent = error.message || 'Login failed'; | |
| errorElement.classList.remove('hidden'); | |
| return; | |
| } | |
| // Redirect based on role | |
| const { role } = await response.json(); | |
| window.location.href = role === 'owner' ? 'admin_dashboard.html' : 'admin_dashboard.html'; | |
| } catch (err) { | |
| errorElement.textContent = 'Network error. Please try again.'; | |
| errorElement.classList.remove('hidden'); | |
| } | |
| }); | |
| </script> | |
| </body> | |
| </html> |