diff --git a/web/src/context/AppContext.tsx b/web/src/context/AppContext.tsx index 0a02a3c..c11955a 100644 --- a/web/src/context/AppContext.tsx +++ b/web/src/context/AppContext.tsx @@ -200,14 +200,14 @@ export const AppProvider = ({ children }: { children: React.ReactNode }) => { // Inserir na BD se necessário (fora do setState) if (needsInsert && shopId) { - const { error: insertErr } = await supabase.from('shops').insert([{ + const { error: insertErr } = await supabase.from('shops').upsert([{ id: shopId, name: shopNameToInsert, address: 'Endereço a definir', rating: 0, }]); - if (insertErr && insertErr.code !== '23505') { - console.error('Erro ao inserir shop:', insertErr); + if (insertErr) { + console.error('Erro ao inserir/atualizar shop inicial:', insertErr); } } }; @@ -442,8 +442,36 @@ export const AppProvider = ({ children }: { children: React.ReactNode }) => { }; const updateShopDetails: AppContextValue['updateShopDetails'] = async (shopId, payload) => { - const { error } = await supabase.from('shops').update(payload).eq('id', shopId); - if (error) { console.error('updateShopDetails error:', error); return; } + // Executa o update na Base de Dados e pede de volta a linha modificada para sabermos se o update afetou 0 linhas + const { data, error } = await supabase.from('shops').update(payload).eq('id', shopId).select(); + + // Se o supabase mandar um erro, mandamos o erro para fora para a UI apanhar + if (error) { + console.error('updateShopDetails error:', error); + throw error; + } + + // Se o update funcionou mas não afetou nenhuma linha (data.length === 0), significa que a loja NUNCA foi inserida com sucesso no registo antes (talvez por RLS ou porque o trigger não funcionou). + // Neste caso, forçamos um UPSERT completo! + if (data && data.length === 0) { + console.warn('A loja não existia na base de dados! Forçando a criação (upsert)...'); + + const existingShopLocal = state.shops.find(s => s.id === shopId); + const { error: upsertErr } = await supabase.from('shops').upsert({ + id: shopId, + name: existingShopLocal?.name || 'Barbearia', + address: existingShopLocal?.address || 'Endereço a definir', + rating: 0, + ...payload + }); + + if (upsertErr) { + console.error('Falha crítica ao forçar insert da loja:', upsertErr); + throw upsertErr; + } + } + + // Se tudo correr bem, atualiza o estado local setState((s) => ({ ...s, shops: s.shops.map((shop) => (shop.id === shopId ? { ...shop, ...payload } : shop)),