"use client" import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faCalendarAlt, faCheck, faTimes, faFileAlt, faMoneyBillWave, faSignature, faCheckCircle, faTimesCircle } from '@fortawesome/free-solid-svg-icons'; import { useEffect, useState } from 'react'; import { getAccessToken } from '@/lib/auth'; import { useTranslation } from 'react-i18next'; type Semester = { id: number | string; semester: string; direction: string; quota: string; note: string; studentCom: string; sum: string; paid: string; ukim: string; createdOn: string; dateChanged: string; credits: string; type: string; doc: string; doc1: string; verified: string; taxes: string; signatures: string; status: string; completed: string; }; type SemestersResponse = { semesters: Semester[]; }; interface TableCellProps { children: React.ReactNode; className?: string; } const TableCell = ({ children, className = "" }: TableCellProps) => ( {children} ); const StatusBadge = ({ status }: { status: string }) => { const { t } = useTranslation(); const baseClasses = "px-2 py-1 rounded-full text-xs font-medium"; if (status === t('valid')) { return ( {t('valid')} ); } return ( {t(status) || status} ); }; const YesNoBadge = ({ value }: { value: string }) => { const { t } = useTranslation(); if (value === t('yes')) { return ( ); } else if (value === t('no')) { return ( ); } return ; }; const SignatureBadge = ({ signatures }: { signatures: string }) => { const [completed, total] = signatures.split('/').map(Number); const percentage = total > 0 ? (completed / total) * 100 : 0; let colorClass = "text-red-600 bg-red-100"; if (percentage === 100) { colorClass = "text-green-600 bg-green-100"; } else if (percentage >= 50) { colorClass = "text-yellow-600 bg-yellow-100"; } return ( {signatures} ); }; export default function SemestersPage() { const [semesters, setSemesters] = useState([]); const [isLoading, setIsLoading] = useState(true); const [errorMessage, setErrorMessage] = useState(null); const { t } = useTranslation(); useEffect(() => { let cancelled = false; async function load() { setIsLoading(true); setErrorMessage(null); const token = getAccessToken(); if (!token) { setErrorMessage('Not authenticated. Please login again.'); setIsLoading(false); return; } try { const response = await fetch('https://iknow-api.onrender.com/api/user/getSemesters', { method: 'GET', headers: { Authorization: `Bearer ${token}`, }, }); if (!response.ok) { const text = await response.text().catch(() => ''); throw new Error(text || `Failed to load semesters (${response.status})`); } const data = (await response.json()) as SemestersResponse; if (!cancelled) setSemesters(Array.isArray(data?.semesters) ? data.semesters : []); } catch (err) { if (!cancelled) { setErrorMessage(err instanceof Error ? err.message : 'Failed to load semesters.'); } } finally { if (!cancelled) setIsLoading(false); } } void load(); return () => { cancelled = true; }; }, []); if (isLoading) { return (
{t('loading')}
); } if (errorMessage) { return (
{errorMessage}
); } return (
{/* Header */}

{t('semesters')}

{t('semesters_overview')}

{/* Table Container */}

{t('semesters_list')}

{semesters.map((semester) => ( {semester.id}{semester.semester}{semester.direction}
{semester.quota}
{semester.note ? ( {semester.note.length > 10 ? `${semester.note.substring(0, 10)}...` : semester.note} ) : ( )} {semester.studentCom ? ( {semester.studentCom.length > 10 ? `${semester.studentCom.substring(0, 10)}...` : semester.studentCom} ) : ( )} {semester.sum ? ( {semester.sum} ) : ( )} {semester.paid ? ( {semester.paid} ) : ( )} {semester.ukim ? ( {semester.ukim} ) : ( )} {semester.createdOn}{semester.dateChanged}{semester.credits} {semester.type} {semester.taxes} {semester.completed !== "Не" ? ( {semester.completed} ) : ( {semester.completed} )} ))}
# {t('semester')} {t('direction')} {t('quota')} {t('note')} {t('student_com')} {t('sum')} {t('paid')} {t('ukim')} {t('created_on')} {t('date_changed')} {t('credits')} {t('type')} {t('doc')} {t('doc1')} {t('verified')} {t('taxes')} {t('signatures')} {t('status')} {t('completed')}
{/* Summary Cards */}

{t('completed_semesters')}

{semesters.filter(s => s.completed !== "Не").length}

{t('verified_semesters')}

{semesters.filter(s => s.verified === "Да").length}

{t('total_semesters')}

{semesters.length}

); }