update for 1. 优化 2.中英切换

This commit is contained in:
wangwei
2026-06-10 11:10:36 +08:00
parent e7963b267e
commit 9212747e1b
42 changed files with 7866 additions and 278 deletions
+9 -7
View File
@@ -3,6 +3,7 @@ import { Topbar } from '../../components/layout/Topbar';
import { Send, Download } from 'lucide-react';
import { usePageState } from '../../contexts';
import type { RagCitation } from '../../contexts';
import { useLanguage } from '../../contexts/LanguageContext';
const TOKEN_KEY = 'auth_token';
function authHeader(): Record<string, string> {
@@ -59,6 +60,7 @@ const MOCK_QUICK = [
export function RagChatPage() {
// All persistent state lives in PageStateContext — survives route changes
const { ragState, setRagState, ragStreamingRef, ragAbortRef } = usePageState();
const { t } = useLanguage();
const { messages, citations, sessionId, inputDraft } = ragState;
// Local-only UI state: highlighted citation and streaming indicator
@@ -206,7 +208,7 @@ export function RagChatPage() {
...s,
messages: s.messages.map(msg =>
msg.id === assistantId
? { ...msg, text: 'Could not reach the RAG API. Please check the backend.' }
? { ...msg, text: t.ragchat.apiError }
: msg
),
}));
@@ -222,7 +224,7 @@ export function RagChatPage() {
return (
<div className="chat-page">
<Topbar
title="Regulation Q&A"
title={t.ragchat.topbarTitle}
actions={
<button
className="btn sm"
@@ -234,7 +236,7 @@ export function RagChatPage() {
URL.revokeObjectURL(url);
}}
>
<Download size={13} />Export chat
<Download size={13} />{t.ragchat.exportBtn}
</button>
}
/>
@@ -242,7 +244,7 @@ export function RagChatPage() {
<div className="chat-body">
{/* ── History pane ── */}
<div className="history-pane">
<div className="history-header">Quick prompts</div>
<div className="history-header">{t.ragchat.quickPromptsHeader}</div>
{quickPrompts.map(q => (
<button key={q} className="quick-item" onClick={() => send(q)}>
{q}
@@ -282,7 +284,7 @@ export function RagChatPage() {
<div className="composer-row">
<textarea
className="composer-input"
placeholder="Ask about your regulations…"
placeholder={t.ragchat.inputPlaceholder}
value={inputDraft}
onChange={e => setRagState(s => ({ ...s, inputDraft: e.target.value }))}
onKeyDown={e => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); send(); } }}
@@ -302,11 +304,11 @@ export function RagChatPage() {
{/* ── Citation rail ── */}
<div className="citation-rail" ref={citRailRef}>
<div className="citation-header">
Sources {citations.length > 0 && `(${citations.length})`}
{t.ragchat.citationsHeader}{citations.length > 0 && ` (${citations.length})`}
</div>
{citations.length === 0 && (
<p style={{ padding: '12px 16px', fontSize: 12, color: 'var(--muted)', lineHeight: 1.5 }}>
Citations will appear here after a response is generated.
{t.ragchat.citationsEmpty}
</p>
)}
{citations.map(c => (