ConnectionIcon.tsx 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { useTheme } from 'next-themes'
  2. import Image from 'next/image'
  3. import { cn } from 'ui'
  4. import { BASE_PATH } from '@/lib/constants'
  5. interface ConnectionIconProps {
  6. icon: string
  7. iconFolder?: string
  8. supportsDarkMode?: boolean
  9. size?: number
  10. className?: string
  11. }
  12. export const ConnectionIcon = ({
  13. icon,
  14. iconFolder,
  15. supportsDarkMode,
  16. size = 14,
  17. className,
  18. }: ConnectionIconProps) => {
  19. const { resolvedTheme } = useTheme()
  20. const imageFolder =
  21. iconFolder || (['ionic-angular'].includes(icon) ? 'icons/frameworks' : 'libraries')
  22. const imageExtension = imageFolder === 'icons/frameworks' ? '' : '-icon'
  23. const shouldUseDarkMode =
  24. supportsDarkMode ||
  25. ['expo', 'nextjs', 'prisma', 'drizzle', 'astro', 'remix', 'refine'].includes(icon.toLowerCase())
  26. const iconImgSrc = icon.startsWith('http')
  27. ? icon
  28. : `${BASE_PATH}/img/${imageFolder}/${icon.toLowerCase()}${
  29. shouldUseDarkMode && resolvedTheme?.includes('dark') ? '-dark' : ''
  30. }${imageExtension}.svg`
  31. return (
  32. <Image
  33. className={cn('transition-all group-hover:scale-110', className)}
  34. src={iconImgSrc}
  35. alt={`${icon} logo`}
  36. width={size}
  37. height={size}
  38. />
  39. )
  40. }