From 7dfdd91798db5b75b19c951ca3c9b895aad1952a Mon Sep 17 00:00:00 2001 From: root Date: Wed, 27 May 2026 15:30:33 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20comprehensive=20error=20logging=20?= =?UTF-8?q?=E2=80=94=20all=20errors=20now=20captured=20in=20client=5Ferror?= =?UTF-8?q?=5Flogs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - safeSupabaseCall: logs caught errors via logError - AuthContext: logs sendOtp, verifyOtp errors - ErrorLogPanel: fixed client→supabase reference in delete functions - AuthContext: sets window.__supersam_user_id__ on auth state change --- src/components/admin/ErrorLogPanel.jsx | 8 ++++---- src/context/AuthContext.jsx | 6 ++++++ src/services/safeSupabaseCall.js | 5 ++++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/components/admin/ErrorLogPanel.jsx b/src/components/admin/ErrorLogPanel.jsx index 00d2bd5..c91f933 100644 --- a/src/components/admin/ErrorLogPanel.jsx +++ b/src/components/admin/ErrorLogPanel.jsx @@ -138,7 +138,7 @@ export default function ErrorLogPanel() { if (selected.size === 0) return; if (!confirm(`Удалить ${selected.size} записей?`)) return; setDeleting(true); - const { error: err } = await client + const { error: err } = await supabase .from('client_error_logs') .delete() .in('id', Array.from(selected)); @@ -150,7 +150,7 @@ export default function ErrorLogPanel() { const handleDeleteAll = async () => { if (!confirm('Удалить ВСЕ записи об ошибках? Это необратимо.')) return; setDeleting(true); - const { error: err } = await client + const { error: err } = await supabase .from('client_error_logs') .delete() .neq('id', '00000000-0000-0000-0000-000000000000'); @@ -162,7 +162,7 @@ export default function ErrorLogPanel() { const handleDeleteOne = async (id) => { if (!confirm('Удалить эту запись?')) return; setDeleting(true); - const { error: err } = await client + const { error: err } = await supabase .from('client_error_logs') .delete() .eq('id', id); @@ -401,4 +401,4 @@ export default function ErrorLogPanel() { )} ); -} +} \ No newline at end of file diff --git a/src/context/AuthContext.jsx b/src/context/AuthContext.jsx index 072da50..51d2e6a 100644 --- a/src/context/AuthContext.jsx +++ b/src/context/AuthContext.jsx @@ -1,6 +1,7 @@ import React, { createContext, useContext, useEffect, useRef, useState } from "react"; import { demoUsers } from "../data/mockAppData"; import { supabase, hasSupabaseConfig } from "../supabaseClient"; +import { logError } from "../utils/errorLogger"; const AuthContext = createContext(null); const STORAGE_KEY = "construction-auth-local-user"; @@ -162,6 +163,7 @@ export const AuthProvider = ({ children }) => { if (!session?.user) { setUser(null); setAuthError(""); + window.__supersam_user_id__ = null; return; } @@ -171,6 +173,8 @@ export const AuthProvider = ({ children }) => { } const baseUser = mapSessionUserToAuthUser(session.user); + // Expose userId for error logger + window.__supersam_user_id__ = session.user?.id || null; if (baseUser) { fetchUserProfile(session.user.id).then((profile) => { if (profile) { @@ -257,6 +261,7 @@ export const AuthProvider = ({ children }) => { } catch (error) { const normalizedError = normalizeOtpError(error); setAuthError(normalizedError.message); + logError(error, { component: "AuthContext.sendOtp" }); return { success: false, error: normalizedError }; } finally { setIsLoading(false); @@ -326,6 +331,7 @@ export const AuthProvider = ({ children }) => { } catch (error) { const normalizedError = normalizeOtpError(error); setAuthError(normalizedError.message); + logError(error, { component: "AuthContext.verifyOtp" }); return { success: false, error: normalizedError }; } finally { setIsLoading(false); diff --git a/src/services/safeSupabaseCall.js b/src/services/safeSupabaseCall.js index 9b2fc33..1858b98 100644 --- a/src/services/safeSupabaseCall.js +++ b/src/services/safeSupabaseCall.js @@ -1,4 +1,5 @@ import logger from "../utils/logger"; +import { logError } from "../utils/errorLogger"; export const safeSupabaseCall = async (callback, fallbackMessage = "Ошибка Supabase") => { try { @@ -6,6 +7,8 @@ export const safeSupabaseCall = async (callback, fallbackMessage = "Ошибка return { data, error: null }; } catch (error) { logger.error(fallbackMessage, error); + // Also log to client_error_logs for admin visibility + logError(error, { component: "safeSupabaseCall", props: { fallbackMessage } }); return { data: null, error }; } -}; +}; \ No newline at end of file