import React, { useState } from 'react' import ProfileCoverEditor from './ProfileCoverEditor' import LevelBadge from '../xp/LevelBadge' import XPProgressBar from '../xp/XPProgressBar' import FollowButton from '../social/FollowButton' import FollowersPreview from '../social/FollowersPreview' import MutualFollowersBadge from '../social/MutualFollowersBadge' function formatCompactNumber(value) { const numeric = Number(value ?? 0) return numeric.toLocaleString() } export default function ProfileHero({ user, profile, isOwner, viewerIsFollowing, followerCount, recentFollowers = [], followContext = null, heroBgUrl, countryName, leaderboardRank, extraActions = null }) { const [following, setFollowing] = useState(viewerIsFollowing) const [count, setCount] = useState(followerCount) const [editorOpen, setEditorOpen] = useState(false) const [coverUrl, setCoverUrl] = useState(user?.cover_url || heroBgUrl || null) const [coverPosition, setCoverPosition] = useState(Number.isFinite(user?.cover_position) ? user.cover_position : 50) const uname = user.username || user.name || 'Unknown' const displayName = user.name || uname const joinDate = user.created_at ? new Date(user.created_at).toLocaleDateString('en-US', { month: 'long', year: 'numeric' }) : null const bio = profile?.bio || profile?.about || '' const progressPercent = Math.round(Number(user?.progress_percent ?? 0)) const heroStats = [ { label: 'Followers', value: formatCompactNumber(count) }, { label: 'Level', value: `Lv ${formatCompactNumber(user?.level ?? 1)}` }, ] return ( <>
@{uname}
{ event.target.style.display = 'none' }}
/>
) : null}
{countryName}
) : null}
{joinDate ? (
Joined {joinDate}
) : null}
{profile?.website ? (
{(() => {
try {
const url = profile.website.startsWith('http') ? profile.website : `https://${profile.website}`
return new URL(url).hostname
} catch {
return profile.website
}
})()}
) : null}
{bio}
) : null}