- Voice tab: simplified interface, voice picker improvements - Subscription: Stripe integration, purchase flow updates - Beneficiaries: dashboard, sharing, improved management - Profile: drawer, edit, help, privacy sections - Theme: expanded constants, new colors - New components: MockDashboard, ProfileDrawer, Toast - Backend: Stripe routes additions - Auth: activate, add-loved-one, purchase screens
46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
import { useMemo } from 'react';
|
|
import { useBeneficiary } from '@/contexts/BeneficiaryContext';
|
|
import type { BeneficiarySubscription } from '@/types';
|
|
|
|
export interface SubscriptionState {
|
|
subscription: BeneficiarySubscription | null;
|
|
beneficiaryName: string | null;
|
|
beneficiaryId: number | null;
|
|
isActive: boolean;
|
|
daysRemaining: number;
|
|
loading: boolean;
|
|
}
|
|
|
|
export function useSubscription(): SubscriptionState {
|
|
const { currentBeneficiary } = useBeneficiary();
|
|
|
|
const subscription = useMemo(() => {
|
|
if (!currentBeneficiary?.subscription) return null;
|
|
|
|
const sub = currentBeneficiary.subscription;
|
|
|
|
// Check if expired
|
|
if (sub.endDate && new Date(sub.endDate) < new Date()) {
|
|
return { ...sub, status: 'expired' as const };
|
|
}
|
|
|
|
return sub;
|
|
}, [currentBeneficiary?.subscription]);
|
|
|
|
const isActive = subscription?.status === 'active';
|
|
|
|
const daysRemaining = useMemo(() => {
|
|
if (!subscription?.endDate) return 0;
|
|
return Math.max(0, Math.ceil((new Date(subscription.endDate).getTime() - Date.now()) / (1000 * 60 * 60 * 24)));
|
|
}, [subscription?.endDate]);
|
|
|
|
return {
|
|
subscription,
|
|
beneficiaryName: currentBeneficiary?.name || null,
|
|
beneficiaryId: currentBeneficiary?.id || null,
|
|
isActive,
|
|
daysRemaining,
|
|
loading: false,
|
|
};
|
|
}
|