'use client'; import { toast } from '@shadcn/ui/lib/sonner'; import { useQuery } from '@tanstack/react-query'; import { useTranslations } from 'next-intl'; import { useEffect, useState } from 'react'; import { createApplication, deleteApplication, getApplication, getSubscribeConfig, getSubscribeType, updateApplication, updateSubscribeConfig, } from '@/services/admin/system'; import { EnhancedInput } from '@repo/ui/enhanced-input'; import { Button } from '@shadcn/ui/button'; import { Label } from '@shadcn/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@shadcn/ui/select'; import { Switch } from '@shadcn/ui/switch'; import { Table, TableBody, TableCell, TableRow } from '@shadcn/ui/table'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@shadcn/ui/tabs'; import { Textarea } from '@shadcn/ui/textarea'; function compareData( originalData: API.GetApplicationResponse, modifiedData: API.GetApplicationResponse, ): { added: API.Application[]; deleted: API.Application[]; updated: API.Application[]; } { const added: API.Application[] = []; const deleted: API.Application[] = []; const updated: API.Application[] = []; const findById = (array: API.Application[], id: number): API.Application | undefined => { return array.find((item) => item.id === id); }; const isUpdated = (original: API.Application, modified: API.Application): boolean => { return ( original.name !== modified.name || original.platform !== modified.platform || original.subscribe_type !== modified.subscribe_type || original.url !== modified.url || original.icon !== modified.icon ); }; Object.values(originalData).forEach((platformData) => { platformData.forEach((originalApp) => { const modifiedApp = findById( modifiedData[originalApp.platform as API.CreateApplicationRequest['platform']], originalApp.id, ); if (!modifiedApp) { deleted.push(originalApp); } else if (isUpdated(originalApp, modifiedApp)) { updated.push(modifiedApp); } }); }); Object.values(modifiedData).forEach((platformData) => { platformData.forEach((modifiedApp) => { if ( !findById( originalData[modifiedApp.platform as API.CreateApplicationRequest['platform']], modifiedApp.id, ) ) { added.push(modifiedApp); } }); }); return { added, deleted, updated }; } export default function Subscription() { const t = useTranslations('system.subscription'); const { data, refetch } = useQuery({ queryKey: ['getSubscribeConfig'], queryFn: async () => { const { data } = await getSubscribeConfig(); return data.data; }, }); const { data: apps, refetch: appsRefetch } = useQuery({ queryKey: ['getApplication'], queryFn: async () => { const { data } = await getApplication(); return data.data; }, }); async function updateConfig(key: string, value: unknown) { if (data?.[key] === value) return; try { await updateSubscribeConfig({ ...data, [key]: value, } as API.GetSubscribeConfigResponse); toast.success(t('saveSuccess')); refetch(); } catch (error) { /* empty */ } } const { data: subscribe_types } = useQuery({ queryKey: ['getSubscribeType'], queryFn: async () => { const { data } = await getSubscribeType(); return data.data?.subscribe_types || []; }, }); const [app, setApp] = useState(); const appTypes = Object.keys(apps || {}); useEffect(() => { if (!app) setApp(apps); }, [app, apps]); return ( <>

{t('singleSubscriptionModeDescription')}

{ updateConfig('single_model', checked); }} />

{t('wildcardResolutionDescription')}

{ updateConfig('pan_domain', checked); }} />

{t('subscriptionPathDescription')}

updateConfig('subscribe_path', value)} />

{t('subscriptionDomainDescription')}