diff --git a/src/components/DetailPanel.tsx b/src/components/DetailPanel.tsx index f88f7cd..40cffb4 100644 --- a/src/components/DetailPanel.tsx +++ b/src/components/DetailPanel.tsx @@ -1,6 +1,6 @@ 'use client'; -import { Calendar, Clock, Film,Globe, Star, Tag, Users, X } from 'lucide-react'; +import { Calendar, Clock, ExternalLink, Film,Globe, Star, Tag, Users, X } from 'lucide-react'; import Image from 'next/image'; import React, { useEffect, useState } from 'react'; import { createPortal } from 'react-dom'; @@ -101,12 +101,38 @@ const DetailPanel: React.FC = ({ const [showImageViewer, setShowImageViewer] = useState(false); const [selectedImage, setSelectedImage] = useState(''); + // 数据源状态管理 const [currentSource, setCurrentSource] = useState<'douban' | 'bangumi' | 'cms' | 'tmdb'>('tmdb'); const [originalSource, setOriginalSource] = useState<'douban' | 'bangumi' | 'cms' | 'tmdb'>('tmdb'); const [isUsingTmdb, setIsUsingTmdb] = useState(false); const [originalDetailData, setOriginalDetailData] = useState(null); + const getExternalUrl = () => { + if (currentSource === 'douban' && doubanId) { + return `https://movie.douban.com/subject/${doubanId}`; + } + + if (currentSource === 'bangumi') { + const actualBangumiId = bangumiId || doubanId; + if (actualBangumiId) { + return `https://bgm.tv/subject/${actualBangumiId}`; + } + } + + if (currentSource === 'tmdb') { + const actualTmdbId = detailData?.tmdbId || tmdbId; + const actualMediaType = detailData?.mediaType || type; + if (actualTmdbId) { + return `https://www.themoviedb.org/${actualMediaType}/${actualTmdbId}`; + } + } + + return null; + }; + + const externalUrl = getExternalUrl(); + // 拖动滚动状态 const [isDragging, setIsDragging] = useState(false); const [isMouseDown, setIsMouseDown] = useState(false); @@ -874,12 +900,26 @@ const DetailPanel: React.FC = ({ {/* 头部 */}

详情

- +
+ {externalUrl && ( + + )} + +
{/* 内容区域 */} @@ -1364,12 +1404,26 @@ const DetailPanel: React.FC = ({ {/* 头部 */}

详情

- +
+ {externalUrl && ( + + )} + +
{/* 内容区域 */}