testes/src/features/prafrot/hooks/useFleetLists.js

111 lines
4.5 KiB
JavaScript

import { create } from 'zustand';
import { prafrotService } from '../services/prafrotService';
import { toast } from 'sonner';
import { extractFriendlyMessage } from '../utils/errorMessages';
export const useFleetLists = create((set, get) => ({
listsConfig: null,
statusFrotaOptions: [],
statusManutencaoOptions: [],
motivoAtendimentoOptions: [],
responsaveisOptions: [],
validacaoOptions: [],
aprovacaoOptions: [],
loading: false,
error: null,
fetchListsConfig: async () => {
set({ loading: true, error: null });
try {
const config = await prafrotService.getListasConfig();
set({ listsConfig: config });
// Se tivermos a configuração para status_frota, já buscamos as opções
if (config && config.status_frota && config.status_frota.rota) {
await get().fetchListOptions('status_frota', config.status_frota.rota);
}
// Se tivermos a configuração para status_manutencao, buscamos as opções
if (config && config.status_manutencao && config.status_manutencao.rota) {
await get().fetchListOptions('status_manutencao', config.status_manutencao.rota);
}
// Se tivermos a configuração para motivo_atendimento, buscamos as opções
if (config && config.motivo_atendimento && config.motivo_atendimento.rota) {
await get().fetchListOptions('motivo_atendimento', config.motivo_atendimento.rota);
}
// Se tivermos a configuração para responsaveis, buscamos as opções
if (config && config.responsaveis && config.responsaveis.rota) {
await get().fetchListOptions('responsaveis', config.responsaveis.rota);
}
// Se tivermos a configuração para validacao, buscamos as opções
if (config && config.validacao && config.validacao.rota) {
await get().fetchListOptions('validacao', config.validacao.rota);
}
// Se tivermos a configuração para aprovacao, buscamos as opções
if (config && config.aprovacao && config.aprovacao.rota) {
await get().fetchListOptions('aprovacao', config.aprovacao.rota);
}
} catch (error) {
console.error('Erro ao buscar configuração de listas:', error);
const friendlyMsg = extractFriendlyMessage(error);
set({ error: friendlyMsg });
} finally {
set({ loading: false });
}
},
fetchListOptions: async (listName, route) => {
try {
const data = await prafrotService.getListasByRoute(route);
let options = Array.isArray(data) ? data : (data.data || []);
if (options.length > 0 && typeof options[0] === 'object') {
if (listName === 'status_frota') {
options = options.map(item => item.status_frota).filter(Boolean);
} else if (listName === 'status_manutencao') {
options = options.map(item => item.status_manutencao || item.status || Object.values(item)[0]).filter(Boolean);
} else if (listName === 'motivo_atendimento') {
options = options.map(item => item.motivo_atendimento || item.motivo || Object.values(item)[0]).filter(Boolean);
} else if (listName === 'responsaveis') {
options = options.map(item => item.responsaveis || item.responsavel || item.nome || Object.values(item)[0]).filter(Boolean);
} else if (listName === 'validacao') {
options = options.map(item => item.validacao || item.validacao_financeiro || Object.values(item)[0]).filter(Boolean);
} else if (listName === 'aprovacao') {
options = options.map(item => item.aprovacao || item.nome || item.responsavel || Object.values(item)[0]).filter(Boolean);
} else {
options = options.map(item => Object.values(item)[0] || JSON.stringify(item));
}
} else {
options = options.map(String);
}
if (listName === 'status_frota') {
set({ statusFrotaOptions: options });
} else if (listName === 'status_manutencao') {
set({ statusManutencaoOptions: options });
} else if (listName === 'motivo_atendimento') {
set({ motivoAtendimentoOptions: options });
} else if (listName === 'responsaveis') {
set({ responsaveisOptions: options });
} else if (listName === 'validacao') {
set({ validacaoOptions: options });
} else if (listName === 'aprovacao') {
set({ aprovacaoOptions: options });
}
return options;
} catch (error) {
console.error(`Erro ao buscar opções para ${listName}:`, error);
return [];
}
}
}));