bw-expo-app/lib/api/pricing.ts

79 lines
1.7 KiB
TypeScript

import { apiRequest } from './client';
export interface StripePricingItem {
price_id: string;
product_id: string;
name: string;
amount: string;
recurring?: {
interval: string;
interval_count: number;
};
metadata?: {
grant_token?: string;
[key: string]: any;
};
feature_list?: string[];
is_highlight?: boolean;
highlight_text?: string;
metered_price_id?: string;
}
export interface StripePricingTableResponse {
pricing_table_items: StripePricingItem[];
}
export interface CreditPlan {
amountInCents: number;
credits: number;
popular?: boolean;
}
/**
* 获取 Stripe 订阅套餐列表
*/
export async function getStripePlans(): Promise<{
success: boolean;
data?: StripePricingTableResponse;
message?: string;
}> {
try {
const response = await apiRequest<{ success: boolean; data: StripePricingTableResponse }>(
'/api/stripe/plans',
{
method: 'GET',
requiresAuth: false,
}
);
if (!response.success || !response.data) {
return {
success: false,
message: 'Failed to fetch pricing data',
};
}
return {
success: true,
data: response.data,
};
} catch (error) {
console.error('Failed to fetch Stripe plans:', error);
return {
success: false,
message: error instanceof Error ? error.message : 'Unknown error',
};
}
}
/**
* 从 API 数据中提取计划名称列表
*/
export function getPlanNames(pricingData?: StripePricingTableResponse | null): string[] {
if (!pricingData?.pricing_table_items) return [];
return pricingData.pricing_table_items
.filter(item => item.recurring?.interval === 'month')
.map(item => item.name || 'basic');
}