"use client" import { useState } from "react" import { useCompetition } from "@/contexts/competition-context" 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 { Badge } from "@/components/ui/badge" import { Avatar, AvatarFallback } from "@/components/ui/avatar" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import { Alert, AlertDescription } from "@/components/ui/alert" import { Users, Plus, MoreHorizontal, Edit, Trash2, Eye, UserPlus, UserMinus, Crown, CheckCircle, AlertTriangle, Loader2, } from "lucide-react" import type { Team, TeamMember } from "@/types/competition" export function TeamManagement() { const { teams, addTeam, updateTeam, getTeamById } = useCompetition() const [searchTerm, setSearchTerm] = useState("") const [selectedDepartment, setSelectedDepartment] = useState("all") const [selectedTeam, setSelectedTeam] = useState(null) const [showTeamDetail, setShowTeamDetail] = useState(false) const [showAddTeam, setShowAddTeam] = useState(false) const [showEditTeam, setShowEditTeam] = useState(false) const [showDeleteConfirm, setShowDeleteConfirm] = useState(false) const [isLoading, setIsLoading] = useState(false) const [success, setSuccess] = useState("") const [error, setError] = useState("") const [newTeam, setNewTeam] = useState({ name: "", department: "HQBU", contactEmail: "", members: [] as TeamMember[], leader: "", apps: [] as string[], totalLikes: 0, }) const [newMember, setNewMember] = useState({ name: "", department: "HQBU", role: "成員", }) const filteredTeams = teams.filter((team) => { const matchesSearch = team.name.toLowerCase().includes(searchTerm.toLowerCase()) || team.members.some((member) => member.name.toLowerCase().includes(searchTerm.toLowerCase())) const matchesDepartment = selectedDepartment === "all" || team.department === selectedDepartment return matchesSearch && matchesDepartment }) const handleViewTeam = (team: Team) => { setSelectedTeam(team) setShowTeamDetail(true) } const handleEditTeam = (team: Team) => { setSelectedTeam(team) setNewTeam({ name: team.name, department: team.department, contactEmail: team.contactEmail, members: [...team.members], leader: team.leader, apps: [...team.apps], totalLikes: team.totalLikes, }) setShowEditTeam(true) } const handleDeleteTeam = (team: Team) => { setSelectedTeam(team) setShowDeleteConfirm(true) } const confirmDeleteTeam = () => { if (selectedTeam) { // In a real app, you would call a delete function here setShowDeleteConfirm(false) setSelectedTeam(null) setSuccess("團隊刪除成功!") setTimeout(() => setSuccess(""), 3000) } } const handleAddMember = () => { if (!newMember.name.trim()) { setError("請輸入成員姓名") return } const member: TeamMember = { id: `m${Date.now()}`, name: newMember.name, department: newMember.department, role: newMember.role, } setNewTeam({ ...newTeam, members: [...newTeam.members, member], }) // Set as leader if it's the first member if (newTeam.members.length === 0) { setNewTeam((prev) => ({ ...prev, leader: member.id, members: [...prev.members, { ...member, role: "隊長" }], })) } setNewMember({ name: "", department: "HQBU", role: "成員", }) setError("") } const handleRemoveMember = (memberId: string) => { const updatedMembers = newTeam.members.filter((m) => m.id !== memberId) let newLeader = newTeam.leader // If removing the leader, assign leadership to the first remaining member if (memberId === newTeam.leader && updatedMembers.length > 0) { newLeader = updatedMembers[0].id updatedMembers[0].role = "隊長" } setNewTeam({ ...newTeam, members: updatedMembers, leader: newLeader, }) } const handleSetLeader = (memberId: string) => { const updatedMembers = newTeam.members.map((member) => ({ ...member, role: member.id === memberId ? "隊長" : "成員", })) setNewTeam({ ...newTeam, members: updatedMembers, leader: memberId, }) } const handleAddTeam = async () => { setError("") if (!newTeam.name || !newTeam.contactEmail || newTeam.members.length === 0) { setError("請填寫所有必填欄位並至少添加一名成員") return } setIsLoading(true) await new Promise((resolve) => setTimeout(resolve, 1000)) addTeam(newTeam) setShowAddTeam(false) setNewTeam({ name: "", department: "HQBU", contactEmail: "", members: [], leader: "", apps: [], totalLikes: 0, }) setSuccess("團隊創建成功!") setIsLoading(false) setTimeout(() => setSuccess(""), 3000) } const handleUpdateTeam = async () => { if (!selectedTeam) return setError("") if (!newTeam.name || !newTeam.contactEmail || newTeam.members.length === 0) { setError("請填寫所有必填欄位並至少添加一名成員") return } setIsLoading(true) await new Promise((resolve) => setTimeout(resolve, 1000)) updateTeam(selectedTeam.id, newTeam) setShowEditTeam(false) setSelectedTeam(null) setSuccess("團隊更新成功!") setIsLoading(false) setTimeout(() => setSuccess(""), 3000) } return (
{/* Success/Error Messages */} {success && ( {success} )} {error && ( {error} )} {/* Header */}

團隊管理

管理競賽團隊和成員資訊

{/* Stats Cards */}

總團隊數

{teams.length}

總成員數

{teams.reduce((sum, team) => sum + team.members.length, 0)}

平均團隊規模

{teams.length > 0 ? Math.round((teams.reduce((sum, team) => sum + team.members.length, 0) / teams.length) * 10) / 10 : 0}

{/* Filters */}
setSearchTerm(e.target.value)} />
{/* Teams Table */} 團隊列表 ({filteredTeams.length}) 管理所有競賽團隊 團隊名稱 隊長 部門 成員數 應用數 總按讚數 操作 {filteredTeams.map((team) => { const leader = team.members.find((m) => m.id === team.leader) return (

{team.name}

{team.contactEmail}

{leader?.name[0] || "?"} {leader?.name || "未設定"}
{team.department}
{team.members.length}
{team.apps.length} {team.totalLikes} handleViewTeam(team)}> 查看詳情 handleEditTeam(team)}> 編輯團隊 handleDeleteTeam(team)}> 刪除團隊
) })}
{/* Add Team Dialog */} 新增團隊 創建一個新的競賽團隊 基本資訊 團隊成員
setNewTeam({ ...newTeam, name: e.target.value })} placeholder="輸入團隊名稱" />
setNewTeam({ ...newTeam, contactEmail: e.target.value })} placeholder="team@company.com" />

