import React, { lazy, Suspense, useCallback, useState } from 'react'
import useWebShare from '../../hooks/useWebShare'
const ArtworkShareModal = lazy(() => import('./ArtworkShareModal'))
/* ── Share icon (lucide-style) ───────────────────────────────────────────── */
function ShareIcon() {
return (
)
}
/**
* ArtworkShareButton – renders the Share pill and manages modal / native share.
*
* Props:
* artwork – artwork object
* shareUrl – canonical URL to share
* size – 'default' | 'small' (for mobile bar)
*/
export default function ArtworkShareButton({ artwork, shareUrl, size = 'default', isLoggedIn = false }) {
const [modalOpen, setModalOpen] = useState(false)
const openModal = useCallback(
() => setModalOpen(true),
[],
)
const closeModal = useCallback(
() => setModalOpen(false),
[],
)
const { share } = useWebShare({ onFallback: openModal })
const handleClick = async () => {
const result = await share({
title: artwork?.title || 'Artwork',
text: artwork?.description?.substring(0, 120) || '',
url: shareUrl || artwork?.canonical_url || window.location.href,
})
if (result?.shared && result?.native && artwork?.id) {
const csrfToken = document.head.querySelector('meta[name="csrf-token"]')?.content
fetch(`/api/artworks/${artwork.id}/share`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken || '' },
credentials: 'same-origin',
body: JSON.stringify({ platform: 'native' }),
}).catch(() => {})
}
}
const isSmall = size === 'small'
return (
<>
{/* Lazy-loaded modal – only rendered when opened */}
{modalOpen && (
)}
>
)
}