import React, { useState } from 'react' import NovaConfirmDialog from '../ui/NovaConfirmDialog' const AVATAR_FALLBACK = 'https://files.skinbase.org/default/missing_sq.webp' export default function ArtworkAuthor({ artwork, presentSq }) { const [following, setFollowing] = useState(Boolean(artwork?.viewer?.is_following_author)) const [followersCount, setFollowersCount] = useState(Number(artwork?.user?.followers_count || 0)) const [confirmOpen, setConfirmOpen] = useState(false) const [pendingFollowState, setPendingFollowState] = useState(null) const user = artwork?.user || {} const authorName = user.name || user.username || 'Artist' const profileUrl = user.profile_url || (user.username ? `/@${user.username}` : '#') const avatar = user.avatar_url || presentSq?.url || AVATAR_FALLBACK const csrfToken = typeof document !== 'undefined' ? document.querySelector('meta[name="csrf-token"]')?.getAttribute('content') : null const persistFollowState = async (nextState) => { setFollowing(nextState) try { const response = await fetch(`/api/users/${user.id}/follow`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken || '', }, credentials: 'same-origin', body: JSON.stringify({ state: nextState }), }) if (!response.ok) throw new Error('Follow failed') const payload = await response.json() if (typeof payload?.followers_count === 'number') { setFollowersCount(payload.followers_count) } setFollowing(Boolean(payload?.is_following)) } catch { setFollowing(!nextState) } } const onToggleFollow = async () => { const nextState = !following if (!nextState) { setPendingFollowState(nextState) setConfirmOpen(true) return } await persistFollowState(nextState) } const onConfirmUnfollow = async () => { if (pendingFollowState === null) return setConfirmOpen(false) await persistFollowState(pendingFollowState) setPendingFollowState(null) } const onCloseConfirm = () => { setConfirmOpen(false) setPendingFollowState(null) } return ( <> Author { event.currentTarget.src = AVATAR_FALLBACK }} /> {authorName} {user.username && @{user.username}} {followersCount.toLocaleString()} followers Profile {following ? ( <> Following > ) : ( <> Follow > )} > ) }
@{user.username}
{followersCount.toLocaleString()} followers