新增成員

setNewMember({ ...newMember, name: e.target.value })} placeholder="輸入成員姓名" />
setNewMember({ ...newMember, role: e.target.value })} placeholder="例如:開發工程師" />
{newTeam.members.length > 0 && (

團隊成員 ({newTeam.members.length})

{newTeam.members.map((member) => (
{member.name[0]}
{member.name} {member.id === newTeam.leader && ( 隊長 )}
{member.department} • {member.role}
{member.id !== newTeam.leader && ( )}
))}
)}
{/* Edit Team Dialog */} 編輯團隊 修改團隊資訊和成員 基本資訊 團隊成員
setNewTeam({ ...newTeam, name: e.target.value })} placeholder="輸入團隊名稱" />
setNewTeam({ ...newTeam, contactEmail: e.target.value })} placeholder="team@company.com" />

新增成員

setNewMember({ ...newMember, name: e.target.value })} placeholder="輸入成員姓名" />
setNewMember({ ...newMember, role: e.target.value })} placeholder="例如:開發工程師" />
{newTeam.members.length > 0 && (

團隊成員 ({newTeam.members.length})

{newTeam.members.map((member) => (
{member.name[0]}
{member.name} {member.id === newTeam.leader && ( 隊長 )}
{member.department} • {member.role}
{member.id !== newTeam.leader && ( )}
))}
)}
{/* Delete Confirmation Dialog */} 確認刪除團隊 您確定要刪除團隊「{selectedTeam?.name}」嗎?
此操作無法復原,將會永久刪除團隊的所有資料。
{/* Team Detail Dialog */} 團隊詳情 查看團隊的詳細資訊 {selectedTeam && (

{selectedTeam.name}

{selectedTeam.contactEmail}

{selectedTeam.department} {selectedTeam.members.length} 名成員 {selectedTeam.apps.length} 個應用

團隊ID

{selectedTeam.id}

總按讚數

{selectedTeam.totalLikes}

團隊成員

{selectedTeam.members.map((member) => (
{member.name[0]}
{member.name} {member.id === selectedTeam.leader && ( 隊長 )}
{member.department} • {member.role}
))}
)}
) }