From 39b9b8e1d2690c894ce08b0ce16d4780ecffee09 Mon Sep 17 00:00:00 2001 From: Fringg Date: Fri, 7 Aug 2026 15:27:17 +0300 Subject: [PATCH] =?UTF-8?q?fix(dashboard):=20=D1=81=D1=87=D1=91=D1=82?= =?UTF-8?q?=D1=87=D0=B8=D0=BA=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81?= =?UTF-8?q?=D1=82=D0=B2=20=D0=B2=20=D0=BF=D0=BB=D0=B8=D1=82=D0=BA=D0=B5=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B3=D0=BB=D0=B0=D0=B2=D0=BD=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Дополнения к PR #544 при мерже. Плитка на главной берёт число подключённых устройств из запроса ['devices'], а он выключен ровно там, где плитка живёт: `enabled: !!subscription && !isMultiTariff`, тогда как блок с плиткой рендерится в мультитарифной ветке, где `subscription` всегда null (свой запрос отключён по !isMultiTariff). То есть счётчик показывал бы «0 из N» всегда, лимит устройств не срабатывал бы никогда, а точки-индикаторы стояли бы пустыми — при том, что счётчик и есть смысл плитки. Добавлен запрос по конкретной подписке: getDevices принимает subscription_id, ключ ['devices', id] — тот же, что на странице подписки, поэтому кэш общий и лишнего похода в сеть при переходе туда не будет. Заодно вынес выбор единственной подписки в переменную, чтобы условие показа и данные плитки не разъезжались. Отдельно поправлен потерянный пробел в className: `duration-300${...}` склеивал класс в `duration-300cursor-not-allowed`, из-за чего оформление заблокированной плитки не применялось. Баг приехал вместе с переносом из SubscriptionCardActive (там он с самого начала), но раз компонент всё равно выделяется — чиню здесь. --- .../dashboard/ConnectDeviceTile.tsx | 2 +- src/pages/Dashboard.tsx | 30 ++++++++++++++----- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/components/dashboard/ConnectDeviceTile.tsx b/src/components/dashboard/ConnectDeviceTile.tsx index 12a9387..49929f3 100644 --- a/src/components/dashboard/ConnectDeviceTile.tsx +++ b/src/components/dashboard/ConnectDeviceTile.tsx @@ -53,7 +53,7 @@ export default function ConnectDeviceTile({ } navigate(`/connection?sub=${subscription.id}`); }} - className={`mb-2.5 flex w-full items-center gap-3.5 rounded-[14px] p-3.5 text-left transition-shadow duration-300${isAtDeviceLimit ? 'cursor-not-allowed opacity-50' : ''}`} + className={`mb-2.5 flex w-full items-center gap-3.5 rounded-[14px] p-3.5 text-left transition-shadow duration-300 ${isAtDeviceLimit ? 'cursor-not-allowed opacity-50' : ''}`} data-onboarding="connect-devices" style={{ fontFamily: 'inherit' }} > diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index 7404dc9..6b15a8d 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -80,6 +80,24 @@ export default function Dashboard() { staleTime: API.BALANCE_STALE_TIME_MS, }); + // Плитка «Подключить устройство» на главной живёт в МУЛЬТИТАРИФНОЙ ветке, а + // запрос выше там выключен: он привязан к одиночной подписке (`subscription` + // в мультитарифе всегда null). Без отдельного запроса счётчик плитки всегда + // показывал бы «0 из N», а лимит устройств не срабатывал бы никогда — то + // есть ровно то, ради чего плитку и добавили, не работало бы. + // Ключ ['devices', id] — тот же, что на странице подписки, так что кэш общий. + const homeSingleSub = + isMultiTariff && multiSubData?.subscriptions?.length === 1 + ? multiSubData.subscriptions[0] + : null; + + const { data: homeSingleSubDevices } = useQuery({ + queryKey: ['devices', homeSingleSub?.id], + queryFn: () => subscriptionApi.getDevices(homeSingleSub?.id), + enabled: !!homeSingleSub, + staleTime: API.BALANCE_STALE_TIME_MS, + }); + const { data: referralInfo, isLoading: refLoading } = useQuery({ queryKey: ['referral-info'], queryFn: referralApi.getReferralInfo, @@ -306,18 +324,16 @@ export default function Dashboard() { и человек попадает на главную с готовым доступом. Пока подписка одна, показываем здесь же, как подключить устройство: иначе за этим нужно уходить на отдельную страницу, о чём он не догадается. */} - {multiSubData.subscriptions.length === 1 && ( + {homeSingleSub && ( 0 + homeSingleSub.traffic_limit_gb > 0 ? Math.min( 100, Math.round( - (multiSubData.subscriptions[0].traffic_used_gb / - multiSubData.subscriptions[0].traffic_limit_gb) * - 100, + (homeSingleSub.traffic_used_gb / homeSingleSub.traffic_limit_gb) * 100, ), ) : 0