refactor(frontend): type legacy cart management flow

This commit is contained in:
Tiago Yamamoto 2026-03-07 08:17:12 -06:00
parent a1eb0efc72
commit 7e3604ed4a
6 changed files with 158 additions and 144 deletions

View file

@ -1,24 +1,24 @@
'use client'; 'use client';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
import { getCurrentUserWithRetry } from '@/lib/appwrite'; // Usar a função com retry import { getCurrentUserWithRetry } from '@/lib/appwrite';
import { Models } from '@/lib/appwrite'; import { Models } from '@/lib/appwrite';
import { List, Plus } from 'lucide-react'; import { List, Plus } from 'lucide-react';
import Header from '@/components/Header'; import Header from '@/components/Header';
import CarrinhoForm from '@/components/CarrinhoForm'; import CarrinhoForm from '@/components/CarrinhoForm';
import CarrinhoList from '@/components/CarrinhoList'; import CarrinhoList from '@/components/CarrinhoList';
import { useCarrinhos, CarrinhoFormData } from '@/hooks/useCarrinhos'; import { useCarrinhos, CarrinhoFormData } from '@/hooks/useCarrinhos';
import { CarrinhoDocument } from '@/types/legacyEntities';
const GestaoCarrinhos = () => { const GestaoCarrinhos = () => {
const router = useRouter(); const router = useRouter();
const [user, setUser] = useState<Models.User<Models.Preferences> | null>(null); const [user, setUser] = useState<Models.User<Models.Preferences> | null>(null);
const [editing, setEditing] = useState<Models.Document | null>(null); const [editing, setEditing] = useState<CarrinhoDocument | null>(null);
const [activeTab, setActiveTab] = useState<'lista' | 'cadastro'>('lista'); const [activeTab, setActiveTab] = useState<'lista' | 'cadastro'>('lista');
const [searchTerm, setSearchTerm] = useState(''); const [searchTerm, setSearchTerm] = useState('');
const [checkingAuth, setCheckingAuth] = useState(true); const [checkingAuth, setCheckingAuth] = useState(true);
// Mover o hook useCarrinhos para antes da renderização condicional
const { const {
carrinhos, carrinhos,
loading, loading,
@ -44,10 +44,9 @@ const GestaoCarrinhos = () => {
return; return;
} }
setUser(currentUser); setUser(currentUser);
// Carregar carrinhos apenas após autenticação bem-sucedida
await listarCarrinhos(); await listarCarrinhos();
} catch (error) { } catch (error) {
console.error('❌ Usuário não autenticado:', error); console.error('Usuário não autenticado:', error);
router.push('/'); router.push('/');
} finally { } finally {
setCheckingAuth(false); setCheckingAuth(false);
@ -55,7 +54,7 @@ const GestaoCarrinhos = () => {
}; };
initializeUser(); initializeUser();
}, [router]); // Remover listarCarrinhos das dependências }, [router, listarCarrinhos]);
const handleFormSubmit = async (formData: CarrinhoFormData): Promise<boolean> => { const handleFormSubmit = async (formData: CarrinhoFormData): Promise<boolean> => {
if (editing) { if (editing) {
@ -65,17 +64,17 @@ const GestaoCarrinhos = () => {
setActiveTab('lista'); setActiveTab('lista');
} }
return success; return success;
} else {
const success = await cadastrarCarrinho(formData);
if (success) {
setTimeout(() => setActiveTab('lista'), 2000);
}
return success;
} }
const success = await cadastrarCarrinho(formData);
if (success) {
setTimeout(() => setActiveTab('lista'), 2000);
}
return success;
}; };
const handleEdit = (car: Models.Document) => { const handleEdit = (carrinho: CarrinhoDocument) => {
setEditing(car); setEditing(carrinho);
setActiveTab('cadastro'); setActiveTab('cadastro');
}; };
@ -94,9 +93,10 @@ const GestaoCarrinhos = () => {
setSearchTerm(term); setSearchTerm(term);
if (term.trim()) { if (term.trim()) {
await buscarCarrinhos(term, 1); await buscarCarrinhos(term, 1);
} else { return;
await listarCarrinhos(1);
} }
await listarCarrinhos(1);
}; };
const handleNextPage = () => { const handleNextPage = () => {
@ -106,24 +106,12 @@ const GestaoCarrinhos = () => {
} }
}; };
// Tela de carregamento durante verificação de autenticação if (checkingAuth || !user) {
if (checkingAuth) {
return ( return (
<div className="min-h-screen bg-gray-50 flex items-center justify-center"> <div className="min-h-screen bg-gray-50 flex items-center justify-center">
<div className="text-center"> <div className="text-center">
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4"></div> <div className="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4"></div>
<p className="text-gray-600">Verificando autenticação...</p> <p className="text-gray-600">Verificando autenticação...</p>
</div>
</div>
);
}
if (!user) {
return (
<div className="min-h-screen bg-gray-50 flex items-center justify-center">
<div className="text-center">
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4"></div>
<p className="text-gray-600">Verificando autenticação...</p>
</div> </div>
</div> </div>
); );
@ -133,7 +121,7 @@ const GestaoCarrinhos = () => {
<div className="min-h-screen bg-gray-50"> <div className="min-h-screen bg-gray-50">
<Header <Header
user={user} user={user}
title="Gestão de Carrinhos" title="Gestão de Carrinhos"
subtitle="Gerencie os carrinhos da plataforma SaveInMed" subtitle="Gerencie os carrinhos da plataforma SaveInMed"
/> />

View file

@ -1,22 +1,27 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import { Models } from '@/lib/appwrite';
import { CarrinhoFormData } from '@/hooks/useCarrinhos'; import { CarrinhoFormData } from '@/hooks/useCarrinhos';
import { usuarioService } from '@/services/usuarioService'; import { usuarioService } from '@/services/usuarioService';
import { CarrinhoDocument } from '@/types/legacyEntities';
interface CarrinhoFormProps { interface CarrinhoFormProps {
onSubmit: (data: CarrinhoFormData) => Promise<boolean>; onSubmit: (data: CarrinhoFormData) => Promise<boolean>;
onCancel?: () => void; onCancel?: () => void;
initialData?: Models.Document | null; initialData?: CarrinhoDocument | null;
loading?: boolean; loading?: boolean;
} }
interface UsuarioOption {
$id: string;
'nome-civil'?: string;
'nome-social'?: string;
}
const CarrinhoForm: React.FC<CarrinhoFormProps> = ({ const CarrinhoForm: React.FC<CarrinhoFormProps> = ({
onSubmit, onSubmit,
onCancel, onCancel,
initialData, initialData,
loading = false loading = false
}) => { }) => {
// Inicializar com valores padrão para evitar problemas de input controlado/não controlado
const [formData, setFormData] = useState<CarrinhoFormData>({ const [formData, setFormData] = useState<CarrinhoFormData>({
usuarios: '', usuarios: '',
itens: [], itens: [],
@ -24,24 +29,21 @@ const CarrinhoForm: React.FC<CarrinhoFormProps> = ({
}); });
const [itemsText, setItemsText] = useState(''); const [itemsText, setItemsText] = useState('');
const [quantText, setQuantText] = useState(''); const [quantText, setQuantText] = useState('');
const [usuariosList, setUsuariosList] = useState<Models.Document[]>([]); const [usuariosList, setUsuariosList] = useState<UsuarioOption[]>([]);
const [message, setMessage] = useState<{ type: 'success' | 'error'; text: string } | null>(null); const [message, setMessage] = useState<{ type: 'success' | 'error'; text: string } | null>(null);
useEffect(() => { useEffect(() => {
if (initialData) { if (initialData) {
const usuarios = (initialData as any).usuarios || ''; const usuarios = typeof initialData.usuarios === 'string'
const itens = (initialData as any).itens || []; ? initialData.usuarios
const quantidade = (initialData as any).quantidade || []; : initialData.usuarios?.$id || '';
const itens = initialData.itens || [];
setFormData({ const quantidade = Array.isArray(initialData.quantidade) ? initialData.quantidade : [];
usuarios,
itens, setFormData({ usuarios, itens, quantidade });
quantidade
});
setItemsText(itens.join('\n')); setItemsText(itens.join('\n'));
setQuantText(quantidade.join('\n')); setQuantText(quantidade.join('\n'));
} else { } else {
// Resetar para valores padrão
setFormData({ usuarios: '', itens: [], quantidade: [] }); setFormData({ usuarios: '', itens: [], quantidade: [] });
setItemsText(''); setItemsText('');
setQuantText(''); setQuantText('');
@ -53,10 +55,10 @@ const CarrinhoForm: React.FC<CarrinhoFormProps> = ({
try { try {
const res = await usuarioService.listar(1, 50); const res = await usuarioService.listar(1, 50);
if (res.success) { if (res.success) {
setUsuariosList(res.documents); setUsuariosList((res.documents || []) as UsuarioOption[]);
} }
} catch (error) { } catch (error) {
console.error('Erro ao carregar usuários:', error); console.error('Erro ao carregar usuários:', error);
} }
}; };
loadUsuarios(); loadUsuarios();
@ -76,7 +78,7 @@ const CarrinhoForm: React.FC<CarrinhoFormProps> = ({
if (success) { if (success) {
setMessage({ setMessage({
type: 'success', type: 'success',
text: initialData ? '🔄 Carrinho atualizado com sucesso!' : '🎉 Carrinho cadastrado com sucesso!' text: initialData ? 'Carrinho atualizado com sucesso!' : 'Carrinho cadastrado com sucesso!'
}); });
if (!initialData) { if (!initialData) {
@ -111,12 +113,12 @@ const CarrinhoForm: React.FC<CarrinhoFormProps> = ({
return ( return (
<div className="max-w-2xl mx-auto bg-white p-6 rounded-lg shadow-md"> <div className="max-w-2xl mx-auto bg-white p-6 rounded-lg shadow-md">
<h2 className="text-2xl font-bold mb-6 text-gray-800"> <h2 className="text-2xl font-bold mb-6 text-gray-800">
{initialData ? '✏️ Editar Carrinho' : 'Cadastrar Novo Carrinho'} {initialData ? 'Editar Carrinho' : 'Cadastrar Novo Carrinho'}
</h2> </h2>
{message && ( {message && (
<div className={`mb-4 p-4 rounded-md ${ <div className={`mb-4 p-4 rounded-md ${
message.type === 'success' message.type === 'success'
? 'bg-green-100 border border-green-400 text-green-700' ? 'bg-green-100 border border-green-400 text-green-700'
: 'bg-red-100 border border-red-400 text-red-700' : 'bg-red-100 border border-red-400 text-red-700'
}`}> }`}>
@ -127,20 +129,20 @@ const CarrinhoForm: React.FC<CarrinhoFormProps> = ({
<form onSubmit={handleSubmit} className="space-y-6"> <form onSubmit={handleSubmit} className="space-y-6">
<div> <div>
<label htmlFor="usuarios" className="block text-sm font-medium text-gray-700 mb-2"> <label htmlFor="usuarios" className="block text-sm font-medium text-gray-700 mb-2">
Usuário * Usuário *
</label> </label>
<select <select
id="usuarios" id="usuarios"
name="usuarios" name="usuarios"
value={formData.usuarios} // Sempre controlado value={formData.usuarios}
onChange={handleInputChange} onChange={handleInputChange}
required required
className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
> >
<option value="">Selecione um usuário</option> <option value="">Selecione um usuário</option>
{usuariosList.map((usuario) => ( {usuariosList.map((usuario) => (
<option key={usuario.$id} value={usuario.$id}> <option key={usuario.$id} value={usuario.$id}>
{(usuario as any)['nome-civil'] || (usuario as any)['nome-social'] || usuario.$id} {usuario['nome-civil'] || usuario['nome-social'] || usuario.$id}
</option> </option>
))} ))}
</select> </select>
@ -153,7 +155,7 @@ const CarrinhoForm: React.FC<CarrinhoFormProps> = ({
<textarea <textarea
id="itens" id="itens"
name="itens" name="itens"
value={itemsText} // Sempre controlado value={itemsText}
onChange={handleInputChange} onChange={handleInputChange}
rows={4} rows={4}
required required
@ -169,7 +171,7 @@ const CarrinhoForm: React.FC<CarrinhoFormProps> = ({
<textarea <textarea
id="quantidade" id="quantidade"
name="quantidade" name="quantidade"
value={quantText} // Sempre controlado value={quantText}
onChange={handleInputChange} onChange={handleInputChange}
rows={4} rows={4}
required required
@ -190,7 +192,7 @@ const CarrinhoForm: React.FC<CarrinhoFormProps> = ({
{initialData ? 'Atualizando...' : 'Cadastrando...'} {initialData ? 'Atualizando...' : 'Cadastrando...'}
</div> </div>
) : ( ) : (
initialData ? '🔄 Atualizar Carrinho' : 'Cadastrar Carrinho' initialData ? 'Atualizar Carrinho' : 'Cadastrar Carrinho'
)} )}
</button> </button>

View file

@ -1,22 +1,21 @@
import React from 'react'; import React from 'react';
import { Models } from '@/lib/appwrite';
import SearchBar from './SearchBar'; import SearchBar from './SearchBar';
import RefreshButton from './RefreshButton'; import RefreshButton from './RefreshButton';
import ListHeader from './ListHeader'; import ListHeader from './ListHeader';
import DataTable, { Column } from './DataTable'; import DataTable, { Column } from './DataTable';
import Pagination from './Pagination'; import Pagination from './Pagination';
import ActionButton from './ActionButton'; import TableActions from './TableActions';
import TableActions from './TableActions'; // Adicionar esta importação import { CarrinhoDocument } from '@/types/legacyEntities';
interface Props { interface Props {
carrinhos: Models.Document[]; carrinhos: CarrinhoDocument[];
loading: boolean; loading: boolean;
isChangingPage?: boolean; isChangingPage?: boolean;
error: string | null; error: string | null;
totalCarrinhos: number; totalCarrinhos: number;
currentPage: number; currentPage: number;
pageSize: number; pageSize: number;
onEdit: (doc: Models.Document) => void; onEdit: (doc: CarrinhoDocument) => void;
onDelete: (id: string) => Promise<boolean>; onDelete: (id: string) => Promise<boolean>;
onRefresh: () => void; onRefresh: () => void;
onPrevPage: () => void; onPrevPage: () => void;
@ -24,16 +23,14 @@ interface Props {
onSearch: (usuario: string) => void; onSearch: (usuario: string) => void;
} }
const columns: Column<Models.Document>[] = [ const columns: Column<CarrinhoDocument>[] = [
{ {
key: 'usuarios', key: 'usuarios',
header: 'Usuário', header: 'Usuário',
render: row => { render: row => {
const usuario = (row as any).usuarios; const usuario = row.usuarios;
if (usuario && typeof usuario === 'object') { if (usuario && typeof usuario === 'object') {
return ( return usuario['nome-civil'] || usuario['nome-social'] || usuario.$id || '';
usuario['nome-civil'] || usuario['nome-social'] || usuario.$id || ''
);
} }
return usuario; return usuario;
} }
@ -41,15 +38,15 @@ const columns: Column<Models.Document>[] = [
{ {
key: 'itens', key: 'itens',
header: 'Itens', header: 'Itens',
render: row => ((row as any).itens || []).join(', ') render: row => (row.itens || []).join(', ')
}, },
{ {
key: 'quantidades', key: 'quantidades',
header: 'Quantidades', header: 'Quantidades',
className: 'text-center', className: 'text-center',
render: row => { render: row => {
const quantidades = (row as any).quantidades; const quantidades = row.quantidades;
const valor = Array.isArray(quantidades) const valor = Array.isArray(quantidades)
? quantidades.join(', ') ? quantidades.join(', ')
: typeof quantidades === 'number' : typeof quantidades === 'number'
? quantidades.toString() ? quantidades.toString()
@ -93,7 +90,7 @@ const CarrinhoList: React.FC<Props> = ({
value={search} value={search}
onChange={setSearch} onChange={setSearch}
onSearch={handleSearch} onSearch={handleSearch}
placeholder="Buscar usuário" placeholder="Buscar usuário"
/> />
<RefreshButton onClick={onRefresh} loading={loading} /> <RefreshButton onClick={onRefresh} loading={loading} />
</ListHeader> </ListHeader>
@ -108,7 +105,7 @@ const CarrinhoList: React.FC<Props> = ({
<div className="bg-blue-50 border border-blue-200 rounded-md p-3 mb-4"> <div className="bg-blue-50 border border-blue-200 rounded-md p-3 mb-4">
<div className="flex items-center"> <div className="flex items-center">
<div className="animate-spin rounded-full h-4 w-4 border-b-2 border-blue-600 mr-2"></div> <div className="animate-spin rounded-full h-4 w-4 border-b-2 border-blue-600 mr-2"></div>
<span className="text-blue-800 text-sm">Carregando página...</span> <span className="text-blue-800 text-sm">Carregando página...</span>
</div> </div>
</div> </div>
)} )}

View file

@ -1,7 +1,6 @@
// @ts-nocheck
import { useState, useCallback, useRef, useEffect } from 'react'; import { useState, useCallback, useRef, useEffect } from 'react';
import { Models } from '@/lib/appwrite';
import { carrinhoService } from '@/services/carrinhoService'; import { carrinhoService } from '@/services/carrinhoService';
import { CarrinhoDocument } from '@/types/legacyEntities';
export interface CarrinhoFormData { export interface CarrinhoFormData {
usuarios: string; usuarios: string;
@ -10,7 +9,7 @@ export interface CarrinhoFormData {
} }
export interface UseCarrinhosReturn { export interface UseCarrinhosReturn {
carrinhos: Models.Document[]; carrinhos: CarrinhoDocument[];
loading: boolean; loading: boolean;
isChangingPage: boolean; isChangingPage: boolean;
isCreating: boolean; isCreating: boolean;
@ -30,7 +29,7 @@ export interface UseCarrinhosReturn {
const PAGE_SIZE = 10; const PAGE_SIZE = 10;
export const useCarrinhos = (): UseCarrinhosReturn => { export const useCarrinhos = (): UseCarrinhosReturn => {
const [carrinhos, setCarrinhos] = useState<Models.Document[]>([]); const [carrinhos, setCarrinhos] = useState<CarrinhoDocument[]>([]);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null); const [error, setError] = useState<string | null>(null);
const [totalCarrinhos, setTotalCarrinhos] = useState(0); const [totalCarrinhos, setTotalCarrinhos] = useState(0);
@ -40,11 +39,10 @@ export const useCarrinhos = (): UseCarrinhosReturn => {
const [searchTerm, setSearchTerm] = useState(''); const [searchTerm, setSearchTerm] = useState('');
const isInitialMount = useRef(true); const isInitialMount = useRef(true);
const listarCarrinhos = useCallback( const listarCarrinhos = useCallback(async (page = currentPage, search = searchTerm) => {
async (page = currentPage, search = searchTerm) => { setIsChangingPage(true);
setIsChangingPage(true); setLoading(true);
setLoading(true); setError(null);
setError(null);
try { try {
const response = search.trim() const response = search.trim()
@ -56,47 +54,42 @@ export const useCarrinhos = (): UseCarrinhosReturn => {
setTotalCarrinhos(response.total || 0); setTotalCarrinhos(response.total || 0);
setCurrentPage(page); setCurrentPage(page);
setSearchTerm(search); setSearchTerm(search);
} else { return;
setError(response.error || 'Erro ao carregar carrinhos');
} }
} catch (err) {
setError('Erro de conexão ao carregar carrinhos'); setError(response.error || 'Erro ao carregar carrinhos');
} catch {
setError('Erro de conexão ao carregar carrinhos');
} finally { } finally {
setLoading(false); setLoading(false);
setIsChangingPage(false); setIsChangingPage(false);
} }
}, [currentPage, searchTerm]); }, [currentPage, searchTerm]);
const buscarCarrinhos = useCallback( const buscarCarrinhos = useCallback(async (usuario: string, page = 1) => {
async (usuario: string, page = 1) => { setIsChangingPage(true);
setIsChangingPage(true); setLoading(true);
setLoading(true); setError(null);
setError(null);
try { try {
const response = await carrinhoService.buscarPorUsuario( const response = await carrinhoService.buscarPorUsuario(usuario, page, PAGE_SIZE);
usuario,
page,
PAGE_SIZE
);
if (response.success) { if (response.success) {
setCarrinhos(response.documents || []); setCarrinhos(response.documents || []);
setTotalCarrinhos(response.total || 0); setTotalCarrinhos(response.total || 0);
setCurrentPage(page); setCurrentPage(page);
setSearchTerm(usuario); setSearchTerm(usuario);
} else { return;
setError(response.error || 'Erro ao buscar carrinhos');
}
} catch (err) {
setError('Erro de conexão ao buscar carrinhos');
} finally {
setLoading(false);
setIsChangingPage(false);
} }
},
[] setError(response.error || 'Erro ao buscar carrinhos');
); } catch {
setError('Erro de conexão ao buscar carrinhos');
} finally {
setLoading(false);
setIsChangingPage(false);
}
}, []);
const cadastrarCarrinho = useCallback(async (formData: CarrinhoFormData): Promise<boolean> => { const cadastrarCarrinho = useCallback(async (formData: CarrinhoFormData): Promise<boolean> => {
setIsCreating(true); setIsCreating(true);
@ -108,12 +101,12 @@ export const useCarrinhos = (): UseCarrinhosReturn => {
if (response.success) { if (response.success) {
await listarCarrinhos(1, searchTerm); await listarCarrinhos(1, searchTerm);
return true; return true;
} else {
setError(response.error || 'Erro ao cadastrar carrinho');
return false;
} }
} catch (err) {
setError('Erro de conexão ao cadastrar carrinho'); setError(response.error || 'Erro ao cadastrar carrinho');
return false;
} catch {
setError('Erro de conexão ao cadastrar carrinho');
return false; return false;
} finally { } finally {
setIsCreating(false); setIsCreating(false);
@ -130,17 +123,17 @@ export const useCarrinhos = (): UseCarrinhosReturn => {
if (response.success) { if (response.success) {
await listarCarrinhos(currentPage, searchTerm); await listarCarrinhos(currentPage, searchTerm);
return true; return true;
} else {
setError(response.error || 'Erro ao atualizar carrinho');
return false;
} }
} catch (err) {
setError('Erro de conexão ao atualizar carrinho'); setError(response.error || 'Erro ao atualizar carrinho');
return false;
} catch {
setError('Erro de conexão ao atualizar carrinho');
return false; return false;
} finally { } finally {
setLoading(false); setLoading(false);
} }
}, [currentPage, listarCarrinhos]); }, [currentPage, listarCarrinhos, searchTerm]);
const deletarCarrinho = useCallback(async (id: string): Promise<boolean> => { const deletarCarrinho = useCallback(async (id: string): Promise<boolean> => {
setLoading(true); setLoading(true);
@ -152,17 +145,17 @@ export const useCarrinhos = (): UseCarrinhosReturn => {
if (response.success) { if (response.success) {
await listarCarrinhos(currentPage, searchTerm); await listarCarrinhos(currentPage, searchTerm);
return true; return true;
} else {
setError(response.error || 'Erro ao deletar carrinho');
return false;
} }
} catch (err) {
setError('Erro de conexão ao deletar carrinho'); setError(response.error || 'Erro ao deletar carrinho');
return false;
} catch {
setError('Erro de conexão ao deletar carrinho');
return false; return false;
} finally { } finally {
setLoading(false); setLoading(false);
} }
}, [currentPage, listarCarrinhos]); }, [currentPage, listarCarrinhos, searchTerm]);
useEffect(() => { useEffect(() => {
if (isInitialMount.current) { if (isInitialMount.current) {
@ -172,9 +165,10 @@ export const useCarrinhos = (): UseCarrinhosReturn => {
if (searchTerm.trim()) { if (searchTerm.trim()) {
buscarCarrinhos(searchTerm, currentPage); buscarCarrinhos(searchTerm, currentPage);
} else { return;
listarCarrinhos(currentPage);
} }
listarCarrinhos(currentPage);
}, [currentPage, searchTerm, listarCarrinhos, buscarCarrinhos]); }, [currentPage, searchTerm, listarCarrinhos, buscarCarrinhos]);
return { return {
@ -192,7 +186,6 @@ export const useCarrinhos = (): UseCarrinhosReturn => {
deletarCarrinho, deletarCarrinho,
setCurrentPage, setCurrentPage,
searchTerm, searchTerm,
setSearchTerm setSearchTerm,
}; };
}; };

View file

@ -1,8 +1,31 @@
// Service stub - removido durante migração para BFF import { CarrinhoDocument, ServiceResponse } from '@/types/legacyEntities';
export interface CarrinhoData {
usuarios?: string;
itens?: string[];
quantidade?: number[];
}
const emptyList = (): ServiceResponse<CarrinhoDocument> => ({
success: true,
data: null,
documents: [],
total: 0,
});
const removed = (message = 'Service removido'): ServiceResponse<CarrinhoDocument> => ({
success: false,
error: message,
message,
});
export const carrinhoService = { export const carrinhoService = {
listarPorUsuario: async () => ({ data: [], total: 0 }), listar: async (_page = 1, _limit = 10) => emptyList(),
buscarPorId: async () => ({ data: null }), buscarPorUsuario: async (_usuario = '', _page = 1, _limit = 10) => emptyList(),
criar: async () => ({ success: false, message: 'Service removido' }), listarPorUsuario: async (_usuario = '', _page = 1, _limit = 10) => emptyList(),
atualizar: async () => ({ success: false, message: 'Service removido' }), buscarPorId: async (_id?: string): Promise<ServiceResponse<CarrinhoDocument>> => ({ success: true, data: null }),
excluir: async () => ({ success: false, message: 'Service removido' }) criar: async (_data?: CarrinhoData) => removed(),
}; atualizar: async (_id?: string, _data?: Partial<CarrinhoData>) => removed(),
deletar: async (_id?: string) => removed(),
excluir: async (_id?: string) => removed(),
};

View file

@ -29,11 +29,22 @@ export interface CatalogoProdutoDocument extends LegacyDocument {
'preco-atual'?: number; 'preco-atual'?: number;
'preco-fabrica'?: number; 'preco-fabrica'?: number;
'preco-nf'?: number; 'preco-nf'?: number;
'preco-unitario'?: number;
pmc?: number; pmc?: number;
quantidade?: number; quantidade?: number;
estoque?: number;
laboratorio?: string; laboratorio?: string;
categoria?: string; categoria?: string;
subcategoria?: string; subcategoria?: string;
laboratorios?: Array<{ $id?: string; nome?: string } | string>;
categorias?: { nome?: string } | null;
}
export interface CarrinhoDocument extends LegacyDocument {
usuarios?: string | { $id?: string; 'nome-civil'?: string; 'nome-social'?: string } | null;
itens?: string[];
quantidade?: number[];
quantidades?: number[] | number;
} }
export interface ServiceResponse<TDocument> { export interface ServiceResponse<TDocument> {