feat: Implementa páginas para gerenciamento de tarefas e detalhes de obras, além de hooks de autenticação e dados, e um gerenciador de cache.
This commit is contained in:
@@ -67,9 +67,14 @@ export const useAuth = () => {
|
||||
|
||||
const { useUserStore } = await import('../stores/useUserStore');
|
||||
const profilePromise = useUserStore.getState().fetchCurrentUser(session.user.id);
|
||||
const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout fetchCurrentUser')), 15000));
|
||||
|
||||
let timeoutId: ReturnType<typeof setTimeout>;
|
||||
const timeoutPromise = new Promise((_, reject) => {
|
||||
timeoutId = setTimeout(() => reject(new Error('Timeout fetchCurrentUser')), 15000);
|
||||
});
|
||||
|
||||
await Promise.race([profilePromise, timeoutPromise]);
|
||||
clearTimeout(timeoutId!);
|
||||
console.log('✅ useAuth: Perfil carregado com sucesso');
|
||||
} catch (err) {
|
||||
console.error('❌ useAuth: Erro/Timeout ao carregar perfil:', err);
|
||||
@@ -134,8 +139,14 @@ export const useAuth = () => {
|
||||
|
||||
if (!currentUser || currentUser.id !== session.user.id) {
|
||||
const profilePromise = useUserStore.getState().fetchCurrentUser(session.user.id);
|
||||
const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout fetchCurrentUser AuthChange')), 15000));
|
||||
|
||||
let timeoutId: ReturnType<typeof setTimeout>;
|
||||
const timeoutPromise = new Promise((_, reject) => {
|
||||
timeoutId = setTimeout(() => reject(new Error('Timeout fetchCurrentUser AuthChange')), 15000);
|
||||
});
|
||||
|
||||
await Promise.race([profilePromise, timeoutPromise]);
|
||||
clearTimeout(timeoutId!);
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Erro/Timeout ao sincronizar perfil no AuthChange:', err);
|
||||
@@ -159,7 +170,10 @@ export const useAuth = () => {
|
||||
try {
|
||||
console.log('🔄 syncUserProfile: Sincronizando dados:', user.email);
|
||||
// Wrapper de timeout para operações de banco
|
||||
const dbTimeout = new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout syncUserProfile')), 15000));
|
||||
let fetchTimeoutId: ReturnType<typeof setTimeout>;
|
||||
const fetchTimeout = new Promise((_, reject) => {
|
||||
fetchTimeoutId = setTimeout(() => reject(new Error('Timeout syncUserProfile fetch')), 15000);
|
||||
});
|
||||
|
||||
// Verificar se o usuário existe na tabela usuarios
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
@@ -170,7 +184,8 @@ export const useAuth = () => {
|
||||
.single();
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const { data: existingUser, error: fetchError } = await Promise.race([fetchPromise, dbTimeout]) as any;
|
||||
const { data: existingUser, error: fetchError } = await Promise.race([fetchPromise, fetchTimeout]) as any;
|
||||
clearTimeout(fetchTimeoutId!);
|
||||
|
||||
if (fetchError && fetchError.code !== 'PGRST116') {
|
||||
console.error('Erro ao buscar usuário (Sync):', fetchError);
|
||||
@@ -179,6 +194,11 @@ export const useAuth = () => {
|
||||
|
||||
// Se não existe, criar registro na tabela usuarios
|
||||
if (!existingUser) {
|
||||
let insertTimeoutId: ReturnType<typeof setTimeout>;
|
||||
const insertTimeout = new Promise((_, reject) => {
|
||||
insertTimeoutId = setTimeout(() => reject(new Error('Timeout syncUserProfile insert')), 15000);
|
||||
});
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const insertPromise = (supabase as any)
|
||||
.from('usuarios')
|
||||
@@ -190,7 +210,8 @@ export const useAuth = () => {
|
||||
});
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const { error: insertError } = await Promise.race([insertPromise, dbTimeout]) as any;
|
||||
const { error: insertError } = await Promise.race([insertPromise, insertTimeout]) as any;
|
||||
clearTimeout(insertTimeoutId!);
|
||||
|
||||
if (insertError) {
|
||||
console.error('Erro ao criar perfil do usuário:', insertError);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useState, useEffect } from 'react';
|
||||
import { useState, useEffect, useCallback } from 'react';
|
||||
import { supabase } from '../lib/supabase';
|
||||
// import { useConfigStore } from '../stores/configStore';
|
||||
// import type { ConfigItem, CondicaoClimatica } from '../stores/configStore';
|
||||
@@ -9,11 +9,11 @@ import { supabase } from '../lib/supabase';
|
||||
export const useSupabaseData = () => {
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
|
||||
|
||||
// const configStore = useConfigStore();
|
||||
|
||||
// Carregar tipos de atividade do Supabase
|
||||
const loadTiposAtividade = async () => {
|
||||
const loadTiposAtividade = useCallback(async () => {
|
||||
try {
|
||||
console.log('🔄 Carregando tipos de atividade do Supabase...');
|
||||
const { data, error } = await supabase
|
||||
@@ -28,7 +28,7 @@ export const useSupabaseData = () => {
|
||||
}
|
||||
|
||||
console.log('✅ Tipos de atividade carregados:', data);
|
||||
|
||||
|
||||
// Converter dados do Supabase para o formato da store
|
||||
// const tiposAtividade: ConfigItem[] = data?.map((item, index) => ({
|
||||
// id: item.id.toString(),
|
||||
@@ -40,16 +40,16 @@ export const useSupabaseData = () => {
|
||||
// Atualizar store com dados do Supabase
|
||||
// configStore.tiposAtividade = tiposAtividade;
|
||||
console.log('📊 Tipos de atividade carregados:', data);
|
||||
|
||||
|
||||
return data || [];
|
||||
} catch (err) {
|
||||
console.error('❌ Erro ao carregar tipos de atividade:', err);
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
}, []);
|
||||
|
||||
// Carregar condições climáticas do Supabase
|
||||
const loadCondicoesClimaticas = async () => {
|
||||
const loadCondicoesClimaticas = useCallback(async () => {
|
||||
try {
|
||||
console.log('🔄 Carregando condições climáticas do Supabase...');
|
||||
const { data, error } = await supabase
|
||||
@@ -64,7 +64,7 @@ export const useSupabaseData = () => {
|
||||
}
|
||||
|
||||
console.log('✅ Condições climáticas carregadas:', data);
|
||||
|
||||
|
||||
// Converter dados do Supabase para o formato da store
|
||||
// const condicoesClimaticas: CondicaoClimatica[] = data?.map((item, index) => ({
|
||||
// id: item.id.toString(),
|
||||
@@ -78,20 +78,20 @@ export const useSupabaseData = () => {
|
||||
// Atualizar store com dados do Supabase
|
||||
// configStore.condicoesClimaticas = condicoesClimaticas;
|
||||
console.log('📊 Condições climáticas carregadas:', data);
|
||||
|
||||
|
||||
return data || [];
|
||||
} catch (err) {
|
||||
console.error('❌ Erro ao carregar condições climáticas:', err);
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
}, []);
|
||||
|
||||
// Carregar funcionários do Supabase
|
||||
const loadFuncionarios = async () => {
|
||||
const loadFuncionarios = useCallback(async () => {
|
||||
try {
|
||||
console.log('🔄 Carregando funcionários do Supabase...');
|
||||
const { data, error } = await supabase
|
||||
.from('funcionarios')
|
||||
.from('usuarios')
|
||||
.select('*')
|
||||
.eq('ativo', true)
|
||||
.order('nome');
|
||||
@@ -107,10 +107,10 @@ export const useSupabaseData = () => {
|
||||
console.error('❌ Erro ao carregar funcionários:', err);
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
}, []);
|
||||
|
||||
// Função principal para carregar todos os dados
|
||||
const loadAllData = async () => {
|
||||
const loadAllData = useCallback(async () => {
|
||||
try {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
@@ -130,12 +130,12 @@ export const useSupabaseData = () => {
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
}, [loadTiposAtividade, loadCondicoesClimaticas, loadFuncionarios]);
|
||||
|
||||
// Carregar dados automaticamente quando o hook é usado
|
||||
useEffect(() => {
|
||||
loadAllData();
|
||||
}, []);
|
||||
}, [loadAllData]);
|
||||
|
||||
return {
|
||||
loading,
|
||||
|
||||
Reference in New Issue
Block a user