sms-extension-1777538290/client/src/context/BusinessContext.jsx
2026-03-26 14:19:26 +05:30

70 lines
2.3 KiB
JavaScript

import { createContext, useContext, useState, useEffect, useCallback } from 'react';
import apiClient from '../api/client';
const BusinessContext = createContext(null);
const SESSION_KEY = 'sms_active_business';
export function BusinessProvider({ children }) {
const [activeBusiness, setActiveBusinessState] = useState(null);
const [hasGlobalSms, setHasGlobalSms] = useState(false);
const [loading, setLoading] = useState(true);
// On mount: rehydrate from sessionStorage and refresh from API
useEffect(() => {
async function rehydrate() {
const stored = sessionStorage.getItem(SESSION_KEY);
if (!stored) { setLoading(false); return; }
try {
const { businessId } = JSON.parse(stored);
const [bizRes, smsRes] = await Promise.all([
apiClient.get(`/api/businesses/${businessId}`),
apiClient.get(`/api/businesses/${businessId}/global-sms/active`).catch(() => ({ data: {} }))
]);
setActiveBusinessState(bizRes.data);
setHasGlobalSms(!!smsRes.data?.activeProfile);
sessionStorage.setItem(SESSION_KEY, JSON.stringify({ businessId }));
} catch {
// Business no longer exists — clear stale session
sessionStorage.removeItem(SESSION_KEY);
setActiveBusinessState(null);
setHasGlobalSms(false);
} finally {
setLoading(false);
}
}
rehydrate();
}, []);
const setActiveBusiness = useCallback(async (business) => {
setActiveBusinessState(business);
sessionStorage.setItem(SESSION_KEY, JSON.stringify({ businessId: business.businessId }));
try {
const smsRes = await apiClient.get(`/api/businesses/${business.businessId}/global-sms/active`);
setHasGlobalSms(!!smsRes.data?.activeProfile);
} catch {
setHasGlobalSms(false);
}
}, []);
const clearBusiness = useCallback(() => {
setActiveBusinessState(null);
setHasGlobalSms(false);
sessionStorage.removeItem(SESSION_KEY);
}, []);
const activeBusinessId = activeBusiness?.businessId || null;
return (
<BusinessContext.Provider value={{
activeBusiness, activeBusinessId, setActiveBusiness, clearBusiness, loading, hasGlobalSms, setHasGlobalSms
}}>
{children}
</BusinessContext.Provider>
);
}
export function useBusiness() {
return useContext(BusinessContext);
}