'use client' import { useState } from 'react' interface CardSegment { cardId: string word: string plannedTests: number completedTests: number isCompleted: boolean widthPercentage: number position: number } interface SegmentedProgressBarProps { progress: { cards: Array<{ cardId: string word: string plannedTests: string[] completedTestsCount: number isCompleted: boolean }> totalTests: number completedTests: number } onClick?: () => void } export default function SegmentedProgressBar({ progress, onClick }: SegmentedProgressBarProps) { const [hoveredWord, setHoveredWord] = useState(null) const [tooltipPosition, setTooltipPosition] = useState({ x: 0, y: 0 }) // 計算每個詞卡的分段數據 const segments: CardSegment[] = progress.cards.map((card, index) => { const plannedTests = card.plannedTests.length const completedTests = card.completedTestsCount const widthPercentage = (plannedTests / progress.totalTests) * 100 // 計算位置(累積前面所有詞卡的寬度) const position = progress.cards .slice(0, index) .reduce((acc, prevCard) => acc + (prevCard.plannedTests.length / progress.totalTests) * 100, 0) return { cardId: card.cardId, word: card.word, plannedTests, completedTests, isCompleted: card.isCompleted, widthPercentage, position } }) const handleMouseMove = (event: React.MouseEvent, word: string) => { setHoveredWord(word) setTooltipPosition({ x: event.clientX, y: event.clientY }) } const handleMouseLeave = () => { setHoveredWord(null) } return (
{/* 分段式進度條 */}
{segments.map((segment, index) => { // 計算當前段落的完成比例 const segmentProgress = segment.plannedTests > 0 ? segment.completedTests / segment.plannedTests : 0 return (
{/* 背景(未完成部分) */}
{/* 已完成部分 */}
{/* 分界線(右邊界) */} {index < segments.length - 1 && (
)}
) })}
{/* 詞卡標誌點 */}
{segments.map((segment, index) => { // 標誌點位置(在每個詞卡段落的中心) const markerPosition = segment.position + (segment.widthPercentage / 2) return (
0 ? 'bg-blue-500' : 'bg-gray-400' }`} onMouseMove={(e) => handleMouseMove(e, segment.word)} onMouseLeave={handleMouseLeave} title={segment.word} />
) })}
{/* Tooltip */} {hoveredWord && (
{hoveredWord}
)} {/* 進度統計 */}
詞卡: {progress.cards.filter(c => c.isCompleted).length} / {progress.cards.length} 測驗: {progress.completedTests} / {progress.totalTests} ({Math.round((progress.completedTests / progress.totalTests) * 100)}%)
) }