import { useState, useEffect } from 'react'; export default function ShareModal({ isOpen, onClose, collectionId, isPublic, onTogglePublic, onInviteUser }) { const [searchQuery, setSearchQuery] = useState(''); const [searchResults, setSearchResults] = useState([]); const [invitedUsers, setInvitedUsers] = useState([]); const [currentUser, setCurrentUser] = useState(null); const [copySuccess, setCopySuccess] = useState(false); useEffect(() => { if (isOpen) { fetchInvitedUsers(); fetchCurrentUser(); } }, [isOpen, collectionId]); const fetchCurrentUser = async () => { try { const response = await fetch('/api/auth/verify', { headers: { 'Authorization': `Bearer ${localStorage.getItem('auth_token')}` } }); if (response.ok) { const data = await response.json(); setCurrentUser(data.user); } } catch (error) { console.error('Error fetching current user:', error); } }; const fetchInvitedUsers = async () => { try { const response = await fetch(`/api/collections/${collectionId}/permissions`, { headers: { 'Authorization': `Bearer ${localStorage.getItem('auth_token')}` } }); if (response.ok) { const data = await response.json(); setInvitedUsers(data.permissions || []); } } catch (error) { console.error('Error fetching invited users:', error); } }; const handleSearch = async (query) => { setSearchQuery(query); if (query.length < 2) { setSearchResults([]); return; } try { // Search for users by email const response = await fetch(`/api/users/search?q=${encodeURIComponent(query)}`, { headers: { 'Authorization': `Bearer ${localStorage.getItem('auth_token')}` } }); if (response.ok) { const data = await response.json(); setSearchResults(data.users || []); } } catch (error) { console.error('Error searching users:', error); } }; const handleInvite = async (emailOrUser) => { try { const email = typeof emailOrUser === 'string' ? emailOrUser : emailOrUser.email; const response = await fetch(`/api/collections/${collectionId}/permissions`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${localStorage.getItem('auth_token')}` }, body: JSON.stringify({ email, role: 'viewer' // Default to viewer as requested }) }); if (response.ok) { setSearchQuery(''); setSearchResults([]); fetchInvitedUsers(); // Refresh the list if (onInviteUser) onInviteUser(email); } } catch (error) { console.error('Error inviting user:', error); } }; const handleCopyLink = () => { const url = window.location.href; navigator.clipboard.writeText(url).then(() => { setCopySuccess(true); setTimeout(() => setCopySuccess(false), 2000); }); }; const handleSocialShare = (platform) => { const url = window.location.href; const title = 'Check out this list on Deck Hearth'; const shareUrls = { twitter: `https://twitter.com/intent/tweet?url=${encodeURIComponent(url)}&text=${encodeURIComponent(title)}`, facebook: `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(url)}`, reddit: `https://reddit.com/submit?url=${encodeURIComponent(url)}&title=${encodeURIComponent(title)}`, discord: `https://discord.com/channels/@me` // Discord doesn't have direct share URL }; if (shareUrls[platform]) { window.open(shareUrls[platform], '_blank', 'width=600,height=400'); } }; const isValidEmail = (email) => { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); }; if (!isOpen) return null; return (
Anyone with a link can view
This list will be available in the community.
Only those invited can view or collaborate on this list.