diff --git a/src/components/McpPanel/components/McpPanelH5.tsx b/src/components/McpPanel/components/McpPanelH5.tsx
index ff16172..cedef7a 100644
--- a/src/components/McpPanel/components/McpPanelH5.tsx
+++ b/src/components/McpPanel/components/McpPanelH5.tsx
@@ -1,5 +1,5 @@
-import { useEffect } from 'react';
-import { Button, Card, List, Modal, App as AntApp, Space, Alert, Tag, Popconfirm, Tooltip } from 'antd';
+import { useEffect, useState } from 'react';
+import { Button, Card, List, Modal, App as AntApp, Space, Alert, Tag, Popconfirm, Tooltip, Form, Input, Select } from 'antd';
import type { McpServer } from '../../../api';
import type { McpPanelLogicOutput } from '../McpPanelLogic';
@@ -230,8 +230,7 @@ function McpFormH5({
onSubmit: (values: any) => void;
onCancel: () => void;
}) {
- const { useForm } = AntApp;
- const [form] = useForm();
+ const [form] = Form.useForm();
const [transport, setTransport] = useState<'stdio' | 'sse' | 'http'>(initial?.transport ?? 'stdio');
useEffect(() => {
@@ -247,92 +246,50 @@ function McpFormH5({
}, [initial, form]);
return (
-
+
+
+
+
+
+
+
+
>
) : (
-
-
-
-
+
+
+
)}
-
+
-
+
);
}
diff --git a/src/components/McpPanel/components/McpPanelWeb.tsx b/src/components/McpPanel/components/McpPanelWeb.tsx
index 0d8ad70..c68f0ee 100644
--- a/src/components/McpPanel/components/McpPanelWeb.tsx
+++ b/src/components/McpPanel/components/McpPanelWeb.tsx
@@ -1,5 +1,5 @@
-import { useEffect } from 'react';
-import { Button, Card, List, Modal, App as AntApp, Space, Alert, Tag, Popconfirm, Tooltip } from 'antd';
+import { useEffect, useState } from 'react';
+import { Button, Card, List, Modal, App as AntApp, Space, Alert, Tag, Popconfirm, Tooltip, Form, Input, Select } from 'antd';
import type { McpServer } from '../../../api';
import type { McpPanelLogicOutput } from '../McpPanelLogic';
@@ -219,7 +219,7 @@ function McpForm({
onSubmit: (values: any) => void;
onCancel: () => void;
}) {
- const [form] = AntApp.useApp().form;
+ const [form] = Form.useForm();
const [transport, setTransport] = useState<'stdio' | 'sse' | 'http'>(initial?.transport ?? 'stdio');
useEffect(() => {
@@ -235,76 +235,50 @@ function McpForm({
}, [initial, form]);
return (
-
+
+
+
+
+
+
+
+
>
) : (
-
-
-
-
+
+
+
)}
-
+
-
+
);
}
diff --git a/src/pages/MarketplacePage/components/MarketplacePageH5.tsx b/src/pages/MarketplacePage/components/MarketplacePageH5.tsx
index a241ab2..92a0528 100644
--- a/src/pages/MarketplacePage/components/MarketplacePageH5.tsx
+++ b/src/pages/MarketplacePage/components/MarketplacePageH5.tsx
@@ -229,7 +229,7 @@ export default function MarketplacePageH5({ logic }: Props) {
-
+
))}
)}
diff --git a/src/pages/PointsMallPage/PointsMallPageLogic.ts b/src/pages/PointsMallPage/PointsMallPageLogic.ts
index 780593d..1708abb 100644
--- a/src/pages/PointsMallPage/PointsMallPageLogic.ts
+++ b/src/pages/PointsMallPage/PointsMallPageLogic.ts
@@ -2,7 +2,7 @@ import { useEffect, useRef, useState } from 'react';
import { message } from 'antd';
import { PointsMallAPI, PointsMallCategory, PointsMallOverview, PointsMallProduct, PointsMallProductsResponse } from '../../api';
import { MOCK_OVERVIEW, MOCK_PRODUCTS } from './mocks';
-import type { SortKey } from './types';
+import type { ExchangeFormValues, SortKey } from './types';
export function usePointsMallPageLogic() {
const [overviewLoading, setOverviewLoading] = useState(false);
@@ -37,7 +37,11 @@ export function usePointsMallPageLogic() {
PointsMallAPI.promoEntries(),
]);
- const me = meRes.status === 'fulfilled' ? meRes.value : { points: 0, level: 'Lv.0' };
+ const rawMe = meRes.status === 'fulfilled' ? meRes.value : { points: 0, level: 'Lv.0' };
+ const me = {
+ ...rawMe,
+ points: Number((rawMe as any)?.points ?? 0),
+ };
const cats = categoriesRes.status === 'fulfilled' ? categoriesRes.value : MOCK_OVERVIEW.categories;
const announcements = announcementsRes.status === 'fulfilled' ? announcementsRes.value : MOCK_OVERVIEW.announcements;
const banners = bannersRes.status === 'fulfilled' ? bannersRes.value : MOCK_OVERVIEW.banners;
@@ -124,10 +128,11 @@ export function usePointsMallPageLogic() {
setPendingExpiresAt(res.expiresAt || new Date(Date.now() + 30 * 60 * 1000).toISOString());
setConfirmModalVisible(false);
setExchangeModalVisible(true);
- if (typeof res.remainingPoints === 'number') {
+ const remainingPoints = res.remainingPoints;
+ if (typeof remainingPoints === 'number') {
setOverview((prev) => {
if (!prev) return prev;
- return { ...prev, me: { ...prev.me, points: res.remainingPoints } };
+ return { ...prev, me: { ...prev.me, points: remainingPoints } };
});
}
message.success('已冻结积分并预扣库存,请继续填写收件信息');
@@ -140,8 +145,34 @@ export function usePointsMallPageLogic() {
}
};
- const handleExchangeSubmit = async () => {
+ const handleExchangeSubmit = async (values: ExchangeFormValues) => {
if (!selectedProduct || !pendingOrderId) return;
+ setExchangeLoading(true);
+ try {
+ const res = await PointsMallAPI.exchangeSubmitShipping(pendingOrderId, values);
+ setExchangeModalVisible(false);
+ setConfirmModalVisible(false);
+ setPendingOrderId(null);
+ setPendingExpiresAt(null);
+ setSelectedProduct(null);
+ setExchangeQuantity(1);
+ const remainingPoints = res.remainingPoints;
+ if (typeof remainingPoints === 'number') {
+ setOverview((prev) => {
+ if (!prev) return prev;
+ return { ...prev, me: { ...prev.me, points: remainingPoints } };
+ });
+ } else {
+ loadOverview();
+ }
+ loadProducts();
+ message.success('兑换成功');
+ } catch (e: any) {
+ const msg = e?.response?.data?.message || e?.response?.data?.error || e?.message || '提交收件信息失败,请稍后重试';
+ message.error(msg);
+ } finally {
+ setExchangeLoading(false);
+ }
};
return {
diff --git a/src/pages/PointsMallPage/components/PointsMallPageH5.tsx b/src/pages/PointsMallPage/components/PointsMallPageH5.tsx
index 71255d9..e4b601d 100644
--- a/src/pages/PointsMallPage/components/PointsMallPageH5.tsx
+++ b/src/pages/PointsMallPage/components/PointsMallPageH5.tsx
@@ -1,15 +1,17 @@
-import { Button, Card, Empty, Input, Select, Space, Spin, Tag } from 'antd';
+import { Button, Card, Empty, Form, Input, Select, Space, Spin, Tag } from 'antd';
import { SearchOutlined } from '@ant-design/icons';
import type { PointsMallProduct } from '../../../api';
import type { PointsMallPageLogicOutput } from '../PointsMallPageLogic';
import ExchangeModal from '../components/ExchangeModal';
import ConfirmExchangeModal from '../components/ConfirmExchangeModal';
+import type { ExchangeFormValues } from '../types';
interface Props {
logic: PointsMallPageLogicOutput;
}
export default function PointsMallPageH5({ logic }: Props) {
+ const [exchangeForm] = Form.useForm();
const {
overview,
overviewLoading,
@@ -246,9 +248,13 @@ export default function PointsMallPageH5({ logic }: Props) {
quantity={exchangeQuantity}
expiresAt={pendingExpiresAt}
loading={exchangeLoading}
- onSubmit={logic.handleExchangeSubmit}
+ form={exchangeForm}
+ onSubmit={() => {
+ exchangeForm.validateFields().then((values) => logic.handleExchangeSubmit(values));
+ }}
onCancel={() => {
setExchangeModalVisible(false);
+ exchangeForm.resetFields();
logic.setPendingOrderId(null);
logic.setPendingExpiresAt(null);
logic.setSelectedProduct(null);
diff --git a/src/pages/PointsMallPage/components/PointsMallPageWeb.tsx b/src/pages/PointsMallPage/components/PointsMallPageWeb.tsx
index 2029ddd..656afa0 100644
--- a/src/pages/PointsMallPage/components/PointsMallPageWeb.tsx
+++ b/src/pages/PointsMallPage/components/PointsMallPageWeb.tsx
@@ -1,15 +1,17 @@
-import { Button, Card, Empty, Input, Select, Space, Spin, Tag } from 'antd';
+import { Button, Card, Empty, Form, Input, Select, Space, Spin, Tag } from 'antd';
import { SearchOutlined } from '@ant-design/icons';
import type { PointsMallProduct } from '../../../api';
import type { PointsMallPageLogicOutput } from '../PointsMallPageLogic';
import ExchangeModal from '../components/ExchangeModal';
import ConfirmExchangeModal from '../components/ConfirmExchangeModal';
+import type { ExchangeFormValues } from '../types';
interface Props {
logic: PointsMallPageLogicOutput;
}
export default function PointsMallPageWeb({ logic }: Props) {
+ const [exchangeForm] = Form.useForm();
const {
overview,
overviewLoading,
@@ -239,9 +241,13 @@ export default function PointsMallPageWeb({ logic }: Props) {
quantity={exchangeQuantity}
expiresAt={pendingExpiresAt}
loading={exchangeLoading}
- onSubmit={logic.handleExchangeSubmit}
+ form={exchangeForm}
+ onSubmit={() => {
+ exchangeForm.validateFields().then((values) => logic.handleExchangeSubmit(values));
+ }}
onCancel={() => {
setExchangeModalVisible(false);
+ exchangeForm.resetFields();
logic.setPendingOrderId(null);
logic.setPendingExpiresAt(null);
logic.setSelectedProduct(null);
diff --git a/src/pages/TeamsPage/TeamsPageLogic.ts b/src/pages/TeamsPage/TeamsPageLogic.ts
index 28864c0..b33f2bc 100644
--- a/src/pages/TeamsPage/TeamsPageLogic.ts
+++ b/src/pages/TeamsPage/TeamsPageLogic.ts
@@ -62,8 +62,10 @@ export function useTeamsPageLogic() {
handleInvite,
handleDelete,
handleRemoveMember,
+ setActive,
setCreateOpen,
setInviteOpen,
+ setLastInviteCode,
};
}
diff --git a/src/pages/TeamsPage/components/TeamsPageH5.tsx b/src/pages/TeamsPage/components/TeamsPageH5.tsx
index ddc62e7..031c3d4 100644
--- a/src/pages/TeamsPage/components/TeamsPageH5.tsx
+++ b/src/pages/TeamsPage/components/TeamsPageH5.tsx
@@ -7,7 +7,7 @@ import {
UserOutlined,
} from '@ant-design/icons';
import { Card, Button, List, Tag, Space, Popconfirm, App as AntApp, Modal, Form, Input, Empty } from 'antd';
-import type { Team } from '../../../api';
+import { TeamAPI, type Team } from '../../../api';
import type { TeamsPageLogicOutput } from '../TeamsPageLogic';
interface Props {
diff --git a/src/pages/TeamsPage/components/TeamsPageWeb.tsx b/src/pages/TeamsPage/components/TeamsPageWeb.tsx
index 5d38afe..642549b 100644
--- a/src/pages/TeamsPage/components/TeamsPageWeb.tsx
+++ b/src/pages/TeamsPage/components/TeamsPageWeb.tsx
@@ -7,7 +7,7 @@ import {
UserOutlined,
} from '@ant-design/icons';
import { Card, Button, List, Tag, Space, Popconfirm, App as AntApp, Modal, Form, Input, Empty } from 'antd';
-import type { Team } from '../../../api';
+import { TeamAPI, type Team } from '../../../api';
import type { TeamsPageLogicOutput } from '../TeamsPageLogic';
interface Props {
@@ -294,8 +294,7 @@ export default function TeamsPageWeb({ logic }: Props) {
}
/>
- );
- }}
+ )}
/>
) : (
diff --git a/src/pages/chat/ChatPage.tsx b/src/pages/chat/ChatPage.tsx
index 4706c53..773cef9 100644
--- a/src/pages/chat/ChatPage.tsx
+++ b/src/pages/chat/ChatPage.tsx
@@ -1,7 +1,7 @@
import { useEffect, useState } from 'react';
-import { useChatPageLogic } from './chat/ChatPageLogic';
-import ChatPageWeb from './chat/components/ChatPageWeb';
-import ChatPageH5 from './chat/components/ChatPageH5';
+import { useChatPageLogic } from './ChatPageLogic';
+import ChatPageWeb from './components/ChatPageWeb';
+import ChatPageH5 from './components/ChatPageH5';
const isMobileDevice = () => {
if (typeof window === 'undefined') return false;
diff --git a/src/pages/chat/ChatPageLogic.ts b/src/pages/chat/ChatPageLogic.ts
index fc3d605..1506fe5 100644
--- a/src/pages/chat/ChatPageLogic.ts
+++ b/src/pages/chat/ChatPageLogic.ts
@@ -1,11 +1,11 @@
import { useEffect, useRef, useState } from 'react';
import { useNavigate, useParams, useSearchParams } from 'react-router-dom';
import { App as AntApp } from 'antd';
-import { SessionAPI } from '../../../api';
+import type { ModelOverrides } from '../../api';
+import { SessionAPI } from '../../api';
import { useChatScroll } from './hooks/useChatScroll';
import { useChatData } from './hooks/useChatData';
import { useChatSender } from './hooks/useChatSender';
-import { markdownToPlainText } from './utils/copy';
const lastRoomKey = (agentId: string) => `chat:lastRoom:${agentId}`;
const isValidRoomId = (v: string | null): v is string => !!v && !String(v).startsWith('legacy_');
@@ -22,6 +22,7 @@ export function useChatPageLogic() {
const [mcpDrawerOpen, setMcpDrawerOpen] = useState(false);
const [paramsDrawerOpen, setParamsDrawerOpen] = useState(false);
const [tplDrawerOpen, setTplDrawerOpen] = useState(false);
+ const [overrides, setOverrides] = useState({});
const abortRef = useRef(null);
const { bodyRef, scrollBottom, initialScrollDoneRef } = useChatScroll();
@@ -111,7 +112,7 @@ export function useChatPageLogic() {
setHighlightId,
scrollBottom,
initialScrollDoneRef,
- setOverrides: (updater) => {},
+ setOverrides,
abort: () => abortRef.current?.abort(),
});
@@ -120,16 +121,32 @@ export function useChatPageLogic() {
agent,
agentList,
roomId,
- overrides: {},
+ overrides,
+ setOverrides,
messages,
setMessages,
setBranches,
loadMessages,
scrollBottom,
notify: { success: (t) => message.success(t), error: (t) => message.error(t) },
- abort: abortRef,
+ abortRef,
});
+ const handleNewSession = async () => {
+ if (!id) return;
+ abortRef.current?.abort();
+ try {
+ const created = await SessionAPI.create(id);
+ setRoomId(created.id);
+ setHighlightId(null);
+ setMessages(() => []);
+ setBranches({});
+ message.success('已创建新会话');
+ } catch (e: any) {
+ message.error('创建房间失败:' + (e?.message ?? e));
+ }
+ };
+
return {
id,
roomId,
@@ -147,10 +164,15 @@ export function useChatPageLogic() {
initialScrollDoneRef,
sender,
navigate,
+ overrides,
+ setOverrides,
+ setRoomId,
+ setHighlightId,
setHistoryDrawerOpen,
setMcpDrawerOpen,
setParamsDrawerOpen,
setTplDrawerOpen,
+ handleNewSession,
};
}
diff --git a/src/pages/chat/components/ChatPageH5.tsx b/src/pages/chat/components/ChatPageH5.tsx
index b4c2ad9..50a274b 100644
--- a/src/pages/chat/components/ChatPageH5.tsx
+++ b/src/pages/chat/components/ChatPageH5.tsx
@@ -1,17 +1,20 @@
-import { Empty } from 'antd';
-import AgentSidebar from './AgentSidebar';
-import ChatHeader from './components/ChatHeader';
-import ChatBody from './components/ChatBody';
-import ChatInput from './components/ChatInput';
-import ChatDrawers from './components/ChatDrawers';
-import ChatOutline from './components/ChatOutline';
+import { App as AntApp, Button, Drawer, Empty, Space } from 'antd';
+import { useState } from 'react';
+import type { ModelOverrides } from '../../../api';
import type { ChatPageLogicOutput } from '../ChatPageLogic';
+import { markdownToPlainText } from '../utils/copy';
+import AgentSidebar from './AgentSidebar';
+import ChatBody from './ChatBody';
+import ChatDrawers from './ChatDrawers';
+import ChatHeader from './ChatHeader';
+import ChatInput from './ChatInput';
+import ChatOutline from './ChatOutline';
-interface Props {
- logic: ChatPageLogicOutput;
-}
+export default function ChatPageH5({ logic }: { logic: ChatPageLogicOutput }) {
+ const { message } = AntApp.useApp();
+ const [agentDrawerOpen, setAgentDrawerOpen] = useState(false);
+ const [outlineDrawerOpen, setOutlineDrawerOpen] = useState(false);
-export default function ChatPageH5({ logic }: Props) {
const {
id,
roomId,
@@ -25,32 +28,81 @@ export default function ChatPageH5({ logic }: Props) {
messages,
branches,
bodyRef,
- scrollBottom,
- initialScrollDoneRef,
sender,
navigate,
+ overrides,
+ setOverrides,
+ setRoomId,
+ setHighlightId,
setHistoryDrawerOpen,
setMcpDrawerOpen,
setParamsDrawerOpen,
setTplDrawerOpen,
+ handleNewSession,
} = logic;
return (
-
navigate('/agents/new')}
- onSelect={(aid) => navigate(`/chat/${aid}`)}
- />
+ setAgentDrawerOpen(false)}
+ width={320}
+ styles={{ body: { padding: 0 } }}
+ >
+ {
+ setAgentDrawerOpen(false);
+ navigate('/agents/new');
+ }}
+ onSelect={(aid) => {
+ setAgentDrawerOpen(false);
+ navigate(`/chat/${aid}`);
+ }}
+ />
+
+
+ setOutlineDrawerOpen(false)}
+ width={320}
+ styles={{ body: { padding: 0 } }}
+ >
+ {
+ setHighlightId(msgId);
+ setOutlineDrawerOpen(false);
+ const el = document.getElementById('msg-' + msgId);
+ if (el) el.scrollIntoView({ block: 'start', behavior: 'smooth' });
+ }}
+ />
+
{!agent ? (
-
+
) : (
<>
+
+
+
+
+
+
+
{
const content = mode === 'markdown' ? text : markdownToPlainText(text);
- return navigator.clipboard
- ?.writeText(content)
- ?.then(() => message.success(mode === 'markdown' ? '已复制(Markdown)' : '已复制(纯文本)'));
- }}
- />
- />
-
- {
- setHighlightId(msgId);
- const el = document.getElementById('msg-' + msgId);
- if (el) el.scrollIntoView({ block: 'start', behavior: 'smooth' });
+ navigator.clipboard?.writeText(content).then(() => {
+ message.success(mode === 'markdown' ? '已复制(Markdown)' : '已复制(纯文本)');
+ });
}}
/>
@@ -109,26 +150,44 @@ export default function ChatPageH5({ logic }: Props) {
onOpenTpl={() => setTplDrawerOpen(true)}
modelOptions={sender.modelOptions}
activeModelValue={sender.activeModelValue}
- onChangeModel={sender.onChangeModel}
+ onChangeModel={(modelId) => {
+ const picked = sender.modelOptions.find((o) => o.value === modelId);
+ setOverrides((o: ModelOverrides) => ({
+ ...o,
+ model_id: modelId,
+ model: picked?.label ?? o.model
+ }));
+ }}
agentList={agentList}
onInsertMention={() => {}}
onOpenHistory={() => setHistoryDrawerOpen(true)}
- onNewSession={async () => {
- if (!id) return;
- abortRef.current?.abort();
- try {
- const created = await SessionAPI.create(id);
- setRoomId(created.id);
- messages.length && messages.splice(0, messages.length);
- branches && Object.keys(branches).length && Object.values(branches).forEach(() => {});
- } catch (e) {
- message.error('创建房间失败');
- }
- }}
+ onNewSession={handleNewSession}
/>
-
-
- >
- );
- };
+ >
+ )}
+
+
+ sender.setInput(updater)}
+ overrides={overrides}
+ setOverrides={setOverrides}
+ roomId={roomId}
+ setRoomId={setRoomId}
+ setHighlightId={setHighlightId}
+ sessionRefresh={sender.sessionRefresh}
+ mcpDrawerOpen={mcpDrawerOpen}
+ setMcpDrawerOpen={setMcpDrawerOpen}
+ tplDrawerOpen={tplDrawerOpen}
+ setTplDrawerOpen={setTplDrawerOpen}
+ paramsDrawerOpen={paramsDrawerOpen}
+ setParamsDrawerOpen={setParamsDrawerOpen}
+ historyDrawerOpen={historyDrawerOpen}
+ setHistoryDrawerOpen={setHistoryDrawerOpen}
+ notify={{ success: (t) => message.success(t) }}
+ />
+
+ );
}
diff --git a/src/pages/chat/components/ChatPageWeb.tsx b/src/pages/chat/components/ChatPageWeb.tsx
index 5488376..9e61d21 100644
--- a/src/pages/chat/components/ChatPageWeb.tsx
+++ b/src/pages/chat/components/ChatPageWeb.tsx
@@ -1,17 +1,17 @@
-import { Empty } from 'antd';
-import AgentSidebar from './AgentSidebar';
-import ChatHeader from './components/ChatHeader';
-import ChatBody from './components/ChatBody';
-import ChatInput from './components/ChatInput';
-import ChatDrawers from './components/ChatDrawers';
-import ChatOutline from './components/ChatOutline';
+import { App as AntApp, Empty } from 'antd';
import type { ChatPageLogicOutput } from '../ChatPageLogic';
+import { markdownToPlainText } from '../utils/copy';
+import type { ModelOverrides } from '../../../api';
+import AgentSidebar from './AgentSidebar';
+import ChatBody from './ChatBody';
+import ChatDrawers from './ChatDrawers';
+import ChatHeader from './ChatHeader';
+import ChatInput from './ChatInput';
+import ChatOutline from './ChatOutline';
-interface Props {
- logic: ChatPageLogicOutput;
-}
+export default function ChatPageWeb({ logic }: { logic: ChatPageLogicOutput }) {
+ const { message } = AntApp.useApp();
-export default function ChatPageWeb({ logic }: Props) {
const {
id,
roomId,
@@ -25,14 +25,17 @@ export default function ChatPageWeb({ logic }: Props) {
messages,
branches,
bodyRef,
- scrollBottom,
- initialScrollDoneRef,
sender,
navigate,
+ overrides,
+ setOverrides,
+ setRoomId,
+ setHighlightId,
setHistoryDrawerOpen,
setMcpDrawerOpen,
setParamsDrawerOpen,
setTplDrawerOpen,
+ handleNewSession,
} = logic;
return (
@@ -77,12 +80,11 @@ export default function ChatPageWeb({ logic }: Props) {
onSwitchBranch={sender.handleSwitchBranch}
onCopy={(text, mode) => {
const content = mode === 'markdown' ? text : markdownToPlainText(text);
- return navigator.clipboard
- ?.writeText(content)
- ?.then(() => message.success(mode === 'markdown' ? '已复制(Markdown)' : '已复制(纯文本)'));
+ navigator.clipboard?.writeText(content).then(() => {
+ message.success(mode === 'markdown' ? '已复制(Markdown)' : '已复制(纯文本)');
+ });
}}
/>
- />
setTplDrawerOpen(true)}
modelOptions={sender.modelOptions}
activeModelValue={sender.activeModelValue}
- onChangeModel={sender.onChangeModel}
+ onChangeModel={(modelId) => {
+ const picked = sender.modelOptions.find((o) => o.value === modelId);
+ setOverrides((o: ModelOverrides) => ({
+ ...o,
+ model_id: modelId,
+ model: picked?.label ?? o.model
+ }));
+ }}
agentList={agentList}
onInsertMention={() => {}}
onOpenHistory={() => setHistoryDrawerOpen(true)}
- onNewSession={async () => {
- if (!id) return;
- abortRef.current?.abort();
- try {
- const created = await SessionAPI.create(id);
- setRoomId(created.id);
- messages.length && messages.splice(0, messages.length);
- branches && Object.keys(branches).length && Object.values(branches).forEach(() => {});
- } catch (e) {
- message.error('创建房间失败');
- }
- }}
+ onNewSession={handleNewSession}
/>
-
- >
- );
+ >
+ )}
+
sender.setInput(updater(sender.input))}
+ setInput={(updater) => sender.setInput(updater)}
+ overrides={overrides}
+ setOverrides={setOverrides}
roomId={roomId}
setRoomId={setRoomId}
setHighlightId={setHighlightId}
@@ -149,6 +149,6 @@ export default function ChatPageWeb({ logic }: Props) {
setHistoryDrawerOpen={setHistoryDrawerOpen}
notify={{ success: (t) => message.success(t) }}
/>
- }
- };
-};
+
+ );
+}
diff --git a/src/styles.css b/src/styles.css
index 9cdd73a..f55bf75 100644
--- a/src/styles.css
+++ b/src/styles.css
@@ -619,6 +619,64 @@ body {
}
}
+@media (max-width: 768px) {
+ .sidebar {
+ display: none;
+ }
+
+ .main {
+ width: 100vw;
+ }
+
+ .chat-shell {
+ height: 100%;
+ }
+
+ .chat-header {
+ height: auto;
+ min-height: 56px;
+ padding: 10px 12px;
+ gap: 10px;
+ flex-wrap: wrap;
+ align-items: center;
+ }
+
+ .chat-header-agent-name {
+ max-width: 220px;
+ }
+
+ .chat-header-agent-desc,
+ .chat-header-agent-meta {
+ display: none;
+ }
+
+ .chat-body .messages-container {
+ max-width: 100%;
+ padding: 18px 12px 96px;
+ }
+
+ .bubble {
+ max-width: 92%;
+ padding: 12px 14px;
+ font-size: 14px;
+ }
+
+ .chat-input-wrapper {
+ max-width: 100%;
+ padding: 0 12px 16px;
+ }
+
+ .chat-input-actions {
+ top: -22px;
+ right: 0;
+ }
+
+ .chat-model-select {
+ min-width: 0;
+ max-width: 220px;
+ }
+}
+
.chat-body .messages-container {
max-width: 780px;
width: 100%;