From 4508c292ebaabb3dd195327f312b49f3388a12db Mon Sep 17 00:00:00 2001
From: BiggerRain <15911122312@163.COM>
Date: Sat, 26 Apr 2025 14:27:00 +0800
Subject: [PATCH] fix: Solves the issue of bottom toolbar overlapping content
in mobile Safari (#448)
* style: adjust style
* fix: close Splash
---
.env | 4 ++-
src/components/Assistant/Splash.tsx | 3 ++-
src/components/ChatMessage/CallTools.tsx | 28 +++++++++++++--------
src/components/ChatMessage/markdown.css | 28 +++++++++++++++++++--
src/components/Search/InputBox.tsx | 5 ----
src/hooks/useChatActions.ts | 7 ++++++
src/hooks/useMessageHandler.ts | 1 -
src/hooks/useViewportHeight.ts | 32 ++++++++++++++++++++++++
src/hooks/useWebSocket.ts | 4 +--
src/pages/web/index.tsx | 9 ++++---
src/web.css | 11 +++-----
tsup.config.ts | 2 +-
12 files changed, 99 insertions(+), 35 deletions(-)
create mode 100644 src/hooks/useViewportHeight.ts
diff --git a/.env b/.env
index 066376a4..ea3e5ed7 100644
--- a/.env
+++ b/.env
@@ -1,3 +1,5 @@
COCO_SERVER_URL=http://localhost:9000 #https://coco.infini.cloud #http://localhost:9000
-COCO_WEBSOCKET_URL=ws://localhost:9000/ws #wss://coco.infini.cloud/ws #ws://localhost:9000/ws
\ No newline at end of file
+COCO_WEBSOCKET_URL=ws://localhost:9000/ws #wss://coco.infini.cloud/ws #ws://localhost:9000/ws
+
+TAURI_DEV_HOST=0.0.0.0
\ No newline at end of file
diff --git a/src/components/Assistant/Splash.tsx b/src/components/Assistant/Splash.tsx
index 1529cb37..a916b5d4 100644
--- a/src/components/Assistant/Splash.tsx
+++ b/src/components/Assistant/Splash.tsx
@@ -1,7 +1,8 @@
+import { useMemo, useState } from "react";
import { CircleX, MoveRight } from "lucide-react";
import { useMount } from "ahooks";
+
import { useAppStore } from "@/stores/appStore";
-import { useMemo, useState } from "react";
import platformAdapter from "@/utils/platformAdapter";
import { useConnectStore } from "@/stores/connectStore";
import { useThemeStore } from "@/stores/themeStore";
diff --git a/src/components/ChatMessage/CallTools.tsx b/src/components/ChatMessage/CallTools.tsx
index e1511a9d..9d9ef5b0 100644
--- a/src/components/ChatMessage/CallTools.tsx
+++ b/src/components/ChatMessage/CallTools.tsx
@@ -37,13 +37,21 @@ export const CallTools = ({ Detail, ChunkData, loading }: CallToolsProps) => {
className="inline-flex items-center gap-2 px-2 py-1 rounded-xl transition-colors border border-[#E6E6E6] dark:border-[#272626]"
>
{loading ? (
-
+ <>
+
+
+ {t(`assistant.message.steps.${ChunkData?.chunk_type}`)}
+
+ >
) : (
-
+ <>
+
+
+ {t(`assistant.message.steps.${ChunkData?.chunk_type}`)}
+
+ >
)}
-
- {t(`assistant.message.steps.${ChunkData?.chunk_type}`)}
-
+
{isThinkingExpanded ? (
) : (
@@ -53,11 +61,11 @@ export const CallTools = ({ Detail, ChunkData, loading }: CallToolsProps) => {
{isThinkingExpanded && (
-
{}}
- />
+ {}}
+ />
{/* {Data?.split("\n").map(
(paragraph, idx) =>
paragraph.trim() && (
diff --git a/src/components/ChatMessage/markdown.css b/src/components/ChatMessage/markdown.css
index 7362c488..ffd3f176 100644
--- a/src/components/ChatMessage/markdown.css
+++ b/src/components/ChatMessage/markdown.css
@@ -35,7 +35,7 @@
--color-fg-subtle: #6e7781;
--color-canvas-default: transparent;
--color-canvas-subtle: #f6f8fa;
- --color-border-default: #d0d7de;
+ --color-border-default: #8b949e;
--color-border-muted: hsla(210, 18%, 87%, 1);
--color-neutral-muted: rgba(175, 184, 193, 0.2);
--color-accent-fg: #0969da;
@@ -302,9 +302,12 @@
border-spacing: 0;
border-collapse: collapse;
display: block;
- width: max-content;
+ width: 100%;
max-width: 100%;
overflow: auto;
+ margin: 16px 0;
+ border-radius: 4px;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
}
.markdown-body td,
@@ -668,23 +671,44 @@
.markdown-body table th {
font-weight: var(--base-text-weight-semibold, 600);
+ background-color: var(--color-canvas-subtle);
+ text-align: left;
+ position: sticky;
+ top: 0;
+ z-index: 1;
}
.markdown-body table th,
.markdown-body table td {
padding: 6px 13px;
border: 1px solid var(--color-border-default);
+ border-width: 1.5px;
+ line-height: 1.5;
+ vertical-align: middle;
+ white-space: pre-wrap;
+}
+
+.markdown-body table td br,
+.markdown-body table th br {
+ display: block;
+ content: "";
+ margin-top: 8px;
}
.markdown-body table tr {
background-color: var(--color-canvas-default);
border-top: 1px solid var(--color-border-muted);
+ transition: background-color 0.2s ease;
}
.markdown-body table tr:nth-child(2n) {
background-color: var(--color-canvas-subtle);
}
+.markdown-body table tr:hover {
+ background-color: rgba(175, 184, 193, 0.1);
+}
+
.markdown-body table img {
background-color: transparent;
}
diff --git a/src/components/Search/InputBox.tsx b/src/components/Search/InputBox.tsx
index 7c10bf0f..fdaf8d14 100644
--- a/src/components/Search/InputBox.tsx
+++ b/src/components/Search/InputBox.tsx
@@ -142,9 +142,6 @@ export default function ChatInput({
const setModifierKeyPressed = useShortcutsStore((state) => {
return state.setModifierKeyPressed;
});
- const setVisibleStartPage = useConnectStore((state) => {
- return state.setVisibleStartPage;
- });
const setBlurred = useAppStore((state) => state.setBlurred);
useEffect(() => {
@@ -170,8 +167,6 @@ export default function ChatInput({
}, [isChatMode, textareaRef, inputRef]);
const handleSubmit = useCallback(() => {
- setVisibleStartPage(false);
-
const trimmedValue = inputValue.trim();
console.log("handleSubmit", trimmedValue, disabled);
if (trimmedValue && !disabled) {
diff --git a/src/hooks/useChatActions.ts b/src/hooks/useChatActions.ts
index e900c111..0d394bf9 100644
--- a/src/hooks/useChatActions.ts
+++ b/src/hooks/useChatActions.ts
@@ -30,6 +30,9 @@ export function useChatActions(
const { connected } = useChatStore();
const sourceDataIds = useSearchStore((state) => state.sourceDataIds);
const MCPIds = useSearchStore((state) => state.MCPIds);
+ const setVisibleStartPage = useConnectStore((state) => {
+ return state.setVisibleStartPage;
+ });
const [keyword, setKeyword] = useState("");
@@ -132,6 +135,7 @@ export function useChatActions(
} catch (error) {
console.error("chatHistory:", error);
}
+ setVisibleStartPage(false);
},
[currentServiceId, setActiveChat]
);
@@ -208,6 +212,7 @@ export function useChatActions(
} catch (error) {
console.error("createNewChat:", error);
}
+ setVisibleStartPage(false);
},
[
currentServiceId,
@@ -291,6 +296,7 @@ export function useChatActions(
} catch (error) {
console.error("sendMessage:", error);
}
+ setVisibleStartPage(false);
},
[
currentServiceId,
@@ -353,6 +359,7 @@ export function useChatActions(
console.error("open_session_chat:", error);
return null;
}
+ setVisibleStartPage(false);
},
[currentServiceId]
);
diff --git a/src/hooks/useMessageHandler.ts b/src/hooks/useMessageHandler.ts
index 019f731f..ac3643f5 100644
--- a/src/hooks/useMessageHandler.ts
+++ b/src/hooks/useMessageHandler.ts
@@ -60,7 +60,6 @@ export function useMessageHandler(
if (chunkData.chunk_type === "query_intent") {
handlers.deal_query_intent(chunkData);
} else if (chunkData.chunk_type === "tools") {
- console.log("tools", chunkData);
handlers.deal_tools(chunkData);
} else if (chunkData.chunk_type === "fetch_source") {
handlers.deal_fetch_source(chunkData);
diff --git a/src/hooks/useViewportHeight.ts b/src/hooks/useViewportHeight.ts
new file mode 100644
index 00000000..1fecbec5
--- /dev/null
+++ b/src/hooks/useViewportHeight.ts
@@ -0,0 +1,32 @@
+import { useEffect } from 'react';
+
+/**
+ * Custom Hook for monitoring window size changes and setting viewport height variables
+ * Solves the issue of bottom toolbar overlapping content in mobile Safari
+ */
+export function useViewportHeight() {
+ useEffect(() => {
+ // Set viewport height variable
+ const setViewportHeight = () => {
+ // Get actual visible viewport height
+ const vh = window.innerHeight * 0.01;
+ // Set CSS variable --vh
+ document.documentElement.style.setProperty('--vh', `${vh}px`);
+ };
+
+ // Initial setup
+ setViewportHeight();
+
+ // Listen for window resize events
+ window.addEventListener('resize', setViewportHeight);
+
+ // Listen for device orientation changes
+ window.addEventListener('orientationchange', setViewportHeight);
+
+ // Cleanup function
+ return () => {
+ window.removeEventListener('resize', setViewportHeight);
+ window.removeEventListener('orientationchange', setViewportHeight);
+ };
+ }, []);
+}
\ No newline at end of file
diff --git a/src/hooks/useWebSocket.ts b/src/hooks/useWebSocket.ts
index 3e7b180d..d905a050 100644
--- a/src/hooks/useWebSocket.ts
+++ b/src/hooks/useWebSocket.ts
@@ -39,7 +39,7 @@ export default function useWebSocket({
// web
const { readyState, connect, disconnect } = useWebSocketAHook(
// "wss://coco.infini.cloud/ws",
- // "ws://localhost:9000/ws",
+ //"ws://localhost:9000/ws",
isTauri ? "" : endpoint_websocket,
{
manual: true,
@@ -82,7 +82,7 @@ export default function useWebSocket({
while (messageQueue.current.length > 0) {
const msg = messageQueue.current.shift();
if (msg) {
- console.log("Processing message:", msg.substring(0, 100));
+ // console.log("Processing message:", msg.substring(0, 100));
processMessage(msg);
}
}
diff --git a/src/pages/web/index.tsx b/src/pages/web/index.tsx
index b98bf813..3da20b66 100644
--- a/src/pages/web/index.tsx
+++ b/src/pages/web/index.tsx
@@ -4,11 +4,12 @@ import SearchChat from "@/components/SearchChat";
import { useAppStore } from "@/stores/appStore";
import { useShortcutsStore } from "@/stores/shortcutsStore";
import { useIsMobile } from "@/hooks/useIsMobile";
+import { useModifierKeyPress } from "@/hooks/useModifierKeyPress";
+import useEscape from "@/hooks/useEscape";
+import { useViewportHeight } from "@/hooks/useViewportHeight";
import "@/i18n";
import "@/web.css";
-import { useModifierKeyPress } from "@/hooks/useModifierKeyPress";
-import useEscape from "@/hooks/useEscape";
interface WebAppProps {
headers?: Record;
@@ -71,8 +72,8 @@ function WebApp({
const [isChatMode, setIsChatMode] = useState(false);
useEscape();
-
useModifierKeyPress();
+ useViewportHeight();
return (
{isMobile && (
diff --git a/src/web.css b/src/web.css
index dace74d1..d0235fa0 100644
--- a/src/web.css
+++ b/src/web.css
@@ -398,11 +398,6 @@ body,
sup {
top: -0.5em;
}
- table {
- text-indent: 0;
- border-color: inherit;
- border-collapse: collapse;
- }
button,
input,
optgroup,
@@ -471,7 +466,7 @@ body,
figure,
p,
pre {
- margin: 0;
+ margin: inherit;
}
fieldset {
margin: 0;
@@ -484,8 +479,8 @@ body,
ul,
menu {
list-style: none;
- margin: 0;
- padding: 0;
+ margin: inherit;
+ padding: inherit;
}
dialog {
padding: 0;
diff --git a/tsup.config.ts b/tsup.config.ts
index 678e9b47..68f5f9c0 100644
--- a/tsup.config.ts
+++ b/tsup.config.ts
@@ -67,7 +67,7 @@ export default defineConfig({
const packageJson = {
name: "@infinilabs/search-chat",
- version: "1.1.10",
+ version: "1.1.12",
main: "index.js",
module: "index.js",
type: "module",