79 lines
1.7 KiB
TypeScript
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');
|
|
}
|