129 lines
2.9 KiB
TypeScript
129 lines
2.9 KiB
TypeScript
import { apiClient, withAuth } from "./client";
|
|
import { API_ENDPOINTS } from "../config/api";
|
|
|
|
export type MembershipType = "basic" | "premium" | "vip";
|
|
|
|
export interface MembershipFeatures {
|
|
recommendationsPerMonth: number;
|
|
hydrationTracking: boolean;
|
|
nutritionTracking: boolean;
|
|
advancedStatistics: boolean;
|
|
}
|
|
|
|
const MEMBERSHIP_FEATURES: Record<MembershipType, MembershipFeatures> = {
|
|
basic: {
|
|
recommendationsPerMonth: 1,
|
|
hydrationTracking: false,
|
|
nutritionTracking: false,
|
|
advancedStatistics: false,
|
|
},
|
|
premium: {
|
|
recommendationsPerMonth: -1,
|
|
hydrationTracking: true,
|
|
nutritionTracking: true,
|
|
advancedStatistics: true,
|
|
},
|
|
vip: {
|
|
recommendationsPerMonth: -1,
|
|
hydrationTracking: true,
|
|
nutritionTracking: true,
|
|
advancedStatistics: true,
|
|
},
|
|
};
|
|
|
|
interface UsersListResponse {
|
|
success?: boolean;
|
|
data?: {
|
|
users?: Array<{
|
|
id: string;
|
|
role: string;
|
|
client?: {
|
|
membershipType?: MembershipType;
|
|
} | null;
|
|
}>;
|
|
};
|
|
users?: Array<{
|
|
id: string;
|
|
role: string;
|
|
client?: {
|
|
membershipType?: MembershipType;
|
|
} | null;
|
|
}>;
|
|
}
|
|
|
|
interface MembershipFeaturesResponse {
|
|
success: boolean;
|
|
data: {
|
|
membershipType: MembershipType;
|
|
currentFeatures: MembershipFeatures;
|
|
plans: Record<MembershipType, MembershipFeatures>;
|
|
};
|
|
}
|
|
|
|
function isMembershipType(value: unknown): value is MembershipType {
|
|
return value === "basic" || value === "premium" || value === "vip";
|
|
}
|
|
|
|
export async function getCurrentMembershipType(
|
|
userId: string,
|
|
token: string | null,
|
|
): Promise<MembershipType> {
|
|
if (!token || !userId) {
|
|
return "basic";
|
|
}
|
|
|
|
const response = await apiClient.get<UsersListResponse>(
|
|
API_ENDPOINTS.USERS.LIST,
|
|
withAuth(token),
|
|
);
|
|
|
|
const payload = response.data;
|
|
const users = payload.data?.users ?? payload.users ?? [];
|
|
const currentUser = users.find((user) => user.id === userId);
|
|
|
|
if (!currentUser || currentUser.role !== "client") {
|
|
return "vip";
|
|
}
|
|
|
|
const membershipType = currentUser.client?.membershipType;
|
|
return isMembershipType(membershipType) ? membershipType : "basic";
|
|
}
|
|
|
|
export function getMembershipFeatures(
|
|
membershipType: MembershipType,
|
|
): MembershipFeatures {
|
|
return MEMBERSHIP_FEATURES[membershipType];
|
|
}
|
|
|
|
export async function getCurrentMembershipFeaturesFromServer(
|
|
token: string | null,
|
|
): Promise<{
|
|
membershipType: MembershipType;
|
|
features: MembershipFeatures;
|
|
}> {
|
|
if (!token) {
|
|
return {
|
|
membershipType: "basic",
|
|
features: MEMBERSHIP_FEATURES.basic,
|
|
};
|
|
}
|
|
|
|
const response = await apiClient.get<MembershipFeaturesResponse>(
|
|
API_ENDPOINTS.MEMBERSHIP.FEATURES,
|
|
withAuth(token),
|
|
);
|
|
|
|
const data = response.data?.data;
|
|
if (!data) {
|
|
return {
|
|
membershipType: "basic",
|
|
features: MEMBERSHIP_FEATURES.basic,
|
|
};
|
|
}
|
|
|
|
return {
|
|
membershipType: data.membershipType,
|
|
features: data.currentFeatures,
|
|
};
|
|
}
|