import { useState } from 'react' import { useTranslation } from 'react-i18next' import { motion, AnimatePresence } from 'motion/react' import { QRCodeSVG } from 'qrcode.react' import { IconCopy, IconX, IconQrcode, IconDownload, IconFileTypePdf, IconCodeCircleFilled, IconChevronDownFilled } from '@tabler/icons-react' import { useStore } from '../store' import { useFocusTrap } from '../hooks/useFocusTrap' export default function ShareModal({ onClose }: { onClose: () => void }) { const trapRef = useFocusTrap(true) const { t } = useTranslation() const shortId = useStore((s) => s.shortId) const puzzleId = useStore((s) => s.puzzleId) const [showEmbed, setShowEmbed] = useState(false) const [embedTheme, setEmbedTheme] = useState('auto') const [embedTimer, setEmbedTimer] = useState(true) const [embedHints, setEmbedHints] = useState(true) const [copied, setCopied] = useState(false) const [copiedEmbed, setCopiedEmbed] = useState(false) if (!shortId || !puzzleId) return null const url = `${window.location.origin}/p/${shortId}` const copy = () => { navigator.clipboard.writeText(url) setCopied(true) setTimeout(() => setCopied(false), 2000) } const download = (format: string) => { window.open(`/api/puzzles/${puzzleId}/export/${format}`, '_blank') } const embedParams = [ embedTheme !== 'auto' ? `theme=${embedTheme}` : '', !embedTimer ? 'timer=false' : '', !embedHints ? 'hints=false' : '', ].filter(Boolean).join('&') const embedUrl = `${window.location.origin}/e/${shortId}${embedParams ? '?' + embedParams : ''}` const embedCode = `` const copyEmbed = () => { navigator.clipboard.writeText(embedCode) setCopiedEmbed(true) setTimeout(() => setCopiedEmbed(false), 2000) } return ( e.stopPropagation()} style={{ textAlign: 'center' }} role="dialog" aria-modal="true" aria-label={t('share.title')} initial={{ opacity: 0, scale: 0.96, y: 10 }} animate={{ opacity: 1, scale: 1, y: 0 }} exit={{ opacity: 0, scale: 0.96, y: 10 }} transition={{ duration: 0.2 }}>

{t('share.title')}

{url}
{t('common.export')}
{showEmbed && (
{(['auto', 'light', 'dark'] as const).map(t => ( ))}
{embedCode}
)}
) }