import { useAuth, useUser } from "@clerk/clerk-expo"; import { useEffect, useState } from "react"; import { getCurrentMembershipFeaturesFromServer, type MembershipFeatures, type MembershipType, } from "../api/membership"; import log from "../utils/logger"; const BASIC_FEATURES: MembershipFeatures = { recommendationsPerMonth: 1, hydrationTracking: false, nutritionTracking: false, advancedStatistics: false, }; interface UseMembershipResult { membershipType: MembershipType; features: MembershipFeatures; loading: boolean; } export function useMembership(): UseMembershipResult { const { user } = useUser(); const { getToken, isSignedIn } = useAuth(); const [membershipType, setMembershipType] = useState("basic"); const [features, setFeatures] = useState(BASIC_FEATURES); const [loading, setLoading] = useState(true); useEffect(() => { let isMounted = true; const loadMembership = async () => { if (!isSignedIn || !user?.id) { if (isMounted) { setMembershipType("basic"); setFeatures(BASIC_FEATURES); setLoading(false); } return; } try { setLoading(true); const token = await getToken(); const result = await getCurrentMembershipFeaturesFromServer(token); if (isMounted) { setMembershipType(result.membershipType); setFeatures(result.features); } } catch (error) { log.error("Failed to load membership", error, { userId: user.id }); if (isMounted) { setMembershipType("basic"); setFeatures(BASIC_FEATURES); } } finally { if (isMounted) { setLoading(false); } } }; loadMembership(); return () => { isMounted = false; }; }, [isSignedIn, user?.id, getToken]); return { membershipType, features, loading, }; }