From 8c841c0ac6c9e34a34bd39702a3c81a26a567499 Mon Sep 17 00:00:00 2001 From: Ariling <97501226+Ariling@users.noreply.github.com> Date: Fri, 29 Dec 2023 15:42:53 +0900 Subject: [PATCH 01/14] =?UTF-8?q?feat=20:=20api=20=EC=97=B0=EA=B2=B0=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B7=B8=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- next.config.js | 2 +- src/components/landing/FourthSection.tsx | 2 +- src/components/partintro/Information.tsx | 42 +++++++++++----------- src/components/partintro/ToggleInfo.tsx | 19 ++++++++-- src/pages/part/[partintro].tsx | 46 ++++++++++++++++++++++-- src/store/type.tsx | 12 +++++++ 6 files changed, 94 insertions(+), 29 deletions(-) create mode 100644 src/store/type.tsx diff --git a/next.config.js b/next.config.js index 04e06b7..ab6496a 100644 --- a/next.config.js +++ b/next.config.js @@ -14,7 +14,7 @@ const nextConfig = withTwin({ }, reactStrictMode: true, images: { - domains: ["cms-cdn.placeholder.co"], + domains: ["startlion.s3.ap-northeast-2.amazonaws.com"], // 이곳에 에러메세지의 hostname 다음 따옴표에 오는 링크를 적으면 된다 // 나중에 서버에서 주는 해당하는 url 도메인을 가져와야 할 것! }, diff --git a/src/components/landing/FourthSection.tsx b/src/components/landing/FourthSection.tsx index f6614b1..bc4fecc 100644 --- a/src/components/landing/FourthSection.tsx +++ b/src/components/landing/FourthSection.tsx @@ -25,7 +25,7 @@ const FourthSection = () => { 적당할 것 가탕요. 우헤헤헤 - router.push("/part/DESIGN")}> + router.push("/part/DE")}> DesignLion
diff --git a/src/components/partintro/Information.tsx b/src/components/partintro/Information.tsx index fcb6f14..7e55ef8 100644 --- a/src/components/partintro/Information.tsx +++ b/src/components/partintro/Information.tsx @@ -3,40 +3,40 @@ import Image from "next/image"; import React from "react"; import design from "@/img/part/design.png"; -const Information = () => { +type Props = { + partContent: string; + typeOfTalent: string; + imageUrl: string; + curriculumContents: Array; +}; + +const Information = (props: Props) => { const test = `🤔 디자인적 고민을 팀원들과 공유하고 긍정적인 피드백을 할 수 있는 분!\n 🗣️ 생각을 자유롭게 표현하는 것을 즐기는 분 !\n 💬 팀원들과 소통을 통해서 더 멋있는 아이디어를 만드는 것을 즐기시는분 !\n`; return ( <> 한줄 소개 - - 중앙대학교 멋쟁이사자처럼 디자인 파트는 웹을 디자인하기 위한 기초 - 이론부터 프로토타입을 구현할 수 있는 디자인 스킬을 배울 수 있습니다. - 디자인 툴을 익히고 다양한 웹 디자인의 이론과 용어 등 기초를 배우고 - 기획자, 개발자들과 적극적으로 소통하는 방법을 공부합니다. - + {props.partContent} 인재상 - {test} + + {props.typeOfTalent} +
커리큘럼
- 파트별 그림 + 파트별 그림 - 1. DESIGN THINKING -
- 2. Topic_아카이빙 훈련 -
- 3. 프론트 특강 -
- 4. Flow Chart & Wireframe -
- 5. Figma 기본 툴
- 6. 웹 디자인 가이드 -
- 7. UI 디자인 + {props.curriculumContents.map((e, i) => ( +
{e}
+ ))}
diff --git a/src/components/partintro/ToggleInfo.tsx b/src/components/partintro/ToggleInfo.tsx index 33897ad..bdcb0ef 100644 --- a/src/components/partintro/ToggleInfo.tsx +++ b/src/components/partintro/ToggleInfo.tsx @@ -2,7 +2,12 @@ import { PartText } from "@/pages/part/[partintro]"; import React, { useState } from "react"; import ToggleButton from "@/svg/toggle.svg"; -const ToggleInfo = () => { +type Props = { + partQuestions: Array; + commonQuestions: Array; +}; + +const ToggleInfo = (props: Props) => { const [utilToggle, setUtilToggle] = useState(false); const [partToggle, setPartToggle] = useState(false); return ( @@ -19,7 +24,11 @@ const ToggleInfo = () => { 공통문항 {utilToggle ? ( -
어떻게 되는거?(유틸별)
+
+ {props.commonQuestions.map((e, i) => ( +
{e}
+ ))} +
) : null}
@@ -34,7 +43,11 @@ const ToggleInfo = () => { 파트별 문항 {partToggle ? ( -
어떻게 되는거?(파트별)
+
+ {props.partQuestions.map((e, i) => ( +
{e}
+ ))} +
) : null}
diff --git a/src/pages/part/[partintro].tsx b/src/pages/part/[partintro].tsx index d800d78..9472f3e 100644 --- a/src/pages/part/[partintro].tsx +++ b/src/pages/part/[partintro].tsx @@ -5,8 +5,10 @@ import { ApplyBtn } from "@/components/landing/FirstSection"; import ToggleInfo from "@/components/partintro/ToggleInfo"; import Information from "@/components/partintro/Information"; import HeightBlank from "@/components/utils/HeightBlank"; +import { GetServerSideProps } from "next"; +import { PartInfo, PartInfoProps } from "@/store/type"; -export default function PartPage() { +export default function PartPage({ partInfo }: PartInfoProps) { //React 컴포넌트와 훅은 항상 대문자로 시작해야 한다는 것을 기억해주세요. const router = useRouter(); return ( @@ -20,9 +22,17 @@ export default function PartPage() { - +
- +
@@ -33,6 +43,36 @@ export default function PartPage() { ); } +// Export the getServerSideProps function with GetServerSideProps type +export const getServerSideProps: GetServerSideProps<{ + partInfo: PartInfo; +}> = async (context) => { + // get params id from the url + const partInfoName = context.params?.partintro as string; + + const API_URL = `${process.env.NEXT_PUBLIC_SERVER_URL}/api/parts/${partInfoName}`; + + // Fetch data + const res = await fetch(API_URL); + + // Parse the data + const data = await res.json(); + const partInfo = data; + + // If the product is not found, return notFound - 404 page + if (partInfo === null) { + return { + notFound: true, + }; + } + // Return the product as props + return { + props: { + partInfo, + }, + }; +}; + export const TextBox = tw.div` flex flex-col items-start justify-start gap-4 w-full `; diff --git a/src/store/type.tsx b/src/store/type.tsx new file mode 100644 index 0000000..a25b573 --- /dev/null +++ b/src/store/type.tsx @@ -0,0 +1,12 @@ +export type PartInfo = { + partContent: string; + typeOfTalent: string; + imageUrl: string; + partQuestions: Array; + curriculumContents: Array; + commonQuestions: Array; +}; + +export interface PartInfoProps { + partInfo: PartInfo; +} From f65fb11a6d471daca90a0e6301f5f7a39eabe8f0 Mon Sep 17 00:00:00 2001 From: Ariling <97501226+Ariling@users.noreply.github.com> Date: Fri, 29 Dec 2023 17:39:04 +0900 Subject: [PATCH 02/14] =?UTF-8?q?[Feat]=20=EC=9D=B8=ED=84=B0=EB=B7=B0=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20api=20=EC=97=B0=EA=B2=B0=20=EB=B0=8F=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- next.config.js | 2 +- src/components/interview/InterviewCard.tsx | 3 +- src/components/interview/QNABox.tsx | 103 ++++----------------- src/pages/interview/[detail].tsx | 59 ++++++++++-- src/store/type.tsx | 30 ++++++ 5 files changed, 102 insertions(+), 95 deletions(-) create mode 100644 src/store/type.tsx diff --git a/next.config.js b/next.config.js index 04e06b7..ab6496a 100644 --- a/next.config.js +++ b/next.config.js @@ -14,7 +14,7 @@ const nextConfig = withTwin({ }, reactStrictMode: true, images: { - domains: ["cms-cdn.placeholder.co"], + domains: ["startlion.s3.ap-northeast-2.amazonaws.com"], // 이곳에 에러메세지의 hostname 다음 따옴표에 오는 링크를 적으면 된다 // 나중에 서버에서 주는 해당하는 url 도메인을 가져와야 할 것! }, diff --git a/src/components/interview/InterviewCard.tsx b/src/components/interview/InterviewCard.tsx index e27cee5..3b45eaa 100644 --- a/src/components/interview/InterviewCard.tsx +++ b/src/components/interview/InterviewCard.tsx @@ -2,6 +2,7 @@ import { InterviewCardProp } from "@/store/testData"; import Image from "next/image"; import React from "react"; import { styled } from "twin.macro"; +import design from "@/img/part/design.png"; const InterviewCard = (props: InterviewCardProp) => { return ( @@ -9,7 +10,7 @@ const InterviewCard = (props: InterviewCardProp) => {
인터뷰 메인 이미지 { +type Props = { + interviewAnswers: Array; +}; + +const QNABox = (props: Props) => { //이부분은 나중에 바뀔 것..! 서버에서 받은걸로 하나하나 돌릴것이기 때문! return ( <> -
- - 질문라이언 -
Q. 처음 멋사에 지원하셨던 이유는 무엇인가요?
-
- -
- 개발자로서 진로에 대한 고민을 해결하고자 지원했어요. -
-
- 개발자로 진로를 결정하며 개발 공부의 계획은 세웠으나 어떻게 공부해야 - 할지 막막하던 차에 답을 구하고자 멋사에 지원하게 되었어요. 멋사에서 - 원하는 만큼 답을 얻을 수 있는 여러 멘토들을 만났습니다 -
-
-
-
- - 질문라이언 -
Q. 멋쟁이사자처럼의 분위기는 어떤가요?
-
- -
자유롭고 즐겁게 코딩할 수 있어요.
-
- 놀땐 놀고 개발할 땐 개발하는 분위기입니다! 멋사는 모각코(모여서 각자 - 코딩)를 자주 진행하는데 자유롭게 참여할 수 있어요. 혼자하면 지루할 - 수 있는 개발공부를 함께 모여 즐겁게 했습니다. -
-
-
-
- - 질문라이언 -
- Q. 멋사 친구들과 함께 했던, 가장 기억에 남는 추억은 무엇인가요? -
-
- -
아이디어톤과 해커톤 !
-
- 개발하면서 밤을 지새웠던 아이디어톤과 해커톤이 가장 기억에 남아요! - 당시에는 좀 고생했지만 지나고보니 좋은 결과도 있었고, 팀원들과 더욱 - 돈독해지는 계기가 되었던 것 같습니다.자 코딩)를 자주 진행하는데 - 자유롭게 참여할 수 있어요. 혼자하면 지루할 수 있는 개발공부를 함께 - 모여 즐겁게 했습니다. -
-
-
-
- - 질문라이언 -
- Q. 많은 지원자들 가운데 현우님이 뽑힌 이유는 무엇이라 생각하시나요? -
-
- -
멋사의 키워드 "협업"
-
- 면접을 합격하고 한참 뒤에 제 면접을 진행했던 운영진에게 저를 왜 - 뽑았는지 물어봤어요. 돌아온 답변은 “협업을 잘할 것 같아서!”였습니다. - 개발실력도 중요하지만 팀원과의 소통 능력 또한 중요하게 생각한다는 - 느낌을 받았고 이는 저도 동의하는 부분입니다. 협업을 잘할 것 같다는 - 인상을 주는 게 개인적으로 멋사 면접에서 중요하다고 생각합니다. -
-
-
-
- - 질문라이언 -
- Q. 마지막으로 멋쟁이 사자처럼 11기 친구들에게 한마디 해주세요 -
-
- -
다들 멋사에서 만나요~!
-
- 10기 멋사를 하면서 함께 고민할 수 있는 사람들을 많이 얻어가서 정말 - 좋았습니다. 11기 여러분들도 멋사에서 저보다 더 많은 것들 얻어가시길 - 응원하겠습니다! -
-
-
+ {props.interviewAnswers.map((e, i) => ( +
+ + 질문라이언 +
Q. {e.question}
+
+ +
+ 개발자로서 진로에 대한 고민을 해결하고자 지원했어요. +
+
{e.answer}
+
+
+ ))} ); }; diff --git a/src/pages/interview/[detail].tsx b/src/pages/interview/[detail].tsx index 2318c2d..8ce4c01 100644 --- a/src/pages/interview/[detail].tsx +++ b/src/pages/interview/[detail].tsx @@ -4,14 +4,25 @@ import React from "react"; import tw from "twin.macro"; import QNABox from "@/components/interview/QNABox"; import Backarrow from "@/svg/backarrow.svg"; +import { GetServerSideProps } from "next"; +import { InterviewInfo, InterviewInfoProps } from "@/store/type"; +import Image from "next/image"; +import design from "@/img/part/design.png"; -const InterviewPage = () => { +const InterviewPage = ({ interviewInfo }: InterviewInfoProps) => { const router = useRouter(); return (
- 이미지파트(백엔드한테 받을부분) + 인터뷰 메인 이미지
{
- {router.query.detail}번 인터뷰 - 10기 백엔드 파트 + {interviewInfo.interviewId}번 인터뷰 - {interviewInfo.part}기{" "} + {interviewInfo.part} 파트
- 정현우 + {interviewInfo.name}

- 에너지시스템공학과 + {interviewInfo.major}

-
- 안녕하세요 저는 중앙대학교 멋사 10기 백엔드파트로 활동했던 - 에너지시스템공학부 정현우입니다. -
+
{interviewInfo.title}
- +
@@ -47,6 +56,36 @@ const InterviewPage = () => { export default InterviewPage; +export const getServerSideProps: GetServerSideProps<{ + interviewInfo: InterviewInfo; +}> = async (context) => { + const interviewId = parseInt(context.params?.detail as string) || 1; + // Define the API url with the product id + const API_URL = `${process.env.NEXT_PUBLIC_SERVER_URL}/api/interviews/${interviewId}`; + + // Fetch data + const res = await fetch(API_URL); + + // Parse the data + const data = await res.json(); + const interviewInfo = data; + console.log(data); + + // If the product is not found, return notFound - 404 page + if (interviewInfo === null) { + return { + notFound: true, + }; + } + + // Return the product as props + return { + props: { + interviewInfo, + }, + }; +}; + const QNAWrapper = tw.div` w-full gap-[160px] flex flex-col `; diff --git a/src/store/type.tsx b/src/store/type.tsx new file mode 100644 index 0000000..e1dc9c8 --- /dev/null +++ b/src/store/type.tsx @@ -0,0 +1,30 @@ +export type InterviewInfo = { + interviewId: number; + title: string; + generation: number; + part: string; + major: string; + name: string; + oneLineContent: string; + oneLineAnswer: string; + imageUrl: string | null; + interviewAnswers: Array; +}; + +export type InterviewAnswerProp = { + interviewAnswerId: number; + question: string; + answer: string; +}; + +export interface InterviewInfoProps { + interviewInfo: InterviewInfo; +} + +export interface TotalInterviewProps { + totalInterview: TotalInterviewInfo; +} + +export type TotalInterviewInfo = { + totalInterview: Array; +}; From 1452b380d067ba98f1df156c4dcd0e1ddda8a00c Mon Sep 17 00:00:00 2001 From: Ariling <97501226+Ariling@users.noreply.github.com> Date: Sun, 31 Dec 2023 02:06:22 +0900 Subject: [PATCH 03/14] =?UTF-8?q?[Feat]=20:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EB=B0=8F=20=EA=B5=AC=EA=B8=80=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20api=20=EC=97=B0=EA=B2=B0=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B7=B8=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 +- src/apis/login/api.ts | 6 +++ src/apis/mypage/api.ts | 16 ++++++++ src/components/mypage/MyApply.tsx | 38 ++++++++++++++++++- src/components/utils/Nav.tsx | 14 ++++++- src/pages/_app.tsx | 6 ++- src/store/atoms.tsx | 42 +++++++++++++++++++++ yarn.lock | 62 +++++++++++++++++++++++++++++++ 8 files changed, 184 insertions(+), 4 deletions(-) create mode 100644 src/apis/login/api.ts create mode 100644 src/apis/mypage/api.ts diff --git a/package.json b/package.json index 29ee107..1b7c610 100644 --- a/package.json +++ b/package.json @@ -12,11 +12,13 @@ "@emotion/react": "^11.11.1", "@emotion/serialize": "^1.1.2", "@emotion/styled": "^11.11.0", + "axios": "^1.6.3", "framer-motion": "^10.16.4", "next": "13.5.6", "react": "^18", "react-dom": "^18", - "recoil": "^0.7.7" + "recoil": "^0.7.7", + "recoil-persist": "^5.1.0" }, "devDependencies": { "@babel/core": "^7.23.2", diff --git a/src/apis/login/api.ts b/src/apis/login/api.ts new file mode 100644 index 0000000..27969c5 --- /dev/null +++ b/src/apis/login/api.ts @@ -0,0 +1,6 @@ +import axios from "axios"; + +// export const getUserTokenApi = () => { +// return await axios +// .get() +// } diff --git a/src/apis/mypage/api.ts b/src/apis/mypage/api.ts new file mode 100644 index 0000000..1f21a13 --- /dev/null +++ b/src/apis/mypage/api.ts @@ -0,0 +1,16 @@ +import axios from "axios"; + +export const getMypageApi = async (token: string) => { + axios.defaults.headers.common["Authorization"] = `Bearer ${token}`; + return await axios + .get(`${process.env.NEXT_PUBLIC_SERVER_URL}/api/users/me`) + .then((response) => { + return response; + }) + .catch((error) => { + if (axios.isAxiosError(error)) { + const result = error.response?.data?.detail; + return result; + } + }); +}; diff --git a/src/components/mypage/MyApply.tsx b/src/components/mypage/MyApply.tsx index 55ca675..a08a6f1 100644 --- a/src/components/mypage/MyApply.tsx +++ b/src/components/mypage/MyApply.tsx @@ -1,9 +1,28 @@ +import { getMypageApi } from "@/apis/mypage/api"; +import { mypageAtom, userInfoState } from "@/store/atoms"; import { useRouter } from "next/router"; -import React from "react"; +import React, { useEffect } from "react"; +import { useRecoilState } from "recoil"; import tw from "twin.macro"; const MyApply = () => { const router = useRouter(); + const [userToken, setUserToken] = useRecoilState(userInfoState); + const [data, setData] = useRecoilState(mypageAtom); + useEffect(() => { + getMypageApi(userToken.accessToken).then((res) => { + if (typeof res === "undefined") { + alert("토큰이 유효하지 않습니다. 다시 시도해주세요"); + setUserToken({ + accessToken: "", + refreshToken: "", + }); + router.replace("/"); + } else { + setData(res); + } + }); + }, []); return (
@@ -14,6 +33,23 @@ const MyApply = () => {
지원서
+ {Array.isArray(data.applicationList) && + data.applicationList.map((e, i) => ( + <> + +
{e.generationId}
+
{e.name}
+
{e.partId}
+
{e.status}
+ router.push("/apply")} + className="ml-[-19px]" + > + 지원서 + +
+ + ))}
지원기수
이름
diff --git a/src/components/utils/Nav.tsx b/src/components/utils/Nav.tsx index 64888d7..f25beb0 100644 --- a/src/components/utils/Nav.tsx +++ b/src/components/utils/Nav.tsx @@ -3,6 +3,8 @@ import { styled } from "twin.macro"; import logo from "@/img/logo.png"; import Image from "next/image"; import { useRouter } from "next/router"; +import { useRecoilValue } from "recoil"; +import { userInfoState } from "@/store/atoms"; const NavBar = styled.div` z-index: 10; @@ -29,6 +31,12 @@ const NavOptionWrapper = styled.div` `; const Nav = () => { + const loginUrl = `${process.env.NEXT_PUBLIC_SERVER_URL}/login`; + const userToken = useRecoilValue(userInfoState); + + const handleClick = () => { + window.location.assign(loginUrl); + }; const router = useRouter(); return ( @@ -43,7 +51,11 @@ const Nav = () => { - + {userToken.accessToken === "" ? ( + + ) : ( + + )} ); diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index f2d928d..33a3d04 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -2,12 +2,16 @@ import Footer from "@/components/utils/Footer"; import Nav from "@/components/utils/Nav"; import "@/styles/globals.css"; import type { AppProps } from "next/app"; +import dynamic from "next/dynamic"; import { RecoilRoot } from "recoil"; export default function App({ Component, pageProps }: AppProps) { + const DynamicNav = dynamic(() => import("@/components/utils/Nav"), { + ssr: false, + }); return ( -
diff --git a/src/pages/part/[partintro].tsx b/src/pages/part/[partintro].tsx index 9472f3e..2ab06d7 100644 --- a/src/pages/part/[partintro].tsx +++ b/src/pages/part/[partintro].tsx @@ -16,7 +16,7 @@ export default function PartPage({ partInfo }: PartInfoProps) {
- 파트별 소개 : {router.query.partintro} + 파트별 소개 : {partInfo.partName}
router.back()}> @@ -87,5 +87,6 @@ export const PartText = styled.div` } &.schedule { line-height: 200%; + white-space: pre-line; } `; diff --git a/src/store/type.tsx b/src/store/type.tsx index a25b573..629821e 100644 --- a/src/store/type.tsx +++ b/src/store/type.tsx @@ -1,9 +1,10 @@ export type PartInfo = { + partName: string; partContent: string; typeOfTalent: string; imageUrl: string; partQuestions: Array; - curriculumContents: Array; + curriculumContents: string; commonQuestions: Array; }; From 81e5476b3b45723774dacf80f009f74b37274ac3 Mon Sep 17 00:00:00 2001 From: Ariling <97501226+Ariling@users.noreply.github.com> Date: Sun, 31 Dec 2023 11:10:38 +0900 Subject: [PATCH 06/14] =?UTF-8?q?[Refactor]=20=EC=9D=B8=ED=84=B0=EB=B7=B0?= =?UTF-8?q?=20=EC=83=81=EC=84=B8=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/interview/QNABox.tsx | 4 +--- src/pages/interview/[detail].tsx | 10 +++++----- src/store/type.tsx | 1 + 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/components/interview/QNABox.tsx b/src/components/interview/QNABox.tsx index 225f434..53be04a 100644 --- a/src/components/interview/QNABox.tsx +++ b/src/components/interview/QNABox.tsx @@ -19,9 +19,7 @@ const QNABox = (props: Props) => {
Q. {e.question}
-
- 개발자로서 진로에 대한 고민을 해결하고자 지원했어요. -
+
{e.boldAnswer}
{e.answer}
diff --git a/src/pages/interview/[detail].tsx b/src/pages/interview/[detail].tsx index 8ce4c01..888a962 100644 --- a/src/pages/interview/[detail].tsx +++ b/src/pages/interview/[detail].tsx @@ -14,14 +14,14 @@ const InterviewPage = ({ interviewInfo }: InterviewInfoProps) => { return (
-
+
인터뷰 메인 이미지
@@ -33,8 +33,8 @@ const InterviewPage = ({ interviewInfo }: InterviewInfoProps) => {
- {interviewInfo.interviewId}번 인터뷰 - {interviewInfo.part}기{" "} - {interviewInfo.part} 파트 + {interviewInfo.interviewId}번 인터뷰 - {interviewInfo.generation} + 기 {interviewInfo.part} 파트
{interviewInfo.name} @@ -42,7 +42,7 @@ const InterviewPage = ({ interviewInfo }: InterviewInfoProps) => { {interviewInfo.major}

-
{interviewInfo.title}
+
{interviewInfo.oneLineAnswer}
diff --git a/src/store/type.tsx b/src/store/type.tsx index e1dc9c8..583aad3 100644 --- a/src/store/type.tsx +++ b/src/store/type.tsx @@ -14,6 +14,7 @@ export type InterviewInfo = { export type InterviewAnswerProp = { interviewAnswerId: number; question: string; + boldAnswer: string; answer: string; }; From 559676c8fe962efbfe7ceed3df2f6bb337475849 Mon Sep 17 00:00:00 2001 From: Ariling <97501226+Ariling@users.noreply.github.com> Date: Sun, 31 Dec 2023 11:13:03 +0900 Subject: [PATCH 07/14] =?UTF-8?q?[Fix]=20=EC=9D=BC=EB=B6=80=20=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/store/type.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/store/type.tsx b/src/store/type.tsx index 583aad3..bdc3965 100644 --- a/src/store/type.tsx +++ b/src/store/type.tsx @@ -1,11 +1,9 @@ export type InterviewInfo = { interviewId: number; - title: string; generation: number; part: string; major: string; name: string; - oneLineContent: string; oneLineAnswer: string; imageUrl: string | null; interviewAnswers: Array; From 4dead653ad968f9f03d3ae518b91fca4dd86b813 Mon Sep 17 00:00:00 2001 From: Ariling <97501226+Ariling@users.noreply.github.com> Date: Mon, 1 Jan 2024 11:47:50 +0900 Subject: [PATCH 08/14] =?UTF-8?q?[Feat]=20=EC=9D=B8=ED=84=B0=EB=B7=B0=20ap?= =?UTF-8?q?i=20=EC=97=B0=EA=B2=B0=20=EB=B0=8F=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + src/components/interview/InterviewCard.tsx | 12 +- .../interview/InterviewCardWrapper.tsx | 129 ++++++++++++------ src/store/type.tsx | 17 ++- src/styles/globals.css | 3 + yarn.lock | 57 ++++++++ 6 files changed, 162 insertions(+), 57 deletions(-) diff --git a/package.json b/package.json index 29ee107..30833b2 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "@emotion/react": "^11.11.1", "@emotion/serialize": "^1.1.2", "@emotion/styled": "^11.11.0", + "axios": "^1.6.3", "framer-motion": "^10.16.4", "next": "13.5.6", "react": "^18", diff --git a/src/components/interview/InterviewCard.tsx b/src/components/interview/InterviewCard.tsx index 3b45eaa..33f1d0c 100644 --- a/src/components/interview/InterviewCard.tsx +++ b/src/components/interview/InterviewCard.tsx @@ -3,22 +3,20 @@ import Image from "next/image"; import React from "react"; import { styled } from "twin.macro"; import design from "@/img/part/design.png"; +import { TotalInterviewInfo } from "@/store/type"; -const InterviewCard = (props: InterviewCardProp) => { +const InterviewCard = (props: TotalInterviewInfo) => { return (
인터뷰 메인 이미지 - - " 멋사 최고~ -
넘 재밌고 유익해용 " -
+ " {props.OneLineContent} "
{props.name}
diff --git a/src/components/interview/InterviewCardWrapper.tsx b/src/components/interview/InterviewCardWrapper.tsx index 0ce3fa2..0899b11 100644 --- a/src/components/interview/InterviewCardWrapper.tsx +++ b/src/components/interview/InterviewCardWrapper.tsx @@ -4,15 +4,32 @@ import Arrowdown from "@/svg/arrowdown.svg"; import { InterviewCardTest, InterviewRouteProp } from "@/store/testData"; import InterviewCard from "./InterviewCard"; import Link from "next/link"; +import { TotalInterviewInfo } from "@/store/type"; +import axios from "axios"; const InterviewCardWrapper = () => { - const options = ["ALL", "PM", "frontend", "backend", "design"]; + const options = [ + { param: "ALL", name: "ALL" }, + { param: "PM", name: "PM" }, + { param: "FE", name: "FE" }, + { param: "BE", name: "BE" }, + { param: "DE", name: "DESIGN" }, + { param: "DEV", name: "DEV" }, + ]; const [option, setOption] = useState("ALL"); + const [serverParam, setServerParam] = useState("ALL"); const [viewmore, setViewmore] = useState(false); - const [getInfo, setGetInfo] = useState>([]); + const [getInfo, setGetInfo] = useState>([]); useEffect(() => { - setGetInfo(InterviewCardTest); - }, [getInfo]); + getInterviewApi(serverParam).then((res) => { + setGetInfo(res.data); + }); + }, [serverParam]); + useEffect(() => { + getInterviewApi(serverParam).then((res) => { + setGetInfo(res.data); + }); + }, []); return (
@@ -20,55 +37,65 @@ const InterviewCardWrapper = () => { return ( <> setOption(e)} + select={option === e.name ? true : false} + onClick={() => { + setOption(e.name); + setServerParam(e.param); + }} > - {e} + {e.name} ); })}
- {getInfo.map((e, i) => { - if (i > 14 && viewmore === false) { - return; - } else if (i > 14 && viewmore === true) { - return ( - - { + if (i > 14 && viewmore === false) { + return; + } else if (i > 14 && viewmore === true) { + return ( + - - ); - } else { - return ( - - + + + ); + } else { + return ( + - - ); - } - })} + href={{ + pathname: "/interview/[detail]", + query: { detail: e.interviewId }, + }} + > + + + ); + } + })}
setViewmore(!viewmore)}> @@ -86,6 +113,20 @@ const InterviewCardWrapper = () => { export default InterviewCardWrapper; +export const getInterviewApi = async (name: string) => { + return await axios + .get(`${process.env.NEXT_PUBLIC_SERVER_URL}/api/interviews?part=${name}`) + .then((response) => { + return response; + }) + .catch((error) => { + if (axios.isAxiosError(error)) { + const result = error.response?.data?.detail; + return result; + } + }); +}; + const InterviewButton = styled.button(({ select }: { select: boolean }) => [ css` width: 140px; diff --git a/src/store/type.tsx b/src/store/type.tsx index bdc3965..2e6becf 100644 --- a/src/store/type.tsx +++ b/src/store/type.tsx @@ -9,6 +9,15 @@ export type InterviewInfo = { interviewAnswers: Array; }; +export type TotalInterviewInfo = { + interviewId: number; + generation: number; + name: string; + part: string; + OneLineContent: string; + imageUrl: string | null; +}; + export type InterviewAnswerProp = { interviewAnswerId: number; question: string; @@ -20,10 +29,6 @@ export interface InterviewInfoProps { interviewInfo: InterviewInfo; } -export interface TotalInterviewProps { - totalInterview: TotalInterviewInfo; +export interface TotalInterviewInfoProps { + totalInterviewInfo: TotalInterviewInfo; } - -export type TotalInterviewInfo = { - totalInterview: Array; -}; diff --git a/src/styles/globals.css b/src/styles/globals.css index 4ec90fb..02b4bd0 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -9,6 +9,9 @@ .flex-base { @apply flex justify-center items-center; } + .flex-base-start { + @apply flex justify-start items-center; + } .flex-base-between { @apply flex justify-between items-center; } diff --git a/yarn.lock b/yarn.lock index 351d5e3..540c871 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1716,6 +1716,11 @@ asynciterator.prototype@^1.0.0: dependencies: has-symbols "^1.0.3" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + autoprefixer@^10: version "10.4.16" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" @@ -1738,6 +1743,15 @@ axe-core@^4.6.2: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.8.2.tgz#2f6f3cde40935825cf4465e3c1c9e77b240ff6ae" integrity sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g== +axios@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.3.tgz#7f50f23b3aa246eff43c54834272346c396613f4" + integrity sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + axobject-query@^3.1.1: version "3.2.1" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" @@ -1923,6 +1937,13 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + commander@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" @@ -2086,6 +2107,11 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, de has-property-descriptors "^1.0.0" object-keys "^1.1.1" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" @@ -2591,6 +2617,11 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== +follow-redirects@^1.15.0: + version "1.15.4" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.4.tgz#cdc7d308bf6493126b17ea2191ea0ccf3e535adf" + integrity sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -2598,6 +2629,15 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + fraction.js@^4.3.6: version "4.3.7" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" @@ -3266,6 +3306,18 @@ micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -3623,6 +3675,11 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + punycode@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" From b0d6fb5ed293dd5912a99f24727d3dcd7d1668b2 Mon Sep 17 00:00:00 2001 From: Ariling <97501226+Ariling@users.noreply.github.com> Date: Mon, 1 Jan 2024 11:53:46 +0900 Subject: [PATCH 09/14] =?UTF-8?q?[Fix]=20Merge=ED=95=98=EB=A9=B4=EC=84=9C?= =?UTF-8?q?=20=EC=83=9D=EA=B8=B4=20=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/interview/InterviewCardWrapper.tsx | 4 ++-- yarn.lock | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/interview/InterviewCardWrapper.tsx b/src/components/interview/InterviewCardWrapper.tsx index 0899b11..40031f1 100644 --- a/src/components/interview/InterviewCardWrapper.tsx +++ b/src/components/interview/InterviewCardWrapper.tsx @@ -32,7 +32,7 @@ const InterviewCardWrapper = () => { }, []); return (
-
+
{options.map((e) => { return ( <> @@ -49,7 +49,7 @@ const InterviewCardWrapper = () => { ); })}
-
+
{Array.isArray(getInfo) && getInfo.map((e, i) => { if (i > 14 && viewmore === false) { diff --git a/yarn.lock b/yarn.lock index 8f9114e..6edba27 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2617,6 +2617,11 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== +follow-redirects@^1.15.0: + version "1.15.4" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.4.tgz#cdc7d308bf6493126b17ea2191ea0ccf3e535adf" + integrity sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" From eb5d3f6d37d939c0063b593fe76f98b3273ead79 Mon Sep 17 00:00:00 2001 From: Ariling <97501226+Ariling@users.noreply.github.com> Date: Mon, 1 Jan 2024 12:16:28 +0900 Subject: [PATCH 10/14] =?UTF-8?q?[Refactor]=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20compo=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interview/CallInterviewCard.tsx | 27 ++++++++++ .../interview/InterviewCardWrapper.tsx | 52 ++++++------------- 2 files changed, 44 insertions(+), 35 deletions(-) create mode 100644 src/components/interview/CallInterviewCard.tsx diff --git a/src/components/interview/CallInterviewCard.tsx b/src/components/interview/CallInterviewCard.tsx new file mode 100644 index 0000000..c8bd8e4 --- /dev/null +++ b/src/components/interview/CallInterviewCard.tsx @@ -0,0 +1,27 @@ +import { TotalInterviewInfo } from "@/store/type"; +import Link from "next/link"; +import React from "react"; +import InterviewCard from "./InterviewCard"; + +const CallInterviewCard = (props: TotalInterviewInfo) => { + return ( + + + + ); +}; + +export default CallInterviewCard; diff --git a/src/components/interview/InterviewCardWrapper.tsx b/src/components/interview/InterviewCardWrapper.tsx index 40031f1..44bf8d3 100644 --- a/src/components/interview/InterviewCardWrapper.tsx +++ b/src/components/interview/InterviewCardWrapper.tsx @@ -1,11 +1,9 @@ import React, { useEffect, useState } from "react"; import { css, styled } from "twin.macro"; import Arrowdown from "@/svg/arrowdown.svg"; -import { InterviewCardTest, InterviewRouteProp } from "@/store/testData"; -import InterviewCard from "./InterviewCard"; -import Link from "next/link"; import { TotalInterviewInfo } from "@/store/type"; import axios from "axios"; +import CallInterviewCard from "./CallInterviewCard"; const InterviewCardWrapper = () => { const options = [ @@ -56,43 +54,27 @@ const InterviewCardWrapper = () => { return; } else if (i > 14 && viewmore === true) { return ( - - - + interviewId={e.interviewId} + generation={e.generation} + OneLineContent={e.OneLineContent} + imageUrl={e.imageUrl} + name={e.name} + part={e.part} + /> ); } else { return ( - - - + interviewId={e.interviewId} + generation={e.generation} + OneLineContent={e.OneLineContent} + imageUrl={e.imageUrl} + name={e.name} + part={e.part} + /> ); } })} From f3b012838cc04d0601924e42b10dae0666fbf0f2 Mon Sep 17 00:00:00 2001 From: Ariling <97501226+Ariling@users.noreply.github.com> Date: Mon, 1 Jan 2024 17:41:56 +0900 Subject: [PATCH 11/14] =?UTF-8?q?[Refactor]=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20FAQ=20=EB=82=B4=EC=9A=A9=20?= =?UTF-8?q?=EC=A0=84=EB=A9=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/FAQ/OptionSelect.tsx | 14 +-- src/components/FAQ/QNAForm.tsx | 8 +- src/store/qnasheet.tsx | 170 ++++++++++++++++++---------- 3 files changed, 122 insertions(+), 70 deletions(-) diff --git a/src/components/FAQ/OptionSelect.tsx b/src/components/FAQ/OptionSelect.tsx index b194714..0154e45 100644 --- a/src/components/FAQ/OptionSelect.tsx +++ b/src/components/FAQ/OptionSelect.tsx @@ -1,4 +1,4 @@ -import { ActivityFAQ, ApplyFAQ, FAQObject, OtherFAQ } from "@/store/qnasheet"; +import { ActivityFAQ, ApplyFAQ, FAQObject } from "@/store/qnasheet"; import React, { useEffect, useState } from "react"; import QNAForm from "./QNAForm"; import tw, { css, styled } from "twin.macro"; @@ -10,10 +10,8 @@ const OptionSelect = () => { useEffect(() => { if (show === "apply") { setData(ApplyFAQ); - } else if (show === "activity") { - setData(ActivityFAQ); } else { - setData(OtherFAQ); + setData(ActivityFAQ); } }, [show]); return ( @@ -37,14 +35,6 @@ const OptionSelect = () => { > 활동 관련 - { - setShow("others"); - }} - > - 그 외의 질문들 -
*추가적인 문의 사항이 있다면
diff --git a/src/components/FAQ/QNAForm.tsx b/src/components/FAQ/QNAForm.tsx index 9b00b1e..d898477 100644 --- a/src/components/FAQ/QNAForm.tsx +++ b/src/components/FAQ/QNAForm.tsx @@ -12,6 +12,13 @@ const QNAForm = (props: FAQObject) => { {open ? ( setOpen(!open)}>

{props.question}

+

{props.answer}
) : ( @@ -44,7 +51,6 @@ const QuestionPart = styled.div` font-size: 16px; font-weight: 400; padding-top: 6px; - border-top: 1px solid black; } } `; diff --git a/src/store/qnasheet.tsx b/src/store/qnasheet.tsx index 46fe6bd..2c77076 100644 --- a/src/store/qnasheet.tsx +++ b/src/store/qnasheet.tsx @@ -1,88 +1,144 @@ +import Link from "next/link"; + export interface FAQObject { question: string; - answer: string; + answer: JSX.Element; } export const ApplyFAQ = [ { - question: "Q. 휴학생도 참여 가능한가요?", - answer: - "네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~", + question: "Q. 재학생만 지원이 가능한가요?", + answer: ( + <> + 1~4학년 재적생이라면 모두 지원 가능합니다. +

+ 중앙대학교 학부 신입생/재학생/휴학생/자대 편입생/졸업유예생 + 가능(졸업생, 타대생 불가) +

+ + ), }, { - question: "Q. 휴학생도 참여 가능한가요?", - answer: - "네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~", + question: "Q. 개인 포트폴리오는 링크로만 제출 가능한가요?", + answer: ( + <> + 네, 링크로만 첨부할 수 있습니다. 파일일 경우, 구글 드라이브에 업로드한 + 후 해당 파일 링크를 첨부하시면 됩니다. + + ), }, { - question: "Q. 휴학생도 참여 가능한가요?", - answer: - "네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~", + question: "Q. 면접 날짜와 시간은 선택 가능한가요?", + answer: ( + <> + 지원서에 면접 가능한 시간을 모두 체크해주시면 운영진이 조율 후 문자로 + 공지해드립니다. + + ), }, { - question: "Q. 휴학생도 참여 가능한가요?", - answer: - "네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~", + question: "Q. 관련 경험이 많이 없어도 괜찮은가요?", + answer: ( + <> + 창업 및 개발에 대한 관심과 열정, 배우고자 하는 의지만 있다면 누구든 + 가능합니다! +
+ 함께 성장하고 나아가기를 희망하는 모든 분을 기다리고 있으니 많은 관심과 + 지원 부탁드립니다 🦁 + + ), }, { - question: "Q. 휴학생도 참여 가능한가요?", - answer: - "네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~", + question: "Q. 구체적으로 무엇을 하는 곳인가요?", + answer: ( + <> + 모든 파트가 참여하는 1년 일정은{" "} + + 랜딩페이지 + + 에서 확인할 수 있으며, 파트별 구체적 일정은{" "} + + 기획 + + ,{" "} + + 디자인 + + ,{" "} + + 프론트엔드 + + ,{" "} + + 백엔드 + + 에서 확인 가능합니다. + + ), }, ]; export const ActivityFAQ = [ { - question: "Q. 휴학생도 활동 가능한가요?", - answer: - "네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~", - }, - { - question: "Q. 휴학생도 참여 가능한가요?", - answer: - "네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~", + question: "Q. OT는 꼭 참여해야 하나요?", + answer: ( + <> + OT는 첫 세션일(수요일 오후 7시)에 대면으로 진행되며, 아기사자와 운영진이 + 처음 만나는 자리이기 때문에 반드시 참석하시는 것을 권장합니다. + + ), }, { - question: "Q. 휴학생도 참여 가능한가요?", - answer: - "네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~", - }, - { - question: "Q. 휴학생도 참여 가능한가요?", - answer: - "네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~", - }, - { - question: "Q. 휴학생도 참여 가능한가요?", - answer: - "네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~", - }, -]; - -export const OtherFAQ = [ - { - question: "Q. 이게 잘 될까요?", - answer: - "네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~", + question: "Q. 세션은 언제, 어떻게 진행되나요?", + answer: ( + <> + 세션은 매주 수요일 오후 7시-10시에 중앙대학교 서울캠 강의실에서 대면으로 + 진행됩니다. + + ), }, { - question: "Q. 휴학생도 참여 가능한가요?", - answer: - "네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~", + question: "Q. 관련 교육이 따로 진행되나요?", + answer: ( + <> + 파트별로 커리큘럼에 따라 세션을 진행합니다. 자세한 내용은 파트별 + 페이지에서 확인하실 수 있습니다. + + ), }, { - question: "Q. 휴학생도 참여 가능한가요?", - answer: - "네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~", + question: "Q. 회비나 준비물이 있나요?", + answer: ( + <> + 연 3만원의 회비가 있으며 동아리 내 회비 사용 계획과 내역을 공지하고 + 있습니다. +
+ 또한 + + {" "} + IT 개발 및 창업 동아리이기에 노트북이 반드시 필요합니다. + + + ), }, { - question: "Q. 휴학생도 참여 가능한가요?", - answer: - "네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~", + question: "Q. 인턴과 병행할 수 있나요?", + answer: ( + <> + 인턴과 병행할 수 있으나 세션을 비롯한 아이디어톤, 해커톤 등의 공식 일정 + 참여에 지장이 없어야 합니다. + + ), }, { - question: "Q. 휴학생도 참여 가능한가요?", - answer: - "네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~네 ! 휴학생 어쩌구 저쩌구 모두 가능 들어와 들어와 ~", + question: "Q. 활동 기간이 어떻게 되나요?", + answer: ( + <> + 활동 기간은 3월~12월입니다. 2학기 연속 활동하셔야 수료하실 수 있습니다. +
+ 또한 아기사자로 1년 활동 및 수료 후 다음 기수 운영진으로 활동 + 가능합니다. + + ), }, ]; From a5517fa8768b13621a0bd9e4fe1286491aab5c22 Mon Sep 17 00:00:00 2001 From: Ariling <97501226+Ariling@users.noreply.github.com> Date: Mon, 1 Jan 2024 17:55:56 +0900 Subject: [PATCH 12/14] =?UTF-8?q?[Design]=20=EB=B0=B0=EC=9C=A8=20=EC=A0=9C?= =?UTF-8?q?=EC=99=B8=ED=95=9C=20FAQ=20=ED=95=B4=EB=8B=B9=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EB=94=94=EC=9E=90=EC=9D=B8=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/FAQ/QNAForm.tsx | 2 -- src/store/qnasheet.tsx | 42 +++++++++++++++++++++++++--------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/components/FAQ/QNAForm.tsx b/src/components/FAQ/QNAForm.tsx index d898477..4a52e73 100644 --- a/src/components/FAQ/QNAForm.tsx +++ b/src/components/FAQ/QNAForm.tsx @@ -39,13 +39,11 @@ const QuestionPart = styled.div` border-radius: 20px; background-color: #f8fafc; width: 720px; - height: 58px; display: flex; align-items: center; &.withanswer { padding: 20px 29px; flex-direction: column; - height: 126px; align-items: flex-start; > div { font-size: 16px; diff --git a/src/store/qnasheet.tsx b/src/store/qnasheet.tsx index 2c77076..240116b 100644 --- a/src/store/qnasheet.tsx +++ b/src/store/qnasheet.tsx @@ -12,8 +12,8 @@ export const ApplyFAQ = [ <> 1~4학년 재적생이라면 모두 지원 가능합니다.

- 중앙대학교 학부 신입생/재학생/휴학생/자대 편입생/졸업유예생 - 가능(졸업생, 타대생 불가) + 중앙대학교 학부 신입생/재학생/휴학생/자대 편입생/졸업유예생 가능 + (졸업생, 타대생 불가)

), @@ -22,8 +22,9 @@ export const ApplyFAQ = [ question: "Q. 개인 포트폴리오는 링크로만 제출 가능한가요?", answer: ( <> - 네, 링크로만 첨부할 수 있습니다. 파일일 경우, 구글 드라이브에 업로드한 - 후 해당 파일 링크를 첨부하시면 됩니다. + 네, 링크로만 첨부할 수 있습니다. + 파일일 경우, 구글 드라이브에 업로드한 후 해당 파일 링크를 첨부하시면 + 됩니다. ), }, @@ -92,8 +93,11 @@ export const ActivityFAQ = [ question: "Q. 세션은 언제, 어떻게 진행되나요?", answer: ( <> - 세션은 매주 수요일 오후 7시-10시에 중앙대학교 서울캠 강의실에서 대면으로 - 진행됩니다. + 세션은{" "} + + 매주 수요일 오후 7시-10시에 중앙대학교 서울캠 강의실에서 대면 + + 으로 진행됩니다. ), }, @@ -101,8 +105,23 @@ export const ActivityFAQ = [ question: "Q. 관련 교육이 따로 진행되나요?", answer: ( <> - 파트별로 커리큘럼에 따라 세션을 진행합니다. 자세한 내용은 파트별 - 페이지에서 확인하실 수 있습니다. + 파트별로 커리큘럼에 따라 세션을 진행합니다. 자세한 내용은{" "} + + 기획 + + ,{" "} + + 디자인 + + ,{" "} + + 프론트엔드 + + ,{" "} + + 백엔드 + + 에서 확인하실 수 있습니다. ), }, @@ -110,8 +129,8 @@ export const ActivityFAQ = [ question: "Q. 회비나 준비물이 있나요?", answer: ( <> - 연 3만원의 회비가 있으며 동아리 내 회비 사용 계획과 내역을 공지하고 - 있습니다. + 연 3만원의 회비가 있으며 동아리 내 + 회비 사용 계획과 내역을 공지하고 있습니다.
또한 @@ -134,7 +153,8 @@ export const ActivityFAQ = [ question: "Q. 활동 기간이 어떻게 되나요?", answer: ( <> - 활동 기간은 3월~12월입니다. 2학기 연속 활동하셔야 수료하실 수 있습니다. + 활동 기간은 3월~12월입니다. 2학기 + 연속 활동하셔야 수료하실 수 있습니다.
또한 아기사자로 1년 활동 및 수료 후 다음 기수 운영진으로 활동 가능합니다. From 269a180a2c0b44bc07dd3b230feb85cd01a7202e Mon Sep 17 00:00:00 2001 From: Ariling <97501226+Ariling@users.noreply.github.com> Date: Mon, 1 Jan 2024 21:25:04 +0900 Subject: [PATCH 13/14] =?UTF-8?q?[Fix]=20=ED=9A=8C=EC=9D=98=EB=A1=9C=20?= =?UTF-8?q?=EB=B0=98=EC=98=81=EB=90=9C=20=EB=B6=80=EB=B6=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/apply/SecondPage.tsx | 9 ++++++--- src/pages/interview/[detail].tsx | 1 - src/store/type.tsx | 1 - 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/components/apply/SecondPage.tsx b/src/components/apply/SecondPage.tsx index 29d9acf..546fab9 100644 --- a/src/components/apply/SecondPage.tsx +++ b/src/components/apply/SecondPage.tsx @@ -8,9 +8,12 @@ const SecondPage = () => { const applyPart = useRecoilValue(ApplyPartAtom); const [question, setQuestion] = useState([]); useEffect(() => { - applyPart === "기획" - ? setQuestion(ApplyQuestionPM) - : setQuestion(ApplyQuestionDevelop); + switch (applyPart) { + case "기획": + setQuestion(ApplyQuestionPM); + default: + setQuestion(ApplyQuestionDevelop); + } }, []); return (
diff --git a/src/pages/interview/[detail].tsx b/src/pages/interview/[detail].tsx index 888a962..d06691c 100644 --- a/src/pages/interview/[detail].tsx +++ b/src/pages/interview/[detail].tsx @@ -42,7 +42,6 @@ const InterviewPage = ({ interviewInfo }: InterviewInfoProps) => { {interviewInfo.major}

-
{interviewInfo.oneLineAnswer}
diff --git a/src/store/type.tsx b/src/store/type.tsx index 3c1c0d3..c94a3a6 100644 --- a/src/store/type.tsx +++ b/src/store/type.tsx @@ -18,7 +18,6 @@ export type InterviewInfo = { part: string; major: string; name: string; - oneLineAnswer: string; imageUrl: string | null; interviewAnswers: Array; }; From 182d14a6431029f657673b2ae97f3501c7e372d4 Mon Sep 17 00:00:00 2001 From: Ariling <97501226+Ariling@users.noreply.github.com> Date: Thu, 4 Jan 2024 23:37:44 +0900 Subject: [PATCH 14/14] =?UTF-8?q?[Chore]=20=EC=95=88=20=EC=93=B0=EC=9D=B4?= =?UTF-8?q?=EB=8A=94=20=EB=B6=80=EB=B6=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apis/interview/api.ts | 15 +++ src/components/interview/InterviewCard.tsx | 1 - .../interview/InterviewCardWrapper.tsx | 16 +-- src/components/interview/QNABox.tsx | 1 - src/pages/_app.tsx | 1 - src/pages/auth/index.tsx | 1 - src/store/testData.tsx | 120 ------------------ 7 files changed, 16 insertions(+), 139 deletions(-) create mode 100644 src/apis/interview/api.ts delete mode 100644 src/store/testData.tsx diff --git a/src/apis/interview/api.ts b/src/apis/interview/api.ts new file mode 100644 index 0000000..4ee9167 --- /dev/null +++ b/src/apis/interview/api.ts @@ -0,0 +1,15 @@ +import axios from "axios"; + +export const getInterviewApi = async (name: string) => { + return await axios + .get(`${process.env.NEXT_PUBLIC_SERVER_URL}/api/interviews?part=${name}`) + .then((response) => { + return response; + }) + .catch((error) => { + if (axios.isAxiosError(error)) { + const result = error.response?.data?.detail; + return result; + } + }); +}; diff --git a/src/components/interview/InterviewCard.tsx b/src/components/interview/InterviewCard.tsx index 33f1d0c..a41b964 100644 --- a/src/components/interview/InterviewCard.tsx +++ b/src/components/interview/InterviewCard.tsx @@ -1,4 +1,3 @@ -import { InterviewCardProp } from "@/store/testData"; import Image from "next/image"; import React from "react"; import { styled } from "twin.macro"; diff --git a/src/components/interview/InterviewCardWrapper.tsx b/src/components/interview/InterviewCardWrapper.tsx index 44bf8d3..af33fa4 100644 --- a/src/components/interview/InterviewCardWrapper.tsx +++ b/src/components/interview/InterviewCardWrapper.tsx @@ -2,8 +2,8 @@ import React, { useEffect, useState } from "react"; import { css, styled } from "twin.macro"; import Arrowdown from "@/svg/arrowdown.svg"; import { TotalInterviewInfo } from "@/store/type"; -import axios from "axios"; import CallInterviewCard from "./CallInterviewCard"; +import { getInterviewApi } from "@/apis/interview/api"; const InterviewCardWrapper = () => { const options = [ @@ -95,20 +95,6 @@ const InterviewCardWrapper = () => { export default InterviewCardWrapper; -export const getInterviewApi = async (name: string) => { - return await axios - .get(`${process.env.NEXT_PUBLIC_SERVER_URL}/api/interviews?part=${name}`) - .then((response) => { - return response; - }) - .catch((error) => { - if (axios.isAxiosError(error)) { - const result = error.response?.data?.detail; - return result; - } - }); -}; - const InterviewButton = styled.button(({ select }: { select: boolean }) => [ css` width: 140px; diff --git a/src/components/interview/QNABox.tsx b/src/components/interview/QNABox.tsx index 53be04a..6e23b2b 100644 --- a/src/components/interview/QNABox.tsx +++ b/src/components/interview/QNABox.tsx @@ -9,7 +9,6 @@ type Props = { }; const QNABox = (props: Props) => { - //이부분은 나중에 바뀔 것..! 서버에서 받은걸로 하나하나 돌릴것이기 때문! return ( <> {props.interviewAnswers.map((e, i) => ( diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 33a3d04..b64184d 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,5 +1,4 @@ import Footer from "@/components/utils/Footer"; -import Nav from "@/components/utils/Nav"; import "@/styles/globals.css"; import type { AppProps } from "next/app"; import dynamic from "next/dynamic"; diff --git a/src/pages/auth/index.tsx b/src/pages/auth/index.tsx index a851e31..3799c62 100644 --- a/src/pages/auth/index.tsx +++ b/src/pages/auth/index.tsx @@ -1,5 +1,4 @@ import { userInfoState } from "@/store/atoms"; -import { useSearchParams } from "next/navigation"; import { useRouter } from "next/router"; import React, { useEffect } from "react"; import { useSetRecoilState } from "recoil"; diff --git a/src/store/testData.tsx b/src/store/testData.tsx deleted file mode 100644 index e94c363..0000000 --- a/src/store/testData.tsx +++ /dev/null @@ -1,120 +0,0 @@ -export interface InterviewCardProp { - name: string; - part: string; - img: string; -} - -export interface InterviewRouteProp extends InterviewCardProp { - index: number; -} - -export const InterviewCardTest = [ - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 1, - }, - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 2, - }, - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 3, - }, - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 4, - }, - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 5, - }, - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 6, - }, - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 7, - }, - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 8, - }, - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 9, - }, - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 10, - }, - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 11, - }, - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 20, - }, - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 21, - }, - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 22, - }, - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 23, - }, - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 24, - }, - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 25, - }, - { - name: "11기 노지우", - part: "디자인", - img: "https://cms-cdn.placeholder.co/Vancouver_87c09f1b29.png?width=750", - index: 26, - }, -];