dramaling-vocab-learning/Generate頁面UX改善計劃.md

228 lines
7.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Generate 頁面 UX 改善計劃
## 🎯 問題描述
### 目前的問題
當用戶在 `http://localhost:3001/generate` 頁面輸入英文文本進行分析後:
1. **第一次分析**:用戶輸入文本 → 點擊「分析句子」→ 下方顯示分析結果 ✅
2. **想要分析新文本時**:用戶在輸入框中輸入新文本 → **舊的分析結果仍然顯示**
3. **用戶體驗問題**:新輸入的文本和下方顯示的舊分析結果不匹配,造成混淆
### 期望的使用流程
1. 用戶輸入文本
2. 點擊「分析句子」→ 顯示對應的分析結果
3. 當用戶開始輸入**新文本**時 → **自動清除舊的分析結果**
4. 用戶需要再次點擊「分析句子」才會顯示新文本的分析結果
---
## 🔧 解決方案
### 核心改善邏輯
添加**智能清除機制**:當用戶開始修改輸入文本時,自動清除之前的分析結果,避免新輸入和舊結果的不匹配。
### 技術實現方案
#### 1. **新增狀態管理**
```typescript
// 新增以下狀態
const [lastAnalyzedText, setLastAnalyzedText] = useState('')
const [isInitialLoad, setIsInitialLoad] = useState(true)
```
#### 2. **實現清除邏輯**
```typescript
// 監聽文本輸入變化
useEffect(() => {
// 如果不是初始載入,且文本與上次分析的不同
if (!isInitialLoad && textInput !== lastAnalyzedText) {
// 清除分析結果
setSentenceAnalysis(null)
setSentenceMeaning('')
setGrammarCorrection(null)
setSelectedIdiom(null)
setSelectedWord(null)
}
}, [textInput, lastAnalyzedText, isInitialLoad])
```
#### 3. **修改分析函數**
```typescript
const handleAnalyzeSentence = async () => {
// ... 現有邏輯 ...
// 分析成功後,記錄此次分析的文本
setLastAnalyzedText(textInput)
setIsInitialLoad(false)
// ... 其他邏輯 ...
}
```
#### 4. **優化快取邏輯**
```typescript
// 恢復快取時標記為初始載入
useEffect(() => {
const cached = loadAnalysisFromCache()
if (cached) {
setTextInput(cached.textInput || '')
setLastAnalyzedText(cached.textInput || '') // 同步記錄
setSentenceAnalysis(cached.sentenceAnalysis || null)
setSentenceMeaning(cached.sentenceMeaning || '')
setGrammarCorrection(cached.grammarCorrection || null)
setIsInitialLoad(false) // 標記快取載入完成
console.log('✅ 已恢復快取的分析結果')
} else {
setIsInitialLoad(false) // 沒有快取也要標記載入完成
}
}, [loadAnalysisFromCache])
```
---
## 📋 詳細修改步驟
### 步驟 1新增狀態變數
`GenerateContent` 函數中新增:
```typescript
const [lastAnalyzedText, setLastAnalyzedText] = useState('')
const [isInitialLoad, setIsInitialLoad] = useState(true)
```
### 步驟 2添加文本變化監聽
在現有的 `useEffect` 後添加新的 `useEffect`
```typescript
// 監聽文本變化,自動清除不匹配的分析結果
useEffect(() => {
if (!isInitialLoad && textInput !== lastAnalyzedText && sentenceAnalysis) {
// 清除所有分析結果
setSentenceAnalysis(null)
setSentenceMeaning('')
setGrammarCorrection(null)
setSelectedIdiom(null)
setSelectedWord(null)
console.log('🧹 已清除舊的分析結果,因為文本已改變')
}
}, [textInput, lastAnalyzedText, isInitialLoad, sentenceAnalysis])
```
### 步驟 3修改 `handleAnalyzeSentence` 函數
在分析成功後添加:
```typescript
// 在 setSentenceAnalysis(analysisData) 之後添加
setLastAnalyzedText(textInput)
setIsInitialLoad(false)
```
### 步驟 4修改快取恢復邏輯
更新現有的快取恢復 `useEffect`
```typescript
useEffect(() => {
const cached = loadAnalysisFromCache()
if (cached) {
setTextInput(cached.textInput || '')
setLastAnalyzedText(cached.textInput || '') // 新增這行
setSentenceAnalysis(cached.sentenceAnalysis || null)
setSentenceMeaning(cached.sentenceMeaning || '')
setGrammarCorrection(cached.grammarCorrection || null)
console.log('✅ 已恢復快取的分析結果')
}
setIsInitialLoad(false) // 新增這行,標記載入完成
}, [loadAnalysisFromCache])
```
### 步驟 5優化用戶體驗可選
在分析結果區域添加提示訊息,當沒有分析結果時顯示:
```typescript
{/* 在分析結果區域前添加 */}
{!sentenceAnalysis && textInput && (
<div className="bg-blue-50 border border-blue-200 rounded-xl p-6 text-center">
<div className="text-blue-600 mb-2">💡</div>
<p className="text-blue-800 font-medium">請點擊「分析句子」查看文本的詳細分析</p>
</div>
)}
```
---
## 🎨 預期效果
### 修改前(問題)
1. 用戶輸入 "Hello world" → 分析 → 顯示結果
2. 用戶修改為 "Good morning" → **舊的 "Hello world" 分析結果仍然顯示**
3. 造成混淆:新輸入 vs 舊結果不匹配
### 修改後(解決)
1. 用戶輸入 "Hello world" → 分析 → 顯示結果
2. 用戶修改為 "Good morning" → **自動清除舊分析結果**
3. 用戶點擊「分析句子」→ 顯示 "Good morning" 的新分析結果 ✅
---
## 🔍 技術細節
### 狀態管理邏輯
- **`lastAnalyzedText`**: 記錄上次成功分析的文本內容
- **`isInitialLoad`**: 區分頁面初始載入和用戶操作,避免載入時誤清除快取
- **清除條件**: `textInput !== lastAnalyzedText` 且不是初始載入狀態
### 快取兼容性
- ✅ 保持現有的 localStorage 快取機制
- ✅ 頁面重新載入時正確恢復分析結果
- ✅ 只在用戶主動修改文本時才清除結果
### 邊界情況處理
- **頁面載入時**: 不會意外清除快取的分析結果
- **空文本**: 當用戶清空輸入框時,分析結果會被清除
- **相同文本**: 如果用戶修改後又改回原來的文本,不會重複清除
---
## 📁 需要修改的文件
### 主要文件
- **`frontend/app/generate/page.tsx`** - 實現所有邏輯修改
### 修改範圍
- 新增狀態變數 (2 行)
- 新增 useEffect 監聽 (約 10 行)
- 修改分析函數 (2 行)
- 修改快取邏輯 (2 行)
- 可選的 UI 提示 (約 8 行)
**總計**: 約 25 行代碼修改,影響範圍小,風險低
---
## ✅ 驗收標準
### 功能驗收
1. ✅ 用戶輸入文本並分析後,修改輸入時舊結果立即消失
2. ✅ 頁面重新載入時,快取的分析結果正確恢復
3. ✅ 分析按鈕的狀態管理保持正常loading、disabled 等)
4. ✅ 語法修正面板的交互功能不受影響
### 用戶體驗驗收
1. ✅ 新輸入和分析結果始終保持一致
2. ✅ 沒有意外的結果清除或誤操作
3. ✅ 清晰的視覺反饋,用戶知道何時需要重新分析
---
## 🚀 實施建議
### 開發順序
1. **先實現核心邏輯** - 狀態管理和清除機制
2. **測試基本功能** - 確保清除邏輯正常運作
3. **優化快取邏輯** - 確保快取恢復不受影響
4. **添加用戶提示** - 提升用戶體驗
5. **全面測試** - 驗收所有功能點
### 測試重點
- 多次輸入不同文本的分析流程
- 頁面重新載入的快取恢復
- 語法修正功能的正常運作
- 詞彙彈窗和保存功能的正常運作
這個改善方案將顯著提升 Generate 頁面的用戶體驗,避免輸入和分析結果不匹配的混淆問題。