'use client'; import { useQuery } from '@tanstack/react-query'; import { useTranslations } from 'next-intl'; import { useEffect, useState } from 'react'; import { toast } from 'sonner'; import { createApplication, deleteApplication, getApplication, getSubscribeConfig, getSubscribeType, updateApplication, updateSubscribeConfig, } from '@/services/admin/system'; import { Button } from '@workspace/ui/components/button'; import { Label } from '@workspace/ui/components/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@workspace/ui/components/select'; import { Switch } from '@workspace/ui/components/switch'; import { Table, TableBody, TableCell, TableRow } from '@workspace/ui/components/table'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/components/tabs'; import { Textarea } from '@workspace/ui/components/textarea'; import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; function compareData( originalData: API.ApplicationResponse, modifiedData: API.ApplicationResponse, ): { 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.SubscribeConfig); 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 || {}) as (keyof API.ApplicationResponse)[]; 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')}