'use client'; import { useState, useMemo, useEffect, useCallback } from 'react'; import { useTranslations } from 'next-intl'; import { useSearchParams } from 'next/navigation'; import { useAuth } from '@/components/auth-provider'; import { toast } from 'sonner'; export function EmbedBuilder() { const t = useTranslations('embedBuilder'); const { session } = useAuth(); const searchParams = useSearchParams(); const [identifier, setIdentifier] = useState(searchParams.get('handle') ?? session?.handle ?? ''); const [debouncedIdentifier, setDebouncedIdentifier] = useState(identifier); useEffect(() => { const timer = setTimeout(() => { setDebouncedIdentifier(identifier); }, 500); return () => clearTimeout(timer); }, [identifier]); const embedCode = useMemo(() => { if (!debouncedIdentifier.trim()) return ''; const isDid = debouncedIdentifier.startsWith('did:'); const dataAttr = isDid ? `data-did="${debouncedIdentifier}"` : `data-handle="${debouncedIdentifier}"`; return ``; }, [debouncedIdentifier]); const [iframeHeight, setIframeHeight] = useState(300); const handleMessage = useCallback((e: MessageEvent) => { if (e.data?.type === 'sifa-embed-resize' && typeof e.data.height === 'number') { setIframeHeight(e.data.height); } }, []); useEffect(() => { window.addEventListener('message', handleMessage); return () => window.removeEventListener('message', handleMessage); }, [handleMessage]); function handleCopy() { void navigator.clipboard.writeText(embedCode).then(() => { toast.success(t('copied')); }); } return (
{t('themeNote')}
{debouncedIdentifier.trim() && (
{embedCode}
{t('previewLabel')}