'use client' import React, { useState, useTransition, useEffect, useRef, useCallback } from 'react' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, } from '@/components/ui/dialog' import { UserPlus, Check, AlertCircle, Globe, Lock, Copy } from 'lucide-react' import { createBrainstormShare } from '@/app/actions/brainstorm' import { useUpdateBrainstormSettings } from '@/hooks/use-brainstorm' import { useLanguage } from '@/lib/i18n' interface BrainstormShareDialogProps { open: boolean onOpenChange: (open: boolean) => void sessionId: string seedIdea: string isPublic?: boolean guestCanEdit?: boolean } interface UserResult { id: string name: string | null email: string image: string | null } const FEEDBACK_BY_MESSAGE: Record = { invited: { key: 'brainstorm.feedbackInviteSent', type: 'success' }, re_invited: { key: 'brainstorm.feedbackInviteResent', type: 'success' }, already_shared: { key: 'brainstorm.feedbackAlreadyShared', type: 'info', }, already_pending: { key: 'brainstorm.feedbackAlreadyPending', type: 'info', }, } export function BrainstormShareDialog({ open, onOpenChange, sessionId, seedIdea, isPublic = false, guestCanEdit = false, }: BrainstormShareDialogProps) { const { t } = useLanguage() const [query, setQuery] = useState('') const [results, setResults] = useState([]) const [showDropdown, setShowDropdown] = useState(false) const [feedback, setFeedback] = useState<{ text: string type: 'success' | 'error' | 'info' } | null>(null) const [isPending, startTransition] = useTransition() const debounceRef = useRef | null>(null) const dropdownRef = useRef(null) const [publicEnabled, setPublicEnabled] = useState(isPublic) const [guestEditEnabled, setGuestEditEnabled] = useState(guestCanEdit) const [linkCopied, setLinkCopied] = useState(false) const updateSettings = useUpdateBrainstormSettings(sessionId) useEffect(() => { setPublicEnabled(isPublic) setGuestEditEnabled(guestCanEdit) }, [isPublic, guestCanEdit]) useEffect(() => { if (!open) { setQuery('') setResults([]) setShowDropdown(false) setFeedback(null) } }, [open]) const searchUsers = useCallback(async (q: string) => { if (q.length < 2) { setResults([]) setShowDropdown(false) return } try { const res = await fetch(`/api/users/search?q=${encodeURIComponent(q)}`) const data = await res.json() setResults(data.users || []) setShowDropdown(data.users?.length > 0) } catch { setResults([]) } }, []) const handleInputChange = (value: string) => { setQuery(value) setFeedback(null) if (debounceRef.current) clearTimeout(debounceRef.current) debounceRef.current = setTimeout(() => searchUsers(value), 200) } const selectUser = (user: UserResult) => { setQuery(user.email) setShowDropdown(false) setResults([]) } const handleShare = (e: React.FormEvent) => { e.preventDefault() if (!query.trim()) return setShowDropdown(false) setFeedback(null) startTransition(async () => { try { const result = await createBrainstormShare(sessionId, query.trim()) if (result.message && FEEDBACK_BY_MESSAGE[result.message]) { const m = FEEDBACK_BY_MESSAGE[result.message] setFeedback({ text: t(m.key), type: m.type }) } else { setFeedback({ text: t('brainstorm.feedbackInviteSent'), type: 'success' }) } if (result.message === 'invited' || result.message === 're_invited') { setQuery('') } } catch (err: any) { setFeedback({ text: err.message || t('brainstorm.feedbackGenericError'), type: 'error' }) } }) } return (
{t('brainstorm.shareDialogTitle')}
{seedIdea.length > 60 ? seedIdea.substring(0, 60) + '…' : seedIdea}
handleInputChange(e.target.value)} onFocus={() => results.length > 0 && setShowDropdown(true)} onBlur={() => setTimeout(() => setShowDropdown(false), 150)} placeholder={t('brainstorm.shareNameOrEmailPlaceholder')} className="w-full px-4 py-3 text-sm border border-border rounded-xl bg-transparent focus:outline-none focus:ring-2 focus:ring-brand-accent/20 focus:border-brand-accent/40 transition-all" autoFocus /> {showDropdown && results.length > 0 && (
{results.map((user) => ( ))}
)}
{feedback && (
{feedback.type === 'success' ? ( ) : ( )} {feedback.text}
)}

{t('brainstorm.shareFooterHint')}

{publicEnabled ? ( ) : ( )} {t('brainstorm.sharePublicLink')}
{publicEnabled && ( <>
{t('brainstorm.shareGuestsCanEdit')}
)}
) }