diff --git a/apps/frontend/app/(client)/(main)/_components/Cover.tsx b/apps/frontend/app/(client)/(main)/_components/Cover.tsx index 1dfe04a1e8..c1c4829f27 100644 --- a/apps/frontend/app/(client)/(main)/_components/Cover.tsx +++ b/apps/frontend/app/(client)/(main)/_components/Cover.tsx @@ -10,7 +10,7 @@ const bgColors: { [key: string]: string } = { contest: 'bg-gradient-to-b from-[#7BD9D3] to-[#A7A5A1]', problem: 'bg-gradient-to-b from-[#5861B7] to-[#99978E]', notice: 'bg-gradient-to-b from-[#2F4672] to-[#4671B3]', - course: 'bg-gradient-to-b from-[#9784E4] to-[#999999]' + course: 'bg-gradient-to-b from-[#7460C5] to-[#CAC1EE]' } const icons: { [key: string]: string } = { diff --git a/apps/frontend/app/(client)/(main)/course/[courseId]/_components/AssignmentOverview.tsx b/apps/frontend/app/(client)/(main)/course/[courseId]/_components/AssignmentOverview.tsx deleted file mode 100644 index e2d2504a4c..0000000000 --- a/apps/frontend/app/(client)/(main)/course/[courseId]/_components/AssignmentOverview.tsx +++ /dev/null @@ -1,22 +0,0 @@ -export function AssignmentOverview() { - return ( -
-

Assignment

-
-

Ongoing

- -
-
-

Finished

-

No assignments

-
-
-

Upcoming

-

No assignments

-
-
- ) -} diff --git a/apps/frontend/app/(client)/(main)/course/[courseId]/_components/AssignmentReminderBox.tsx b/apps/frontend/app/(client)/(main)/course/[courseId]/_components/AssignmentReminderBox.tsx new file mode 100644 index 0000000000..90a5a6b2f2 --- /dev/null +++ b/apps/frontend/app/(client)/(main)/course/[courseId]/_components/AssignmentReminderBox.tsx @@ -0,0 +1,15 @@ +export function AssignmentReminderBox() { + return ( +
+

혜림님!

+
+

+ 아직 과제가 남아 있으니, 얼른 확인해 보세요! 😊 +

+ + 2주차 과제 바로 가기 + +
+
+ ) +} diff --git a/apps/frontend/app/(client)/(main)/course/[courseId]/_components/CourseInfoBox.tsx b/apps/frontend/app/(client)/(main)/course/[courseId]/_components/CourseInfoBox.tsx new file mode 100644 index 0000000000..49e46bfa5c --- /dev/null +++ b/apps/frontend/app/(client)/(main)/course/[courseId]/_components/CourseInfoBox.tsx @@ -0,0 +1,60 @@ +'use client' + +import QuarterEllipse from '@/public/icons/quarter-ellipse.svg' +import Image from 'next/image' +// TODO: 백엔드 API 사용할 떄 필요할 것 같습니다(민규) +// import { useSearchParams } from 'next/navigation' +import { useState, useEffect } from 'react' +import { BsPersonFill } from 'react-icons/bs' +import { FaCalendar } from 'react-icons/fa' + +export function CourseInfoBox() { + // TODO: 백엔드 API 사용할 떄 필요할 것 같습니다(민규) + // const searchParams = useSearchParams()\ + // const courseId = searchParams.get('courseId') + const [courseCode, setCourseCode] = useState('') + const [courseName, setCourseName] = useState('') + const [courseSemester, setCourseSemester] = useState('') + const [profName, setProfName] = useState('') + + useEffect(() => { + const fetch = () => { + try { + setCourseCode('SWE3011_41') + setCourseName('강의명은최대열세글자까지') + setCourseSemester('2025 Spring') + setProfName('박진영') + } catch (err) { + throw new Error(`Failed to fetch data: ${err}`) + } + } + fetch() + }, []) + + return ( +
+
+ [{courseCode}] + {courseName} +
+
+
+
+ + {courseSemester} +
+
+ + Prof. {profName} +
+
+ Quarter Ellipse +
+
+ ) +} diff --git a/apps/frontend/app/(client)/(main)/course/[courseId]/_components/Cover.tsx b/apps/frontend/app/(client)/(main)/course/[courseId]/_components/Cover.tsx new file mode 100644 index 0000000000..fc34412512 --- /dev/null +++ b/apps/frontend/app/(client)/(main)/course/[courseId]/_components/Cover.tsx @@ -0,0 +1,92 @@ +import { cn } from '@/libs/utils' +import Codedang from '@/public/logos/codedang-rotated.svg' +import Image from 'next/image' + +interface CoverProps { + title: string + description: string +} + +interface OvalIconProps { + position: string + transform: string + backgroundColor: string + additionalClasses?: string +} + +const bgColors: { [key: string]: string } = { + course: 'bg-[#F3F7FF]' +} + +export function Cover({ title, description }: CoverProps) { + return ( +
+
+ +
+
+ banner +

COURSE

+

{description}

+
+ + + + + + +
+
+ ) +} + +function OvalIcon({ + position, + transform, + additionalClasses, + backgroundColor +}: OvalIconProps) { + return ( +
+ ) +} diff --git a/apps/frontend/app/(client)/(main)/course/[courseId]/_components/OngoingAssignments.tsx b/apps/frontend/app/(client)/(main)/course/[courseId]/_components/OngoingAssignments.tsx new file mode 100644 index 0000000000..eab32f419b --- /dev/null +++ b/apps/frontend/app/(client)/(main)/course/[courseId]/_components/OngoingAssignments.tsx @@ -0,0 +1,97 @@ +'use client' + +import checkBlue from '@/public/icons/check-blue.svg' +import checkGray from '@/public/icons/check-gray.svg' +import type { Assignment } from '@/types/type' +import Image from 'next/image' +import { useEffect, useState } from 'react' +import { toast } from 'sonner' + +export function OngoingAssignments() { + const [ongoings, setOngoings] = useState([]) + + useEffect(() => { + const fetchAssignments = async () => { + try { + const response = await new Promise((resolve) => + setTimeout( + () => + resolve([ + { + id: 1, + title: 'HelloWorld.java', + startTime: new Date('2025-01-12'), + endTime: new Date('2024-01-22'), + group: { id: 'G1', groupName: 'Group A' }, + isGraded: true, + status: 'ongoing' + }, + { + id: 2, + title: 'HelloWorld.java', + startTime: new Date('2025-01-12'), + endTime: new Date('2024-01-22'), + group: { id: 'G1', groupName: 'Group A' }, + isGraded: false, + status: 'ongoing' + } + ]), + 1000 + ) + ) + setOngoings(response) + } catch (err) { + toast.error(`Failed to fetch assignments: ${err}`) + } + } + fetchAssignments() + }, []) + + return ( +
+

On-going Assignments

+ + + + + + + + + + + {ongoings.map((assignment) => ( + + + + + + + ))} + +
TitleStart DateEnd DateSubmission
{assignment.title} + {assignment.startTime.toLocaleDateString()} + + {assignment.endTime.toLocaleDateString()} + + {assignment.isGraded ? ( + graded + ) : ( + not graded + )} +
+
+ ) +} diff --git a/apps/frontend/app/(client)/(main)/course/[courseId]/_components/RecentNotice.tsx b/apps/frontend/app/(client)/(main)/course/[courseId]/_components/RecentNotice.tsx index 071eb19835..27bd54f49f 100644 --- a/apps/frontend/app/(client)/(main)/course/[courseId]/_components/RecentNotice.tsx +++ b/apps/frontend/app/(client)/(main)/course/[courseId]/_components/RecentNotice.tsx @@ -1,21 +1,36 @@ 'use client' +import { cn } from '@/libs/utils' +import type { CourseNotice } from '@/types/type' import Link from 'next/link' import { useSearchParams } from 'next/navigation' import { useState, useEffect } from 'react' +import { toast } from 'sonner' -interface Notice { - id: number - title: string - isNew: boolean +const formatDate = (date: Date) => { + const year = date.getFullYear() + const month = date.getMonth() + 1 + const day = date.getDate() + + return `${year}.${month}.${day}` +} + +interface DateBadgeProps { + date: string +} + +function DateBadge({ date }: DateBadgeProps) { + return ( +
+ {date} +
+ ) } export function RecentNotice() { const searchParams = useSearchParams() const courseId = searchParams.get('courseId') - const [notices, setNotices] = useState([]) - const [loading, setLoading] = useState(true) - const [error, setError] = useState(null) + const [notices, setNotices] = useState([]) useEffect(() => { const fetchNotices = () => { @@ -40,19 +55,24 @@ export function RecentNotice() { { id: 999, title: '[필독] 3주차 과제 1번 문제 수정사항', - isNew: true + isNew: true, + date: new Date(2025, 1, 27) }, { id: 998, title: '[필독] 확인된 공지명은 이렇게 보이는 식', - isNew: false + isNew: false, + date: new Date(2025, 1, 27) }, - { id: 997, title: '[샘플] 공지 테스트 3', isNew: false } + { + id: 997, + title: '[샘플] 공지 테스트 3', + isNew: false, + date: new Date(2025, 1, 27) + } ]) } catch (err) { - setError('공지사항을 불러오는 중 오류가 발생했습니다.') - } finally { - setLoading(false) + toast.error(`Failed to fetch notices: ${err}`) } } @@ -60,47 +80,54 @@ export function RecentNotice() { }, []) return ( -
-
- 최근 공지 +
+
+
+ Recent Notice + {notices.length} +
+ - show more + + SHOW MORE+
- {loading &&

Loading...

} - - {error &&

{error}

} - - {!loading && !error && ( -
    - {notices.length > 0 ? ( - notices.map((notice) => ( - //TODO: 공지 요소 누르면 해당 페이지로 넘어가는 기능 필요! -
  • +
      + {notices.length > 0 ? ( + notices.map((notice) => ( + //TODO: 공지 요소 누르면 해당 페이지로 넘어가는 기능 필요! +
    • +
      - + {notice.title} -
    • - )) - ) : ( -

      공지사항이 없습니다.

      - )} -
    - )} +
+ + + )) + ) : ( +

공지사항이 없습니다.

+ )} +
) } diff --git a/apps/frontend/app/(client)/(main)/course/[courseId]/_components/RecentUpdate.tsx b/apps/frontend/app/(client)/(main)/course/[courseId]/_components/RecentUpdate.tsx index c29d1e768a..885e169133 100644 --- a/apps/frontend/app/(client)/(main)/course/[courseId]/_components/RecentUpdate.tsx +++ b/apps/frontend/app/(client)/(main)/course/[courseId]/_components/RecentUpdate.tsx @@ -1,24 +1,19 @@ 'use client' -import Link from 'next/link' -import { useSearchParams } from 'next/navigation' +import { cn } from '@/libs/utils' +import type { CourseRecentUpdate, RecentUpdateType } from '@/types/type' +// import { useSearchParams } from 'next/navigation' import { useState, useEffect } from 'react' - -interface Notice { - id: number - title: string - isNew: boolean -} +import { toast } from 'sonner' +import { AssignmentIcon, ExamIcon, GradeIcon, QnaIcon } from './UpdateIcon' export function RecentUpdate() { - const searchParams = useSearchParams() - const courseId = searchParams.get('courseId') - const [notices, setNotices] = useState([]) - const [loading, setLoading] = useState(true) - const [error, setError] = useState(null) + // const searchParams = useSearchParams() + // const courseId = searchParams.get('courseId') + const [updates, setUpdates] = useState([]) useEffect(() => { - const fetchNotices = () => { + const fetchUpdates = () => { try { // TODO: API 연동 시 사용할 코드입니다. // const response = await fetch('') @@ -36,71 +31,99 @@ export function RecentUpdate() { // setNotices(formattedData) // 이것은 샘플 데이터입니다. - setNotices([ + setUpdates([ { id: 999, - title: '[필독] 3주차 과제 1번 문제 수정사항', - isNew: true + title: 'Week 2 Assignment Uploaded', + isNew: true, + type: 'Assignment' }, { id: 998, - title: '[필독] 확인된 공지명은 이렇게 보이는 식', - isNew: false + title: 'Week 1 Assignment Graded', + isNew: false, + type: 'Grade' }, - { id: 997, title: '[샘플] 공지 테스트 3', isNew: false } + { + id: 997, + title: 'New Answer Registered', + isNew: false, + type: 'QnA' + } ]) } catch (err) { - setError('공지사항을 불러오는 중 오류가 발생했습니다.') - } finally { - setLoading(false) + toast.error(`Failed to fetch updates: ${err}`) } } - fetchNotices() + fetchUpdates() }, []) return ( -
-
- 최근 공지 - - show more + - +
+
+
+ RECENT UPDATE + {updates.length} +
- {loading &&

Loading...

} - - {error &&

{error}

} - - {!loading && !error && ( -
    - {notices.length > 0 ? ( - notices.map((notice) => ( - //TODO: 공지 요소 누르면 해당 페이지로 넘어가는 기능 필요! -
  • +
      + {updates.length > 0 ? ( + updates.map((update) => ( + //TODO: 업데이트 요소 누르면 해당 페이지로 넘어가는 기능 필요! +
    • +
      - - {notice.title} +
      + +
      + + {update.title} -
    • - )) - ) : ( -

      공지사항이 없습니다.

      - )} -
    - )} +
+ + )) + ) : ( +

공지사항이 없습니다.

+ )} +
) } + +interface RecentUpdateIconProps { + type: RecentUpdateType + isNew: boolean +} + +function RecentUpdateIcon({ type, isNew }: RecentUpdateIconProps) { + const strokeColor = isNew ? 'black' : '#8A8A8A' + switch (type) { + case 'Assignment': + return + case 'Grade': + return + case 'QnA': + return + case 'Exam': + return + default: + throw new Error(`Unknown type: ${type}`) + } +} diff --git a/apps/frontend/app/(client)/(main)/course/[courseId]/_components/Sidebar.tsx b/apps/frontend/app/(client)/(main)/course/[courseId]/_components/Sidebar.tsx index 8084f33696..aec0065759 100644 --- a/apps/frontend/app/(client)/(main)/course/[courseId]/_components/Sidebar.tsx +++ b/apps/frontend/app/(client)/(main)/course/[courseId]/_components/Sidebar.tsx @@ -1,9 +1,12 @@ 'use client' +import { Separator } from '@/components/shadcn/separator' import assignmentIcon from '@/public/icons/assignment.svg' import examIcon from '@/public/icons/exam.svg' +import gradeIcon from '@/public/icons/grade.svg' import homeIcon from '@/public/icons/home.svg' import noticeIcon from '@/public/icons/notice.svg' +import qnaIcon from '@/public/icons/qna.svg' import Image from 'next/image' import Link from 'next/link' import { useSearchParams } from 'next/navigation' @@ -32,12 +35,12 @@ export function Sidebar() { { name: 'Grade', path: `/course/${courseId}/grade` as const, - icon: assignmentIcon + icon: gradeIcon }, { name: 'Q&A', path: `/course/${courseId}/qna` as const, - icon: assignmentIcon + icon: qnaIcon } ] @@ -52,13 +55,13 @@ export function Sidebar() { {item.name} {item.name} + ))}
diff --git a/apps/frontend/app/(client)/(main)/course/[courseId]/_components/UpdateIcon.tsx b/apps/frontend/app/(client)/(main)/course/[courseId]/_components/UpdateIcon.tsx new file mode 100644 index 0000000000..0896674e7d --- /dev/null +++ b/apps/frontend/app/(client)/(main)/course/[courseId]/_components/UpdateIcon.tsx @@ -0,0 +1,134 @@ +interface IconProps { + strokeColor?: string +} +export function AssignmentIcon({ strokeColor }: IconProps) { + return ( + + + + + + + + + + + + ) +} + +export function GradeIcon({ strokeColor }: IconProps) { + return ( + + + + + + + + + ) +} + +export function QnaIcon({ strokeColor }: IconProps) { + return ( + + + + ) +} + +export function ExamIcon({ strokeColor }: IconProps) { + return ( + + + + ) +} diff --git a/apps/frontend/app/(client)/(main)/course/[courseId]/layout.tsx b/apps/frontend/app/(client)/(main)/course/[courseId]/layout.tsx index cb5516fba2..92a0166d11 100644 --- a/apps/frontend/app/(client)/(main)/course/[courseId]/layout.tsx +++ b/apps/frontend/app/(client)/(main)/course/[courseId]/layout.tsx @@ -1,33 +1,24 @@ import { Separator } from '@/components/shadcn/separator' -import codedangLogo from '@/public/logos/codedang-with-text.svg' -import Image from 'next/image' -import Link from 'next/link' -import { Header } from './_components/Header' +import { CourseInfoBox } from './_components/CourseInfoBox' +import { Cover } from './_components/Cover' import { Sidebar } from './_components/Sidebar' export default function Layout({ children }: { children: React.ReactNode }) { return ( -
-
- -
- - -
-
{children}
-
+ <> + +
+
+ + +
+
{children}
+
+
-
+ ) } diff --git a/apps/frontend/app/(client)/(main)/course/[courseId]/page.tsx b/apps/frontend/app/(client)/(main)/course/[courseId]/page.tsx index d5034cb0d7..590bce7f98 100644 --- a/apps/frontend/app/(client)/(main)/course/[courseId]/page.tsx +++ b/apps/frontend/app/(client)/(main)/course/[courseId]/page.tsx @@ -1,5 +1,5 @@ import { Separator } from '@/components/shadcn/separator' -import { AssignmentOverview } from './_components/AssignmentOverview' +import { OngoingAssignments } from './_components/OngoingAssignments' import { RecentNotice } from './_components/RecentNotice' import { RecentUpdate } from './_components/RecentUpdate' @@ -16,7 +16,7 @@ export default function Dashboard() {
- +
) } diff --git a/apps/frontend/app/(client)/(main)/course/_components/CourseCardList.tsx b/apps/frontend/app/(client)/(main)/course/_components/CourseCardList.tsx index f496697af1..a37f1e6a7b 100644 --- a/apps/frontend/app/(client)/(main)/course/_components/CourseCardList.tsx +++ b/apps/frontend/app/(client)/(main)/course/_components/CourseCardList.tsx @@ -66,7 +66,7 @@ const getUsername = async () => { const getCourses = async () => { try { const rawData: RawCourse[] = await safeFetcherWithAuth - .get('group/joined') + .get('course/joined') .json() const data: Course[] = rawData.map((item: RawCourse) => ({ id: item.id, diff --git a/apps/frontend/app/(client)/(main)/course/_components/Cover.tsx b/apps/frontend/app/(client)/(main)/course/_components/Cover.tsx new file mode 100644 index 0000000000..39bb26efcc --- /dev/null +++ b/apps/frontend/app/(client)/(main)/course/_components/Cover.tsx @@ -0,0 +1,116 @@ +import { Button } from '@/components/shadcn/button' +import { cn } from '@/libs/utils' +import Image from 'next/image' +import { FaArrowRightLong } from 'react-icons/fa6' + +interface CoverProps { + title: string + welcomeText: string + mainText: string + buttonText: string +} + +interface OvalIconProps { + position: string + transform: string + additionalClasses?: string +} + +const bgColors: { [key: string]: string } = { + course: 'bg-gradient-to-r from-[#E9D0FF] via-[#DAB5FF] to-[#C9F]' +} + +const titleTextColors: { [key: string]: string } = { + course: 'text-[#3E29A0]' +} + +const gradientTextColors: { [key: string]: string } = { + course: + 'bg-gradient-to-r from-[#1D124A] via-[#3B2699] via-[#5942D7] to-[#5C3CCF] bg-clip-text text-transparent' // 그라디언트 보조 텍스트 색상 +} + +const icons: { [key: string]: string } = { + course: '/banners/book.png' +} + +export function Cover({ + title, + welcomeText, + mainText, + buttonText +}: CoverProps) { + return ( +
+
+ +
+
+ + {welcomeText} + +
+

CODEDANG

+

{mainText}

+
+ +
+ banner + + +
+
+ ) +} + +function OvalIcon({ position, transform, additionalClasses }: OvalIconProps) { + return ( +
+ ) +} diff --git a/apps/frontend/app/(client)/(main)/course/page.tsx b/apps/frontend/app/(client)/(main)/course/page.tsx index 5db126db00..00b77b066c 100644 --- a/apps/frontend/app/(client)/(main)/course/page.tsx +++ b/apps/frontend/app/(client)/(main)/course/page.tsx @@ -1,4 +1,3 @@ -import { Cover } from '@/app/(client)/(main)/_components/Cover' import { FetchErrorFallback } from '@/components/FetchErrorFallback' import { Separator } from '@/components/shadcn/separator' import { Skeleton } from '@/components/shadcn/skeleton' @@ -6,6 +5,7 @@ import { auth } from '@/libs/auth' import { ErrorBoundary } from '@suspensive/react' import { Suspense } from 'react' import { CourseCardList } from './_components/CourseCardList' +import { Cover } from './_components/Cover' import { Dashboard } from './_components/Dashboard' function CardListFallback() { @@ -24,7 +24,12 @@ export default async function Course() { const session = await auth() return ( <> - +
}> @@ -40,7 +45,6 @@ export default async function Course() {

Course Overview

- {/* TODO: 완성되면 주석해제 할 거예요! */}
diff --git a/apps/frontend/public/banners/book.png b/apps/frontend/public/banners/book.png new file mode 100644 index 0000000000..77e250a803 Binary files /dev/null and b/apps/frontend/public/banners/book.png differ diff --git a/apps/frontend/public/banners/course.png b/apps/frontend/public/banners/course.png new file mode 100644 index 0000000000..b14a5a4020 Binary files /dev/null and b/apps/frontend/public/banners/course.png differ diff --git a/apps/frontend/public/icons/assignment.svg b/apps/frontend/public/icons/assignment.svg index 0cd6976776..db4922ae1d 100644 --- a/apps/frontend/public/icons/assignment.svg +++ b/apps/frontend/public/icons/assignment.svg @@ -1,6 +1,6 @@ - + diff --git a/apps/frontend/public/icons/calendar-default.svg b/apps/frontend/public/icons/calendar-default.svg new file mode 100644 index 0000000000..531767e9dc --- /dev/null +++ b/apps/frontend/public/icons/calendar-default.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/frontend/public/icons/exam.svg b/apps/frontend/public/icons/exam.svg index e8037852ab..21a01cd39c 100644 --- a/apps/frontend/public/icons/exam.svg +++ b/apps/frontend/public/icons/exam.svg @@ -1,10 +1,3 @@ - - - - - - - - - + + diff --git a/apps/frontend/public/icons/grade.svg b/apps/frontend/public/icons/grade.svg new file mode 100644 index 0000000000..4369d988e9 --- /dev/null +++ b/apps/frontend/public/icons/grade.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/apps/frontend/public/icons/home.svg b/apps/frontend/public/icons/home.svg index 39cca12f9f..120245bf6f 100644 --- a/apps/frontend/public/icons/home.svg +++ b/apps/frontend/public/icons/home.svg @@ -1,3 +1,3 @@ - - + + diff --git a/apps/frontend/public/icons/person.svg b/apps/frontend/public/icons/person.svg new file mode 100644 index 0000000000..0df8e6b2cf --- /dev/null +++ b/apps/frontend/public/icons/person.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/frontend/public/icons/qna.svg b/apps/frontend/public/icons/qna.svg new file mode 100644 index 0000000000..15f65a07fd --- /dev/null +++ b/apps/frontend/public/icons/qna.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/frontend/public/icons/quarter-ellipse.svg b/apps/frontend/public/icons/quarter-ellipse.svg new file mode 100644 index 0000000000..147ec9f71b --- /dev/null +++ b/apps/frontend/public/icons/quarter-ellipse.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/frontend/public/logos/codedang-rotated.svg b/apps/frontend/public/logos/codedang-rotated.svg new file mode 100644 index 0000000000..73f314e52e --- /dev/null +++ b/apps/frontend/public/logos/codedang-rotated.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/frontend/types/type.ts b/apps/frontend/types/type.ts index d5bc3dc629..d349bcfb4e 100644 --- a/apps/frontend/types/type.ts +++ b/apps/frontend/types/type.ts @@ -12,6 +12,8 @@ export type AssignmentStatus = | 'registeredOngoing' | 'registeredUpcoming' +export type RecentUpdateType = 'Assignment' | 'Grade' | 'QnA' | 'Exam' + export type CourseStatus = 'ongoing' | 'finished' export type Level = 'Level1' | 'Level2' | 'Level3' | 'Level4' | 'Level5' @@ -244,6 +246,20 @@ export interface Course { professor: string } +export interface CourseNotice { + id: number + title: string + date: Date + isNew: boolean +} + +export interface CourseRecentUpdate { + id: number + title: string + type: RecentUpdateType + isNew: boolean +} + export interface Assignment { id: number title: string @@ -253,11 +269,15 @@ export interface Assignment { id: string groupName: string } - isJudgeResultVisible: boolean - enableCopyPaste: boolean + // TODO: Assignement에서 현재 사용 중이지 않은 필드로, 추후 필요시 사용할 예정 (민규) + // isJudgeResultVisible: boolean + // enableCopyPaste: boolean + + // TODO: CI 오류나서 임시방편으로 주석 해제 했습니다(민규) status: AssignmentStatus - participants: number - isRegistered: boolean + // participants: number + // isRegistered: boolean + isGraded: boolean } export interface CalendarAssignment { @@ -265,13 +285,3 @@ export interface CalendarAssignment { start: Date end: Date } - -// 일단은 DashboardCalendar에서 null처리를함으로써 필요가 없어진 것 같은데, 원작자 의견을 들어보고 코드를 삭제할 예정 -// export interface CalendarAssignmentEvent { -// event: { -// id: number -// title: string -// start: Date -// end: Date -// } -// } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b07152ed2e..fab7ac18e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11829,7 +11829,7 @@ snapshots: '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 convert-source-map: 2.0.0 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -12137,7 +12137,7 @@ snapshots: '@babel/parser': 7.26.2 '@babel/template': 7.25.9 '@babel/types': 7.26.0 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -13201,7 +13201,7 @@ snapshots: '@types/js-yaml': 4.0.9 '@whatwg-node/fetch': 0.9.23 chalk: 4.1.2 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) dotenv: 16.4.7 graphql: 16.10.0 graphql-request: 6.1.0(graphql@16.10.0) @@ -17018,13 +17018,13 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color agent-base@7.1.1: dependencies: - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -18068,10 +18068,6 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.7: - dependencies: - ms: 2.1.3 - debug@4.3.7(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -19449,7 +19445,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.1 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -19461,14 +19457,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.5: dependencies: agent-base: 7.1.1 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -22172,7 +22168,7 @@ snapshots: require-in-the-middle@7.4.0: dependencies: - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) module-details-from-path: 1.0.3 resolve: 1.22.8 transitivePeerDependencies: @@ -23273,7 +23269,7 @@ snapshots: vite-node@2.1.8(@types/node@20.17.11)(terser@5.36.0): dependencies: cac: 6.7.14 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) es-module-lexer: 1.5.4 pathe: 1.1.2 vite: 5.4.10(@types/node@20.17.11)(terser@5.36.0) @@ -23308,7 +23304,7 @@ snapshots: '@vitest/spy': 2.1.8 '@vitest/utils': 2.1.8 chai: 5.1.2 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) expect-type: 1.1.0 magic-string: 0.30.12 pathe: 1.1.2