feat: Enhance regimen filtering logic and add timeout to authenticatedFetch
This commit is contained in:
@@ -187,12 +187,31 @@
|
||||
// Combinar clientes y proveedores para shipped_to
|
||||
const allClientsProviders = [...clients, ...providers];
|
||||
|
||||
// Filtrar regímenes por tipo de operación (1='1' exp, 2='2' imp)
|
||||
const filteredRegimens = $derived(
|
||||
codePedimentoRegimens.filter(r =>
|
||||
r.type_code === String(formData.operation_type)
|
||||
)
|
||||
);
|
||||
// Filtrar regímenes por tipo de operación (1='E' exp, 2='I' imp) y obtener valores únicos
|
||||
const filteredRegimens = $derived.by(() => {
|
||||
const typeCode = formData.operation_type === 1 ? 'E' : formData.operation_type === 2 ? 'I' : null;
|
||||
const filtered = codePedimentoRegimens.filter(r => r.type_code === typeCode);
|
||||
|
||||
// Obtener solo regímenes únicos por regimen_code
|
||||
const uniqueMap = new Map();
|
||||
filtered.forEach(r => {
|
||||
if (r.regimen_code && !uniqueMap.has(r.regimen_code)) {
|
||||
uniqueMap.set(r.regimen_code, r);
|
||||
}
|
||||
});
|
||||
|
||||
return Array.from(uniqueMap.values());
|
||||
});
|
||||
|
||||
// Efecto: Limpiar régimen si no existe en los regímenes filtrados al cambiar operation_type
|
||||
$effect(() => {
|
||||
if (formData.clave_regimen_aduanero && filteredRegimens.length > 0) {
|
||||
const regimenExists = filteredRegimens.some(r => r.regimen_code === formData.clave_regimen_aduanero);
|
||||
if (!regimenExists) {
|
||||
formData.clave_regimen_aduanero = '';
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<!-- Layout de 2 columnas compacto -->
|
||||
@@ -692,7 +711,7 @@
|
||||
<Select.Trigger id="clave_regimen_aduanero" class="h-7 text-xs w-full">
|
||||
<span class="truncate">
|
||||
{#if formData.clave_regimen_aduanero}
|
||||
{formData.clave_regimen_aduanero}
|
||||
{codePedimentoRegimens.find(r => r.regimen_code === formData.clave_regimen_aduanero)?.regimen_code || formData.clave_regimen_aduanero}
|
||||
{:else if filteredRegimens.length > 0}
|
||||
Selecciona régimen...
|
||||
{:else if formData.operation_type}
|
||||
|
||||
@@ -133,13 +133,15 @@ export async function refreshAccessToken(
|
||||
* @param cookies - Objeto de cookies de SvelteKit
|
||||
* @param fetch - Función fetch de SvelteKit
|
||||
* @param redirectUrl - URL a la que redirigir si falla la autenticación (opcional)
|
||||
* @param timeout - Timeout en milisegundos (default: 10000ms)
|
||||
*/
|
||||
export async function authenticatedFetch(
|
||||
endpoint: string,
|
||||
options: RequestInit = {},
|
||||
cookies: Cookies,
|
||||
fetch: typeof globalThis.fetch,
|
||||
redirectUrl?: string
|
||||
redirectUrl?: string,
|
||||
timeout: number = 10000
|
||||
): Promise<Response> {
|
||||
try {
|
||||
const baseUrl = getServerApiUrl();
|
||||
@@ -156,24 +158,43 @@ export async function authenticatedFetch(
|
||||
// Construir URL completa
|
||||
const url = endpoint.startsWith('http') ? endpoint : `${baseUrl}${endpoint}`;
|
||||
|
||||
// Crear AbortController para timeout
|
||||
const controller = new AbortController();
|
||||
const timeoutId = setTimeout(() => {
|
||||
console.error(`⏱️ [API] Timeout después de ${timeout}ms:`, endpoint);
|
||||
controller.abort();
|
||||
}, timeout);
|
||||
|
||||
// Realizar la petición inicial
|
||||
const headers = createAuthHeaders(accessToken, options.headers as Record<string, string>);
|
||||
let response = await fetch(url, {
|
||||
...options,
|
||||
headers
|
||||
headers,
|
||||
signal: controller.signal
|
||||
});
|
||||
|
||||
clearTimeout(timeoutId);
|
||||
|
||||
// Si es 401, intentar refrescar el token
|
||||
if (response.status === 401) {
|
||||
const newToken = await refreshAccessToken(cookies, fetch);
|
||||
|
||||
if (newToken) {
|
||||
// Reintentar la petición con el nuevo token
|
||||
const newController = new AbortController();
|
||||
const newTimeoutId = setTimeout(() => {
|
||||
console.error(`⏱️ [API] Timeout en retry después de ${timeout}ms:`, endpoint);
|
||||
newController.abort();
|
||||
}, timeout);
|
||||
|
||||
const newHeaders = createAuthHeaders(newToken, options.headers as Record<string, string>);
|
||||
response = await fetch(url, {
|
||||
...options,
|
||||
headers: newHeaders
|
||||
headers: newHeaders,
|
||||
signal: newController.signal
|
||||
});
|
||||
|
||||
clearTimeout(newTimeoutId);
|
||||
} else {
|
||||
// No se pudo refrescar, limpiar y redirigir
|
||||
clearAuthTokens(cookies);
|
||||
|
||||
Reference in New Issue
Block a user