xpeditis2.0/apps/frontend/src/lib/context/subscription-context.tsx
2026-03-18 15:11:09 +01:00

78 lines
2.0 KiB
TypeScript

'use client';
import React, { createContext, useContext, useState, useEffect } from 'react';
import { useAuth } from './auth-context';
import {
getSubscriptionOverview,
type SubscriptionOverviewResponse,
type SubscriptionPlan,
type PlanFeature,
} from '../api/subscriptions';
interface SubscriptionContextType {
subscription: SubscriptionOverviewResponse | null;
loading: boolean;
plan: SubscriptionPlan | null;
planFeatures: PlanFeature[];
hasFeature: (feature: PlanFeature) => boolean;
refresh: () => Promise<void>;
}
const SubscriptionContext = createContext<SubscriptionContextType | undefined>(undefined);
export function SubscriptionProvider({ children }: { children: React.ReactNode }) {
const { user, isAuthenticated } = useAuth();
const [subscription, setSubscription] = useState<SubscriptionOverviewResponse | null>(null);
const [loading, setLoading] = useState(true);
const fetchSubscription = async () => {
if (!isAuthenticated) {
setSubscription(null);
setLoading(false);
return;
}
try {
const data = await getSubscriptionOverview();
setSubscription(data);
} catch (error) {
console.error('Failed to fetch subscription:', error);
} finally {
setLoading(false);
}
};
useEffect(() => {
fetchSubscription();
}, [isAuthenticated, user?.organizationId]);
const plan = subscription?.plan ?? null;
const planFeatures = subscription?.planDetails?.planFeatures ?? [];
const hasFeature = (feature: PlanFeature): boolean => {
return planFeatures.includes(feature);
};
return (
<SubscriptionContext.Provider
value={{
subscription,
loading,
plan,
planFeatures,
hasFeature,
refresh: fetchSubscription,
}}
>
{children}
</SubscriptionContext.Provider>
);
}
export function useSubscription() {
const context = useContext(SubscriptionContext);
if (context === undefined) {
throw new Error('useSubscription must be used within a SubscriptionProvider');
}
return context;
}