1+ /**
2+ * Image utilities for handling external images and fallbacks
3+ */
4+
5+ export interface ImageFallbackProps {
6+ src : string
7+ alt : string
8+ fallbackSrc ?: string
9+ }
10+
11+ /**
12+ * Generate a fallback avatar using GitHub's avatar API or a placeholder
13+ */
14+ export function generateFallbackAvatar ( name : string ) : string {
15+ // Create a simple avatar using the first letter of the name
16+ const initials = name
17+ . split ( ' ' )
18+ . map ( word => word [ 0 ] )
19+ . join ( '' )
20+ . toUpperCase ( )
21+ . slice ( 0 , 2 )
22+
23+ // Return a GitHub-style avatar URL or placeholder
24+ return `https://ui-avatars.com/api/?name=${ encodeURIComponent ( initials ) } &background=171717&color=fff&size=200`
25+ }
26+
27+ /**
28+ * Validate image URL and provide fallbacks
29+ */
30+ export function getImageWithFallback ( src : string , alt : string ) : ImageFallbackProps {
31+ // If it's already a fallback avatar, return as is
32+ if ( src . includes ( 'ui-avatars.com' ) || src . includes ( 'github.com' ) ) {
33+ return { src, alt }
34+ }
35+
36+ // For Unsplash images, provide a fallback
37+ const fallbackSrc = generateFallbackAvatar ( alt . replace ( ' profile picture' , '' ) . replace ( ' avatar' , '' ) )
38+
39+ return {
40+ src,
41+ alt,
42+ fallbackSrc
43+ }
44+ }
45+
46+ /**
47+ * Handle image load errors by updating src to fallback
48+ */
49+ export function handleImageError ( event : React . SyntheticEvent < HTMLImageElement > , fallbackSrc ?: string ) {
50+ const img = event . target as HTMLImageElement
51+ if ( fallbackSrc && img . src !== fallbackSrc ) {
52+ img . src = fallbackSrc
53+ }
54+ }
55+
56+ /**
57+ * Optimize external image URLs for better loading
58+ */
59+ export function optimizeImageUrl ( src : string , width : number , height : number ) : string {
60+ // For Unsplash images, add optimization parameters
61+ if ( src . includes ( 'unsplash.com' ) ) {
62+ const url = new URL ( src )
63+ url . searchParams . set ( 'w' , width . toString ( ) )
64+ url . searchParams . set ( 'h' , height . toString ( ) )
65+ url . searchParams . set ( 'fit' , 'crop' )
66+ url . searchParams . set ( 'crop' , 'face' )
67+ url . searchParams . set ( 'auto' , 'format' )
68+ url . searchParams . set ( 'q' , '80' )
69+ return url . toString ( )
70+ }
71+
72+ return src
73+ }
0 commit comments