diff --git a/apps/admin/app/dashboard/subscribe/app/form.tsx b/apps/admin/app/dashboard/subscribe/app/form.tsx index 758a4de..1c0915d 100644 --- a/apps/admin/app/dashboard/subscribe/app/form.tsx +++ b/apps/admin/app/dashboard/subscribe/app/form.tsx @@ -42,7 +42,7 @@ import { z } from 'zod'; const platforms = ['windows', 'macos', 'linux', 'android', 'ios', 'harmony']; const defaultValues = { - subscription_protocol: 'Clash', + subscribe_type: 'Clash', name: '', icon: '', url: '', @@ -58,7 +58,7 @@ const versionSchema = z.object({ const formSchema = z.object({ icon: z.string(), name: z.string(), - subscription_protocol: z.string(), + subscribe_type: z.string(), platform: z.object({ windows: z.array(versionSchema).optional(), macos: z.array(versionSchema).optional(), @@ -172,7 +172,7 @@ export default function SubscribeAppForm< /> ( {t('subscriptionProtocol')} diff --git a/apps/admin/app/dashboard/subscribe/app/table.tsx b/apps/admin/app/dashboard/subscribe/app/table.tsx index 904f486..8e26977 100644 --- a/apps/admin/app/dashboard/subscribe/app/table.tsx +++ b/apps/admin/app/dashboard/subscribe/app/table.tsx @@ -76,9 +76,9 @@ export default function SubscribeApp() { header: t('appName'), }, { - accessorKey: 'subscription_protocol', + accessorKey: 'subscribe_type', header: t('subscriptionProtocol'), - cell: ({ row }) => row.getValue('subscription_protocol'), + cell: ({ row }) => row.getValue('subscribe_type'), }, ]} actions={{ diff --git a/apps/admin/services/admin/typings.d.ts b/apps/admin/services/admin/typings.d.ts index 3d31bbe..ccbfcbb 100644 --- a/apps/admin/services/admin/typings.d.ts +++ b/apps/admin/services/admin/typings.d.ts @@ -50,7 +50,7 @@ declare namespace API { name: string; icon: string; description: string; - subscription_protocol: string; + subscribe_type: string; platform: ApplicationPlatform; }; diff --git a/apps/admin/services/common/typings.d.ts b/apps/admin/services/common/typings.d.ts index e34759a..04164fb 100644 --- a/apps/admin/services/common/typings.d.ts +++ b/apps/admin/services/common/typings.d.ts @@ -42,7 +42,7 @@ declare namespace API { name: string; icon: string; description: string; - subscription_protocol: string; + subscribe_type: string; platform: ApplicationPlatform; }; diff --git a/apps/user/app/(main)/(user)/dashboard/content.tsx b/apps/user/app/(main)/(user)/dashboard/content.tsx index edf27a0..b0d22e5 100644 --- a/apps/user/app/(main)/(user)/dashboard/content.tsx +++ b/apps/user/app/(main)/(user)/dashboard/content.tsx @@ -43,6 +43,15 @@ import CopyToClipboard from 'react-copy-to-clipboard'; import { toast } from 'sonner'; import Subscribe from '../subscribe/page'; +const platforms: (keyof API.ApplicationPlatform)[] = [ + 'windows', + 'mac', + 'linux', + 'ios', + 'android', + 'harmony', +]; + export default function Content() { const t = useTranslations('dashboard'); const { getUserSubscribe, getAppSubLink } = useGlobalStore(); @@ -56,14 +65,14 @@ export default function Content() { return data.data?.list || []; }, }); - const { data: application } = useQuery({ + const { data: applications } = useQuery({ queryKey: ['queryApplicationConfig'], queryFn: async () => { const { data } = await queryApplicationConfig(); - return data.data as API.ApplicationResponse; + return data.data?.applications || []; }, }); - const [platform, setPlatform] = useState(getPlatform()); + const [platform, setPlatform] = useState(getPlatform()); const { data } = useQuery({ queryKey: ['getStat'], @@ -87,16 +96,27 @@ export default function Content() {
setPlatform(value as keyof API.ApplicationResponse)} + onValueChange={(value) => setPlatform(value as keyof API.ApplicationPlatform)} className='w-full max-w-full md:w-auto' > - {application && - Object.keys(application)?.map((item) => ( - - {item} - - ))} + {platforms.map((item) => ( + + + + ))} {data?.protocol && data?.protocol.length > 1 && ( @@ -215,54 +235,69 @@ export default function Content() {
- {application?.[platform]?.map((app) => ( -
- {app.name} - {app.icon && ( - {app.name} - )} -
- + {applications + ?.filter((application) => { + const platformApps = application.platform?.[platform]; + return platformApps && platformApps.length > 0; + }) + .map((application) => { + const platformApps = application.platform?.[platform]; + const app = + platformApps?.find((item) => item.is_default) || platformApps?.[0]; + if (!app) return null; + const handleCopy = (text: string, result: boolean) => { + const href = getAppSubLink(application.subscribe_type, url); - { - const href = getAppSubLink(app.subscribe_type, url); - if (isBrowser() && href) { - window.location.href = href; - } else if (result) { - toast.success( - <> -

{t('copySuccess')}

-

{t('manualImportMessage')}

- , - ); - } - }} + if (isBrowser() && href) { + window.location.href = href; + return; + } + + if (result) { + toast.success( + <> +

{t('copySuccess')}

+

{t('manualImportMessage')}

+ , + ); + } + }; + + return ( +
- - -
-
- ))} + {application.name} + + {application.icon && ( + {application.name} + )} +
+ + + + + +
+
+ ); + })}
{t('qrCode')} ;