import defaultProductImage from '@/assets/default-product.svg' export const DEFAULT_PRODUCT_IMAGE = defaultProductImage const ABSOLUTE_URL_PATTERN = /^(https?:)?\/\//i const SPECIAL_URL_PATTERN = /^(data:|blob:)/i const normalizeBaseUrl = (value?: string) => { if (!value) return '' return value.endsWith('/') ? value.slice(0, -1) : value } export const resolveImageUrl = (value?: string | null) => { if (!value || !String(value).trim()) { return DEFAULT_PRODUCT_IMAGE } const imageUrl = String(value).trim() if (ABSOLUTE_URL_PATTERN.test(imageUrl) || SPECIAL_URL_PATTERN.test(imageUrl)) { return imageUrl } const baseUrl = normalizeBaseUrl(import.meta.env.VITE_API_BASE_URL) if (!baseUrl) { return imageUrl.startsWith('/') ? imageUrl : `/${imageUrl}` } return imageUrl.startsWith('/') ? `${baseUrl}${imageUrl}` : `${baseUrl}/${imageUrl}` } export const normalizeStorageImageUrl = (value?: string | null) => { if (!value || !String(value).trim()) { return '' } const imageUrl = String(value).trim() if (ABSOLUTE_URL_PATTERN.test(imageUrl)) { try { const parsed = new URL(imageUrl.startsWith('//') ? `http:${imageUrl}` : imageUrl) if ( parsed.pathname.startsWith('/uploads/') || parsed.pathname.startsWith('/images/') || parsed.pathname.startsWith('/static/') ) { return parsed.pathname } } catch { return imageUrl } } return imageUrl } export const applyFallbackImage = (event: Event) => { const target = event.target as HTMLImageElement | null if (!target) return if (target.dataset.fallbackApplied === 'true') { return } target.dataset.fallbackApplied = 'true' target.onerror = null target.src = DEFAULT_PRODUCT_IMAGE }