From 513e68743ec1d926fa3125637f95819ac867872d Mon Sep 17 00:00:00 2001 From: speakeloudest Date: Thu, 31 Jul 2025 18:17:36 -0700 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../(main)/(content)/(user)/sidebar-left.tsx | 32 +++++++-------- .../components/main/OfferDialog/index.tsx | 10 ++--- .../user/components/main/OfferDialog/types.ts | 41 ++++++++++++++++++- apps/user/config/navs.ts | 6 --- 4 files changed, 60 insertions(+), 29 deletions(-) diff --git a/apps/user/app/(main)/(content)/(user)/sidebar-left.tsx b/apps/user/app/(main)/(content)/(user)/sidebar-left.tsx index 3f5f77d..99a6c10 100644 --- a/apps/user/app/(main)/(content)/(user)/sidebar-left.tsx +++ b/apps/user/app/(main)/(content)/(user)/sidebar-left.tsx @@ -26,23 +26,21 @@ export function SidebarLeft({ ...props }: React.ComponentProps) {navs.map((nav, navIndex) => ( - {(nav.items || [nav]).map((item) => ( - - - - {item.icon && } - {t(item.title)} - - - - ))} + + + + {nav.icon && } + {t(nav.title)} + + + ))} diff --git a/apps/user/components/main/OfferDialog/index.tsx b/apps/user/components/main/OfferDialog/index.tsx index 998ef33..64b1f13 100644 --- a/apps/user/components/main/OfferDialog/index.tsx +++ b/apps/user/components/main/OfferDialog/index.tsx @@ -254,12 +254,12 @@ const OfferDialog = forwardRef((props, ref) => { const response = await getSubscription({ skipErrorHandler: true }); // 确保返回有效的数组,避免 undefined const list = response.data?.data?.list || []; - return list.filter((v) => v.unit_time === 'Month') as unknown as ProcessedPlanData[]; + return list.filter((v) => v.unit_time === 'Month') as API.Subscribe[]; } catch (err) { // 自定义错误处理 console.error('获取订阅数据失败:', err); // 返回空数组而不是抛出错误,避免 queryFn 返回 undefined - return [] as ProcessedPlanData[]; + return [] as API.Subscribe[]; } }, enabled: false, // 初始不执行,手动控制 @@ -301,7 +301,7 @@ const OfferDialog = forwardRef((props, ref) => { }; // 处理套餐数据的工具函数 - const processPlanData = (item: ProcessedPlanData, isYearly: boolean): ProcessedPlanData => { + const processPlanData = (item: API.Subscribe, isYearly: boolean): ProcessedPlanData => { if (isYearly) { const discountItem = item.discount?.find((v) => v.quantity === 12); return { @@ -323,12 +323,12 @@ const OfferDialog = forwardRef((props, ref) => { // 使用 useMemo 优化数据处理性能 const yearlyPlans: ProcessedPlanData[] = useMemo( - () => data.map((item) => processPlanData(item, true)), + () => (data || []).map((item) => processPlanData(item, true)), [data], ); const monthlyPlans: ProcessedPlanData[] = useMemo( - () => data.map((item) => processPlanData(item, false)), + () => (data || []).map((item) => processPlanData(item, false)), [data], ); diff --git a/apps/user/components/main/OfferDialog/types.ts b/apps/user/components/main/OfferDialog/types.ts index ca9c2f5..99b9a82 100644 --- a/apps/user/components/main/OfferDialog/types.ts +++ b/apps/user/components/main/OfferDialog/types.ts @@ -20,7 +20,46 @@ export interface SubscriptionData { }; } -export interface ProcessedPlanData extends SubscriptionData { +// 以 API.Subscribe 为准的类型定义 +export interface ProcessedPlanData { + id: number; + name: string; + description: string; + unit_price: number; + unit_time: string; + discount: Array<{ + quantity: number; + discount: number; + }>; + replacement: number; + inventory: number; + traffic: number; + speed_limit: number; + device_limit: number; + quota: number; + group_id: number; + server_group: number[]; + server: number[]; + show: boolean; + sell: boolean; + sort: number; + deduction_ratio: number; + allow_deduction: boolean; + reset_cycle: number; + renewal_reset: boolean; + created_at: number; + updated_at: number; + // 处理后的价格字段 origin_price: string; discount_price: string; + // 添加features属性以兼容现有代码 + features?: { + traffic: string; + duration: string; + onlineIPs: string; + connections: string; + bandwidth: string; + nodes: string; + stability: number; + }; } diff --git a/apps/user/config/navs.ts b/apps/user/config/navs.ts index ca63770..506fef8 100644 --- a/apps/user/config/navs.ts +++ b/apps/user/config/navs.ts @@ -46,12 +46,6 @@ export function findNavByUrl(url: string) { if (nav.url && nav.url === url) { return [nav]; } - if (nav.items) { - const current = nav.items.find((item) => item.url === url); - if (current) { - return [nav, current]; - } - } } return []; }