search/app/utils/entrelineaImage.ts

56 lines
2.3 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Construcción de URLs de ImageKit para los assets de "Entre Líneas".
//
// El campo `image` que devuelve Typesense ya viene con la subruta completa
// dentro del bucket, incluyendo extensión (ej.
// "5171cd64-4b42-4e6d-a081-3703efbe7d43.jpeg"). Aquí sólo lo combinamos con
// la base pública de ImageKit y le añadimos el preset de transformación
// según el contexto (lista, detalle, fullscreen).
//
// Mismo patrón que `getAssetUrl` del cliente Directus: una sola fuente de
// verdad para la URL, todos los componentes leen de aquí.
/** Base pública de ImageKit donde están alojadas las imágenes de Entre Líneas.
* Si cambia la cuenta o el folder, sólo hay que tocar esta constante. */
const IMAGEKIT_BASE = 'https://images.carpa.com/entrelineas'
/**
* Transforms de ImageKit por contexto. Los anchos cuentan con high-DPI:
* un container de 320 px CSS necesita ~640 px reales en pantallas 2x,
* por eso `detail` pide 1800 px. Quality 8090 es el sweet spot:
* notablemente más nítido que 60 con poco aumento de peso.
*/
const IMAGE_PRESETS = {
thumb: 'tr=w-600,q-80', // miniaturas en lista de resultados
detail: 'tr=w-1800,q-90', // imagen principal del panel de detalle
full: 'tr=q-95' // sin resize, máxima calidad (zoom / lightbox)
} as const
export type EntrelineaImagePreset = keyof typeof IMAGE_PRESETS
/**
* Construye la URL de ImageKit para una imagen de entrelínea.
*
* - `image` es el valor del campo `image` de Typesense, ya con extensión
* incluida (ej. "5171cd64-4b42-4e6d-a081-3703efbe7d43.jpeg"). Se concatena
* tal cual a la base.
* - `preset` es el preset de transformación a aplicar (default: `detail`).
*
* Devuelve `null` si no hay imagen para no romper la UI; los componentes
* deben mostrar placeholder en ese caso.
*
* Ejemplo:
* getEntrelineaImageUrl('5171cd64-...jpeg')
* → 'https://images.carpa.com/entrelineas/5171cd64-...jpeg?tr=w-1800,q-90'
*/
export function getEntrelineaImageUrl(
image: string | null | undefined,
preset: EntrelineaImagePreset = 'detail'
): string | null {
if (!image) return null
// Defensivo: por si algún día llega con barra al inicio o el base con
// barra al final, evitamos doble slash en la URL final.
const base = IMAGEKIT_BASE.replace(/\/+$/, '')
const path = String(image).replace(/^\/+/, '')
return `${base}/${path}?${IMAGE_PRESETS[preset]}`
}