CreatorCard.tsx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import Link from 'next/link';
  2. import Image from 'next/image';
  3. import type { CreatorItem } from '@/types/response/channel/creators';
  4. import { buildChannelUrl, formatHandle, formatCount } from '@/lib/utils/channel';
  5. export default function CreatorCard({ creator }: { creator: CreatorItem })
  6. {
  7. const href = buildChannelUrl({ handle: creator.handle, channelSID: creator.channelSID });
  8. return (
  9. <Link
  10. href={href}
  11. className="flex items-center gap-3 rounded-xl border border-[var(--border-default)] bg-[var(--bg-elevated)] p-3 transition hover:shadow-md"
  12. >
  13. <div className="relative shrink-0">
  14. <div className="relative size-16 overflow-hidden rounded-full bg-[var(--bg-elevated)]">
  15. {creator.thumbnailUrl ? (
  16. <Image src={creator.thumbnailUrl} alt="" fill unoptimized sizes="64px" className="object-cover" />
  17. ) : (
  18. <span className="flex size-full items-center justify-center text-2xl font-bold text-[var(--text-secondary)]">
  19. {creator.name.charAt(0).toUpperCase()}
  20. </span>
  21. )}
  22. </div>
  23. {creator.isLive && (
  24. <span className="absolute -bottom-1 left-1/2 -translate-x-1/2 rounded-full bg-red-600 px-2 py-0.5 text-[10px] font-bold leading-none text-white">
  25. LIVE
  26. </span>
  27. )}
  28. </div>
  29. <div className="flex min-w-0 flex-1 flex-col gap-0.5">
  30. <div className="flex items-center gap-1.5">
  31. <h3 className="line-clamp-1 font-semibold">{creator.name}</h3>
  32. {creator.gradeName && (
  33. <span
  34. className="inline-flex shrink-0 items-center gap-1 rounded-full border border-[var(--border-default)] px-1.5 py-0.5 text-[10px] font-semibold"
  35. style={creator.gradeColor ? { color: creator.gradeColor } : undefined}
  36. >
  37. {creator.gradeImage && (
  38. <Image src={creator.gradeImage} alt="" width={12} height={12} unoptimized className="inline-block" />
  39. )}
  40. {creator.gradeName}
  41. </span>
  42. )}
  43. </div>
  44. {creator.handle && (
  45. <div className="line-clamp-1 text-xs text-[var(--text-secondary)]">{formatHandle(creator.handle)}</div>
  46. )}
  47. <div className="mt-0.5 flex flex-wrap gap-x-3 text-xs text-[var(--text-secondary)]">
  48. <span>구독 {formatCount(creator.subscriberCount)}</span>
  49. <span>팔로워 {formatCount(creator.followerCount)}</span>
  50. </div>
  51. </div>
  52. </Link>
  53. );
  54. }