fix: useOrders unmount guard, log event errors, complete status coverage in tests
This commit is contained in:
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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 };
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user