Fix: TransactionForm prop type and service errors
Fixes the type error in `Transacoes.tsx` by ensuring the `TransactionForm` component receives the correct props, specifically addressing the missing `transaction` prop. Also resolves the type errors in `transacaoService.ts` related to incorrect argument types for number parameters.
This commit is contained in:
parent
6d6734c17d
commit
1c78451e07
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
import { useState } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
import { zodResolver } from '@hookform/resolvers/zod';
|
import { zodResolver } from '@hookform/resolvers/zod';
|
||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
@ -23,6 +23,8 @@ import {
|
|||||||
SelectValue
|
SelectValue
|
||||||
} from '@/components/ui/select';
|
} from '@/components/ui/select';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
import { Transaction } from '@/types/financialTypes';
|
||||||
|
import { updateTransacao } from '@/services/transacaoService';
|
||||||
|
|
||||||
const transactionSchema = z.object({
|
const transactionSchema = z.object({
|
||||||
estabelecimento: z.string().min(1, { message: 'Estabelecimento é obrigatório' }),
|
estabelecimento: z.string().min(1, { message: 'Estabelecimento é obrigatório' }),
|
||||||
@ -41,16 +43,25 @@ interface TransactionFormProps {
|
|||||||
onCancel: () => void;
|
onCancel: () => void;
|
||||||
defaultTipo?: 'receita' | 'despesa';
|
defaultTipo?: 'receita' | 'despesa';
|
||||||
grupoId?: string;
|
grupoId?: string;
|
||||||
|
transaction?: Transaction | null; // Added this property
|
||||||
|
isEditing?: boolean; // Added this property
|
||||||
}
|
}
|
||||||
|
|
||||||
export function TransactionForm({ onSuccess, onCancel, defaultTipo = 'despesa', grupoId }: TransactionFormProps) {
|
export function TransactionForm({
|
||||||
|
onSuccess,
|
||||||
|
onCancel,
|
||||||
|
defaultTipo = 'despesa',
|
||||||
|
grupoId,
|
||||||
|
transaction = null, // Default to null
|
||||||
|
isEditing = false // Default to false
|
||||||
|
}: TransactionFormProps) {
|
||||||
const [isSubmitting, setIsSubmitting] = useState(false);
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||||
const [grupos, setGrupos] = useState<{remote_jid: string, nome_grupo: string | null}[]>([]);
|
const [grupos, setGrupos] = useState<{remote_jid: string, nome_grupo: string | null}[]>([]);
|
||||||
const { toast } = useToast();
|
const { toast } = useToast();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
// Buscar grupos do usuário ao carregar o formulário
|
// Fetch user groups when the form loads
|
||||||
useState(() => {
|
useEffect(() => {
|
||||||
const fetchGrupos = async () => {
|
const fetchGrupos = async () => {
|
||||||
const userEmail = localStorage.getItem('userEmail');
|
const userEmail = localStorage.getItem('userEmail');
|
||||||
if (!userEmail) {
|
if (!userEmail) {
|
||||||
@ -73,18 +84,21 @@ export function TransactionForm({ onSuccess, onCancel, defaultTipo = 'despesa',
|
|||||||
};
|
};
|
||||||
|
|
||||||
fetchGrupos();
|
fetchGrupos();
|
||||||
});
|
}, []);
|
||||||
|
|
||||||
|
// Set up form with default values or transaction data if editing
|
||||||
const form = useForm<TransactionFormValues>({
|
const form = useForm<TransactionFormValues>({
|
||||||
resolver: zodResolver(transactionSchema),
|
resolver: zodResolver(transactionSchema),
|
||||||
defaultValues: {
|
defaultValues: {
|
||||||
estabelecimento: '',
|
estabelecimento: transaction?.estabelecimento || '',
|
||||||
valor: '',
|
valor: transaction ? String(Math.abs(transaction.valor)) : '',
|
||||||
detalhes: '',
|
detalhes: transaction?.detalhes || '',
|
||||||
categoria: '',
|
categoria: transaction?.categoria || '',
|
||||||
tipo: defaultTipo,
|
tipo: transaction?.tipo as 'receita' | 'despesa' || defaultTipo,
|
||||||
quando: new Date().toISOString().split('T')[0],
|
quando: transaction?.quando ?
|
||||||
grupo_id: grupoId || ''
|
new Date(transaction.quando).toISOString().split('T')[0] :
|
||||||
|
new Date().toISOString().split('T')[0],
|
||||||
|
grupo_id: transaction?.grupo_id || grupoId || ''
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -104,7 +118,7 @@ export function TransactionForm({ onSuccess, onCancel, defaultTipo = 'despesa',
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Normalizar o email (minúsculo e sem espaços)
|
// Normalize the email (lowercase and trim spaces)
|
||||||
const normalizedEmail = userEmail.trim().toLowerCase();
|
const normalizedEmail = userEmail.trim().toLowerCase();
|
||||||
|
|
||||||
// Get user ID from localStorage - kept for compatibility
|
// Get user ID from localStorage - kept for compatibility
|
||||||
@ -128,40 +142,63 @@ export function TransactionForm({ onSuccess, onCancel, defaultTipo = 'despesa',
|
|||||||
|
|
||||||
console.log(`Salvando transação para usuário: ${normalizedEmail} (ID: ${userId})`);
|
console.log(`Salvando transação para usuário: ${normalizedEmail} (ID: ${userId})`);
|
||||||
|
|
||||||
// Preparar dados da transação incluindo o login e grupo_id
|
// Handle editing vs creating new transaction
|
||||||
const transactionData = {
|
if (isEditing && transaction) {
|
||||||
user: userId, // Mantido por compatibilidade
|
// Update existing transaction
|
||||||
login: normalizedEmail, // Campo principal para identificação
|
const updatedTransaction = {
|
||||||
estabelecimento: data.estabelecimento,
|
...transaction,
|
||||||
valor: valorFinal,
|
estabelecimento: data.estabelecimento,
|
||||||
detalhes: data.detalhes,
|
valor: valorFinal,
|
||||||
categoria: data.categoria,
|
detalhes: data.detalhes,
|
||||||
tipo: data.tipo,
|
categoria: data.categoria,
|
||||||
quando: data.quando,
|
tipo: data.tipo,
|
||||||
grupo_id: data.grupo_id || null
|
quando: data.quando,
|
||||||
};
|
grupo_id: data.grupo_id || null
|
||||||
|
};
|
||||||
console.log('Dados da transação a serem salvos:', transactionData);
|
|
||||||
|
|
||||||
// With RLS disabled, we can insert directly to the fixed table
|
|
||||||
const { error } = await supabase
|
|
||||||
.from('transacoes')
|
|
||||||
.insert([transactionData]);
|
|
||||||
|
|
||||||
if (error) {
|
|
||||||
console.error('Erro ao salvar transação:', error);
|
|
||||||
|
|
||||||
|
await updateTransacao(updatedTransaction);
|
||||||
toast({
|
toast({
|
||||||
title: "Erro ao salvar",
|
title: "Transação atualizada",
|
||||||
description: `Não foi possível salvar a transação: ${error.message}`,
|
description: "Transação atualizada com sucesso",
|
||||||
variant: "destructive"
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
toast({
|
|
||||||
title: "Transação salva",
|
|
||||||
description: "Transação registrada com sucesso",
|
|
||||||
});
|
});
|
||||||
onSuccess();
|
onSuccess();
|
||||||
|
} else {
|
||||||
|
// Create new transaction
|
||||||
|
// Prepare transaction data including login and grupo_id
|
||||||
|
const transactionData = {
|
||||||
|
user: userId, // Kept for compatibility
|
||||||
|
login: normalizedEmail, // Main field for identification
|
||||||
|
estabelecimento: data.estabelecimento,
|
||||||
|
valor: valorFinal,
|
||||||
|
detalhes: data.detalhes,
|
||||||
|
categoria: data.categoria,
|
||||||
|
tipo: data.tipo,
|
||||||
|
quando: data.quando,
|
||||||
|
grupo_id: data.grupo_id || null
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log('Dados da transação a serem salvos:', transactionData);
|
||||||
|
|
||||||
|
// With RLS disabled, we can insert directly to the fixed table
|
||||||
|
const { error } = await supabase
|
||||||
|
.from('transacoes')
|
||||||
|
.insert([transactionData]);
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
console.error('Erro ao salvar transação:', error);
|
||||||
|
|
||||||
|
toast({
|
||||||
|
title: "Erro ao salvar",
|
||||||
|
description: `Não foi possível salvar a transação: ${error.message}`,
|
||||||
|
variant: "destructive"
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
toast({
|
||||||
|
title: "Transação salva",
|
||||||
|
description: "Transação registrada com sucesso",
|
||||||
|
});
|
||||||
|
onSuccess();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Erro ao processar formulário:', error);
|
console.error('Erro ao processar formulário:', error);
|
||||||
|
|||||||
@ -303,7 +303,7 @@ export async function deleteTransacao(id: string): Promise<void> {
|
|||||||
const { error } = await supabase
|
const { error } = await supabase
|
||||||
.from('transacoes')
|
.from('transacoes')
|
||||||
.delete()
|
.delete()
|
||||||
.eq('id', id);
|
.eq('id', parseInt(id)); // Convert string to number with parseInt
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
console.error('Erro ao excluir transação:', error);
|
console.error('Erro ao excluir transação:', error);
|
||||||
@ -350,7 +350,7 @@ export async function updateTransacao(transaction: Transaction): Promise<Transac
|
|||||||
const { data, error } = await supabase
|
const { data, error } = await supabase
|
||||||
.from('transacoes')
|
.from('transacoes')
|
||||||
.update(transacaoData)
|
.update(transacaoData)
|
||||||
.eq('id', transaction.id)
|
.eq('id', parseInt(transaction.id)) // Convert string to number with parseInt
|
||||||
.select('*')
|
.select('*')
|
||||||
.single();
|
.single();
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user