import { useState, useEffect } from 'react'; import { Modal } from './ui'; 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) return; 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); } }; fetchInvitedUsers(); fetchCurrentUser(); }, [isOpen, collectionId]); 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); }; return ( <> {/* Public Access Toggle */}

Public access

Anyone with a link can view

This list will be available in the community.

{/* Add People */}
handleSearch(e.target.value)} className="w-full px-4 py-3 pl-10 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
{/* Search Results */} {searchResults.length > 0 && (
{searchResults.map((user) => (
handleInvite(user)} className="flex items-center p-3 cursor-pointer nav-item-hover" >
{user.email.charAt(0).toUpperCase()}
{user.email}
Click to invite as viewer
))}
)} {/* Email invite option */} {searchQuery && isValidEmail(searchQuery) && !searchResults.some(u => u.email === searchQuery) && (
handleInvite(searchQuery)} className="flex items-center p-3 cursor-pointer nav-item-hover" >
Invite {searchQuery}
Send email invitation as viewer
)}
{/* Current Permissions */}

Only those invited can view or collaborate on this list.

{/* Current User */} {currentUser && (
{currentUser.email.charAt(0).toUpperCase()}
{currentUser.email} (You)
Owner
)} {/* Invited Users */} {invitedUsers.map((permission) => (
{permission.user_email?.charAt(0).toUpperCase() || '?'}
{permission.user_email || 'Unknown User'}
{permission.role === 'editor' ? 'Collaborator' : 'Viewer'}
))}
{/* Share Link */}
{/* Social Share */}
{[ { name: 'Twitter', icon: 'twitter', platform: 'twitter' }, { name: 'Facebook', icon: 'facebook', platform: 'facebook' }, { name: 'Reddit', icon: 'reddit', platform: 'reddit' }, { name: 'Discord', icon: 'discord', platform: 'discord' } ].map((social) => ( ))}
); }