修复tmdbkey错误和未登录时获取外部观影室密钥无限重定向

This commit is contained in:
mtvpls
2026-01-29 21:14:36 +08:00
parent 38dab1a8c2
commit 5b6d6fbdff
3 changed files with 129 additions and 53 deletions
+38 -12
View File
@@ -7,6 +7,8 @@ import { useWatchRoom } from '@/hooks/useWatchRoom';
import Toast, { ToastProps } from '@/components/Toast';
import { getAuthInfoFromBrowserCookie } from '@/lib/auth';
import type { ChatMessage, Member, Room, WatchRoomConfig } from '@/types/watch-room';
// Import type from watch-room-socket
@@ -79,6 +81,7 @@ export function WatchRoomProvider({ children }: WatchRoomProviderProps) {
const [isEnabled, setIsEnabled] = useState(false);
const [toast, setToast] = useState<ToastProps | null>(null);
const [reconnectFailed, setReconnectFailed] = useState(false);
const [isLoggedIn, setIsLoggedIn] = useState(false);
// 处理房间删除的回调
const handleRoomDeleted = useCallback((data?: { reason?: string }) => {
@@ -116,6 +119,23 @@ export function WatchRoomProvider({ children }: WatchRoomProviderProps) {
const watchRoom = useWatchRoom(handleRoomDeleted, handleStateCleared);
// 检查登录状态
useEffect(() => {
const checkLoginStatus = () => {
const authInfo = getAuthInfoFromBrowserCookie();
const loggedIn = !!(authInfo && authInfo.username);
setIsLoggedIn(loggedIn);
};
// 初始检查
checkLoginStatus();
// 定期检查登录状态(每秒检查一次)
const interval = setInterval(checkLoginStatus, 1000);
return () => clearInterval(interval);
}, []);
// 手动重连
const manualReconnect = useCallback(async () => {
console.log('[WatchRoomProvider] Manual reconnect initiated');
@@ -164,20 +184,26 @@ export function WatchRoomProvider({ children }: WatchRoomProviderProps) {
// 如果使用外部服务器,需要获取认证信息(需要登录)
if (watchRoomConfig.serverType === 'external' && watchRoomConfig.enabled) {
try {
const authResponse = await fetch('/api/watch-room-auth');
if (authResponse.ok) {
const authData = await authResponse.json();
watchRoomConfig.externalServerAuth = authData.externalServerAuth;
} else {
console.error('[WatchRoom] Failed to load auth info:', authResponse.status);
// 检查用户是否已登录
if (!isLoggedIn) {
console.log('[WatchRoom] User not logged in, skipping auth info request');
// 用户未登录,不调用认证接口
} else {
try {
const authResponse = await fetch('/api/watch-room-auth');
if (authResponse.ok) {
const authData = await authResponse.json();
watchRoomConfig.externalServerAuth = authData.externalServerAuth;
} else {
console.error('[WatchRoom] Failed to load auth info:', authResponse.status);
// 如果无法获取认证信息,禁用观影室
watchRoomConfig.enabled = false;
}
} catch (error) {
console.error('[WatchRoom] Error loading auth info:', error);
// 如果无法获取认证信息,禁用观影室
watchRoomConfig.enabled = false;
}
} catch (error) {
console.error('[WatchRoom] Error loading auth info:', error);
// 如果无法获取认证信息,禁用观影室
watchRoomConfig.enabled = false;
}
}
@@ -232,7 +258,7 @@ export function WatchRoomProvider({ children }: WatchRoomProviderProps) {
return () => {
watchRoom.disconnect();
};
}, []);
}, [isLoggedIn]); // 添加 isLoggedIn 作为依赖
const contextValue: WatchRoomContextType = {
socket: watchRoom.socket,