costco-grocery-list/frontend/src/context/StoreContext.jsx

100 lines
3.0 KiB
JavaScript

import { createContext, useContext, useEffect, useState } from 'react';
import { getHouseholdStores } from '../api/stores';
import { AuthContext } from './AuthContext';
import { HouseholdContext } from './HouseholdContext';
export const StoreContext = createContext({
stores: [],
activeStore: null,
loading: false,
error: null,
setActiveStore: () => { },
refreshStores: () => { },
});
export const StoreProvider = ({ children }) => {
const { token } = useContext(AuthContext);
const { activeHousehold } = useContext(HouseholdContext);
const [stores, setStores] = useState([]);
const [activeStore, setActiveStoreState] = useState(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
// Load stores when household changes
useEffect(() => {
if (token && activeHousehold) {
loadStores();
} else {
// Clear state when logged out or no household
setStores([]);
setActiveStoreState(null);
}
}, [token, activeHousehold?.id]);
// Load active store from localStorage on mount (per household)
useEffect(() => {
if (!activeHousehold || stores.length === 0) return;
console.log('[StoreContext] Setting active store from:', stores);
const storageKey = `activeStoreId_${activeHousehold.id}`;
const savedStoreId = localStorage.getItem(storageKey);
if (savedStoreId) {
const store = stores.find(s => s.id === parseInt(savedStoreId));
if (store) {
console.log('[StoreContext] Found saved store:', store);
setActiveStoreState(store);
return;
}
}
// No saved store or not found, use default or first one
const defaultStore = stores.find(s => s.is_default) || stores[0];
console.log('[StoreContext] Using store:', defaultStore);
setActiveStoreState(defaultStore);
localStorage.setItem(storageKey, defaultStore.id);
}, [stores, activeHousehold]);
const loadStores = async () => {
if (!token || !activeHousehold) return;
setLoading(true);
setError(null);
try {
console.log('[StoreContext] Loading stores for household:', activeHousehold.id);
const response = await getHouseholdStores(activeHousehold.id);
console.log('[StoreContext] Loaded stores:', response.data);
setStores(response.data);
} catch (err) {
console.error('[StoreContext] Failed to load stores:', err);
setError(err.response?.data?.message || 'Failed to load stores');
setStores([]);
} finally {
setLoading(false);
}
};
const setActiveStore = (store) => {
setActiveStoreState(store);
if (store && activeHousehold) {
const storageKey = `activeStoreId_${activeHousehold.id}`;
localStorage.setItem(storageKey, store.id);
}
};
const value = {
stores,
activeStore,
loading,
error,
setActiveStore,
refreshStores: loadStores,
};
return (
<StoreContext.Provider value={value}>
{children}
</StoreContext.Provider>
);
};