77 lines
1.9 KiB
TypeScript
77 lines
1.9 KiB
TypeScript
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<MembershipType>("basic");
|
|
const [features, setFeatures] = useState<MembershipFeatures>(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,
|
|
};
|
|
}
|