mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-29 18:13:47 +00:00
feat(sales-stats): душевные карточки с иконками + фикс скачка при смене периода
- StatCard: иконка в мягком цветном чипе (tone success/accent/warning/…) в духе статистики Remnawave; дельта под значением. Обратно совместимо (valueClassName). - Карточки сводки получили осмысленные иконки (доход/подписки/триалы/конверсия/ продления/допы/пополнения) и цветовые тоны. - Скачок при переключении периодов убран: на все запросы статистики добавлен placeholderData: keepPreviousData — старые данные остаются на экране, пока грузятся новые, без вспышки скелетона и прыжка вёрстки.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import { useMemo } from 'react';
|
||||
import { useQuery } from '@tanstack/react-query';
|
||||
import { keepPreviousData, useQuery } from '@tanstack/react-query';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import type { SalesStatsParams } from '../../api/adminSalesStats';
|
||||
@@ -23,6 +23,7 @@ export function AddonsTab({ params }: AddonsTabProps) {
|
||||
queryKey: ['sales-stats', 'addons', params],
|
||||
queryFn: () => salesStatsApi.getAddons(params),
|
||||
staleTime: SALES_STATS.STALE_TIME,
|
||||
placeholderData: keepPreviousData,
|
||||
});
|
||||
|
||||
const dailyChartData = useMemo(() => {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { useCallback, useMemo } from 'react';
|
||||
import { useQuery } from '@tanstack/react-query';
|
||||
import { keepPreviousData, useQuery } from '@tanstack/react-query';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import type { SalesStatsParams } from '../../api/adminSalesStats';
|
||||
@@ -27,6 +27,7 @@ export function DepositsTab({ params }: DepositsTabProps) {
|
||||
queryKey: ['sales-stats', 'deposits', params],
|
||||
queryFn: () => salesStatsApi.getDeposits(params),
|
||||
staleTime: SALES_STATS.STALE_TIME,
|
||||
placeholderData: keepPreviousData,
|
||||
});
|
||||
|
||||
const formatValue = useCallback((v: number) => formatWithCurrency(v), [formatWithCurrency]);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useQuery } from '@tanstack/react-query';
|
||||
import { keepPreviousData, useQuery } from '@tanstack/react-query';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import type { SalesStatsParams } from '../../api/adminSalesStats';
|
||||
@@ -22,6 +22,7 @@ export function RenewalsTab({ params }: RenewalsTabProps) {
|
||||
queryKey: ['sales-stats', 'renewals', params],
|
||||
queryFn: () => salesStatsApi.getRenewals(params),
|
||||
staleTime: SALES_STATS.STALE_TIME,
|
||||
placeholderData: keepPreviousData,
|
||||
});
|
||||
|
||||
if (isLoading) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { useMemo } from 'react';
|
||||
import { useQuery } from '@tanstack/react-query';
|
||||
import { keepPreviousData, useQuery } from '@tanstack/react-query';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import type { SalesStatsParams } from '../../api/adminSalesStats';
|
||||
@@ -25,6 +25,7 @@ export function SalesTab({ params }: SalesTabProps) {
|
||||
queryKey: ['sales-stats', 'sales', params],
|
||||
queryFn: () => salesStatsApi.getSales(params),
|
||||
staleTime: SALES_STATS.STALE_TIME,
|
||||
placeholderData: keepPreviousData,
|
||||
});
|
||||
|
||||
const dailyByTariffData = useMemo(
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useQuery } from '@tanstack/react-query';
|
||||
import { keepPreviousData, useQuery } from '@tanstack/react-query';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import type { SalesStatsParams } from '../../api/adminSalesStats';
|
||||
@@ -29,6 +29,7 @@ export function TrialsTab({ params }: TrialsTabProps) {
|
||||
queryKey: ['sales-stats', 'trials', params],
|
||||
queryFn: () => salesStatsApi.getTrials(params),
|
||||
staleTime: SALES_STATS.STALE_TIME,
|
||||
placeholderData: keepPreviousData,
|
||||
});
|
||||
|
||||
if (isLoading) {
|
||||
|
||||
Reference in New Issue
Block a user