'use client'; import React, { useState, useEffect } from 'react'; import { Modal, Button, Spin, message } from 'antd'; import { CheckCircleOutlined, CloseCircleOutlined } from '@ant-design/icons'; import { Loader2 } from 'lucide-react'; import { baseUrl } from '@/lib/env'; interface TwitterCallbackModalProps { /** 是否显示弹框 */ visible: boolean; /** 关闭弹框回调 */ onClose: () => void; /** 项目信息 */ project: { project_id: string; name?: string; final_video_url?: string; final_simple_video_url?: string; }; /** URL 参数 */ urlParams: { state: string; code: string; }; } enum CallbackStatus { LOADING = 'loading', SUCCESS = 'success', FAILED = 'failed' } export default function TwitterCallbackModal({ visible, onClose, project, urlParams }: TwitterCallbackModalProps) { const [callbackStatus, setCallbackStatus] = useState(CallbackStatus.LOADING); const [callbackData, setCallbackData] = useState(null); /** * 处理 Twitter 授权回调 */ const handleTwitterCallback = async () => { try { setCallbackStatus(CallbackStatus.LOADING); // 从localStorage获取用户信息 const currentUser = JSON.parse(localStorage.getItem('currentUser') || '{}'); const userId = currentUser.id || currentUser.userId; if (!userId) { throw new Error('用户ID不存在,请先登录'); } // 调用 Twitter 授权回调接口 const response = await fetch(`${baseUrl}/api/video-share/x/auth/callback?state=${encodeURIComponent(urlParams.state)}&code=${encodeURIComponent(urlParams.code)}`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${localStorage.getItem('token') || ''}` } }); const data = await response.json(); if (data.successful && data.code === 0) { setCallbackData(data.data); setCallbackStatus(CallbackStatus.SUCCESS); message.success('Twitter 授权成功!'); } else { throw new Error(data.message || 'Twitter 授权回调失败'); } } catch (error) { console.error('Twitter 授权回调失败:', error); setCallbackStatus(CallbackStatus.FAILED); message.error(`Twitter 授权失败: ${error instanceof Error ? error.message : '未知错误'}`); } }; // 组件挂载时自动处理回调 useEffect(() => { if (visible && urlParams.state && urlParams.code) { handleTwitterCallback(); } }, [visible, urlParams.state, urlParams.code]); /** * 重新尝试授权 */ const handleRetry = () => { setCallbackStatus(CallbackStatus.LOADING); handleTwitterCallback(); }; /** * 关闭弹框 */ const handleClose = () => { setCallbackStatus(CallbackStatus.LOADING); setCallbackData(null); onClose(); }; return (
X
Twitter 授权回调 } open={visible} onCancel={handleClose} footer={null} width={480} className="twitter-callback-modal" styles={{ content: { backgroundColor: 'rgba(27, 27, 27, 0.8)', backdropFilter: 'blur(20px)', border: '1px solid rgba(255, 255, 255, 0.1)', }, header: { backgroundColor: 'rgba(27, 27, 27, 0.6)', backdropFilter: 'blur(20px)', borderBottom: '1px solid rgba(255, 255, 255, 0.1)', }, body: { backgroundColor: 'transparent', } }} >
{/* 项目信息 */}

分享视频: {project.name || 'Unnamed Project'}

视频链接: {project.final_video_url || project.final_simple_video_url || 'N/A'}

{/* 回调状态显示 */}
{callbackStatus === CallbackStatus.LOADING && ( <>

正在处理 Twitter 授权...

请稍候,正在验证授权信息

)} {callbackStatus === CallbackStatus.SUCCESS && ( <>

授权成功!

Twitter 授权已完成,可以开始分享视频

{callbackData && (

授权 Token: {callbackData.access_token ? '已获取' : '未获取'}

)}
)} {callbackStatus === CallbackStatus.FAILED && ( <>

授权失败

Twitter 授权处理失败,请重试

)}
); }