diff --git a/src/components/VideoDetailContent.tsx b/src/components/VideoDetailContent.tsx index 10fa4d6..ced9e7b 100644 --- a/src/components/VideoDetailContent.tsx +++ b/src/components/VideoDetailContent.tsx @@ -13,16 +13,7 @@ import { import { VideoDetailItem, CommentItem, UserMeResponse } from '../types/api'; import { buildVideoShareUrl, tryNativeShare } from '../utils/nativeShare'; import LoginPromptModal from './LoginPromptModal'; - -const isSafeHttpUrl = (url?: string | null): boolean => { - if (!url) return false; - try { - const parsed = new URL(url); - return parsed.protocol === 'http:' || parsed.protocol === 'https:'; - } catch { - return false; - } -}; +import { isSafeHttpUrl } from '../utils/url'; interface VideoDetailContentProps { videoId: string; diff --git a/src/pages/Ssulbox/SsulDetailContent.tsx b/src/pages/Ssulbox/SsulDetailContent.tsx index 2b60897..f3dc331 100644 --- a/src/pages/Ssulbox/SsulDetailContent.tsx +++ b/src/pages/Ssulbox/SsulDetailContent.tsx @@ -14,6 +14,7 @@ import type { SsulDetailItem } from '../../utils/api'; import { CommentItem, UserMeResponse } from '../../types/api'; import { buildContentShareUrl, tryNativeShare } from '../../utils/nativeShare'; import LoginPromptModal from '../../components/LoginPromptModal'; +import { isSafeHttpUrl } from '../../utils/url'; interface SsulDetailContentProps { contentId: string; @@ -48,6 +49,7 @@ const SsulDetailContent: React.FC = ({ const [copied, setCopied] = useState(false); const [isLandscape, setIsLandscape] = useState(false); + const [showSiteOverlay, setShowSiteOverlay] = useState(false); const [showLoginModal, setShowLoginModal] = useState(false); const [comments, setComments] = useState([]); @@ -86,6 +88,7 @@ const SsulDetailContent: React.FC = ({ const fetchContent = async () => { setLoading(true); setError(null); + setShowSiteOverlay(false); try { const data = await getSsulContentById(contentId); setContent(data); @@ -265,19 +268,47 @@ const SsulDetailContent: React.FC = ({

{error}

) : content ? (
-