// API Configuration const API_BASE_URL = ''; // Replace with your API URL // API Helper Functions const api = { // Generic request handler async request(endpoint, options = {}) { const token = storage.get('authToken'); const config = { headers: { 'Content-Type': 'application/json', ...(token && {'Authorization': `Bearer ${token}`}), ...options.headers }, ...options }; try { const response = await fetch(`${API_BASE_URL}${endpoint}`, config); if (!response.ok) { if (response.status === 401) { // Unauthorized - redirect to login window.location.href = 'login.html'; throw new Error('Unauthorized'); } throw new Error(`HTTP error! status: ${response.status}`); } return await response.json(); } catch (error) { console.error('API Error:', error); throw error; } }, // GET request async get(endpoint) { return this.request(endpoint, {method: 'GET'}); }, // POST request async post(endpoint, data) { return this.request(endpoint, { method: 'POST', body: JSON.stringify(data) }); }, // PUT request async put(endpoint, data) { return this.request(endpoint, { method: 'PUT', body: JSON.stringify(data) }); }, // DELETE request async delete(endpoint) { return this.request(endpoint, {method: 'DELETE'}); } }; // Mock Data Generator (for demo purposes) const mockData = { // Generate mock users generateUsers(count = 20) { const roles = ['admin', 'user', 'moderator']; const statuses = ['active', 'inactive']; const users = []; for (let i = 1; i <= count; i++) { users.push({ id: i, name: `User ${i}`, email: `user${i}@example.com`, role: roles[Math.floor(Math.random() * roles.length)], status: statuses[Math.floor(Math.random() * statuses.length)], avatar: `https://i.pravatar.cc/150?img=${i}`, joinedDate: new Date(Date.now() - Math.random() * 365 * 24 * 60 * 60 * 1000).toISOString() }); } return users; }, // Generate mock products generateProducts(count = 12) { const categories = ['electronics', 'clothing', 'food', 'books']; const products = []; for (let i = 1; i <= count; i++) { products.push({ id: i, name: `Product ${i}`, category: categories[Math.floor(Math.random() * categories.length)], price: (Math.random() * 1000).toFixed(2), stock: Math.floor(Math.random() * 100), image: `https://picsum.photos/400/300?random=${i}`, description: `Description for product ${i}` }); } return products; }, // Generate mock orders generateOrders(count = 15) { const statuses = ['pending', 'processing', 'completed', 'cancelled']; const orders = []; for (let i = 1; i <= count; i++) { orders.push({ id: `ORD-${1000 + i}`, customer: `Customer ${i}`, products: Math.floor(Math.random() * 5) + 1, total: (Math.random() * 1000).toFixed(2), status: statuses[Math.floor(Math.random() * statuses.length)], date: new Date(Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000).toISOString() }); } return orders; }, // Generate mock activities generateActivities(count = 10) { const types = ['user', 'order', 'product', 'system']; const actions = ['created', 'updated', 'deleted', 'logged in']; const activities = []; for (let i = 1; i <= count; i++) { const type = types[Math.floor(Math.random() * types.length)]; activities.push({ id: i, type: type, title: `${type.charAt(0).toUpperCase() + type.slice(1)} ${actions[Math.floor(Math.random() * actions.length)]}`, description: `A ${type} was ${actions[Math.floor(Math.random() * actions.length)]}`, time: new Date(Date.now() - Math.random() * 24 * 60 * 60 * 1000).toISOString() }); } return activities; }, // Generate chart data generateChartData(points = 12) { const labels = []; const data = []; for (let i = 0; i < points; i++) { labels.push(`Month ${i + 1}`); data.push(Math.floor(Math.random() * 10000)); } return {labels, data}; } }; // Mock API calls (replace with real API calls) const mockApi = { async login(email, password) { console.log('Mock login with', email, password); // Simulate API delay await new Promise(resolve => setTimeout(resolve, 1000)); if (email === 'admin@example.com' && password === 'admin123') { return { success: true, token: 'mock-jwt-token-' + Date.now(), user: { id: 1, name: 'Admin User', email: email, role: 'admin' } }; } throw new Error('Invalid credentials'); }, async getDashboardStats() { await new Promise(resolve => setTimeout(resolve, 500)); return { totalUsers: 1234, totalRevenue: 45678.90, totalOrders: 567, totalProducts: 89 }; }, async getUsers(page = 1, limit = 10, search = '', role = '') { await new Promise(resolve => setTimeout(resolve, 500)); let users = mockData.generateUsers(50); if (search) { users = users.filter(u => u.name.toLowerCase().includes(search.toLowerCase()) || u.email.toLowerCase().includes(search.toLowerCase()) ); } if (role) { users = users.filter(u => u.role === role); } const start = (page - 1) * limit; const end = start + limit; return { users: users.slice(start, end), total: users.length, page, totalPages: Math.ceil(users.length / limit) }; }, async getProducts() { await new Promise(resolve => setTimeout(resolve, 500)); return mockData.generateProducts(); }, async getOrders() { await new Promise(resolve => setTimeout(resolve, 500)); return mockData.generateOrders(); }, async getActivities() { await new Promise(resolve => setTimeout(resolve, 500)); return mockData.generateActivities(); }, async createUser(userData) { await new Promise(resolve => setTimeout(resolve, 500)); return { success: true, user: { id: Date.now(), ...userData, avatar: `https://i.pravatar.cc/150?img=${Math.floor(Math.random() * 70)}`, joinedDate: new Date().toISOString() } }; }, async updateUser(id, userData) { await new Promise(resolve => setTimeout(resolve, 500)); return { success: true, user: { id, ...userData, avatar: `https://i.pravatar.cc/150?img=${Math.floor(Math.random() * 70)}`, joinedDate: new Date().toISOString() } }; }, async deleteUser(id) { await new Promise(resolve => setTimeout(resolve, 500)); return {success: true}; }, async createProduct(productData) { await new Promise(resolve => setTimeout(resolve, 500)); return { success: true, product: { id: Date.now(), ...productData, image: `https://picsum.photos/400/300?random=${Date.now()}` } }; }, async updateProduct(id, productData) { await new Promise(resolve => setTimeout(resolve, 500)); return { success: true, product: { id, ...productData, image: `https://picsum.photos/400/300?random=${id}` } }; }, async deleteProduct(id) { await new Promise(resolve => setTimeout(resolve, 500)); return {success: true}; }, async updateOrder(id, orderData) { await new Promise(resolve => setTimeout(resolve, 500)); return { success: true, order: { id, ...orderData, date: new Date().toISOString() } }; }, async deleteOrder(id) { await new Promise(resolve => setTimeout(resolve, 500)); return {success: true}; }, async getOrderDetails(id) { await new Promise(resolve => setTimeout(resolve, 500)); // Generate detailed order information const subtotal = Math.random() * 500 + 100; const shippingCost = 15.99; const tax = subtotal * 0.08; const total = subtotal + shippingCost + tax; const products = ['Laptop', 'Mouse', 'Keyboard', 'Monitor', 'Headphones', 'Webcam']; const numItems = Math.floor(Math.random() * 3) + 1; const items = []; for (let i = 0; i < numItems; i++) { const product = products[Math.floor(Math.random() * products.length)]; const quantity = Math.floor(Math.random() * 3) + 1; const price = Math.random() * 200 + 50; items.push({product, quantity, price}); } return { id: id, status: ['pending', 'processing', 'completed'][Math.floor(Math.random() * 3)], date: new Date(Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000).toISOString(), customer: { name: 'John Doe', email: 'john.doe@example.com', phone: '+1 (555) 123-4567', address: '123 Main Street, New York, NY 10001, USA' }, items: items, payment: { method: 'Credit Card (****1234)', status: 'Paid', transactionId: 'TXN-' + Math.random().toString(36).substr(2, 9).toUpperCase() }, shipping: { method: 'Standard Shipping', trackingNumber: 'TRK-' + Math.random().toString(36).substr(2, 12).toUpperCase(), estimatedDelivery: new Date(Date.now() + Math.random() * 7 * 24 * 60 * 60 * 1000).toISOString() }, subtotal: subtotal, shippingCost: shippingCost, tax: tax, total: total }; } };