import { Check, Copy, MessageCircle, Music2 } from 'lucide-react'; import { useEffect, useMemo, useRef, useState } from 'react'; import { copyTextToClipboard } from '../../services/clipboard'; import { buildPublishShareText, type PublishShareModalPayload, } from './publishShareModalModel'; import { UnifiedModal } from './UnifiedModal'; type PublishShareModalProps = { open: boolean; payload: PublishShareModalPayload | null; onClose: () => void; }; const SHARE_CHANNELS = [ { id: 'wechat', label: '微信', icon: MessageCircle, className: 'bg-emerald-500 text-white', }, { id: 'qq', label: 'QQ', icon: MessageCircle, className: 'bg-sky-500 text-white', }, { id: 'douyin', label: '抖音', icon: Music2, className: 'bg-slate-950 text-white', }, ] as const; /** * 发布完成后的分享弹窗。 * 目前各渠道先统一复制分享文本,后续如接入微信/QQ/抖音 SDK,可以只替换这里的渠道点击逻辑。 */ export function PublishShareModal({ open, payload, onClose, }: PublishShareModalProps) { const [copyState, setCopyState] = useState<'idle' | 'copied' | 'failed'>( 'idle', ); const resetTimerRef = useRef(null); const shareText = useMemo( () => (payload ? buildPublishShareText(payload) : ''), [payload], ); useEffect( () => () => { if (resetTimerRef.current !== null) { window.clearTimeout(resetTimerRef.current); } }, [], ); useEffect(() => { setCopyState('idle'); }, [payload?.publicWorkCode]); const copyShareText = () => { if (!shareText) { return; } void copyTextToClipboard(shareText).then((copied) => { setCopyState(copied ? 'copied' : 'failed'); if (resetTimerRef.current !== null) { window.clearTimeout(resetTimerRef.current); } resetTimerRef.current = window.setTimeout(() => { resetTimerRef.current = null; setCopyState('idle'); }, 1400); }); }; return ( {SHARE_CHANNELS.map((channel) => { const Icon = channel.icon; return ( ); })} } >
{shareText}
); }