diff --git a/app/api/video-share/x/auth/callback/page.tsx b/app/api/video-share/x/auth/callback/page.tsx index 6bee4cb..f74e61d 100644 --- a/app/api/video-share/x/auth/callback/page.tsx +++ b/app/api/video-share/x/auth/callback/page.tsx @@ -1,10 +1,13 @@ 'use client'; -import { useEffect } from 'react'; +import { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; +import TwitterCallbackModal from '@/components/common/TwitterCallbackModal'; export default function TwitterAuthCallbackPage() { const router = useRouter(); + const [callbackParams, setCallbackParams] = useState<{ state: string; code: string } | null>(null); + const [project, setProject] = useState(null); useEffect(() => { // 解析回调参数 @@ -12,38 +15,57 @@ export default function TwitterAuthCallbackPage() { const state = searchParams.get('state'); const code = searchParams.get('code'); - // 将回调参数写入 localStorage,供原窗口读取 if (state && code) { - try { - const payload = { - state, - code, - timestamp: Date.now(), - }; - localStorage.setItem('twitterAuthCallbackPayload', JSON.stringify(payload)); - // 通过变化一个随机标记键,确保触发其它窗口的 storage 事件 - localStorage.setItem('twitterAuthCallbackFlag', Math.random().toString(36).slice(2)); - } catch { - // 忽略本地存储异常 - } + setCallbackParams({ state, code }); - // 通过 postMessage 通知打开者(如果存在且同源策略允许) - try { - if (window.opener) { - window.opener.postMessage({ type: 'TWITTER_AUTH_CALLBACK', state, code }, window.location.origin); + // 从 localStorage 获取项目信息 + const storedProject = localStorage.getItem('currentShareProject'); + if (storedProject) { + try { + const parsedProject = JSON.parse(storedProject); + setProject(parsedProject); + } catch (error) { + console.error('解析项目信息失败:', error); + setProject({ project_id: '', name: '未知项目', final_video_url: '' }); } - } catch { - + } else { + setProject({ project_id: '', name: '未知项目', final_video_url: '' }); } - } - // 跳回应用页面(原窗口会通过 storage 事件弹出处理弹框) - router.push('/movies?twitterCallback=true'); + // 清理 URL 参数 + const cleanUrl = window.location.pathname; + window.history.replaceState({}, document.title, cleanUrl); + } else { + // 如果没有参数,重定向到主页面 + router.push('/movies'); + } }, [router]); + const handleCloseModal = () => { + // 清理 localStorage 中的临时数据 + try { + localStorage.removeItem('twitterAuthCallbackPayload'); + localStorage.removeItem('twitterAuthCallbackFlag'); + } catch (error) { + console.error('清理 localStorage 失败:', error); + } + setCallbackParams(null); + router.push('/movies'); + }; + return (
-

处理 Twitter 授权回调...

+ {callbackParams && project && ( + + )} + {!callbackParams && ( +

处理 Twitter 授权回调...

+ )}
); }