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 && ( )} ) }