"use client" import { useState } from "react" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Alert, AlertDescription } from "@/components/ui/alert" import { Badge } from "@/components/ui/badge" import { Progress } from "@/components/ui/progress" import { Avatar, AvatarFallback } from "@/components/ui/avatar" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Textarea } from "@/components/ui/textarea" import { AlertTriangle, CheckCircle, User, Trophy, LogIn, Loader2, Eye, EyeOff, Lock } from "lucide-react" interface Judge { id: string name: string specialty: string } interface ScoringItem { id: string name: string type: "individual" | "team" status: "pending" | "completed" score?: number submittedAt?: string } export default function JudgeScoringPage() { const [isLoggedIn, setIsLoggedIn] = useState(false) const [judgeId, setJudgeId] = useState("") const [accessCode, setAccessCode] = useState("") const [currentJudge, setCurrentJudge] = useState(null) const [scoringItems, setScoringItems] = useState([]) const [selectedItem, setSelectedItem] = useState(null) const [showScoringDialog, setShowScoringDialog] = useState(false) const [scores, setScores] = useState>({}) const [comments, setComments] = useState("") const [isSubmitting, setIsSubmitting] = useState(false) const [error, setError] = useState("") const [success, setSuccess] = useState("") const [showAccessCode, setShowAccessCode] = useState(false) // Judge data - empty for production const mockJudges: Judge[] = [] // Scoring items - empty for production const mockScoringItems: ScoringItem[] = [] const handleLogin = () => { setError("") if (!judgeId.trim() || !accessCode.trim()) { setError("請填寫評審ID和存取碼") return } if (accessCode !== "judge2024") { setError("存取碼錯誤") return } const judge = mockJudges.find(j => j.id === judgeId) if (!judge) { setError("評審ID不存在") return } setCurrentJudge(judge) setScoringItems(mockScoringItems) setIsLoggedIn(true) setSuccess("登入成功!") setTimeout(() => setSuccess(""), 3000) } const handleStartScoring = (item: ScoringItem) => { setSelectedItem(item) setScores({}) setComments("") setShowScoringDialog(true) } const handleSubmitScore = async () => { if (!selectedItem) return setIsSubmitting(true) // 模擬提交評分 setTimeout(() => { setScoringItems(prev => prev.map(item => item.id === selectedItem.id ? { ...item, status: "completed", score: Object.values(scores).reduce((a, b) => a + b, 0) / Object.values(scores).length, submittedAt: new Date().toISOString() } : item )) setShowScoringDialog(false) setSelectedItem(null) setScores({}) setComments("") setIsSubmitting(false) setSuccess("評分提交成功!") setTimeout(() => setSuccess(""), 3000) }, 1000) } const getProgress = () => { const total = scoringItems.length const completed = scoringItems.filter(item => item.status === "completed").length return { total, completed, percentage: total > 0 ? Math.round((completed / total) * 100) : 0 } } const progress = getProgress() if (!isLoggedIn) { return (
評審評分系統 請輸入您的評審ID和存取碼進行登入
{error && ( {error} )}
setJudgeId(e.target.value)} />
setAccessCode(e.target.value)} className="pl-10 pr-10" />

評審ID範例:j1, j2, j3, j4, j5

存取碼:judge2024

) } return (
{/* 成功訊息 */} {success && ( {success} )} {/* 評審資訊 */}
{currentJudge?.name.charAt(0)}

{currentJudge?.name}

{currentJudge?.specialty}

{/* 評分進度 */} 評分進度 您的評分任務進度概覽
完成進度 {progress.completed} / {progress.total}
{progress.percentage}%
{/* 評分項目列表 */} 評分項目 請為以下項目進行評分
{scoringItems.map((item) => (
{item.type === "individual" ? ( ) : (
)} {item.name} {item.type === "individual" ? "個人" : "團隊"}
{item.status === "completed" ? (
{item.score}
/ 10
{item.submittedAt}
) : ( )}
))}
{/* 評分對話框 */} 評分項目:{selectedItem?.name} 請為此項目進行評分,滿分為10分
{/* 評分項目 */}

評分項目

{[ { name: "創新性", description: "創新程度和獨特性" }, { name: "技術性", description: "技術實現的複雜度和品質" }, { name: "實用性", description: "實際應用價值和用戶體驗" }, { name: "展示效果", description: "展示的清晰度和吸引力" }, { name: "影響力", description: "對行業或社會的潛在影響" } ].map((criterion, index) => (

{criterion.description}

{Array.from({ length: 10 }, (_, i) => i + 1).map((score) => ( ))}
))}
{/* 評審意見 */}