Spaces:
Sleeping
Sleeping
| // ======================================== | |
| // STATE MANAGEMENT — LocalStorage Store | |
| // ======================================== | |
| const STORE_KEYS = { CART: "mtextile_cart", WISHLIST: "mtextile_wishlist", USER: "mtextile_user", ORDERS: "mtextile_orders" }; | |
| function _get(key) { try { return JSON.parse(localStorage.getItem(key)) || null; } catch { return null; } } | |
| function _set(key, val) { localStorage.setItem(key, JSON.stringify(val)); } | |
| // === CART === | |
| function getCart() { return _get(STORE_KEYS.CART) || []; } | |
| function saveCart(cart) { _set(STORE_KEYS.CART, cart); document.dispatchEvent(new CustomEvent("cartUpdated", { detail: { cart } })); } | |
| function addToCart(productId, size, color, qty = 1) { | |
| const cart = getCart(); | |
| const existing = cart.find(i => i.productId === productId && i.size === size && i.color === color); | |
| if (existing) { existing.quantity += qty; } | |
| else { cart.push({ productId, size, color, quantity: qty, addedAt: Date.now() }); } | |
| saveCart(cart); | |
| return cart; | |
| } | |
| function removeFromCart(productId, size, color) { | |
| let cart = getCart(); | |
| cart = cart.filter(i => !(i.productId === productId && i.size === size && i.color === color)); | |
| saveCart(cart); | |
| return cart; | |
| } | |
| function updateCartQty(productId, size, color, qty) { | |
| const cart = getCart(); | |
| const item = cart.find(i => i.productId === productId && i.size === size && i.color === color); | |
| if (item) { | |
| if (qty <= 0) return removeFromCart(productId, size, color); | |
| item.quantity = qty; | |
| saveCart(cart); | |
| } | |
| return cart; | |
| } | |
| function clearCart() { saveCart([]); } | |
| function getCartCount() { return getCart().reduce((sum, i) => sum + i.quantity, 0); } | |
| function getCartTotal() { | |
| const cart = getCart(); | |
| let subtotal = 0, discount = 0; | |
| cart.forEach(item => { | |
| const product = getProductById(item.productId); | |
| if (product) { | |
| subtotal += product.price * item.quantity; | |
| if (product.oldPrice) discount += (product.oldPrice - product.price) * item.quantity; | |
| } | |
| }); | |
| return { subtotal, discount, shipping: 0, total: subtotal }; | |
| } | |
| // === WISHLIST === | |
| function getWishlist() { return _get(STORE_KEYS.WISHLIST) || []; } | |
| function saveWishlist(wl) { _set(STORE_KEYS.WISHLIST, wl); document.dispatchEvent(new CustomEvent("wishlistUpdated", { detail: { wishlist: wl } })); } | |
| function toggleWishlist(productId) { | |
| let wl = getWishlist(); | |
| const idx = wl.indexOf(productId); | |
| if (idx > -1) { wl.splice(idx, 1); } else { wl.push(productId); } | |
| saveWishlist(wl); | |
| return wl; | |
| } | |
| function isInWishlist(productId) { return getWishlist().includes(productId); } | |
| // === USER AUTHENTICATION === | |
| const USERS_KEY = "mtextile_users"; | |
| const SESSION_KEY = "mtextile_session"; | |
| function getUsers() { return _get(USERS_KEY) || []; } | |
| function setUsers(users) { _set(USERS_KEY, users); } | |
| function getCurrentUser() { | |
| return _get(SESSION_KEY); | |
| } | |
| function isLoggedIn() { | |
| return getCurrentUser() !== null; | |
| } | |
| function registerUser(name, phone, password) { | |
| const users = getUsers(); | |
| if (users.find(u => u.phone === phone)) { | |
| return { success: false, message: "Bu telefon raqam allaqachon ro'yxatdan o'tgan." }; | |
| } | |
| const newUser = { id: Date.now(), name, phone, password, email: "", addresses: [] }; | |
| users.push(newUser); | |
| setUsers(users); | |
| _set(SESSION_KEY, newUser); // Auto login | |
| return { success: true }; | |
| } | |
| function loginUser(phone, password) { | |
| const users = getUsers(); | |
| const user = users.find(u => (u.phone === phone || u.email === phone) && u.password === password); | |
| if (!user) { | |
| return { success: false, message: "Telefon raqam yoki parol noto'g'ri." }; | |
| } | |
| _set(SESSION_KEY, user); | |
| return { success: true }; | |
| } | |
| function logoutUser() { | |
| localStorage.removeItem(SESSION_KEY); | |
| localStorage.removeItem('mtextile_auth'); // Clean up old legacy keys | |
| localStorage.removeItem('stylestore_auth'); // Used in older structure | |
| localStorage.removeItem('stylestore_session'); | |
| } | |
| function getUser() { | |
| // For backwards compatibility and profile edits | |
| return getCurrentUser() || { name: "", phone: "", email: "", addresses: [] }; | |
| } | |
| function saveUser(data) { | |
| const currentUser = getCurrentUser(); | |
| if (!currentUser) return; // Must be logged in to save profile | |
| // Update session | |
| const updated = { ...currentUser, ...data }; | |
| _set(SESSION_KEY, updated); | |
| // Update DB | |
| const users = getUsers(); | |
| const index = users.findIndex(u => u.id === currentUser.id); | |
| if (index > -1) { | |
| users[index] = updated; | |
| setUsers(users); | |
| } | |
| } | |
| // === ORDERS === | |
| function getOrders() { return _get(STORE_KEYS.ORDERS) || []; } | |
| function getUserOrders() { | |
| const allOrders = getOrders(); | |
| const currentUser = getCurrentUser(); | |
| if (!currentUser) return []; | |
| return allOrders.filter(o => o.userId === currentUser.id); | |
| } | |
| function addOrder(orderData) { | |
| const orders = getOrders(); | |
| const currentUser = getCurrentUser(); | |
| const order = { | |
| id: "ORD-" + Date.now().toString(36).toUpperCase(), | |
| userId: currentUser ? currentUser.id : 'guest', | |
| ...orderData, | |
| status: "Kutilmoqda", | |
| createdAt: new Date().toISOString(), | |
| items: getCart().map(item => { | |
| const p = getProductById(item.productId); | |
| return { ...item, name: p?.name, price: p?.price, image: p?.images?.[0] }; | |
| }), | |
| totals: getCartTotal() | |
| }; | |
| orders.unshift(order); | |
| _set(STORE_KEYS.ORDERS, orders); | |
| clearCart(); | |
| return order; | |
| } | |
| // === PROMO CODES === | |
| const PROMO_CODES = { | |
| "YANGI10": { discount: 10, type: "percent", desc: "10% chegirma" }, | |
| "STYLE20": { discount: 20, type: "percent", desc: "20% chegirma" }, | |
| }; | |
| function applyPromo(code) { | |
| const promo = PROMO_CODES[code.toUpperCase()]; | |
| if (!promo) return { valid: false, message: "Noto'g'ri promo-kod" }; | |
| return { valid: true, ...promo }; | |
| } | |