forked from akai/readest
59 lines
1.9 KiB
TypeScript
59 lines
1.9 KiB
TypeScript
import { useEffect, useState } from 'react';
|
|
import { fetchAndTransformIAPPlans, isIAPAvailable } from '@/libs/payment/iap/client';
|
|
import { fetchStripePlans } from '@/libs/payment/stripe/client';
|
|
import { AvailablePlan } from '@/types/quota';
|
|
import { stubTranslation as _ } from '@/utils/misc';
|
|
|
|
const IAP_PRODUCT_IDS = [
|
|
'com.bilingify.readest.monthly.plus',
|
|
'com.bilingify.readest.monthly.pro',
|
|
'com.bilingify.readest.storage.1gb.purchase',
|
|
'com.bilingify.readest.storage.2gb.purchase',
|
|
'com.bilingify.readest.storage.5gb.purchase',
|
|
'com.bilingify.readest.storage.10gb.purchase',
|
|
];
|
|
|
|
interface UseAvailablePlansParams {
|
|
hasIAP: boolean;
|
|
onError?: (message: string) => void;
|
|
}
|
|
|
|
export const useAvailablePlans = ({ hasIAP, onError }: UseAvailablePlansParams) => {
|
|
const [availablePlans, setAvailablePlans] = useState<AvailablePlan[]>([]);
|
|
const [iapAvailable, setIapAvailable] = useState(false);
|
|
const [loading, setLoading] = useState(false);
|
|
const [error, setError] = useState<Error | null>(null);
|
|
|
|
useEffect(() => {
|
|
const fetchPlans = async () => {
|
|
setLoading(true);
|
|
setError(null);
|
|
|
|
try {
|
|
if (hasIAP && (await isIAPAvailable())) {
|
|
const plans = await fetchAndTransformIAPPlans(IAP_PRODUCT_IDS);
|
|
setAvailablePlans(plans);
|
|
setIapAvailable(true);
|
|
} else {
|
|
const plans = await fetchStripePlans();
|
|
setAvailablePlans(plans);
|
|
}
|
|
} catch (err) {
|
|
const error = err instanceof Error ? err : new Error('Unknown error');
|
|
setError(error);
|
|
console.error(`Failed to fetch ${hasIAP ? 'IAP' : 'Stripe'} plans:`, error);
|
|
|
|
if (onError) {
|
|
onError(_('Failed to load subscription plans.'));
|
|
}
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
fetchPlans();
|
|
}, [hasIAP, onError]);
|
|
|
|
return { availablePlans, iapAvailable, loading, error };
|
|
};
|