'use client'; import { createAppVersion, deleteAppVersion, getAppVersionList, updateAppVersion, } from '@/services/admin/application'; import { zodResolver } from '@hookform/resolvers/zod'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { Button } from '@workspace/ui/components/button'; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from '@workspace/ui/components/dialog'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@workspace/ui/components/form'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@workspace/ui/components/select'; import { Switch } from '@workspace/ui/components/switch'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@workspace/ui/components/table'; import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; import { Icon } from '@workspace/ui/custom-components/icon'; import { useTranslations } from 'next-intl'; import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { toast } from 'sonner'; import { z } from 'zod'; const versionSchema = z.object({ id: z.number().optional(), platform: z.string().min(1), version: z.string().min(1), min_version: z.string().optional(), url: z.string().url(), description: z.string().optional(), force_update: z.boolean(), is_default: z.boolean(), is_in_review: z.boolean(), }); type VersionFormData = z.infer; export default function VersionPage() { const t = useTranslations('system'); const queryClient = useQueryClient(); const [page, setPage] = useState(1); const [pageSize, setPageSize] = useState(10); const [open, setOpen] = useState(false); const [editingVersion, setEditingVersion] = useState(null); const { data } = useQuery({ queryKey: ['app-versions', page, pageSize], queryFn: async () => { const res = await getAppVersionList({ page, size: pageSize }); return res.data?.data; }, }); const form = useForm({ resolver: zodResolver(versionSchema), defaultValues: { platform: 'android', version: '', min_version: '', url: '', description: '', force_update: false, is_default: false, is_in_review: false, }, }); const createMutation = useMutation({ mutationFn: createAppVersion, onSuccess: () => { toast.success(t('common.saveSuccess')); setOpen(false); form.reset(); queryClient.invalidateQueries({ queryKey: ['app-versions'] }); }, onError: () => { toast.error(t('common.saveFailed')); }, }); const updateMutation = useMutation({ mutationFn: updateAppVersion, onSuccess: () => { toast.success(t('common.saveSuccess')); setOpen(false); setEditingVersion(null); form.reset(); queryClient.invalidateQueries({ queryKey: ['app-versions'] }); }, onError: () => { toast.error(t('common.saveFailed')); }, }); const deleteMutation = useMutation({ mutationFn: deleteAppVersion, onSuccess: () => { toast.success(t('common.saveSuccess')); queryClient.invalidateQueries({ queryKey: ['app-versions'] }); }, onError: () => { toast.error(t('common.saveFailed')); }, }); const onSubmit = (values: VersionFormData) => { const payload = { ...values, description: JSON.stringify({ 'en-US': values.description, 'zh-CN': values.description }), }; if (editingVersion) { updateMutation.mutate({ ...payload, id: editingVersion.id } as API.UpdateAppVersionRequest); } else { createMutation.mutate(payload as API.CreateAppVersionRequest); } }; const handleEdit = (version: API.ApplicationVersion) => { setEditingVersion(version); let desc = ''; if (version.description && typeof version.description === 'object') { desc = Object.values(version.description)[0] || ''; } else if (typeof version.description === 'string') { try { const parsed = JSON.parse(version.description); desc = (Object.values(parsed)[0] as string) || ''; } catch (e) { desc = version.description; } } form.reset({ platform: version.platform, version: version.version, min_version: version.min_version, url: version.url, description: desc, force_update: version.force_update, is_default: version.is_default, is_in_review: version.is_in_review, }); setOpen(true); }; const handleDelete = (id: number) => { if (confirm(t('version.confirmDelete'))) { deleteMutation.mutate({ id }); } }; const handleOpenChange = (open: boolean) => { setOpen(open); if (!open) { setEditingVersion(null); form.reset({ platform: 'android', version: '', min_version: '', url: '', description: '', force_update: false, is_default: false, is_in_review: false, }); } }; return (

{t('version.title')}

ID {t('version.platform')} {t('version.versionNumber')} {t('version.url')} {t('version.force')} {t('version.default')} {t('version.actions')} {data?.list?.map((version: API.ApplicationVersion) => ( {version.id} {version.platform} {version.version} {version.url} {version.force_update ? t('version.yes') : t('version.no')} {version.is_default ? t('version.yes') : t('version.no')}
))} {!data?.list?.length && ( {t('version.noResults')} )}
{t('version.total', { count: data?.total || 0 })}
{t('version.page', { page })}
{editingVersion ? t('version.edit') : t('version.createVersion')}
( {t('version.platform')} )} /> ( {t('version.versionNumber')} )} />
( {t('version.minVersion')} )} /> ( {t('version.downloadUrl')} )} />
( {t('version.descriptionField')} )} />
(
{t('version.forceUpdate')}
)} /> (
{t('version.default')}
)} /> (
{t('version.inReview')}
)} />
); }