170 lines
4.7 KiB
TypeScript
170 lines
4.7 KiB
TypeScript
import { useState, useCallback, useRef, useEffect } from 'react';
|
|
import { Models } from 'appwrite';
|
|
import { pedidoService, PedidoData } from '@/services/pedidoService';
|
|
export type { PedidoData };
|
|
|
|
export const PAGE_SIZE = 10;
|
|
|
|
export const usePedidos = () => {
|
|
const [pedidos, setPedidos] = useState<Models.Document[]>([]);
|
|
const [loading, setLoading] = useState(false);
|
|
const [error, setError] = useState<string | null>(null);
|
|
const [totalPedidos, setTotalPedidos] = useState(0);
|
|
const [currentPage, setCurrentPage] = useState(1);
|
|
const [isChangingPage, setIsChangingPage] = useState(false);
|
|
const [isCreating, setIsCreating] = useState(false);
|
|
const [searchTerm, setSearchTerm] = useState('');
|
|
const isInitialMount = useRef(true);
|
|
|
|
const listarPedidos = useCallback(
|
|
async (page = currentPage, status = '', search = searchTerm) => {
|
|
setIsChangingPage(true);
|
|
setLoading(true);
|
|
setError(null);
|
|
try {
|
|
const response = await pedidoService.listar(page, PAGE_SIZE, status, search);
|
|
if (response.success) {
|
|
setPedidos((response.documents as unknown as Models.Document[]) || []);
|
|
setTotalPedidos(response.total || 0);
|
|
setCurrentPage(page);
|
|
setSearchTerm(search);
|
|
} else {
|
|
setError(response.error || 'Erro ao carregar pedidos');
|
|
}
|
|
} catch (err) {
|
|
setError('Erro de conexão ao carregar pedidos');
|
|
} finally {
|
|
setLoading(false);
|
|
setIsChangingPage(false);
|
|
}
|
|
},
|
|
[currentPage, searchTerm]
|
|
);
|
|
|
|
const cadastrarPedido = useCallback(
|
|
async (formData: PedidoData): Promise<boolean> => {
|
|
setIsCreating(true);
|
|
setError(null);
|
|
try {
|
|
const response = await pedidoService.criar(formData);
|
|
if (response.success) {
|
|
await listarPedidos(1, '', searchTerm);
|
|
return true;
|
|
} else {
|
|
setError(response.error || 'Erro ao cadastrar pedido');
|
|
return false;
|
|
}
|
|
} catch (err) {
|
|
setError('Erro de conexão ao cadastrar pedido');
|
|
return false;
|
|
} finally {
|
|
setIsCreating(false);
|
|
}
|
|
},
|
|
[listarPedidos, searchTerm]
|
|
);
|
|
|
|
const atualizarPedido = useCallback(
|
|
async (id: string, formData: PedidoData): Promise<boolean> => {
|
|
setLoading(true);
|
|
setError(null);
|
|
try {
|
|
const response = await pedidoService.atualizar(id, formData);
|
|
if (response.success) {
|
|
await listarPedidos(currentPage, '', searchTerm);
|
|
return true;
|
|
} else {
|
|
setError(response.error || 'Erro ao atualizar pedido');
|
|
return false;
|
|
}
|
|
} catch (err) {
|
|
setError('Erro de conexão ao atualizar pedido');
|
|
return false;
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
},
|
|
[currentPage, listarPedidos]
|
|
);
|
|
|
|
useEffect(() => {
|
|
if (isInitialMount.current) {
|
|
isInitialMount.current = false;
|
|
return;
|
|
}
|
|
|
|
listarPedidos(currentPage, '', searchTerm);
|
|
}, [currentPage, searchTerm, listarPedidos]);
|
|
|
|
const buscarPedidos = useCallback(
|
|
async (nome: string, page = 1) => {
|
|
setIsChangingPage(true);
|
|
setLoading(true);
|
|
setError(null);
|
|
|
|
try {
|
|
const response = await pedidoService.buscarPorNome(
|
|
nome,
|
|
page,
|
|
PAGE_SIZE
|
|
);
|
|
|
|
if (response.success) {
|
|
setPedidos((response.documents as unknown as Models.Document[]) || []);
|
|
setTotalPedidos(response.total || 0);
|
|
setCurrentPage(page);
|
|
setSearchTerm(nome);
|
|
} else {
|
|
setError(response.error || 'Erro ao buscar pedidos');
|
|
}
|
|
} catch (err) {
|
|
setError('Erro de conexão ao buscar pedidos');
|
|
} finally {
|
|
setLoading(false);
|
|
setIsChangingPage(false);
|
|
}
|
|
},
|
|
[]
|
|
);
|
|
|
|
const deletarPedido = useCallback(
|
|
async (id: string): Promise<boolean> => {
|
|
setLoading(true);
|
|
setError(null);
|
|
try {
|
|
const response = await pedidoService.deletar(id);
|
|
if (response.success) {
|
|
await listarPedidos(currentPage, '', searchTerm);
|
|
return true;
|
|
} else {
|
|
setError(response.error || 'Erro ao deletar pedido');
|
|
return false;
|
|
}
|
|
} catch (err) {
|
|
setError('Erro de conexão ao deletar pedido');
|
|
return false;
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
},
|
|
[currentPage, listarPedidos]
|
|
);
|
|
|
|
return {
|
|
pedidos,
|
|
loading,
|
|
isChangingPage,
|
|
isCreating,
|
|
error,
|
|
totalPedidos,
|
|
currentPage,
|
|
listarPedidos,
|
|
buscarPedidos,
|
|
cadastrarPedido,
|
|
atualizarPedido,
|
|
deletarPedido,
|
|
setCurrentPage,
|
|
searchTerm,
|
|
setSearchTerm,
|
|
};
|
|
};
|