import { useState } from 'react' import { createFileRoute } from '@tanstack/react-router' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { useTranslation } from 'react-i18next' import { toast } from '@/shared/ui/toast-store' import { Button } from '@/shared/ui/button' import { Badge } from '@/shared/ui/badge' import { listAdminPlans, deletePlan } from '@/features/admin/plans/api' import { PlanFormDialog } from '@/features/admin/plans/PlanFormDialog' import { getPricingSettings } from '@/features/admin/pricing/api' import { applyDiscount, resolveDiscountPercent } from '@/shared/lib/pricing' import type { AdminPlanDto } from '@/shared/api/types' export const Route = createFileRoute('/admin/plans')({ component: AdminPlansPage }) function AdminPlansPage() { const { t } = useTranslation() const queryClient = useQueryClient() const [editing, setEditing] = useState(null) const { data, isLoading, isError, refetch } = useQuery({ queryKey: ['admin-plans'], queryFn: listAdminPlans }) const { data: pricing } = useQuery({ queryKey: ['admin-pricing'], queryFn: getPricingSettings }) const priceCell = (monthlyRate: number | null | undefined, configCount: number, months: number) => { if (monthlyRate == null) return {t('admin.plans.noPrice')} const original = monthlyRate * months * configCount const percent = resolveDiscountPercent(pricing?.discountTiers ?? [], configCount) if (percent <= 0) return {original} ₽ const discounted = applyDiscount(original, percent) return ( {original} ₽ {discounted} ₽ -{percent}% ) } const deleteMutation = useMutation({ mutationFn: deletePlan, onSuccess: async () => { toast.success(t('admin.plans.deleted')) await queryClient.invalidateQueries({ queryKey: ['admin-plans'] }) }, onError: () => toast.error(t('auth.genericError')), }) return (

{t('admin.plans.pageHint')}

{isLoading &&

} {isError && (

{t('auth.genericError')}

)} {data?.length === 0 &&

{t('admin.plans.empty')}

} {data && data.length > 0 && (
{data.map((plan) => ( ))}
{t('admin.plans.name')} {t('admin.plans.configCount')} {t('admin.plans.totalPerQuarter')} {t('admin.plans.totalHalfYear')} {t('admin.plans.totalPerYear')}
{plan.name} {!plan.isEnabled && {t('admin.plans.disabled')}} {plan.configCount} {priceCell(pricing?.pricePerConfigPerQuarter, plan.configCount, 3)} {priceCell(pricing?.pricePerConfigPerHalfYear, plan.configCount, 6)} {priceCell(pricing?.pricePerConfigPerYear, plan.configCount, 12)}
)} {editing && !open && setEditing(null)} />}
) }