111 lines
4.5 KiB
JavaScript
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 [];
|
|
}
|
|
}
|
|
}));
|
|
|
|
|
|
|