diff --git a/public/images/project_img.png b/public/images/project_img.png new file mode 100644 index 0000000..17bd67d Binary files /dev/null and b/public/images/project_img.png differ diff --git a/public/images/seminar/presenter/seohuichan.png b/public/images/seminar/presenter/seohuichan.png new file mode 100644 index 0000000..970d859 Binary files /dev/null and b/public/images/seminar/presenter/seohuichan.png differ diff --git a/public/images/solution_challenge_banner.png b/public/images/solution_challenge_banner.png new file mode 100644 index 0000000..4b24ae2 Binary files /dev/null and b/public/images/solution_challenge_banner.png differ diff --git a/public/svg/icons/project/fileIcon.svg b/public/svg/icons/project/fileIcon.svg new file mode 100644 index 0000000..a1b5628 --- /dev/null +++ b/public/svg/icons/project/fileIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/svg/icons/project/githubIcon.svg b/public/svg/icons/project/githubIcon.svg new file mode 100644 index 0000000..1364872 --- /dev/null +++ b/public/svg/icons/project/githubIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/svg/icons/project/toggleIcon.svg b/public/svg/icons/project/toggleIcon.svg new file mode 100644 index 0000000..5c11431 --- /dev/null +++ b/public/svg/icons/project/toggleIcon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/svg/icons/project/youtubeIcon.svg b/public/svg/icons/project/youtubeIcon.svg new file mode 100644 index 0000000..81598b4 --- /dev/null +++ b/public/svg/icons/project/youtubeIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/svg/icons/solutionChallenge/lightIcon.svg b/public/svg/icons/solutionChallenge/lightIcon.svg new file mode 100644 index 0000000..fa468b8 --- /dev/null +++ b/public/svg/icons/solutionChallenge/lightIcon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/svg/icons/solutionChallenge/solution_challenge_banner2.svg b/public/svg/icons/solutionChallenge/solution_challenge_banner2.svg new file mode 100644 index 0000000..c1f1529 --- /dev/null +++ b/public/svg/icons/solutionChallenge/solution_challenge_banner2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/svg/seminar/gdsc_logo.svg b/public/svg/seminar/gdsc_logo.svg new file mode 100644 index 0000000..2b559a5 --- /dev/null +++ b/public/svg/seminar/gdsc_logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/svg/seminar/pin.svg b/public/svg/seminar/pin.svg new file mode 100644 index 0000000..385b112 --- /dev/null +++ b/public/svg/seminar/pin.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/svg/seminar/seminar_banner.svg b/public/svg/seminar/seminar_banner.svg new file mode 100644 index 0000000..ce5c8d2 --- /dev/null +++ b/public/svg/seminar/seminar_banner.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/app/project/[id]/page.tsx b/src/app/project/[id]/page.tsx new file mode 100644 index 0000000..2d0824a --- /dev/null +++ b/src/app/project/[id]/page.tsx @@ -0,0 +1,24 @@ +import ProjectContent from '@/components/project/content/ProjectContent'; +import ProjectIntroduction from '@/components/project/introduction/ProjectIntroduction'; +import React from 'react'; + +export const metadata = { + title: 'Project Detail', +}; + +const ProjectDetailPage = () => { + return ( +
+ {/* -----------------------------------------------*/} + {/* -------------------- 프로젝트 소개 ---------------*/} + {/* -----------------------------------------------*/} + + {/* -----------------------------------------------*/} + {/* ------------------ 프로젝트 내용 ----------------*/} + {/* -----------------------------------------------*/} + +
+ ); +}; + +export default ProjectDetailPage; diff --git a/src/app/project/page.tsx b/src/app/project/page.tsx index 3ac0745..cae9c2b 100644 --- a/src/app/project/page.tsx +++ b/src/app/project/page.tsx @@ -1,3 +1,6 @@ +import ProjectHeader from '@/components/project/header/ProjectHeader'; +import ProjectList from '@/components/project/list/ProjectList'; +import ProjectPagination from '@/components/project/pagination/ProjectPagination'; import React from 'react'; export const metadata = { @@ -5,7 +8,22 @@ export const metadata = { }; const ProjectPage = () => { - return
Project 페이지입니당
; + return ( +
+ {/* -----------------------------------------------*/} + {/* -------------------- 제목 ----------------------*/} + {/* -----------------------------------------------*/} + + {/* -----------------------------------------------*/} + {/* ------------------ 프로젝트 리스트 ----------------*/} + {/* -----------------------------------------------*/} + + {/* -----------------------------------------------*/} + {/* ------------------ 페이지네이션 ----------------*/} + {/* -----------------------------------------------*/} + +
+ ); }; export default ProjectPage; diff --git a/src/app/seminar/[id]/page.tsx b/src/app/seminar/[id]/page.tsx index c431b77..4874a2d 100644 --- a/src/app/seminar/[id]/page.tsx +++ b/src/app/seminar/[id]/page.tsx @@ -1,7 +1,40 @@ +'use client'; + import React from 'react'; +import { useRouter } from 'next/navigation'; +import SeminarDetailHeader from '@/components/seminar/seminarDetail/header/SeminarDetailHeader'; +import SeminarDetailBanner from '@/components/seminar/seminarDetail/banner/SeminarDetailBanner'; +import { SEMINAR_DATA } from '@/constants/seminar/seminarData'; +import SeminarDetailPdf from '@/components/seminar/seminarDetail/pdf/SeminarDetailPdf'; +import NotFoundPage from '@/app/not-found'; +import SeminarDetailReview from '@/components/seminar/seminarDetail/review/SeminarDetailReview'; + +const SeminarDetailPage = () => { + const router = useRouter(); + console.log(router); + + // 객체 찾기 + const seminar = SEMINAR_DATA.find(seminar => Number(seminar.id) === 1); + + if (!seminar) { + // 세미나를 찾지 못한 경우 + return ; + } + + + return
+ {/* header */} + + + {/* banner */} + + + {/* pdf file */} + -const CommunityDetailPage = () => { - return
CommunityDetail 페이지입니당
; + {/* review */} + +
; }; -export default CommunityDetailPage; +export default SeminarDetailPage; diff --git a/src/app/seminar/page.tsx b/src/app/seminar/page.tsx index 971d2ae..df2dacd 100644 --- a/src/app/seminar/page.tsx +++ b/src/app/seminar/page.tsx @@ -1,12 +1,27 @@ -import React from 'react'; +'use client'; -// metadata -export const metadata = { - title: 'Seminar', -}; +import SeminarHeader from '@/components/seminar/header/SeminarHeader'; +import SeminarMenuBar from '@/components/seminar/menubar/SeminarMenuBar'; +import SeminarThumbnailList from '@/components/seminar/thumbnail/SeminarThumbnailList'; +import SeminarToggle from '@/components/seminar/toggle/SeminarToggle'; +import React, { useState } from 'react'; const SeminarPage = () => { - return
Seminar 페이지입니당
; + const [selectedCategory, setSelectedCategory] = useState('all'); + + return
+{/* header */} + + +{/* toggle */} + + +{/* select button */} + + +{/* seminar list */} + +
; }; export default SeminarPage; diff --git a/src/app/solutionChallenge/page.tsx b/src/app/solutionChallenge/page.tsx new file mode 100644 index 0000000..78d3c61 --- /dev/null +++ b/src/app/solutionChallenge/page.tsx @@ -0,0 +1,29 @@ +import ProjectList from '@/components/project/list/ProjectList'; +import SolutionChallengeHeader from '@/components/sollutionChallenge/header/SolutionChallengeHeader'; +import SolutionChallengeTab from '@/components/sollutionChallenge/tab/SolutionChallengeTab'; +import React from 'react'; + +export const metadata = { + title: 'SolutionChallenge', +}; + +const SolutionChallengePage = () => { + return ( +
+ {/* -----------------------------------------------*/} + {/* -------------------- 배너 ----------------------*/} + {/* -----------------------------------------------*/} + + {/* -----------------------------------------------*/} + {/* -------------------- 상단 탭 --------------------*/} + {/* -----------------------------------------------*/} + + {/* -----------------------------------------------*/} + {/* ------------------ 프로젝트 리스트 ----------------*/} + {/* -----------------------------------------------*/} + +
+ ); +}; + +export default SolutionChallengePage; diff --git a/src/components/project/card/ProjectCard.tsx b/src/components/project/card/ProjectCard.tsx new file mode 100644 index 0000000..5f0676d --- /dev/null +++ b/src/components/project/card/ProjectCard.tsx @@ -0,0 +1,42 @@ +import ProjectImg from '@/images/project_img.png'; +import Link from 'next/link'; + +/** + * @description + * 프로젝트 페이지 프로젝트 카드 컴포넌트 + * @component ProjectCard + * @returns {JSX.Element} ProjectCard + * @since 2024.04.16 + */ +/** + * Renders the card component for the project section. + * @returns The rendered card component. + */ + +const ProjectCard = () => { + return ( +
+ +
+
+
제목
+
+ 서비스 소개! 두줄까지 적어주세요. +
+
+ 특이 사항 +
+
+ +
+ ); +}; + +export default ProjectCard; diff --git a/src/components/project/content/ProjectContent.tsx b/src/components/project/content/ProjectContent.tsx new file mode 100644 index 0000000..22a7037 --- /dev/null +++ b/src/components/project/content/ProjectContent.tsx @@ -0,0 +1,41 @@ +import ProjectMember from './ProjectMember'; +import ToggleIcon from '@/svg/icons/project/toggleIcon.svg'; + +/** + * @description + * 프로젝트 상세 페이지 프로젝트 내용 컴포넌트 + * @component ProjectContent + * @returns {JSX.Element} ProjectContent + * @since 2024.04.16 + */ +/** + * Renders the prject content component for the project section. + * @returns The rendered project content component. + */ + +const ProjectContent = () => { + return ( +
+
+
+
Team
+ +
+
+ + + + +
+
+
+ 노션 내용 크롤링
CONG(콩) : 축하 아카이빙 서비스
CONG은 왜 + 필요할까?
{' '} +
+
+ ); +}; + +export default ProjectContent; diff --git a/src/components/project/content/ProjectMember.tsx b/src/components/project/content/ProjectMember.tsx new file mode 100644 index 0000000..5643d6b --- /dev/null +++ b/src/components/project/content/ProjectMember.tsx @@ -0,0 +1,36 @@ +import ProfileImg from '@/images/project_img.png'; + +/** + * @description + * 프로젝트 상세 페이지 프로젝트 멤버 컴포넌트 + * @component ProjectMember + * @returns {JSX.Element} ProjectMember + * @since 2024.04.18 + */ +/** + * Renders the project Member component for the project section. + * @returns The rendered project Member component. + */ + +import Image from 'next/image'; + +const ProjectMember = () => { + return ( +
+ profile +
+
+
성이름
+
part role
+
+
세미나 이름
+
+
+ ); +}; + +export default ProjectMember; diff --git a/src/components/project/header/ProjectHeader.tsx b/src/components/project/header/ProjectHeader.tsx new file mode 100644 index 0000000..e516a85 --- /dev/null +++ b/src/components/project/header/ProjectHeader.tsx @@ -0,0 +1,23 @@ +/** + * @description + * 프로젝트 페이지 헤더 컴포넌트 + * @component ProjectHeader + * @returns {JSX.Element} ProjectHeader + * @since 2024.04.16 + */ +/** + * Renders the header component for the project section. + * @returns The rendered header component. + */ + +const ProjectHeader = () => { + return ( +
+
Project
+
GDSC DGU의 프로젝트
+
+
+ ); +}; + +export default ProjectHeader; diff --git a/src/components/project/introduction/ProjectIntroduction.tsx b/src/components/project/introduction/ProjectIntroduction.tsx new file mode 100644 index 0000000..3b7997e --- /dev/null +++ b/src/components/project/introduction/ProjectIntroduction.tsx @@ -0,0 +1,56 @@ +import GithubIcon from '@/svg/icons/project/githubIcon.svg'; +import YoutubeIcon from '@/svg/icons/project/youtubeIcon.svg'; +import FileIcon from '@/svg/icons/project/fileIcon.svg'; +import ProjectImg from '@/images/project_img.png'; +import Image from 'next/image'; + +/** + * @description + * 프로젝트 상세 페이지 프로젝트 소개 컴포넌트 + * @component ProjectIntroduction + * @returns {JSX.Element} ProjectIntroduction + * @since 2024.04.16 + */ +/** + * Renders the prject introduction component for the project section. + * @returns The rendered project introduction component. + */ + +const ProjectIntroduction = () => { + return ( +
+
+
+
+
+ + + +
+
서비스명
+
+ 서비스의 캐치프라이즈, 컨셉을 잘 나타낼 수 있는 말을 간결하게 + 적고자합니다. +
+
+
+
+
+
+ 서비스가 어디서 시작됐는지, 서비스의 띠지 +
+
추가적인 성과
+
+
+
+ ); +}; + +export default ProjectIntroduction; diff --git a/src/components/project/list/ProjectList.tsx b/src/components/project/list/ProjectList.tsx new file mode 100644 index 0000000..f0134e7 --- /dev/null +++ b/src/components/project/list/ProjectList.tsx @@ -0,0 +1,29 @@ +import ProjectCard from '../card/ProjectCard'; + +/** + * @description + * 프로젝트 페이지 프로젝트 리스트 컴포넌트 + * @component ProjectList + * @returns {JSX.Element} ProjectList + * @since 2024.04.16 + */ +/** + * Renders the list component for the project section. + * @returns The rendered list component. + */ + +const ProjectList = () => { + return ( +
+ + + + + + + +
+ ); +}; + +export default ProjectList; diff --git a/src/components/project/pagination/ProjectPagination.tsx b/src/components/project/pagination/ProjectPagination.tsx new file mode 100644 index 0000000..0c58bb7 --- /dev/null +++ b/src/components/project/pagination/ProjectPagination.tsx @@ -0,0 +1,34 @@ +import ProjectCard from '../card/ProjectCard'; + +/** + * @description + * 프로젝트 페이지 프로젝트 페이지네이션 컴포넌트 + * @component ProjectPagination + * @returns {JSX.Element} ProjectPagination + * @since 2024.04.16 + */ +/** + * Renders the pagination component for the project section. + * @returns The rendered pagination component. + */ + +const ProjectPagination = () => { + return ( +
+ + + + +
+ ); +}; + +export default ProjectPagination; diff --git a/src/components/seminar/header/SeminarHeader.tsx b/src/components/seminar/header/SeminarHeader.tsx new file mode 100644 index 0000000..7e0bf46 --- /dev/null +++ b/src/components/seminar/header/SeminarHeader.tsx @@ -0,0 +1,29 @@ +import BannerImg from '@/svg/seminar/seminar_banner.svg'; + +/** + * @description + * 세미나 페이지 헤더 컴포넌트 + * @component SeminarHeader + * @returns {JSX.Element} SeminarHeader + * @since 2024.04.12 + */ +/** + * Renders the header component for the recruitment section. + * @returns The rendered header component. + */ +const SeminarHeader = () => { + + return ( +
+

+ Seminar +

+

+ 여러분과 함께 나누고싶은 이야기 +

+

+ +

+ ); +}; +export default SeminarHeader; diff --git a/src/components/seminar/menubar/SeminarMenuBar.tsx b/src/components/seminar/menubar/SeminarMenuBar.tsx new file mode 100644 index 0000000..666c18d --- /dev/null +++ b/src/components/seminar/menubar/SeminarMenuBar.tsx @@ -0,0 +1,44 @@ +'use client'; + +import { SEMINAR_CATEGORYS } from '@/constants/seminar/seminarCategory'; +import React, { useState } from 'react'; + +/** + * @description + * 세미나 페이지 오픈 세미나 토클 메뉴 + * @component SeminarMenuBar + * @returns {JSX.Element} SeminarMenuBar + * @since 2024.04.18 + */ +/** + * Renders the header component for the recruitment section. + * @returns The rendered header component. + */ +const SeminarMenuBar = ({ + selectedCategory, + setSelectedCategory, +}: { selectedCategory: string; setSelectedCategory: (value: string) => void }) => { + + const handleCategoryChange = (value: string) => { + setSelectedCategory(value); + }; + + return ( +
+ {SEMINAR_CATEGORYS.map((category) => ( + + ))} +
+ ); +}; + + export default SeminarMenuBar; + \ No newline at end of file diff --git a/src/components/seminar/seminarDetail/banner/SeminarDetailBanner.tsx b/src/components/seminar/seminarDetail/banner/SeminarDetailBanner.tsx new file mode 100644 index 0000000..874f5ae --- /dev/null +++ b/src/components/seminar/seminarDetail/banner/SeminarDetailBanner.tsx @@ -0,0 +1,68 @@ +import React from 'react'; +import { SeminarThumnail } from '@/interfaces/seminar/seminarThumbnail'; +import SeminarDetailBannerThumbnail from './SeminarDetailBannerThumbnail'; + + +/** + * @description + * 세미나 상세 페이지 배너 컴포넌트 + * @component SeminarDetailBanner + * @returns {JSX.Element} SeminarDetailBanner + * @since 2024.04.18 + */ +/** + * Renders the header component for the recruitment section. + * @returns The rendered header component. + */ +const SeminarDetailBanner = ({ data }: { data: SeminarThumnail }) => { + return ( +
+ {/* 왼쪽 컨텐츠 */} + + {/* 오른쪽 컨텐츠 */} +
+
+
+

+ {data.presenter} +

+

+ {data.flag}st {data.role} +

+
+
+
+
+

+ Date +

+

+ {data.date} +

+

+ Location +

+

+ {data.location} +

+

+ Speaker +

+

+ {data.presenter} +

+
+
+ ); +}; +export default SeminarDetailBanner; diff --git a/src/components/seminar/seminarDetail/banner/SeminarDetailBannerThumbnail.tsx b/src/components/seminar/seminarDetail/banner/SeminarDetailBannerThumbnail.tsx new file mode 100644 index 0000000..d0f737f --- /dev/null +++ b/src/components/seminar/seminarDetail/banner/SeminarDetailBannerThumbnail.tsx @@ -0,0 +1,34 @@ +import React from 'react'; +import GDSCLOGO from '@/svg/seminar/gdsc_logo.svg'; +import { SeminarThumnail } from '@/interfaces/seminar/seminarThumbnail'; + + +/** + * @description + * 세미나 상세 페이지 배너 썸네일 컴포넌트 + * @component SeminarDetailBannerThumbnail + * @returns {JSX.Element} SeminarDetailBanner + * @since 2024.04.18 + */ +/** + * Renders the header component for the recruitment section. + * @returns The rendered header component. + */ + +const SeminarDetailBannerThumbnail = ({ data }: { data: SeminarThumnail }) => { + return ( +
+
+ +

GDSC DGU {data.flag}st

+

{data.type}

+

{data.date}

+

+

{data.title}

+

{data.description}

+
+
+ ); + }; + export default SeminarDetailBannerThumbnail; + \ No newline at end of file diff --git a/src/components/seminar/seminarDetail/header/SeminarDetailHeader.tsx b/src/components/seminar/seminarDetail/header/SeminarDetailHeader.tsx new file mode 100644 index 0000000..8a9fbde --- /dev/null +++ b/src/components/seminar/seminarDetail/header/SeminarDetailHeader.tsx @@ -0,0 +1,41 @@ +'use client'; + +import { SeminarThumnail } from '@/interfaces/seminar/seminarThumbnail'; +import React, { useState } from 'react'; + +/** + * @description + * 세미나 상세 페이지 헤더 컴포넌트 + * @component SeminarDetailHeader + * @returns {JSX.Element} SeminarDetailHeader + * @since 2024.04.18 + */ +/** + * Renders the header component for the recruitment section. + * @returns The rendered header component. + */ +const SeminarDetailHeader = ({ data }: { data: SeminarThumnail }) => { + const [categoryData, setCategoryData] = useState([data.type, `${data.flag}st`, data.topic]); + + return ( +
+
+ {categoryData.map((category, index) => ( + + ))} +
+

+ {data.title} +

+

+ {data.description} +

+
+ ); +}; +export default SeminarDetailHeader; diff --git a/src/components/seminar/seminarDetail/pdf/SeminarDetailPdf.tsx b/src/components/seminar/seminarDetail/pdf/SeminarDetailPdf.tsx new file mode 100644 index 0000000..c25c176 --- /dev/null +++ b/src/components/seminar/seminarDetail/pdf/SeminarDetailPdf.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import PinImg from '@/svg/seminar/pin.svg'; + +/** + * @description + * 세미나 상세 페이지 pdf 다운로드 컴포넌트 + * @component SeminarDetailPdf + * @returns {JSX.Element} SeminarDetailPdf + * @since 2024.04.18 + */ +/** + * Renders the header component for the recruitment section. + * @returns The rendered header component. + */ +const SeminarDetailPdf = () => { + + return ( +
+ +

세미나 자료 보기

+
+ ); +}; +export default SeminarDetailPdf; diff --git a/src/components/seminar/seminarDetail/review/SeminalDetailReviewDetail.tsx b/src/components/seminar/seminarDetail/review/SeminalDetailReviewDetail.tsx new file mode 100644 index 0000000..e6d36bf --- /dev/null +++ b/src/components/seminar/seminarDetail/review/SeminalDetailReviewDetail.tsx @@ -0,0 +1,24 @@ +import { SeminarReview } from '@/interfaces/seminar/seminarReview'; +import React from 'react'; + +/** + * @description + * 세미나 상세 페이지 리뷰 디테일 컴포넌트 + * @component SeminarDetailReviewDetail + * @returns {JSX.Element} SeminarDetailReviewDetail + * @since 2024.04.18 + */ +/** + * Renders the header component for the recruitment section. + * @returns The rendered header component. + */ +const SeminarDetailReviewDetail = ({ data }: { data: SeminarReview }) => { + + return ( +
+

사람 이름

+

리뷰 내용

+
+ ); +}; +export default SeminarDetailReviewDetail; diff --git a/src/components/seminar/seminarDetail/review/SeminarDetailReview.tsx b/src/components/seminar/seminarDetail/review/SeminarDetailReview.tsx new file mode 100644 index 0000000..8fdda8f --- /dev/null +++ b/src/components/seminar/seminarDetail/review/SeminarDetailReview.tsx @@ -0,0 +1,32 @@ +import { SEMINAR_REVIEW } from '@/constants/seminar/seminarReviewData'; +import React from 'react'; +import SeminarDetailReviewDetail from './SeminalDetailReviewDetail'; + +/** + * @description + * 세미나 상세 페이지 리뷰 컴포넌트 + * @component SeminarDetailReview + * @returns {JSX.Element} SeminarDetailReivew + * @since 2024.04.18 + */ +/** + * Renders the header component for the recruitment section. + * @returns The rendered header component. + */ +const SeminarDetailReview = () => { + + return ( +
+

+ Review +

+

+ {SEMINAR_REVIEW.map((review) => ( + + ))} +

+ ); +}; +export default SeminarDetailReview; diff --git a/src/components/seminar/thumbnail/SeminarThumbnail.tsx b/src/components/seminar/thumbnail/SeminarThumbnail.tsx new file mode 100644 index 0000000..a716ee8 --- /dev/null +++ b/src/components/seminar/thumbnail/SeminarThumbnail.tsx @@ -0,0 +1,58 @@ +import React, { useState } from 'react'; +import GDSCLOGO from '@/svg/seminar/gdsc_logo.svg'; +import { SeminarThumnail } from '@/interfaces/seminar/seminarThumbnail'; + +/** + * @description + * 세미나 페이지 세미나 썸네일 디테일 + * @component SeminarThumbnail + * @returns {JSX.Element} SeminarThumbnail + * @since 2024.04.18 + */ +/** + * Renders the header component for the recruitment section. + * @returns The rendered header component. + */ +const SeminarThumbnail = ({ data }: { data: SeminarThumnail }) => { + return ( +
+ {/* 왼쪽 컨텐츠 */} +
+ +

GDSC DGU {data.flag}st

+

{data.type}

+

{data.date}

+

+

{data.title}

+

{data.description}

+
+ {/* 오른쪽 컨텐츠 */} +
+

+ {data.topic} +

+
+
+

+ {data.presenter} +

+

+ {data.flag}st {data.role} +

+
+
+
+
+ ); +}; +export default SeminarThumbnail; diff --git a/src/components/seminar/thumbnail/SeminarThumbnailList.tsx b/src/components/seminar/thumbnail/SeminarThumbnailList.tsx new file mode 100644 index 0000000..5e09964 --- /dev/null +++ b/src/components/seminar/thumbnail/SeminarThumbnailList.tsx @@ -0,0 +1,83 @@ +'use client'; + +import React, { useState } from 'react'; +import { useRouter } from 'next/navigation'; +import SeminarThumbnail from "./SeminarThumbnail"; +import { SEMINAR_DATA } from '@/constants/seminar/seminarData'; +import Link from 'next/link' + +/** + * @description + * 세미나 페이지 세미나 리스트 + * @component SeminarThumbnailList + * @returns {JSX.Element} SeminarThumbnailList + * @since 2024.04.18 + */ + + +/** + * Renders the header component for the recruitment section. + * @returns The rendered header component. + */ + +const SeminarThumbnailList = ({ selectedCategory }: { selectedCategory: string }) => { + const router = useRouter(); + const [currentPage, setCurrentPage] = useState(1); + const itemsPerPage = 12; // 한 페이지당 표시할 항목 수 + + // topic으로 데이터 필터링 + const filteredData = selectedCategory !== "all" ? SEMINAR_DATA.filter(seminar => seminar.topic === selectedCategory) : SEMINAR_DATA; + + // 페이지네이션 + const indexOfLastItem = currentPage * itemsPerPage; + const indexOfFirstItem = indexOfLastItem - itemsPerPage; + const currentItems = filteredData.slice(indexOfFirstItem, indexOfLastItem); + + // 페이지 번호 계산 + const pageNumbers = []; + for (let i = 1; i <= Math.ceil(SEMINAR_DATA.length / itemsPerPage); i++) { + pageNumbers.push(i); + } + + // 세미나 리스트 페이지네이션 함수 + const paginate = (pageNumber: number) => { + setCurrentPage(pageNumber); + // /seminar/${seminar.id}/page + }; + + + return ( +
+ {/* 썸네일 레스트 */} +
+ {currentItems.map((seminar) => ( + + + + ))} +
+ {/* 페이지네이션 버튼 */} +
+ {pageNumbers.map(number => ( + + ))} +
+
+ ); + }; + export default SeminarThumbnailList; + \ No newline at end of file diff --git a/src/components/seminar/toggle/SeminarToggle.tsx b/src/components/seminar/toggle/SeminarToggle.tsx new file mode 100644 index 0000000..8c83584 --- /dev/null +++ b/src/components/seminar/toggle/SeminarToggle.tsx @@ -0,0 +1,48 @@ +'use client'; + +import React, { useState } from 'react'; +import SeminarToggleMenu from './SeminarToggleMenu'; +import ChervonDownIcon from '@/svg/icons/common/chervon_down.svg'; +import { OPEN_SEMINAR_DATA } from '@/constants/seminar/openSeminarData'; + +/** + * @description + * 세미나 페이지 오픈 세미나 토클 버튼 + * @component SeminarToggle + * @returns {JSX.Element} SeminarToggle + * @since 2024.04.18 + */ +/** + * Renders the header component for the recruitment section. + * @returns The rendered header component. + */ +const SeminarToggle = () => { + const [isMenuVisible, setIsMenuVisible] = useState(false); // 오픈 세미나 목록 토클 버튼 + const toggleMenuVisibility = () => { + setIsMenuVisible(!isMenuVisible); + }; + + return ( +
+
+ +
+
+ {isMenuVisible && ( +
+ {OPEN_SEMINAR_DATA.map((openSeminar) => ( + + ))} +
+ )} +
+
+ ); +}; +export default SeminarToggle; diff --git a/src/components/seminar/toggle/SeminarToggleMenu.tsx b/src/components/seminar/toggle/SeminarToggleMenu.tsx new file mode 100644 index 0000000..39b0d44 --- /dev/null +++ b/src/components/seminar/toggle/SeminarToggleMenu.tsx @@ -0,0 +1,32 @@ +/** + * @description + * 세미나 페이지 오픈 세미나 토클 메뉴 + * @component SeminarToggleMenu + * @returns {JSX.Element} SeminarToggleMenu + * @since 2024.04.18 + */ + +import { OpenSeminar } from "@/interfaces/seminar/openSeminar"; + +/** + * Renders the header component for the recruitment section. + * @returns The rendered header component. + */ +const SeminarToggleMenu = ({data}: {data:OpenSeminar}) => { + return ( +
+
+
+

{data.opening_date}{" "}{data.type}

+

{data.seminar_date}

+
+

+ {data.status === false ? "종료" : "진행중"} +

+
+

+

+ ); +}; +export default SeminarToggleMenu; diff --git a/src/components/sollutionChallenge/header/SolutionChallengeHeader.tsx b/src/components/sollutionChallenge/header/SolutionChallengeHeader.tsx new file mode 100644 index 0000000..bff4c18 --- /dev/null +++ b/src/components/sollutionChallenge/header/SolutionChallengeHeader.tsx @@ -0,0 +1,55 @@ +import BannerImg from '@/images/solution_challenge_banner.png'; +import BannerImg2 from '@/svg/icons/solutionChallenge/solution_challenge_banner2.svg'; +import Link from 'next/link'; + +/** + * @description + * 솔루션 챌린지 페이지 헤더 컴포넌트 + * @component SollutionChallengeHeader + * @returns {JSX.Element} SollutionChallengeHeader + * @since 2024.04.13 + */ +/** + * Renders the header component for the SollutionChallenge section. + * @returns The rendered header component. + */ + +const SolutionChallengeHeader = () => { + return ( +
+ {/*
*/} +
+
+ +
+ + + +
+
+
+
+ ); +}; + +export default SolutionChallengeHeader; diff --git a/src/components/sollutionChallenge/tab/SolutionChallengeTab.tsx b/src/components/sollutionChallenge/tab/SolutionChallengeTab.tsx new file mode 100644 index 0000000..2e5cc75 --- /dev/null +++ b/src/components/sollutionChallenge/tab/SolutionChallengeTab.tsx @@ -0,0 +1,45 @@ +import LightIcon from '@/svg/icons/solutionChallenge/lightIcon.svg'; + +/** + * @description + * 솔루션 챌린지 페이지 상단 탭 컴포넌트 + * @component SollutionChallengeTab + * @returns {JSX.Element} SollutionChallengeTab + * @since 2024.04.13 + */ +/** + * Renders the Tab component for the SollutionChallenge section. + * @returns The rendered Tab component. + */ + +const SolutionChallengeTab = () => { + return ( +
+
+ +
+ 2024 Solution Challenge 에서 GDSC DGU의 2팀이 TOP100에 진출했습니다. +
+
+
+ + + + + +
+
+ ); +}; + +export default SolutionChallengeTab; diff --git a/src/constants/seminar/openSeminarData.ts b/src/constants/seminar/openSeminarData.ts new file mode 100644 index 0000000..b3c10a3 --- /dev/null +++ b/src/constants/seminar/openSeminarData.ts @@ -0,0 +1,26 @@ +import SeoHuiChan from '@/images/seminar/presenter/seohuichan.png'; +import { OpenSeminar } from '@/interfaces/seminar/openSeminar'; + +export const OPEN_SEMINAR_DATA: OpenSeminar[] = [ + { + id: 1, + flag: 1, + type: 'Open Seminar', + topic: 'DevTalk', + opening_date: '2023/5', + seminar_date: '2023.09.22 (FRI) 19:30', + location: '동국대학교 원흥관 PBL', + title: ` + 휴, 하마터면 + 의사 될 뻔... + `, + description: ` + 의사를 목표로 공부를 하다가, + 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들 + `, + presenter: '서희찬', + role: 'Lead', + profile_image_url: SeoHuiChan.src, + status: false + }, +] \ No newline at end of file diff --git a/src/constants/seminar/seminarCategory.ts b/src/constants/seminar/seminarCategory.ts new file mode 100644 index 0000000..7f7305b --- /dev/null +++ b/src/constants/seminar/seminarCategory.ts @@ -0,0 +1,9 @@ +import { SeminarCategory } from "@/interfaces/seminar/seminarCategory"; + +export const SEMINAR_CATEGORYS: SeminarCategory[] = [ + { label: 'ALL', value: 'all' }, + { label: 'DevTalk', value: 'DevTalk' }, + { label: 'Web/App', value: 'Web/App' }, + { label: 'Server/Cloud', value: 'Server/Cloud' }, + { label: 'AI/ML', value: 'AI/ML' }, + ]; \ No newline at end of file diff --git a/src/constants/seminar/seminarData.ts b/src/constants/seminar/seminarData.ts new file mode 100644 index 0000000..38f4c31 --- /dev/null +++ b/src/constants/seminar/seminarData.ts @@ -0,0 +1,193 @@ +import SeoHuiChan from '@/images/seminar/presenter/seohuichan.png'; +import { SeminarThumnail } from '@/interfaces/seminar/seminarThumbnail'; + +export const SEMINAR_DATA: SeminarThumnail[] = [ + { + id: 1, + flag: 1, + type: 'Camping Seminar', + topic: 'DevTalk', + date: '2023.09.22 (FRI) 19:30', + location: '동국대학교 원흥관 PBL', + title: ` + 휴, 하마터면 + 의사 될 뻔... + `, + description: ` + 의사를 목표로 공부를 하다가, + 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들 + `, + presenter: '서희찬', + role: 'Lead', + profile_image_url: SeoHuiChan.src, + }, + { + id: 2, + flag: 1, + type: 'Camping Seminar', + topic: 'DevTalk', + date: '2023.09.22 (FRI) 19:30', + location: '동국대학교 원흥관 PBL', + title: '휴, 하마터면\n의사 될 뻔...', + description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`, + presenter: '서희찬', + role: 'Lead', + profile_image_url: SeoHuiChan.src, + }, + { + id: 3, + flag: 1, + type: 'Camping Seminar', + topic: 'DevTalk', + date: '2023.09.22 (FRI) 19:30', + location: '동국대학교 원흥관 PBL', + title: '휴, 하마터면\n의사 될 뻔...', + description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`, + presenter: '서희찬', + role: 'Lead', + profile_image_url: SeoHuiChan.src, + }, + { + id: 4, + flag: 1, + type: 'Camping Seminar', + topic: 'DevTalk', + date: '2023.09.22 (FRI) 19:30', + location: '동국대학교 원흥관 PBL', + title: '휴, 하마터면\n의사 될 뻔...', + description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`, + presenter: '서희찬', + role: 'Lead', + profile_image_url: SeoHuiChan.src, + }, + { + id: 5, + flag: 1, + type: 'Camping Seminar', + topic: 'DevTalk', + date: '2023.09.22 (FRI) 19:30', + location: '동국대학교 원흥관 PBL', + title: '휴, 하마터면\n의사 될 뻔...', + description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`, + presenter: '서희찬', + role: 'Lead', + profile_image_url: SeoHuiChan.src, + }, + { + id: 6, + flag: 1, + type: 'Camping Seminar', + topic: 'DevTalk', + date: '2023.09.22 (FRI) 19:30', + location: '동국대학교 원흥관 PBL', + title: '휴, 하마터면\n의사 될 뻔...', + description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`, + presenter: '서희찬', + role: 'Lead', + profile_image_url: SeoHuiChan.src, + }, + { + id: 7, + flag: 1, + type: 'Camping Seminar', + topic: 'DevTalk', + date: '2023.09.22 (FRI) 19:30', + location: '동국대학교 원흥관 PBL', + title: '휴, 하마터면\n의사 될 뻔...', + description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`, + presenter: '서희찬', + role: 'Lead', + profile_image_url: SeoHuiChan.src, + }, + { + id: 8, + flag: 1, + type: 'Camping Seminar', + topic: 'DevTalk', + date: '2023.09.22 (FRI) 19:30', + location: '동국대학교 원흥관 PBL', + title: '휴, 하마터면\n의사 될 뻔...', + description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`, + presenter: '서희찬', + role: 'Lead', + profile_image_url: SeoHuiChan.src, + }, + { + id: 9, + flag: 1, + type: 'Camping Seminar', + topic: 'DevTalk', + date: '2023.09.22 (FRI) 19:30', + location: '동국대학교 원흥관 PBL', + title: '휴, 하마터면\n의사 될 뻔...', + description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`, + presenter: '서희찬', + role: 'Lead', + profile_image_url: SeoHuiChan.src, + }, + { + id: 10, + flag: 1, + type: 'Camping Seminar', + topic: 'DevTalk', + date: '2023.09.22 (FRI) 19:30', + location: '동국대학교 원흥관 PBL', + title: '휴, 하마터면\n의사 될 뻔...', + description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`, + presenter: '서희찬', + role: 'Lead', + profile_image_url: SeoHuiChan.src, + }, + { + id: 11, + flag: 1, + type: 'Camping Seminar', + topic: 'DevTalk', + date: '2023.09.22 (FRI) 19:30', + location: '동국대학교 원흥관 PBL', + title: '휴, 하마터면\n의사 될 뻔...', + description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`, + presenter: '서희찬', + role: 'Lead', + profile_image_url: SeoHuiChan.src, + }, + { + id: 12, + flag: 1, + type: 'Camping Seminar', + topic: 'DevTalk', + date: '2023.09.22 (FRI) 19:30', + location: '동국대학교 원흥관 PBL', + title: '휴, 하마터면\n의사 될 뻔...', + description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`, + presenter: '서희찬', + role: 'Lead', + profile_image_url: SeoHuiChan.src, + }, + { + id: 13, + flag: 1, + type: 'Camping Seminar', + topic: 'DevTalk', + date: '2023.09.22 (FRI) 19:30', + location: '동국대학교 원흥관 PBL', + title: '휴, 하마터면\n의사 될 뻔...', + description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`, + presenter: '서희찬', + role: 'Lead', + profile_image_url: SeoHuiChan.src, + }, + { + id: 14, + flag: 1, + type: 'Camping Seminar', + topic: 'DevTalk', + date: '2023.09.22 (FRI) 19:30', + location: '동국대학교 원흥관 PBL', + title: '휴, 하마터면\n의사 될 뻔...', + description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`, + presenter: '서희찬', + role: 'Lead', + profile_image_url: SeoHuiChan.src, + }, +] \ No newline at end of file diff --git a/src/constants/seminar/seminarReviewData.ts b/src/constants/seminar/seminarReviewData.ts new file mode 100644 index 0000000..c2d0397 --- /dev/null +++ b/src/constants/seminar/seminarReviewData.ts @@ -0,0 +1,59 @@ +import { SeminarReview } from "@/interfaces/seminar/seminarReview"; + +export const SEMINAR_REVIEW: SeminarReview[] = [ + { + id: 1, + author: '사람 이름', + content: '리뷰 내용~ \n 리뷰 내용~' + }, + { + id: 2, + author: '사람 이름', + content: '리뷰 내용~ \n 리뷰 내용~' + }, + { + id: 3, + author: '사람 이름', + content: '리뷰 내용~ \n 리뷰 내용~' + }, + { + id: 4, + author: '사람 이름', + content: '리뷰 내용~ \n 리뷰 내용~' + }, + { + id: 5, + author: '사람 이름', + content: '리뷰 내용~ \n 리뷰 내용~' + }, + { + id: 6, + author: '사람 이름', + content: '리뷰 내용~ \n 리뷰 내용~' + }, + { + id: 7, + author: '사람 이름', + content: '리뷰 내용~ \n 리뷰 내용~' + }, + { + id: 8, + author: '사람 이름', + content: '리뷰 내용~ \n 리뷰 내용~' + }, + { + id: 9, + author: '사람 이름', + content: '리뷰 내용~ \n 리뷰 내용~' + }, + { + id: 10, + author: '사람 이름', + content: '리뷰 내용~ \n 리뷰 내용~' + }, + { + id: 11, + author: '사람 이름', + content: '리뷰 내용~ \n 리뷰 내용~' + }, + ]; \ No newline at end of file diff --git a/src/interfaces/seminar/openSeminar.ts b/src/interfaces/seminar/openSeminar.ts new file mode 100644 index 0000000..e619caa --- /dev/null +++ b/src/interfaces/seminar/openSeminar.ts @@ -0,0 +1,16 @@ +export interface OpenSeminar { + id: number; + flag: number; + type: string; + topic: string; + opening_date: string; + seminar_date: string; + location: string; + title: string; + description: string; + presenter: string; + role: string; + profile_image_url: string; + status: boolean; +} + \ No newline at end of file diff --git a/src/interfaces/seminar/seminarCategory.ts b/src/interfaces/seminar/seminarCategory.ts new file mode 100644 index 0000000..b595693 --- /dev/null +++ b/src/interfaces/seminar/seminarCategory.ts @@ -0,0 +1,5 @@ +export interface SeminarCategory { + label: string; + value: string; +} + \ No newline at end of file diff --git a/src/interfaces/seminar/seminarReview.ts b/src/interfaces/seminar/seminarReview.ts new file mode 100644 index 0000000..191cc5f --- /dev/null +++ b/src/interfaces/seminar/seminarReview.ts @@ -0,0 +1,6 @@ +export interface SeminarReview { + id: number; + author: string; + content: string; +} + \ No newline at end of file diff --git a/src/interfaces/seminar/seminarThumbnail.ts b/src/interfaces/seminar/seminarThumbnail.ts new file mode 100644 index 0000000..7160158 --- /dev/null +++ b/src/interfaces/seminar/seminarThumbnail.ts @@ -0,0 +1,14 @@ +export interface SeminarThumnail { + id: number; + flag: number; + type: string; + topic: string; + date: string; + location: string; + title: string; + description: string; + presenter: string; + role: string; + profile_image_url: string; +} + \ No newline at end of file