import React, { useState, useEffect, useRef } from 'react' import axios from 'axios' const VISIBILITY_OPTIONS = [ { value: 'public', icon: 'fa-globe', label: 'Public' }, { value: 'followers', icon: 'fa-user-friends', label: 'Followers' }, { value: 'private', icon: 'fa-lock', label: 'Private' }, ] function ArtworkResult({ artwork, onSelect }) { return ( ) } /** * ShareArtworkModal * * Props: * isOpen boolean * onClose function * onShared function(newPost) * preselectedArtwork object|null (share from artwork page) */ export default function ShareArtworkModal({ isOpen, onClose, onShared, preselectedArtwork = null }) { const [query, setQuery] = useState('') const [results, setResults] = useState([]) const [searching, setSearching] = useState(false) const [selected, setSelected] = useState(preselectedArtwork) const [body, setBody] = useState('') const [visibility, setVisibility] = useState('public') const [submitting, setSubmitting] = useState(false) const [error, setError] = useState(null) const searchTimer = useRef(null) const inputRef = useRef(null) // Focus search on open useEffect(() => { if (isOpen && !preselectedArtwork) { setTimeout(() => inputRef.current?.focus(), 100) } }, [isOpen]) useEffect(() => { setSelected(preselectedArtwork) }, [preselectedArtwork]) const handleSearch = (q) => { setQuery(q) clearTimeout(searchTimer.current) if (!q.trim()) { setResults([]); return } searchTimer.current = setTimeout(async () => { setSearching(true) try { const { data } = await axios.get('/api/search/artworks', { params: { q, shareable: 1, per_page: 12 }, }) setResults(data.data ?? data.hits ?? []) } catch { setResults([]) } finally { setSearching(false) } }, 300) } const handleSubmit = async () => { if (!selected) return setSubmitting(true) setError(null) try { const { data } = await axios.post(`/api/posts/share/artwork/${selected.id}`, { body: body.trim() || null, visibility, }) onShared?.(data.post) handleClose() } catch (err) { setError(err.response?.data?.errors?.artwork_id?.[0] ?? err.response?.data?.message ?? 'Failed to share.') } finally { setSubmitting(false) } } const handleClose = () => { setQuery('') setResults([]) setSelected(preselectedArtwork) setBody('') setVisibility('public') setError(null) onClose?.() } if (!isOpen) return null return (
{/* Backdrop */}