diff --git a/components/SmartChatBox/SmartChatBox.tsx b/components/SmartChatBox/SmartChatBox.tsx
index ac48e8d..b446f6d 100644
--- a/components/SmartChatBox/SmartChatBox.tsx
+++ b/components/SmartChatBox/SmartChatBox.tsx
@@ -1,4 +1,4 @@
-import React, { useRef, useCallback, useState, useEffect } from "react";
+import React, { useRef, useCallback, useState, useEffect, useMemo } from "react";
import { ChevronsRight, ChevronDown, X } from 'lucide-react';
import { Switch } from 'antd';
import { MessageRenderer } from "./MessageRenderer";
@@ -8,6 +8,7 @@ import { DateDivider } from "./DateDivider";
import { LoadMoreButton } from "./LoadMoreButton";
import { ChatMessage } from "./types";
import { useDeviceType } from '@/hooks/useDeviceType';
+import { useBrowserType } from '@/hooks/useBrowserType';
interface SmartChatBoxProps {
isSmartChatBoxOpen: boolean;
@@ -168,15 +169,28 @@ export default function SmartChatBox({
return groups.sort((a, b) => a.date - b.date);
}, [messages]);
+ const browserType = useBrowserType();
+ /** 根据浏览器类型获取最大高度值 */
+ const maxHeight = useMemo(() => {
+ switch (browserType) {
+ case 'Edge':
+ return 'calc(100vh - 5.5rem)';
+ case 'Chrome':
+ return 'calc(100vh - 7rem)';
+ default:
+ return 'calc(100vh - 5.5rem)';
+ }
+ }, [browserType]);
+
return (
{/* Header */}
- Chat
+ Chat {browserType}-{maxHeight}
{/* System push toggle */}
(0);
const [isPlaying, setIsPlaying] = useState(false);
const [isCatalogOpen, setIsCatalogOpen] = useState(false);
- const [isEdgeBrowser, setIsEdgeBrowser] = useState(false);
+ const browserType = useBrowserType();
const searchParams = useSearchParams();
const episodeId = searchParams.get('episodeId') || '';
/** 解析形如 "16:9" 的比例字符串 */
@@ -100,16 +101,17 @@ export function H5MediaViewer({
};
};
- /** 检测是否为 Edge 浏览器(客户端挂载后执行) */
- useEffect(() => {
- const isEdge = navigator.userAgent.indexOf('Edg') !== -1;
- setIsEdgeBrowser(isEdge);
- }, []);
-
/** 根据浏览器类型获取最大高度值 */
const maxHeight = useMemo(() => {
- return isEdgeBrowser ? 'calc(100vh - 10.5rem)' : 'calc(100vh - 15rem)';
- }, [isEdgeBrowser]);
+ switch (browserType) {
+ case 'Edge':
+ return 'calc(100vh - 10.5rem)';
+ case 'Chrome':
+ return 'calc(100vh - 17rem)';
+ default:
+ return 'calc(100vh - 15rem)';
+ }
+ }, [browserType]);
/** 视频轮播容器高度:按 aspectRatio 计算(基于视口宽度) */
const videoWrapperHeight = useMemo(() => {
diff --git a/hooks/useBrowserType.ts b/hooks/useBrowserType.ts
new file mode 100644
index 0000000..83ebf64
--- /dev/null
+++ b/hooks/useBrowserType.ts
@@ -0,0 +1,25 @@
+import { useState, useEffect } from 'react';
+
+type BrowserType = 'Edge' | 'Chrome' | 'Safari';
+
+/**
+ * Detects the browser type on client side
+ * @returns {BrowserType} - The detected browser type
+ */
+export const useBrowserType = (): BrowserType => {
+ const [browserType, setBrowserType] = useState('Safari');
+
+ useEffect(() => {
+ const userAgent = navigator.userAgent;
+
+ if (userAgent.indexOf('EdgA') !== -1 || userAgent.indexOf('EdgiOS') !== -1) {
+ setBrowserType('Edge');
+ } else if (userAgent.indexOf('Chrome') !== -1 || userAgent.indexOf('CriOS') !== -1) {
+ setBrowserType('Chrome');
+ } else {
+ setBrowserType('Safari');
+ }
+ }, []);
+
+ return browserType;
+};
\ No newline at end of file