import { useMemo } from 'react' import { createStore, applyMiddleware } from 'redux' import { composeWithDevTools } from 'redux-devtools-extension' import { productsData } from './products' let store const initialState = { products: productsData, cart: [], total: 0, } const reducer = (state = initialState, action) => { switch (action.type) { case 'ADD_TO_CART': let addedItem = state.products.find(item => item.id === action.id) let existed_item = state.cart.find(item => action.id === item.id) if(existed_item){ addedItem.quantity += 1 return { ...state, total: state.total + addedItem.price } } else { addedItem.quantity = 1 let newTotal = state.total + addedItem.price return { ...state, cart: [...state.cart, addedItem], total: newTotal } } case 'ADD_QUANTITY': let existingItem = state.cart.find(item => item.id === action.id) existingItem.quantity += 1 let newTotal = state.total + existingItem.price return { ...state, total: newTotal } case 'SUB_QUANTITY': let exItem = state.products.find(item=> item.id === action.id) if(exItem.quantity === 1){ let new_items = state.cart.filter(item=>item.id !== action.id) let newTotal = state.total - exItem.price return { ...state, cart: new_items, total: newTotal } } else { exItem.quantity -= 1 let newTotal = state.total - exItem.price return { ...state, total: newTotal } } case 'ADD_QUANTITY_WITH_NUMBER': let addedItemD = state.products.find(item => item.id === action.id) //check if the action id exists in the addedItems let existed_itemd = state.cart.find(item=> action.id === item.id) if(existed_itemd) { addeaddedItemDdItem.quantity += action.qty return { ...state, total: state.total + addedItemD.price * action.qty } } else { addedItemD.quantity = action.qty; //calculating the total let newTotal = state.total + addedItemD.price * action.qty return { ...state, cart: [...state.cart, addedItemD], total : newTotal } } case 'REMOVE_ITEM': let itemToRemove = state.cart.find(item=> action.id === item.id) let new_items = state.cart.filter(item=> action.id !== item.id) //calculating the total let newTotalRemove = state.total - (itemToRemove.price * itemToRemove.quantity ); return { ...state, cart: new_items, total: newTotalRemove } case 'RESET': return { ...state, cart: [], } default: return state } } function initStore(preloadedState = initialState) { return createStore( reducer, preloadedState, composeWithDevTools(applyMiddleware()) ) } export const initializeStore = (preloadedState) => { let _store = store ?? initStore(preloadedState) // After navigating to a page with an initial Redux state, merge that state // with the current state in the store, and create a new store if (preloadedState && store) { _store = initStore({ ...store.getState(), ...preloadedState, }) // Reset the current store store = undefined } // For SSG and SSR always create a new store if (typeof window === 'undefined') return _store // Create the store once in the client if (!store) store = _store return _store } export function useStore(initialState) { const store = useMemo(() => initializeStore(initialState), [initialState]) return store }