import { useEffect } from "react"; import { useNavigate } from "@remix-run/react"; import { useMyStores } from "../requestHandler/use-seller-hooks"; /** * Guards a store dashboard route. A user may enter a store they OWN or are an * active STAFF member of. Non-members are redirected away. Returns the user's * role for this store so callers can gate owner-only UI. */ export function useStoreOwnership(storeId: string | undefined, mode?: string) { const navigate = useNavigate(); const { data: stores, isLoading } = useMyStores(); const current = stores?.find((s) => s.username === storeId); useEffect(() => { if (isLoading || mode === "create") return; if (!storeId) { navigate("/"); return; } if (stores === undefined) return; // not loaded yet if (!current) { // Not a member of this store → send them to a store they can manage, else home. if (stores.length > 0) navigate(`/store/${stores[0].username}`); else navigate("/"); } }, [stores, current, storeId, isLoading, navigate, mode]); const ownedOrFirst = stores?.find((s) => s.role === "owner") ?? stores?.[0]; return { isLoading, isMember: !!current, role: current?.role ?? null, isOwner: current?.role === "owner", userStoreId: ownedOrFirst?.username, stores: stores ?? [], }; } /** * Guard for OWNER-ONLY store pages (financial, shipping, edit, team). Redirects * non-members (via useStoreOwnership) and staff members back to the dashboard. * Returns { isLoading, isOwner } so callers can render a spinner meanwhile. */ export function useRequireOwner(storeId: string | undefined) { const navigate = useNavigate(); const { isLoading, role } = useStoreOwnership(storeId); useEffect(() => { if (!isLoading && role && role !== "owner") { navigate(`/store/${storeId}`); } }, [isLoading, role, storeId, navigate]); return { isLoading, isOwner: role === "owner" }; }