From 34a2f10b67236137d7aba7e23066de0cfbb5b927 Mon Sep 17 00:00:00 2001 From: houseassassin Date: Thu, 7 May 2026 20:19:45 +0300 Subject: [PATCH] fix: useOrders unmount guard, log event errors, complete status coverage in tests --- src/admin/orders/__tests__/useOrders.test.js | 1 + src/admin/orders/useOrders.js | 33 +++++++++++++++++--- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/admin/orders/__tests__/useOrders.test.js b/src/admin/orders/__tests__/useOrders.test.js index 9ed347a..42b6171 100644 --- a/src/admin/orders/__tests__/useOrders.test.js +++ b/src/admin/orders/__tests__/useOrders.test.js @@ -69,6 +69,7 @@ describe('useOrders', () => { await act(async () => {}); expect(result.current.ordersByStatus['новая']).toHaveLength(2); expect(result.current.ordersByStatus['замер']).toHaveLength(1); + expect(result.current.ordersByStatus['согласование']).toHaveLength(0); expect(result.current.ordersByStatus['монтаж']).toHaveLength(0); expect(result.current.ordersByStatus['закрыт']).toHaveLength(0); }); diff --git a/src/admin/orders/useOrders.js b/src/admin/orders/useOrders.js index ec65182..ab1b2bf 100644 --- a/src/admin/orders/useOrders.js +++ b/src/admin/orders/useOrders.js @@ -23,14 +23,34 @@ export function useOrders() { }, []); useEffect(() => { - fetchOrders(); + let active = true; + + const fetchOnMount = async () => { + const { data, error } = await supabase + .from('orders') + .select('*') + .order('created_at', { ascending: false }); + + if (!active) return; + if (error) { + setError(error.message); + } else { + setOrders(data || []); + } + setLoading(false); + }; + + fetchOnMount(); const channel = supabase .channel('orders-realtime') .on('postgres_changes', { event: '*', schema: 'public', table: 'orders' }, fetchOrders) .subscribe(); - return () => supabase.removeChannel(channel); + return () => { + active = false; + supabase.removeChannel(channel); + }; }, [fetchOrders]); const ordersByStatus = STATUSES.reduce((acc, status) => { @@ -46,12 +66,13 @@ export function useOrders() { const { error } = await supabase.from('orders').update(updates).eq('id', orderId); if (!error) { - await supabase.from('order_events').insert({ + const { error: evtErr } = await supabase.from('order_events').insert({ order_id: orderId, created_by: userEmail, event_type: 'status_change', description: `Статус изменён: ${order?.status} → ${newStatus}`, }); + if (evtErr) console.error('Failed to log order event:', evtErr); } return { error }; }; @@ -64,12 +85,13 @@ export function useOrders() { .single(); if (!error && data) { - await supabase.from('order_events').insert({ + const { error: evtErr } = await supabase.from('order_events').insert({ order_id: data.id, created_by: userEmail, event_type: 'status_change', description: 'Заявка создана вручную', }); + if (evtErr) console.error('Failed to log order event:', evtErr); } return { data, error }; }; @@ -77,12 +99,13 @@ export function useOrders() { const updateOrder = async (orderId, updates, userEmail) => { const { error } = await supabase.from('orders').update(updates).eq('id', orderId); if (!error) { - await supabase.from('order_events').insert({ + const { error: evtErr } = await supabase.from('order_events').insert({ order_id: orderId, created_by: userEmail, event_type: 'edit', description: 'Данные заказа обновлены', }); + if (evtErr) console.error('Failed to log order event:', evtErr); } return { error }; };