'use client'; import { useEffect, useState } from 'react'; import Link from 'next/link'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { StatusDot } from '@/components/status-badge'; import { ProgressRing } from '@/components/progress-ring'; import { useUser } from '@/components/user-context'; import { calculateProgress, getDaysRemaining, formatDateRange, isKRActive, getTodayInTokyo } from '@/lib/kr-utils'; import { PERIOD_TYPES, REASON_CODES } from '@/lib/constants'; import type { KR, User } from '@/types/database'; import { Target, Clock, AlertTriangle, CheckCircle, History } from 'lucide-react'; interface KRWithRelations extends KR { owner: User | null; project: { id: string; name: string; status: string } | null; } export default function MyKRsPage() { const { currentUser } = useUser(); const [krs, setKRs] = useState([]); const [isLoading, setIsLoading] = useState(true); useEffect(() => { async function fetchKRs() { try { const res = await fetch('/api/krs'); if (res.ok) { const data = await res.json(); setKRs(data); } } catch (error) { console.error('Failed to fetch KRs:', error); } finally { setIsLoading(false); } } fetchKRs(); }, []); const myKRs = krs.filter(kr => kr.owner_user_id === currentUser?.id); const activeKRs = myKRs.filter(isKRActive); const completedKRs = activeKRs.filter(kr => calculateProgress(kr) >= 1); const pastKRs = myKRs.filter(kr => !isKRActive(kr)); if (isLoading) { return (
{[1, 2, 3].map(i => (
))}
); } return (

我的 KR

{currentUser?.name} 负责的执行目标

{activeKRs.length}

进行中

{completedKRs.length}

已达标

{activeKRs.filter(kr => kr.status === 'red').length}

需关注

进行中 ({activeKRs.length}) 已结束 ({pastKRs.length}) 全部 ({myKRs.length}) {activeKRs.length === 0 ? (

暂无进行中的 KR

) : ( activeKRs.map(kr => ) )}
{pastKRs.length === 0 ? (

暂无已结束的 KR

) : ( pastKRs.map(kr => ) )}
{myKRs.length === 0 ? (

暂无 KR

) : ( myKRs.map(kr => ) )}
); } function KRCard({ kr, showEnded }: { kr: KRWithRelations; showEnded?: boolean }) { const progress = calculateProgress(kr); const daysLeft = getDaysRemaining(kr.period_end); const isActive = isKRActive(kr); return (

{kr.title}

{showEnded && ( 已结束 )}
{kr.project?.name} {PERIOD_TYPES[kr.period_type]} {formatDateRange(kr.period_start, kr.period_end)}
{kr.reason_code && kr.status !== 'green' && (
{REASON_CODES[kr.reason_code]} {kr.note && ` - ${kr.note}`}
)}

{kr.current_value}/{kr.target_value}

{kr.unit}

{isActive && (

剩余 {daysLeft} 天

)}
); }