photum/frontend/contexts/RegionContext.tsx
NANDO9322 b4b2f536f1 feat(notificacoes): envios de whatsapp dinamicos por regiao (SP e MG)
Implementa suporte a multiplas instancias da Evolution API via .env. O servico agora verifica a origiem do evento e roteia o disparo para garantir que cada franquia use seu proprio numero comercial.
2026-02-23 22:16:53 -03:00

90 lines
2.9 KiB
TypeScript

import React, { createContext, useContext, useState, useEffect } from "react";
import { useAuth } from "./AuthContext";
const REGION_KEY = "photum_selected_region";
interface RegionContextType {
currentRegion: string;
setRegion: (region: string) => void;
availableRegions: string[];
isRegionReady: boolean;
}
const RegionContext = createContext<RegionContextType>({
currentRegion: "SP",
setRegion: () => {},
availableRegions: [],
isRegionReady: false,
});
export const RegionProvider: React.FC<{ children: React.ReactNode }> = ({
children,
}) => {
const { user } = useAuth();
const [currentRegion, setCurrentRegion] = useState(() => {
return localStorage.getItem(REGION_KEY) || "SP";
});
// Calculate available regions based on user permissions
// If user is null (public), default to SP or both?
// Requirement: Public pages might need both for registration?
// Actually, RegionSwitcher is usually for logged in header.
// Registration page has its own selector.
// Let's assume public = SP only or no switcher.
// BUT: If user is logged out, they shouldn't see switcher anyway.
const [availableRegions, setAvailableRegions] = useState<string[]>(["SP"]);
const [isRegionReady, setIsRegionReady] = useState(false);
useEffect(() => {
console.log("RegionContext Debug:", { user, allowedRegions: user?.allowedRegions });
// If not logged in or user still fetching, wait (but if public page, we could mark ready. For now, mark ready if no token or after user loads)
const token = localStorage.getItem("token");
if (token && !user) {
// Wait for user to load to evaluate regions
setIsRegionReady(false);
return;
}
if (user && user.allowedRegions && user.allowedRegions.length > 0) {
setAvailableRegions(user.allowedRegions);
// If current region is not in allowed list, switch to first allowed
if (!user.allowedRegions.includes(currentRegion)) {
console.log("Switching region to allowed:", user.allowedRegions[0]);
const fallback = user.allowedRegions[0];
setCurrentRegion(fallback);
localStorage.setItem(REGION_KEY, fallback);
}
} else {
// Fallback or Public
setAvailableRegions(["SP"]);
}
setIsRegionReady(true);
}, [user, currentRegion]);
useEffect(() => {
localStorage.setItem(REGION_KEY, currentRegion);
}, [currentRegion]);
const setRegion = (region: string) => {
// Prevent switching if not allowed
if (!availableRegions.includes(region)) return;
setCurrentRegion(region);
setTimeout(() => {
window.location.reload();
}, 100);
};
return (
<RegionContext.Provider
value={{ currentRegion, setRegion, availableRegions, isRegionReady }}
>
{children}
</RegionContext.Provider>
);
};
export const useRegion = () => useContext(RegionContext);