/opt/canhelp/apps/web/src/components
Edit: /opt/canhelp/apps/web/src/components/CategoryIcon.tsx (1576B)
import React, { useEffect, useMemo, useState } from 'react'
const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'
export function isCategoryIconUrl(icon?: string | null): boolean {
if (!icon) return false
const value = icon.trim()
return value.startsWith('http://') || value.startsWith('https://') || value.startsWith('/')
}
export function resolveCategoryIconUrl(icon: string): string {
if (icon.startsWith('/api/')) return `${API_URL}${icon}`
return icon
}
interface CategoryIconProps {
icon?: string | null
alt?: string
className: string
fallback?: string
}
export function CategoryIcon({ icon, alt = '', className, fallback = '📦' }: CategoryIconProps) {
const value = (icon || '').trim()
const [hasError, setHasError] = useState(false)
useEffect(() => {
setHasError(false)
}, [value])
const url = useMemo(() => (isCategoryIconUrl(value) ? resolveCategoryIconUrl(value) : ''), [value])
const fallbackUrl = '/category-icons/package.svg'
if (isCategoryIconUrl(value)) {
if (hasError && value !== fallbackUrl) {
return (

setHasError(true)}
/>
)
}
if (hasError && value === fallbackUrl) {
return
{fallback}
}
return

setHasError(true)} />
}
return
{value || fallback}
}