From 8131e26c778276fd4938e6eaea8f99815e855d20 Mon Sep 17 00:00:00 2001 From: Hermes Date: Wed, 19 Aug 2026 11:02:23 +0200 Subject: [PATCH] perf: load single order group by id in detail view instead of all 430 groups MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - add fetchOrderGroupById (single .eq(id).single() query) - useOrderGroups gains groupId mode: fetches one group, not full 2.6MB list - GroupDetailPage passes groupId — fixes 30-40s card open on slow connections --- src/hooks/useOrderGroups.js | 24 ++++++++++++++-- src/pages/GroupDetailPage.jsx | 2 +- src/services/supabase/orderGroupRepository.js | 28 +++++++++++++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/hooks/useOrderGroups.js b/src/hooks/useOrderGroups.js index 5704c5b..0d9c7df 100644 --- a/src/hooks/useOrderGroups.js +++ b/src/hooks/useOrderGroups.js @@ -1,5 +1,5 @@ import React from "react"; -import { assignDriverToOrderGroup, fetchOrderGroups, saveShipmentData, updateDeliveryStatus, updateOrderGroupDeliveryChoice } from "../services/supabase/orderGroupRepository"; +import { assignDriverToOrderGroup, fetchOrderGroupById, fetchOrderGroups, saveShipmentData, updateDeliveryStatus, updateOrderGroupDeliveryChoice } from "../services/supabase/orderGroupRepository"; import { buildOrderGroupBuckets, filterOrderGroups, @@ -9,7 +9,7 @@ import { } from "../services/orderGroupViews"; import { getErrorMessage } from "../utils/deliveryUtils"; -export const useOrderGroups = ({ enabled = true, details = false } = {}) => { +export const useOrderGroups = ({ enabled = true, details = false, groupId = null } = {}) => { const [orderGroups, setOrderGroups] = React.useState(() => []); const FILTERS_STORAGE_KEY = "supersam_order_filters"; const [filters, setFilters] = React.useState(() => { @@ -41,6 +41,24 @@ export const useOrderGroups = ({ enabled = true, details = false } = {}) => { if (!enabled) { setOrderGroups([]); setIsLoading(false); return; } + // Single-group mode: load only the requested group (avoids pulling all + // 430 groups with their full source_orders JSON — 2.6MB — for a detail view). + if (groupId) { + const singleResult = await fetchOrderGroupById(groupId); + if (!singleResult) { + return; + } + if (singleResult.error) { + setLoadError(singleResult.error?.message || "Не удалось загрузить группу доставки"); + setOrderGroups([]); + setIsLoading(false); + return; + } + setOrderGroups(singleResult.data ? [singleResult.data] : []); + setIsLoading(false); + return; + } + const groupsResult = await fetchOrderGroups({ details }); if (!groupsResult) { @@ -56,7 +74,7 @@ export const useOrderGroups = ({ enabled = true, details = false } = {}) => { setOrderGroups(groupsResult.data || []); setIsLoading(false); - }, [enabled, details]); + }, [enabled, details, groupId]); // Initial load React.useEffect(() => { diff --git a/src/pages/GroupDetailPage.jsx b/src/pages/GroupDetailPage.jsx index 084f448..a353d67 100644 --- a/src/pages/GroupDetailPage.jsx +++ b/src/pages/GroupDetailPage.jsx @@ -38,7 +38,7 @@ export const GroupDetailPage = () => { saveShipmentData, isLoading, refetch, - } = useOrderGroups({ details: true }); + } = useOrderGroups({ details: true, groupId }); // ── Drivers ──────────────────────────────────────────────────────────────── const [drivers, setDrivers] = React.useState([]); diff --git a/src/services/supabase/orderGroupRepository.js b/src/services/supabase/orderGroupRepository.js index 3181099..24d3d0f 100644 --- a/src/services/supabase/orderGroupRepository.js +++ b/src/services/supabase/orderGroupRepository.js @@ -594,3 +594,31 @@ export const fetchOrderGroups = async ({ details = true } = {}) => { }).filter(Boolean); }, "Ошибка загрузки групп доставки"); }; + +export const fetchOrderGroupById = async (orderGroupId) => { + return safeSupabaseCall(async () => { + const client = requireSupabase(); + const { data, error } = await client + .from("order_groups") + .select(ORDER_GROUP_SELECT_FIELDS) + .eq("id", orderGroupId) + .single(); + + if (error) { + throw error; + } + + const group = mapOrderGroupRowToDeliveryGroup(data); + if (group && group.assignedDriverId && !group.assignedDriverName) { + const { data: drivers, error: driversError } = await client.rpc("get_drivers"); + if (!driversError && drivers) { + const driver = drivers.find((d) => d.id === group.assignedDriverId); + if (driver) { + group.assignedDriverName = driver.name || driver.email; + } + } + } + + return group; + }, "Ошибка загрузки группы доставки"); +};