diff --git a/apps/admin/app/dashboard/user/user-detail.tsx b/apps/admin/app/dashboard/user/user-detail.tsx index 5d84bdb..ee6e5c4 100644 --- a/apps/admin/app/dashboard/user/user-detail.tsx +++ b/apps/admin/app/dashboard/user/user-detail.tsx @@ -134,7 +134,9 @@ export function UserDetail({ id }: { id: number }) { diff --git a/apps/user/app/(main)/(content)/(user)/dashboard/components/SubscribeCard/index.tsx b/apps/user/app/(main)/(content)/(user)/dashboard/components/SubscribeCard/index.tsx index 285b246..ace62d7 100644 --- a/apps/user/app/(main)/(content)/(user)/dashboard/components/SubscribeCard/index.tsx +++ b/apps/user/app/(main)/(content)/(user)/dashboard/components/SubscribeCard/index.tsx @@ -28,9 +28,11 @@ import { import { Popover, PopoverContent, PopoverTrigger } from '@workspace/airo-ui/components/popover'; import { Tabs, TabsList, TabsTrigger } from '@workspace/airo-ui/components/tabs'; import { differenceInDays } from '@workspace/airo-ui/utils'; +import Link from 'next/link'; import { QRCodeCanvas } from 'qrcode.react'; import { useEffect, useState } from 'react'; import { CopyToClipboard } from 'react-copy-to-clipboard'; + interface SubscribeCardProps { userSubscribeData: API.UserSubscribe; protocol: string[]; @@ -53,7 +55,7 @@ const SubscribeCard = (props: SubscribeCardProps) => { if (list.length > 0) { setUserSubscribeProtocolCurrent(0); } - }, [props.userSubscribeData.token, protocol]); + }, [props.userSubscribeData?.token, protocol]); return (
@@ -69,11 +71,15 @@ const SubscribeCard = (props: SubscribeCardProps) => { {t('totalTraffic')}

- + {userSubscribeData?.status === 1 ? ( + + ) : ( + '0.00GB' + )}

@@ -81,9 +87,15 @@ const SubscribeCard = (props: SubscribeCardProps) => { {t('nextResetDays')}

- {userSubscribeData.reset_time - ? differenceInDays(new Date(userSubscribeData.reset_time), new Date()) - : t('noReset')} + {userSubscribeData?.status === 1 ? ( + <> + {userSubscribeData.reset_time + ? differenceInDays(new Date(userSubscribeData.reset_time), new Date()) + : t('noReset')} + + ) : ( + 'N/A' + )}

@@ -91,17 +103,30 @@ const SubscribeCard = (props: SubscribeCardProps) => { {t('expirationDays')}

- {userSubscribeData.expire_time - ? differenceInDays(new Date(userSubscribeData.expire_time), new Date()) || - t('unknown') - : t('noLimit')} + {userSubscribeData?.status === 1 ? ( + <> + {userSubscribeData.expire_time + ? differenceInDays(new Date(userSubscribeData.expire_time), new Date()) || + t('unknown') + : t('noLimit')} + + ) : ( + 'N/A' + )}

{/* 订阅链接 */} -
+
+ {userSubscribeData?.status !== 1 && ( +
+ + {t('buySubscriptionNow')} + +
+ )}
{props.protocol.length > 1 && ( {
-
+
{userSubscribeProtocol[userSubscribeProtocolCurrent]} @@ -203,7 +228,7 @@ const SubscribeCard = (props: SubscribeCardProps) => {
- + {t('resetSubscription')} @@ -231,7 +256,7 @@ const SubscribeCard = (props: SubscribeCardProps) => {
diff --git a/apps/user/app/(main)/(content)/(user)/dashboard/content.tsx b/apps/user/app/(main)/(content)/(user)/dashboard/content.tsx index 03e279c..25e1e95 100644 --- a/apps/user/app/(main)/(content)/(user)/dashboard/content.tsx +++ b/apps/user/app/(main)/(content)/(user)/dashboard/content.tsx @@ -27,7 +27,6 @@ import { Empty } from '@/components/empty'; import SvgIcon from '@/components/SvgIcon'; import { queryAnnouncement } from '@/services/user/announcement'; import { queryOrderList } from '@/services/user/order'; -import { default as Airo_Empty } from '@workspace/airo-ui/custom-components/empty'; import { formatDate } from '@workspace/airo-ui/utils'; const platforms: (keyof API.ApplicationPlatform)[] = [ @@ -42,11 +41,13 @@ const platforms: (keyof API.ApplicationPlatform)[] = [ export default function Content() { const t = useTranslations('dashboard'); - const { data: userSubscribe = [], refetch } = useQuery({ + const { data: userSubscribe = {}, refetch } = useQuery({ queryKey: ['queryUserSubscribe'], queryFn: async () => { const { data } = await queryUserSubscribe(); - return data.data?.list || []; + const activeList = data.data?.list?.filter((v) => v.status === 1); + + return activeList[0] ?? {}; }, }); @@ -119,11 +120,11 @@ export default function Content() { {/* 快捷下载 Card */}
-

快捷下载

-
-
- 选择对应操作系统下载客户端 +

+ {t('quickDownloads')} +

+
{t('selectOS')}
@@ -189,20 +203,13 @@ export default function Content() { {t('beginnerTutorial')}
-
- 复制订阅链接或点击二维码按钮扫码 -
- {userSubscribe?.[0] && data?.protocol ? ( - - ) : ( - - )} + {/* 账户概况 Card */} @@ -218,7 +225,7 @@ export default function Content() {
- {userSubscribe?.length > 0 && userSubscribe[0]?.status === 1 && orderData + {userSubscribe?.status === 1 && orderData ? orderData?.quantity === 1 ? t('annualMonthPlanUser') : t('annualYearPlanUser') @@ -247,93 +254,109 @@ export default function Content() {

{t('planStatus')} - {userSubscribe?.length > 0 && userSubscribe?.[0]?.status === 1 ? ( + {userSubscribe?.status === 1 ? ( {t('inEffect')} - ) : null} + ) : ( + + {t('notEffect')} + + )}

- {userSubscribe?.length ? ( - <> -
- {t('planExpirationTime')} - {formatDate(userSubscribe?.[0]?.expire_time, false)} -
-
- - {userSubscribe?.[0]?.subscribe.name} - -
-
-
- {t('availableDevices')} -
- {Array.from({ length: userSubscribe?.[0]?.subscribe.device_limit }).map( - (_, index) => { - return ( -
1 ? 'bg-[#225BA9]' : 'bg-[#D9D9D9]'}`} - >
- ); - }, - )} -
+
+
+ {t('planExpirationTime')} + {formatDate(userSubscribe?.expire_time, false) || t('None')} +
+
+ + {userSubscribe?.subscribe?.name ? ( + userSubscribe?.subscribe?.name + ) : ( + {t('noPlanAvailable')} + )} + +
+
+
+ {t('availableDevices')} +
+ {Array.from({ length: userSubscribe?.subscribe?.device_limit || 6 }).map( + (_, index) => { + return ( +
1 ? 'bg-[#225BA9]' : 'bg-[#D9D9D9]'}`} + >
+ ); + }, + )}
+
+ + {t('online')} + {data?.online_device || 0}/{userSubscribe?.subscribe?.device_limit || 0} + +
+
+
- {t('online')} - {data?.online_device} / {userSubscribe?.[0]?.subscribe.device_limit} + {t('usedTrafficTotalTraffic')} + {userSubscribe?.subscribe?.device_limit ? ( + <> + + / + + + ) : ( + '0GB/0GB' + )} + + + {t('remaining')} + {userSubscribe?.status === 1 ? ( + <> + {100 - + Math.round( + (((userSubscribe?.upload || 0) + (userSubscribe?.download || 0)) / + (userSubscribe?.traffic || 1)) * + 100, + )} + + ) : ( + 0 + )} + %
-
-
- - {t('usedTrafficTotalTraffic')} - - /{' '} - - - - {t('remaining')} - {100 - - Math.round( - (((userSubscribe?.[0]?.upload || 0) + (userSubscribe?.[0]?.download || 0)) / - (userSubscribe?.[0]?.traffic || 1)) * - 100, - )} - % - -
-
-
-
+
+
- - ) : ( - - )} +
+
{/* 网站公告 Card */} diff --git a/apps/user/app/(main)/(content)/(user)/document/tutorial-button.tsx b/apps/user/app/(main)/(content)/(user)/document/tutorial-button.tsx index 807eeaa..a650597 100644 --- a/apps/user/app/(main)/(content)/(user)/document/tutorial-button.tsx +++ b/apps/user/app/(main)/(content)/(user)/document/tutorial-button.tsx @@ -168,7 +168,7 @@ export function TutorialButton({ items }: { items: Item[] }) { )}
-
+
{item.download ? (