From 2c74d43b3e8ce2b6509682d57133bacbf8775957 Mon Sep 17 00:00:00 2001 From: klmhyeonwooo Date: Fri, 24 Mar 2023 16:07:35 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A6=AC=EB=8D=95=EC=8A=A4=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EC=B1=84=EB=84=90?= =?UTF-8?q?=ED=86=A1=20=EB=A1=9C=EA=B3=A0,=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EA=B2=BD=ED=97=98=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=A0=91?= =?UTF-8?q?=EA=B7=BC=EC=84=B1=20=EC=84=A4=EA=B3=84=20(#42)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 14 + package.json | 1 + src/component/404/NotTime.tsx | 66 +- src/component/404/NotWidth.tsx | 72 +- src/component/admin/emotion/component.tsx | 1168 ++++++++++++--------- src/component/position/Backend.tsx | 599 ++++++----- src/component/position/Design.tsx | 694 +++++++----- src/component/position/Frontend.tsx | 747 +++++++------ src/hooks/KeyboardIOS.ts | 24 +- src/images/notTime.png | Bin 0 -> 26209 bytes tsconfig.json | 2 +- 11 files changed, 1939 insertions(+), 1448 deletions(-) create mode 100644 src/images/notTime.png diff --git a/package-lock.json b/package-lock.json index 5adeeef..ed71cce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "react": "^18.2.0", "react-canvas-confetti": "^1.3.0", "react-dom": "^18.2.0", + "react-intersection-observer": "^9.4.3", "react-redux": "^8.0.5", "react-router-dom": "^6.6.2", "react-scripts": "5.0.1", @@ -14604,6 +14605,14 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, + "node_modules/react-intersection-observer": { + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.4.3.tgz", + "integrity": "sha512-WNRqMQvKpupr6MzecAQI0Pj0+JQong307knLP4g/nBex7kYfIaZsPpXaIhKHR+oV8z+goUbH9e10j6lGRnTzlQ==", + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -27846,6 +27855,11 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, + "react-intersection-observer": { + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.4.3.tgz", + "integrity": "sha512-WNRqMQvKpupr6MzecAQI0Pj0+JQong307knLP4g/nBex7kYfIaZsPpXaIhKHR+oV8z+goUbH9e10j6lGRnTzlQ==" + }, "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", diff --git a/package.json b/package.json index b92556f..c6ed776 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "react": "^18.2.0", "react-canvas-confetti": "^1.3.0", "react-dom": "^18.2.0", + "react-intersection-observer": "^9.4.3", "react-redux": "^8.0.5", "react-router-dom": "^6.6.2", "react-scripts": "5.0.1", diff --git a/src/component/404/NotTime.tsx b/src/component/404/NotTime.tsx index ee084db..c21db67 100644 --- a/src/component/404/NotTime.tsx +++ b/src/component/404/NotTime.tsx @@ -1,36 +1,46 @@ /** @jsxImportSource @emotion/react */ import { css, keyframes } from "@emotion/react"; -import React from 'react' -import { Button, Modal, Section } from '../emotion/component' -import oops from '../../images/oops.png'; +import React from "react"; +import { Button, Modal, Section } from "../emotion/component"; +import notTime from "../../images/notTime.png"; import { Link } from "react-router-dom"; import { fadeUp } from "../../styles/Keyframes"; export default function NotTime() { - return ( -
- 404 - 현재는 예비 사자 모집 기간이 아니에요! -
- ) + display: flex; + flex-direction: column; + align-items: center; + `} + > + 404 + {/* + 현재는 예비 사자 모집 기간이 아니에요! + */} + + ); } diff --git a/src/component/404/NotWidth.tsx b/src/component/404/NotWidth.tsx index d5fae52..e6941c9 100644 --- a/src/component/404/NotWidth.tsx +++ b/src/component/404/NotWidth.tsx @@ -1,40 +1,50 @@ /** @jsxImportSource @emotion/react */ import { css, keyframes } from "@emotion/react"; -import React from 'react' -import { Button, Modal, Section } from '../emotion/component' -import oops from '../../images/oops.png'; +import React from "react"; +import { Button, Modal, Section } from "../emotion/component"; +import oops from "../../images/oops.png"; import { Link } from "react-router-dom"; import { fadeUp } from "../../styles/Keyframes"; export default function NotWidth() { - return ( -
- 404 - 원활한 지원환경을 위해
PC 또는 태블릿으로 접속해주세요!
-
- ) + @media (max-width: 1024px) { + display: flex; + } + `} + > + 404 + + 원활한 지원환경을 위해
PC 또는 태블릿으로 접속해주세요! +
+ + ); } diff --git a/src/component/admin/emotion/component.tsx b/src/component/admin/emotion/component.tsx index 649c07c..13a4583 100644 --- a/src/component/admin/emotion/component.tsx +++ b/src/component/admin/emotion/component.tsx @@ -1,67 +1,71 @@ /** @jsxImportSource @emotion/react */ -import React, { useCallback, useEffect, useMemo, useState } from 'react' -import { WrapperProps } from '../../../App' +import React, { useCallback, useEffect, useMemo, useState } from "react"; +import { WrapperProps } from "../../../App"; import { css, keyframes } from "@emotion/react"; -import { AgreeType, ButtonType, InputType } from '../../emotion/component'; -import { PositionType } from '../../emotion/component'; -import { Link, useLocation } from 'react-router-dom'; -import oops from '../../../images/oops.png'; -import { fadeUp } from '../../../styles/Keyframes'; -import { MailType, mailUserType } from '../partition/Type'; -import checkBox from '../../../images/checkBox.svg'; -import checkedBox from '../../../images/checkedBox.svg'; -import { useDispatch, useSelector } from 'react-redux'; -import { AppDispatch, TestState } from '../../../app/store'; -import { updatePassMailList } from '../../../features/fetcherSlice'; +import { AgreeType, ButtonType, InputType } from "../../emotion/component"; +import { PositionType } from "../../emotion/component"; +import { Link, useLocation } from "react-router-dom"; +import oops from "../../../images/oops.png"; +import { fadeUp } from "../../../styles/Keyframes"; +import { MailType, mailUserType } from "../partition/Type"; +import checkBox from "../../../images/checkBox.svg"; +import checkedBox from "../../../images/checkedBox.svg"; +import { useDispatch, useSelector } from "react-redux"; +import { AppDispatch, TestState } from "../../../app/store"; +import { updatePassMailList } from "../../../features/fetcherSlice"; export const Section = ({ children }: WrapperProps) => { - return ( -
- {children} -
- ) -} + return ( +
+ {children} +
+ ); +}; export const LoginBox = ({ children }: WrapperProps) => { - return ( -
- {children} -
- ) -} + return ( +
+ {children} +
+ ); +}; export const PassUserContent = ({ children }: WrapperProps) => { - return ( -
{ border-radius: 3.07em; border-width: 0.076em; - border-color: #4F85E8; - color: #4F85E8; - `}> - {children} -
- - ) -} + border-color: #4f85e8; + color: #4f85e8; + `} + > + {children} + + ); +}; export const PassUser = ({ children }: WrapperProps) => { - return ( -
- {children} -
- ) -} + return ( +
{ - return ( -
- {children} -
- ) -} + flex-wrap: wrap; + white-space: normal; + font-size: 15px; + white-space: pre-line; + column-gap: 1em; + row-gap: 1em; + margin-bottom: 1.7em; + `} + > + {children} +
+ ); +}; +export const Content = ({ children }: WrapperProps) => { + return ( +
+ {children} +
+ ); +}; export const FailMailSend = (props: MailType) => { - return ( -
{props.position} 포지션의 불합격 메일 전체 전송을 하고싶으신가요?
- ) -} + &:hover { + opacity: 80%; + } + `} + {...props} + > + {" "} + + {props.position} + {" "} + 포지션의 불합격 메일 전체 전송을 하고싶으신가요?{" "} + + ); +}; export const PassMailSend = (props: MailType) => { + const passMailList = useSelector( + (state: TestState) => state.fetcher.passMailList + ); + + return ( +
state.fetcher.passMailList); - - return ( -
{props.position} 포지션의 합격 메일 전송을 하고싶으신가요?
- ) -} + &:hover { + opacity: 80%; + } + `} + {...props} + > + {" "} + + {props.position} + {" "} + 포지션의 합격 메일 전송을 하고싶으신가요? +
+ ); +}; export const Button = (props: ButtonType) => { - return ( - - ) -} + &:hover { + opacity: 80%; + } + `} + {...props} + > + {props.children} + + ); +}; export interface HeaderType { - path?: string; - children?: React.ReactNode; - url?: string; + path?: string; + children?: React.ReactNode; + url?: string; } export const HeaderText = (props: HeaderType) => { - return ( -
{props.children}
- ) -} + text-decoration: none; + color: #6b7684; + cursor: pointer; + + ${props.path === props.url && + css` + border: none; + font-family: "Pretendard-Bold"; + border: color; + color: #4f85e8; + // border-bottom: 0.16em solid #4F85E8; + // margin-bottom: -0.16em; + `} + `} + tabIndex={-1} + > + {props.children} + + ); +}; interface ImgType { - src?: string; + src?: string; } export const Img = (props: ImgType) => { - return ( - 어드민 이미지 - ) -} + return ( + 어드민 이미지 + ); +}; export const HeaderDescription = ({ children }: WrapperProps) => { - return ( - - {children} - - ) -} + return ( + + {children} + + ); +}; export const Position = (props: PositionType) => { - return ( - - ) -} + `} + {...props} + tabIndex={-1} + > + {props.children} + + ); +}; export const NotData = () => { - return ( - <> - Oops! - - 데이터가 존재하지 않아요! - - - ) -} + return ( + <> + Oops! + + 데이터가 존재하지 않아요! + + + ); +}; export const PositionBox = (props: WrapperProps) => { - return ( -
- {props.children} -
- ) -} + return ( +
+ {props.children} +
+ ); +}; export const Input = (props: InputType) => { - return ( - - ) -} + &:focus { + outline-color: #4f85e8; + + &:hover { + box-shadow: none; + } + // box-shadow: inset 0 0 0 2px #4F85E8; + } + + &:hover { + box-shadow: inset 0 0 0 2px #90c2ff; + } + + &::placeholder { + font-family: "Pretendard-Regular"; + margin-left: 0.4em; + } + `} + {...props} + /> + ); +}; export interface ChangeCheckStateType { - (userName: string, userEmail: string, userId: string): void; + (userName: string, userEmail: string, userId: string): void; } export interface ListType { - name?: string; - id?: string; - department?: string; - email?: string; - position?: string; - check?: string; - onClick?: (event: React.MouseEvent) => void; - children?: React.ReactNode; - mailState?: boolean; + name?: string; + id?: string; + department?: string; + email?: string; + position?: string; + check?: string; + onClick?: (event: React.MouseEvent) => void; + children?: React.ReactNode; + mailState?: boolean; } export interface onModalType { - (userID: string): void; + (userID: string): void; } // 사용자 리스트를 나타내주는 컴포넌트 export const List = React.memo(function List(props: ListType) { + const [checkState, setCheckState] = useState(false); + const [checkList, setCheckList] = useState([]); + const [userEmail, setEmail] = useState(""); + const [userName, setName] = useState(""); + const [userId, setId] = useState(""); + + const dispatch = useDispatch(); + const passMailList = useSelector( + (state: TestState) => state.fetcher.passMailList + ); + const newList = useSelector((state: TestState) => state.fetcher.newList); + + const ChangeCheckState: ChangeCheckStateType = useCallback( + (userEmail: string, userName: string, userId: string) => { + setCheckState(!checkState); + setEmail(userEmail); + setName(userName); + setId(userId); + // await setCheckList(user) + // 전역 상태로 업데이트 할 것! + }, + [checkState] + ); + + useEffect(() => { + setCheckState(false); + }, [newList]); + + useEffect(() => { + if (checkState) { + dispatch( + updatePassMailList([ + ...passMailList, + { + id: userId as string, + name: userName as string, + email: userEmail as string, + }, + ]) + ); + } else if (!checkState) { + dispatch( + updatePassMailList( + passMailList.filter((items: mailUserType) => { + return items.id !== userId; + }) + ) + ); + } + }, [checkState]); + + return ( +
(false); - const [checkList, setCheckList] = useState([]); - const [userEmail, setEmail] = useState(''); - const [userName, setName] = useState(''); - const [userId, setId] = useState(''); - - const dispatch = useDispatch(); - const passMailList = useSelector((state: TestState) => state.fetcher.passMailList); - const newList = useSelector((state: TestState) => (state.fetcher.newList)); - - const ChangeCheckState: ChangeCheckStateType = useCallback((userEmail: string, userName: string, userId: string) => { - setCheckState(!checkState); - setEmail(userEmail); - setName(userName); - setId(userId); - // await setCheckList(user) - // 전역 상태로 업데이트 할 것! - }, [checkState]); - - useEffect(() => { - setCheckState(false); - }, [newList]) - - useEffect(() => { - if (checkState) { - dispatch(updatePassMailList([...passMailList, { id: userId as string, name: userName as string, email: userEmail as string }])) - } else if (!checkState) { - dispatch(updatePassMailList(passMailList.filter((items: mailUserType) => { return items.id !== userId }))) - } - }, [checkState]) - - return ( -
+ {props.name} + {props.position} + {props.department} + + {props.id !== "학번" && props.mailState ? ( + - {props.name} - {props.position} - {props.department} - - {props.id !== "학번" && props.mailState ? {props.id} : props.id} - - {/* {props.email} */} - {props.check === "체크 없음" && null} - {props.check === "전송 체크" ? {props.check} : !props.check && ChangeCheckState(props.email as string, props.name as string, props.id as string)}> } -
- ) + > + {" "} + {props.id}{" "} + + ) : ( + props.id + )} + + {/* {props.email} */} + {props.check === "체크 없음" && null} + {props.check === "전송 체크" ? ( + {props.check} + ) : ( + !props.check && ( + + ChangeCheckState( + props.email as string, + props.name as string, + props.id as string + ) + } + > + {" "} + {" "} + + ) + )} +
+ ); }); export const ListText = (props: ListType) => { - return ( -
- {props.children} -
- ) -} + return ( +
+ {props.children} +
+ ); +}; diff --git a/src/component/position/Backend.tsx b/src/component/position/Backend.tsx index 59b883b..ab5f9f6 100644 --- a/src/component/position/Backend.tsx +++ b/src/component/position/Backend.tsx @@ -1,115 +1,202 @@ -import React, { ChangeEvent } from 'react' -import { ButtonBox, Section, Button, Require, Article, InputTitle, TextAreaBox, InputBox, Banner, WordLength, Modal, Footer } from '../emotion/component' -import { useNavigate } from 'react-router-dom' -import { useState } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; -import { AppDispatch, TestState } from '../../app/store'; -import { saveCommon, saveIndex, view, saveBackEnd } from '../../features/fetcherSlice'; -import { useEffect, useMemo } from 'react'; -import axios from 'axios'; -import tempImg from '../../images/temp.png'; -import completeImg from '../../images/complete.png'; -import Confetti from '../../hooks/Confetti'; -import { currentTime, endTime } from '../time/time'; +import React, { ChangeEvent } from "react"; +import { + ButtonBox, + Section, + Button, + Require, + Article, + InputTitle, + TextAreaBox, + InputBox, + Banner, + WordLength, + Modal, + Footer, +} from "../emotion/component"; +import { useNavigate } from "react-router-dom"; +import { useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { AppDispatch, TestState } from "../../app/store"; +import { + saveCommon, + saveIndex, + view, + saveBackEnd, +} from "../../features/fetcherSlice"; +import { useEffect, useMemo } from "react"; +import axios from "axios"; +import tempImg from "../../images/temp.png"; +import completeImg from "../../images/complete.png"; +import Confetti from "../../hooks/Confetti"; +import { currentTime, endTime } from "../time/time"; export default function Backend() { + const navigate = useNavigate(); + const dispatch = useDispatch(); + const [difficultAndOvercoming, setDifficultAndOvercoming] = useState(""); + const [studyFramework, setStudyFramework] = useState(""); + const [importantGroup, setImportantGroup] = useState(""); + const [portfolioLink, setPortfolioLink] = useState(""); + const [buttonState, setButtonState] = useState(false); + const [backButtonState, setBackButtonState] = useState(false); + const [submitCount, setSubmitCount] = useState(0); + const [tempState, setTempState] = useState(false); + const [temp, setTemp] = useState(false); + const [complete, setComplete] = useState(false); - const navigate = useNavigate(); - const dispatch = useDispatch(); - const [difficultAndOvercoming, setDifficultAndOvercoming] = useState(''); - const [studyFramework, setStudyFramework] = useState(''); - const [importantGroup, setImportantGroup] = useState(''); - const [portfolioLink, setPortfolioLink] = useState(''); - const [buttonState, setButtonState] = useState(false); - const [backButtonState, setBackButtonState] = useState(false); - const [submitCount, setSubmitCount] = useState(0); - const [tempState, setTempState] = useState(false); - const [temp, setTemp] = useState(false); - const [complete, setComplete] = useState(false); + const userName = useSelector((state: TestState) => state.fetcher.userName); + const userID = useSelector((state: TestState) => state.fetcher.userID); + const userPhone = useSelector((state: TestState) => state.fetcher.userPhone); + const userEmail = useSelector((state: TestState) => state.fetcher.userEmail); + const userPosition = useSelector( + (state: TestState) => state.fetcher.userPosition + ); + const userDepartment = useSelector( + (state: TestState) => state.fetcher.userDepartment + ); - const userName = useSelector((state: TestState) => state.fetcher.userName); - const userID = useSelector((state: TestState) => state.fetcher.userID); - const userPhone = useSelector((state: TestState) => state.fetcher.userPhone); - const userEmail = useSelector((state: TestState) => state.fetcher.userEmail); - const userPosition = useSelector((state: TestState) => state.fetcher.userPosition); - const userDepartment = useSelector((state: TestState) => state.fetcher.userDepartment); + const userMotiv = useSelector((state: TestState) => state.fetcher.userMotiv); + const userHardWork = useSelector( + (state: TestState) => state.fetcher.userHardWork + ); + const userKeyWord = useSelector( + (state: TestState) => state.fetcher.userKeyWord + ); + const userMostDeeplyWork = useSelector( + (state: TestState) => state.fetcher.userMostDeeplyWork + ); - const userMotiv = useSelector((state: TestState) => state.fetcher.userMotiv); - const userHardWork = useSelector((state: TestState) => state.fetcher.userHardWork); - const userKeyWord = useSelector((state: TestState) => state.fetcher.userKeyWord); - const userMostDeeplyWork = useSelector((state: TestState) => state.fetcher.userMostDeeplyWork); + const userDifficultAndOvercoming = useSelector( + (state: TestState) => state.fetcher.userDifficultAndOvercoming + ); + const userStudyFramework = useSelector( + (state: TestState) => state.fetcher.userStudyFramework + ); + const userImportantGroup = useSelector( + (state: TestState) => state.fetcher.userImportantGroup + ); + const userPortfolioLink = useSelector( + (state: TestState) => state.fetcher.userPortfolioLinkBack + ); - const userDifficultAndOvercoming = useSelector((state: TestState) => state.fetcher.userDifficultAndOvercoming); - const userStudyFramework = useSelector((state: TestState) => state.fetcher.userStudyFramework); - const userImportantGroup = useSelector((state: TestState) => state.fetcher.userImportantGroup); - const userPortfolioLink = useSelector((state: TestState) => state.fetcher.userPortfolioLinkBack); + const [name, setName] = useState(""); - const [name, setName] = useState(''); + useEffect(() => { + document.body.style.overflow = "unset"; - useEffect(() => { - document.body.style.overflow = "unset"; + if (!userName && !userID && !userPhone && !userEmail && !userPosition) { + navigate("/404"); + } - if (!userName && !userID && !userPhone && !userEmail && !userPosition) { - navigate('/404') - } + if (currentTime > endTime) { + alert("제출 기간이 마감되었습니다!"); + navigate("/notTime"); + } - if (currentTime > endTime) { - alert("제출 기간이 마감되었습니다!"); - navigate('/notTime'); - } + // 이전 값들을 저장하기 위해서 Redux 사용 + if (userDifficultAndOvercoming) { + setDifficultAndOvercoming(userDifficultAndOvercoming); + } - // 이전 값들을 저장하기 위해서 Redux 사용 - if (userDifficultAndOvercoming) { - setDifficultAndOvercoming(userDifficultAndOvercoming); - } + if (userStudyFramework) { + setStudyFramework(userStudyFramework); + } - if (userStudyFramework) { - setStudyFramework(userStudyFramework); - } + if (userImportantGroup) { + setImportantGroup(userImportantGroup); + } - if (userImportantGroup) { - setImportantGroup(userImportantGroup); - } + if (userPortfolioLink) { + setPortfolioLink(userPortfolioLink); + } - if (userPortfolioLink) { - setPortfolioLink(userPortfolioLink) - } + if (userName) { + setName(userName); + } + }, []); - if (userName) { - setName(userName) - } - }, []) + useMemo(() => { + // 백엔드 파트로 들어왔을 때는 공통 질문이 하나라도 작성된 상태이기 때문에 바로 임시저장이 가능함 + if (userMotiv || userHardWork || userKeyWord || userMostDeeplyWork) { + setTempState(false); + } else { + setTempState(true); + } - useMemo(() => { + if (difficultAndOvercoming && studyFramework && importantGroup) { + setButtonState(false); + } else { + setButtonState(true); + } + if (submitCount >= 1) { + setButtonState(true); + setBackButtonState(true); + } + }, [difficultAndOvercoming, studyFramework, importantGroup, submitCount]); - // 백엔드 파트로 들어왔을 때는 공통 질문이 하나라도 작성된 상태이기 때문에 바로 임시저장이 가능함 - if (userMotiv || userHardWork || userKeyWord || userMostDeeplyWork) { - setTempState(false); - } else { - setTempState(true); - } + const Back = () => { + setSubmitCount((prev) => prev + 1); + dispatch( + saveBackEnd({ + userDifficultAndOvercoming: difficultAndOvercoming, + userStudyFramework: studyFramework, + userImportantGroup: importantGroup, + userPortfolioLinkBack: portfolioLink, + }) + ); + navigate("/common"); + }; - if (difficultAndOvercoming && studyFramework && importantGroup) { - setButtonState(false) - } else { - setButtonState(true) - } - if (submitCount >= 1) { - setButtonState(true); - setBackButtonState(true); + const TempSave = () => { + setSubmitCount((prev) => prev + 1); + axios + .post( + "/backendApplication", + JSON.stringify({ + department: userDepartment, + difficultAndOvercoming: difficultAndOvercoming, + email: userEmail, + hardWork: userHardWork, + importantGroup: importantGroup, + keyWord: userKeyWord, + mostDeeplyWork: userMostDeeplyWork, + motive: userMotiv, + name: userName, + passOrNot: false, + sendMail: false, + phoneNumber: userPhone, + portfolioFile: "", + portfolioLink: portfolioLink, + sid: userID, + studyFramework: studyFramework, + submissionStatus: false, + }), + { + headers: { + "Content-type": "application/json", + }, } - }, [difficultAndOvercoming, studyFramework, importantGroup, submitCount]) - + ) + .then((res) => { + setTemp(!temp); + document.body.style.overflow = "hidden"; + }); + }; - const Back = () => { - setSubmitCount((prev) => (prev + 1)) - dispatch(saveBackEnd({ userDifficultAndOvercoming: difficultAndOvercoming, userStudyFramework: studyFramework, userImportantGroup: importantGroup, userPortfolioLinkBack: portfolioLink })); - navigate('/common'); - } + const Submit = () => { + const time = new Date(); - const TempSave = () => { - setSubmitCount((prev) => (prev + 1)) - axios.post('/backendApplication', JSON.stringify({ + if (time > endTime) { + alert("제출 기간이 마감되었습니다!"); + navigate("/notTime"); + } else if ( + window.confirm("최중 제출을 하면 수정이 불가해요, 제출하시겠어요?") + ) { + setSubmitCount((prev) => prev + 1); + axios + .post( + "/backendApplication", + JSON.stringify({ department: userDepartment, difficultAndOvercoming: difficultAndOvercoming, email: userEmail, @@ -126,181 +213,179 @@ export default function Backend() { portfolioLink: portfolioLink, sid: userID, studyFramework: studyFramework, - submissionStatus: false, - }), - { - headers: { - "Content-type": "application/json", - } - } + submissionStatus: true, + }), + { + headers: { + "Content-type": "application/json", + }, + } ) - .then((res) => { - dispatch(saveBackEnd({ - userDifficultAndOvercoming: '', - userImportantGroup: '', - userPortfolioLink: '', - userStudyFramework: '', - })); - dispatch(saveCommon({ - userMotiv: '', - userHardWork: '', - userKeyWord: '', - userMostDeeplyWork: '', - })) - dispatch(saveIndex({ - userName: '', - userID: '', - userDepartment: '', - userEmail: '', - userPhone: '', - userPosition: '', - })) - setTemp(!temp); - document.body.style.overflow = "hidden"; - }) + .then((res) => { + setComplete(!complete); + document.body.style.overflow = "hidden"; + }); } + }; - const Submit = () => { - - const time = new Date(); - - if (time > endTime) { - alert("제출 기간이 마감되었습니다!"); - navigate('/notTime'); - } - - else if (window.confirm("최중 제출을 하면 수정이 불가해요, 제출하시겠어요?")) { - setSubmitCount((prev) => (prev + 1)) - axios.post('/backendApplication', JSON.stringify({ - department: userDepartment, - difficultAndOvercoming: difficultAndOvercoming, - email: userEmail, - hardWork: userHardWork, - importantGroup: importantGroup, - keyWord: userKeyWord, - mostDeeplyWork: userMostDeeplyWork, - motive: userMotiv, - name: userName, - passOrNot: false, - sendMail: false, - phoneNumber: userPhone, - portfolioFile: "", - portfolioLink: portfolioLink, - sid: userID, - studyFramework: studyFramework, - submissionStatus: true, - }), - { - headers: { - "Content-type": "application/json", - } - } - ) - .then((res) => { - setComplete(!complete); - document.body.style.overflow = "hidden"; - }) - } + const handleChange = ( + event: ChangeEvent | ChangeEvent + ) => { + if (event.target.name === "극복") { + if (event.target.value.length <= 1000) { + setDifficultAndOvercoming(event.target.value); + } } - const handleChange = (event: ChangeEvent | ChangeEvent) => { - if (event.target.name === "극복") { - if (event.target.value.length <= 1000) { - setDifficultAndOvercoming(event.target.value); - } - } - - if (event.target.name === "경험") { - if (event.target.value.length <= 1000) { - setStudyFramework(event.target.value); - } - } - - if (event.target.name === "팀워크") { - if (event.target.value.length <= 1000) { - setImportantGroup(event.target.value); - } - } - - if (event.target.name === "포트폴리오") { - setPortfolioLink(event.target.value); - } + if (event.target.name === "경험") { + if (event.target.value.length <= 1000) { + setStudyFramework(event.target.value); + } } - const TempBack = async () => { - setTemp(false); - setSubmitCount(0); - setTempState(false); - setButtonState(false); - document.body.style.overflow = "unset"; + if (event.target.name === "팀워크") { + if (event.target.value.length <= 1000) { + setImportantGroup(event.target.value); + } } - /* 처음에는 임시 저장에서 메인화면으로 가는 용도로 만들었지만, 최종 제출 후 redux를 초기화하는 로직이 동일해 최종 제출 후 홈으로 갈 때도 같이 사용*/ - const TempHome = async () => { - await dispatch(saveBackEnd({ - userDifficultAndOvercoming: '', - userImportantGroup: '', - userPortfolioLink: '', - userStudyFramework: '', - })); - await dispatch(saveCommon({ - userMotiv: '', - userHardWork: '', - userKeyWord: '', - userMostDeeplyWork: '', - })) - await dispatch(saveIndex({ - userName: '', - userID: '', - userDepartment: '', - userEmail: '', - userPhone: '', - userPosition: '', - })) - await navigate('/'); + if (event.target.name === "포트폴리오") { + setPortfolioLink(event.target.value); } + }; + + const TempBack = async () => { + setTemp(false); + setSubmitCount(0); + setTempState(false); + setButtonState(false); + document.body.style.overflow = "unset"; + }; + + /* 처음에는 임시 저장에서 메인화면으로 가는 용도로 만들었지만, 최종 제출 후 redux를 초기화하는 로직이 동일해 최종 제출 후 홈으로 갈 때도 같이 사용*/ + const TempHome = async () => { + await dispatch( + saveBackEnd({ + userDifficultAndOvercoming: "", + userImportantGroup: "", + userPortfolioLink: "", + userStudyFramework: "", + }) + ); + await dispatch( + saveCommon({ + userMotiv: "", + userHardWork: "", + userKeyWord: "", + userMostDeeplyWork: "", + }) + ); + await dispatch( + saveIndex({ + userName: "", + userID: "", + userDepartment: "", + userEmail: "", + userPhone: "", + userPosition: "", + }) + ); + await navigate("/"); + }; - return ( -
- {complete && } - {complete ? - - - - : null - } - {temp ? - - - - - : null - } - -
- 개발 관련 공부를 하며 개인적으로 힘들었던 경험과 그걸 극복했던 자신만의 방법이 있나요? - - {difficultAndOvercoming.length} -
-
- 웹 백앤드 프레임워크를 공부해보신적 있으신가요? 있으시다면 어디까지 공부해보셨나요? - - {studyFramework.length} -
-
- 단체생활에서 가장 중요하다고 생각하는 것은 무엇인가요? - - {importantGroup.length} -
-
- 깃허브 또는 포트폴리오 링크가 있다면 첨부해주세요 - -
- - - - - -
- ) + return ( +
+ {complete && } + {complete ? ( + + + + ) : null} + {temp ? ( + + + + + ) : null} + +
+ + 개발 관련 공부를 하며 개인적으로 힘들었던 경험과 그걸 극복했던 + 자신만의 방법이 있나요? + {" "} + + + {difficultAndOvercoming.length} +
+
+ + 웹 백앤드 프레임워크를 공부해보신적 있으신가요? 있으시다면 어디까지 + 공부해보셨나요? + {" "} + + + {studyFramework.length} +
+
+ + 단체생활에서 가장 중요하다고 생각하는 것은 무엇인가요? + {" "} + + + {importantGroup.length} +
+
+ + 깃허브 또는 포트폴리오 링크가 있다면 첨부해주세요{" "} + + +
+ + + + + +
+ ); } diff --git a/src/component/position/Design.tsx b/src/component/position/Design.tsx index 8e81da2..5209be6 100644 --- a/src/component/position/Design.tsx +++ b/src/component/position/Design.tsx @@ -1,119 +1,215 @@ -import React, { ChangeEvent } from 'react' -import { ButtonBox, Section, Button, Require, Article, InputTitle, TextAreaBox, InputBox, Banner, WordLength, Modal, Footer } from '../emotion/component' -import { useNavigate } from 'react-router-dom' -import { useState } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; -import { AppDispatch, TestState } from '../../app/store'; -import { saveCommon, saveIndex, view, saveDesign } from '../../features/fetcherSlice'; -import { useEffect, useMemo } from 'react'; -import axios from 'axios'; -import tempImg from '../../images/temp.png'; -import completeImg from '../../images/complete.png'; -import Confetti from '../../hooks/Confetti'; -import { currentTime, endTime } from '../time/time'; - +import React, { ChangeEvent } from "react"; +import { + ButtonBox, + Section, + Button, + Require, + Article, + InputTitle, + TextAreaBox, + InputBox, + Banner, + WordLength, + Modal, + Footer, +} from "../emotion/component"; +import { useNavigate } from "react-router-dom"; +import { useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { AppDispatch, TestState } from "../../app/store"; +import { + saveCommon, + saveIndex, + view, + saveDesign, +} from "../../features/fetcherSlice"; +import { useEffect, useMemo } from "react"; +import axios from "axios"; +import tempImg from "../../images/temp.png"; +import completeImg from "../../images/complete.png"; +import Confetti from "../../hooks/Confetti"; +import { currentTime, endTime } from "../time/time"; export default function Design() { + const navigate = useNavigate(); + const dispatch = useDispatch(); + const [whyDesign, setWhyDesign] = useState(""); + const [toolExperience, setToolExperience] = useState(""); + const [teamworkExperience, setTeamworkExperience] = useState(""); + const [designGrowth, setDesignGrowth] = useState(""); + const [buttonState, setButtonState] = useState(false); + const [portfolioLink, setPortfolioLink] = useState(""); + const [submitCount, setSubmitCount] = useState(0); + const [tempState, setTempState] = useState(false); + const [temp, setTemp] = useState(false); + const [complete, setComplete] = useState(false); + + const userName = useSelector((state: TestState) => state.fetcher.userName); + const userID = useSelector((state: TestState) => state.fetcher.userID); + const userPhone = useSelector((state: TestState) => state.fetcher.userPhone); + const userEmail = useSelector((state: TestState) => state.fetcher.userEmail); + const userPosition = useSelector( + (state: TestState) => state.fetcher.userPosition + ); + const userDepartment = useSelector( + (state: TestState) => state.fetcher.userDepartment + ); + + const userMotiv = useSelector((state: TestState) => state.fetcher.userMotiv); + const userHardWork = useSelector( + (state: TestState) => state.fetcher.userHardWork + ); + const userKeyWord = useSelector( + (state: TestState) => state.fetcher.userKeyWord + ); + const userMostDeeplyWork = useSelector( + (state: TestState) => state.fetcher.userMostDeeplyWork + ); + + const userWhyDesign = useSelector( + (state: TestState) => state.fetcher.userWhyDesign + ); + const userToolExperience = useSelector( + (state: TestState) => state.fetcher.userToolExperience + ); + const userTeamworkExperience = useSelector( + (state: TestState) => state.fetcher.userTeamworkExperience + ); + const userDesignGrowth = useSelector( + (state: TestState) => state.fetcher.userDesignGrowth + ); + const userPortfolioLink = useSelector( + (state: TestState) => state.fetcher.userPortfolioLinkDesign + ); + + const [name, setName] = useState(""); + + useEffect(() => { + document.body.style.overflow = "unset"; + if (!userName && !userID && !userPhone && !userEmail && !userPosition) { + navigate("/404"); + } - const navigate = useNavigate(); - const dispatch = useDispatch(); - const [whyDesign, setWhyDesign] = useState(''); - const [toolExperience, setToolExperience] = useState(''); - const [teamworkExperience, setTeamworkExperience] = useState(''); - const [designGrowth, setDesignGrowth] = useState(''); - const [buttonState, setButtonState] = useState(false); - const [portfolioLink, setPortfolioLink] = useState(''); - const [submitCount, setSubmitCount] = useState(0); - const [tempState, setTempState] = useState(false); - const [temp, setTemp] = useState(false); - const [complete, setComplete] = useState(false); - - const userName = useSelector((state: TestState) => state.fetcher.userName); - const userID = useSelector((state: TestState) => state.fetcher.userID); - const userPhone = useSelector((state: TestState) => state.fetcher.userPhone); - const userEmail = useSelector((state: TestState) => state.fetcher.userEmail); - const userPosition = useSelector((state: TestState) => state.fetcher.userPosition); - const userDepartment = useSelector((state: TestState) => state.fetcher.userDepartment); - - const userMotiv = useSelector((state: TestState) => state.fetcher.userMotiv); - const userHardWork = useSelector((state: TestState) => state.fetcher.userHardWork); - const userKeyWord = useSelector((state: TestState) => state.fetcher.userKeyWord); - const userMostDeeplyWork = useSelector((state: TestState) => state.fetcher.userMostDeeplyWork); - - const userWhyDesign = useSelector((state: TestState) => state.fetcher.userWhyDesign); - const userToolExperience = useSelector((state: TestState) => state.fetcher.userToolExperience); - const userTeamworkExperience = useSelector((state: TestState) => state.fetcher.userTeamworkExperience); - const userDesignGrowth = useSelector((state: TestState) => state.fetcher.userDesignGrowth); - const userPortfolioLink = useSelector((state: TestState) => state.fetcher.userPortfolioLinkDesign); - - const [name, setName] = useState(''); - - useEffect(() => { - document.body.style.overflow = "unset"; - if (!userName && !userID && !userPhone && !userEmail && !userPosition) { - navigate('/404') - } - - if (currentTime > endTime) { - alert("제출 기간이 마감되었습니다!"); - navigate('/notTime'); - } - - // 이전 값들을 저장하기 위해서 Redux 사용 - if (userWhyDesign) { - setWhyDesign(userWhyDesign); - } - - if (userToolExperience) { - setToolExperience(userToolExperience); - } - - if (userTeamworkExperience) { - setTeamworkExperience(userTeamworkExperience); - } - - if (userDesignGrowth) { - setDesignGrowth(userDesignGrowth); - } - - if (userPortfolioLink) { - setPortfolioLink(userPortfolioLink) - } + if (currentTime > endTime) { + alert("제출 기간이 마감되었습니다!"); + navigate("/notTime"); + } - if (userName) { - setName(userName) - } + // 이전 값들을 저장하기 위해서 Redux 사용 + if (userWhyDesign) { + setWhyDesign(userWhyDesign); + } - }, []) + if (userToolExperience) { + setToolExperience(userToolExperience); + } - useMemo(() => { - // 디자인 파트로 들어왔을 때는 공통 질문이 하나라도 작성된 상태이기 때문에 바로 임시저장이 가능함 - if (userMotiv || userHardWork || userKeyWord || userMostDeeplyWork) { - setTempState(false); - } else { - setTempState(true); - } + if (userTeamworkExperience) { + setTeamworkExperience(userTeamworkExperience); + } - if (whyDesign && toolExperience && teamworkExperience && designGrowth) { - setButtonState(false) - } else { - setButtonState(true) - } - if (submitCount >= 1) { - setButtonState(true); - } - }, [whyDesign, toolExperience, teamworkExperience, designGrowth, submitCount]) + if (userDesignGrowth) { + setDesignGrowth(userDesignGrowth); + } + if (userPortfolioLink) { + setPortfolioLink(userPortfolioLink); + } - const Back = () => { - setSubmitCount((prev) => (prev + 1)) - dispatch(saveDesign({ userWhyDesign: whyDesign, userToolExperience: toolExperience, userTeamworkExperience: teamworkExperience, userDesignGrowth: designGrowth, userPortfolioLinkDesign: portfolioLink })); - navigate('/common'); + if (userName) { + setName(userName); + } + }, []); + + useMemo(() => { + // 디자인 파트로 들어왔을 때는 공통 질문이 하나라도 작성된 상태이기 때문에 바로 임시저장이 가능함 + if (userMotiv || userHardWork || userKeyWord || userMostDeeplyWork) { + setTempState(false); + } else { + setTempState(true); } - const TempSave = () => { - setSubmitCount((prev) => (prev + 1)) - axios.post('/designApplication', JSON.stringify({ + if (whyDesign && toolExperience && teamworkExperience && designGrowth) { + setButtonState(false); + } else { + setButtonState(true); + } + if (submitCount >= 1) { + setButtonState(true); + } + }, [ + whyDesign, + toolExperience, + teamworkExperience, + designGrowth, + submitCount, + ]); + + const Back = () => { + setSubmitCount((prev) => prev + 1); + dispatch( + saveDesign({ + userWhyDesign: whyDesign, + userToolExperience: toolExperience, + userTeamworkExperience: teamworkExperience, + userDesignGrowth: designGrowth, + userPortfolioLinkDesign: portfolioLink, + }) + ); + navigate("/common"); + }; + + const TempSave = () => { + setSubmitCount((prev) => prev + 1); + axios + .post( + "/designApplication", + JSON.stringify({ + department: userDepartment, + whyDesign: whyDesign, + email: userEmail, + hardWork: userHardWork, + toolExperience: toolExperience, + keyWord: userKeyWord, + mostDeeplyWork: userMostDeeplyWork, + motive: userMotiv, + name: userName, + passOrNot: false, + sendMail: false, + phoneNumber: userPhone, + portfolioFile: "", + portfolioLink: portfolioLink, + sid: userID, + teamworkExperience: teamworkExperience, + designGrowth: designGrowth, + submissionStatus: false, + }), + { + headers: { + "Content-type": "application/json", + }, + } + ) + .then((res) => { + setTemp(!temp); + document.body.style.overflow = "hidden"; + }); + }; + + const Submit = async () => { + const time = new Date(); + + if (time > endTime) { + alert("제출 기간이 마감되었습니다!"); + navigate("/notTime"); + } else if ( + window.confirm("최중 제출을 하면 수정이 불가해요, 제출하시겠어요?") + ) { + setSubmitCount((prev) => prev + 1); + axios + .post( + "/designApplication", + JSON.stringify({ department: userDepartment, whyDesign: whyDesign, email: userEmail, @@ -131,194 +227,224 @@ export default function Design() { sid: userID, teamworkExperience: teamworkExperience, designGrowth: designGrowth, - submissionStatus: false, - }), - { - headers: { - "Content-type": "application/json", - } - } + submissionStatus: true, + }), + { + headers: { + "Content-type": "application/json", + }, + } ) - .then((res) => { - setTemp(!temp); - document.body.style.overflow = "hidden"; + .then((res) => { + dispatch( + saveDesign({ + userWhyDesign: "", + userToolExperience: "", + userTeamworkExperience: "", + userPortfolioLinkDesign: "", + userDesignGrowth: "", + }) + ); + dispatch( + saveCommon({ + userMotiv: "", + userHardWork: "", + userKeyWord: "", + userMostDeeplyWork: "", }) + ); + dispatch( + saveIndex({ + userName: "", + userID: "", + userDepartment: "", + userEmail: "", + userPhone: "", + userPosition: "", + }) + ); + setComplete(!complete); + document.body.style.overflow = "hidden"; + }); } - - const Submit = async () => { - - const time = new Date(); - - if (time > endTime) { - alert("제출 기간이 마감되었습니다!"); - navigate('/notTime'); - } - else if (window.confirm("최중 제출을 하면 수정이 불가해요, 제출하시겠어요?")) { - setSubmitCount((prev) => (prev + 1)) - axios.post('/designApplication', JSON.stringify({ - department: userDepartment, - whyDesign: whyDesign, - email: userEmail, - hardWork: userHardWork, - toolExperience: toolExperience, - keyWord: userKeyWord, - mostDeeplyWork: userMostDeeplyWork, - motive: userMotiv, - name: userName, - passOrNot: false, - sendMail: false, - phoneNumber: userPhone, - portfolioFile: "", - portfolioLink: portfolioLink, - sid: userID, - teamworkExperience: teamworkExperience, - designGrowth: designGrowth, - submissionStatus: true, - }), - { - headers: { - "Content-type": "application/json", - } - } - ) - .then((res) => { - dispatch(saveDesign({ - userWhyDesign: '', - userToolExperience: '', - userTeamworkExperience: '', - userPortfolioLinkDesign: '', - userDesignGrowth: '', - })); - dispatch(saveCommon({ - userMotiv: '', - userHardWork: '', - userKeyWord: '', - userMostDeeplyWork: '', - })) - dispatch(saveIndex({ - userName: '', - userID: '', - userDepartment: '', - userEmail: '', - userPhone: '', - userPosition: '', - })) - setComplete(!complete) - document.body.style.overflow = "hidden"; - }) - } + }; + + const handleChange = ( + event: ChangeEvent | ChangeEvent + ) => { + if (event.target.name === "동기") { + if (event.target.value.length <= 1000) { + setWhyDesign(event.target.value); + } } - const handleChange = (event: ChangeEvent | ChangeEvent) => { - if (event.target.name === "동기") { - if (event.target.value.length <= 1000) { - setWhyDesign(event.target.value); - } - } - - if (event.target.name === "경험") { - if (event.target.value.length <= 1000) { - setToolExperience(event.target.value); - } - } - - if (event.target.name === "팀워크") { - if (event.target.value.length <= 1000) { - setTeamworkExperience(event.target.value); - } - } - - if (event.target.name === "성장") { - if (event.target.value.length <= 1000) { - setDesignGrowth(event.target.value); - } - } - - if (event.target.name === "포트폴리오") { - setPortfolioLink(event.target.value); - } + if (event.target.name === "경험") { + if (event.target.value.length <= 1000) { + setToolExperience(event.target.value); + } } - const TempBack = async () => { - setTemp(false); - setSubmitCount(0); - setTempState(false); - setButtonState(false); - document.body.style.overflow = "unset"; + if (event.target.name === "팀워크") { + if (event.target.value.length <= 1000) { + setTeamworkExperience(event.target.value); + } } - /* 처음에는 임시 저장에서 메인화면으로 가는 용도로 만들었지만, 최종 제출 후 redux를 초기화하는 로직이 동일해 최종 제출 후 홈으로 갈 때도 같이 사용*/ - const TempHome = async () => { - await dispatch(saveDesign({ - userWhyDesign: '', - userToolExperience: '', - userTeamworkExperience: '', - userPortfolioLinkDesign: '', - userDesignGrowth: '', - })); - await dispatch(saveCommon({ - userMotiv: '', - userHardWork: '', - userKeyWord: '', - userMostDeeplyWork: '', - })) - await dispatch(saveIndex({ - userName: '', - userID: '', - userDepartment: '', - userEmail: '', - userPhone: '', - userPosition: '', - })) - await navigate('/'); + if (event.target.name === "성장") { + if (event.target.value.length <= 1000) { + setDesignGrowth(event.target.value); + } } - return ( -
- {complete && } - {complete ? - - - - : null - } - {temp ? - - - - - : null - } - -
- 디자인 트랙을 선택하게 된 이유를 구체적으로 서술해주세요 - - {whyDesign.length} -
-
- 피그마나 Adobe XD와 같은 목업 툴에 관련된 경험을 해본 적이 있다면 그 경험에 대해 자세히 설명을 해주세요 - - {toolExperience.length} -
-
- 본인이 협업과 팀워크를 진행해 보았던 경험과, 그 경험을 멋쟁이 사자처럼 대학에서 어떻게 적용시킬 수 있는지 알려주세요 - - {teamworkExperience.length} -
-
- 디자인 트랙을 통해 어떠한 성장을 희망하시는지 구체적으로 서술해주세요 - - {designGrowth.length} -
-
- 포트폴리오 링크가 있다면 첨부해주세요 - -
- - - - - -
- ) + if (event.target.name === "포트폴리오") { + setPortfolioLink(event.target.value); + } + }; + + const TempBack = async () => { + setTemp(false); + setSubmitCount(0); + setTempState(false); + setButtonState(false); + document.body.style.overflow = "unset"; + }; + + /* 처음에는 임시 저장에서 메인화면으로 가는 용도로 만들었지만, 최종 제출 후 redux를 초기화하는 로직이 동일해 최종 제출 후 홈으로 갈 때도 같이 사용*/ + const TempHome = async () => { + await dispatch( + saveDesign({ + userWhyDesign: "", + userToolExperience: "", + userTeamworkExperience: "", + userPortfolioLinkDesign: "", + userDesignGrowth: "", + }) + ); + await dispatch( + saveCommon({ + userMotiv: "", + userHardWork: "", + userKeyWord: "", + userMostDeeplyWork: "", + }) + ); + await dispatch( + saveIndex({ + userName: "", + userID: "", + userDepartment: "", + userEmail: "", + userPhone: "", + userPosition: "", + }) + ); + await navigate("/"); + }; + + return ( +
+ {complete && } + {complete ? ( + + + + ) : null} + {temp ? ( + + + + + ) : null} + +
+ + 디자인 트랙을 선택하게 된 이유를 구체적으로 서술해주세요 + {" "} + + + {whyDesign.length} +
+
+ + 피그마나 Adobe XD와 같은 목업 툴에 관련된 경험을 해본 적이 있다면 그 + 경험에 대해 자세히 설명을 해주세요 + {" "} + + + {toolExperience.length} +
+
+ + 본인이 협업과 팀워크를 진행해 보았던 경험과, 그 경험을 멋쟁이 사자처럼 + 대학에서 어떻게 적용시킬 수 있는지 알려주세요 + {" "} + + + {teamworkExperience.length} +
+
+ + 디자인 트랙을 통해 어떠한 성장을 희망하시는지 구체적으로 서술해주세요 + {" "} + + + {designGrowth.length} +
+
+ 포트폴리오 링크가 있다면 첨부해주세요 + +
+ + + + + +
+ ); } diff --git a/src/component/position/Frontend.tsx b/src/component/position/Frontend.tsx index b5eec79..094e3ca 100644 --- a/src/component/position/Frontend.tsx +++ b/src/component/position/Frontend.tsx @@ -1,332 +1,451 @@ -import React, { ChangeEvent } from 'react' -import { ButtonBox, Section, Button, Require, Article, InputTitle, TextAreaBox, InputBox, Banner, WordLength, Modal, Footer } from '../emotion/component' -import { useNavigate } from 'react-router-dom' -import { useState } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; -import { AppDispatch, TestState } from '../../app/store'; -import { saveCommon, saveIndex, view, saveFrontEnd } from '../../features/fetcherSlice'; -import { useEffect, useMemo } from 'react'; -import axios from 'axios'; -import tempImg from '../../images/temp.png'; -import completeImg from '../../images/complete.png'; -import Confetti from '../../hooks/Confetti'; -import { currentTime, endTime } from '../time/time'; +import React, { ChangeEvent } from "react"; +import { + ButtonBox, + Section, + Button, + Require, + Article, + InputTitle, + TextAreaBox, + InputBox, + Banner, + WordLength, + Modal, + Footer, +} from "../emotion/component"; +import { useNavigate } from "react-router-dom"; +import { useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { AppDispatch, TestState } from "../../app/store"; +import { + saveCommon, + saveIndex, + view, + saveFrontEnd, +} from "../../features/fetcherSlice"; +import { useEffect, useMemo } from "react"; +import axios from "axios"; +import tempImg from "../../images/temp.png"; +import completeImg from "../../images/complete.png"; +import Confetti from "../../hooks/Confetti"; +import { currentTime, endTime } from "../time/time"; export default function Frontend() { + const navigate = useNavigate(); + const dispatch = useDispatch(); + + const [buttonState, setButtonState] = useState(false); + const [submitCount, setSubmitCount] = useState(0); + const [tempState, setTempState] = useState(false); + const [temp, setTemp] = useState(false); + const [complete, setComplete] = useState(false); + + const [whyFrontend, setWhyFrontend] = useState(""); + const [usingStack, setUsingStack] = useState(""); + const [teamProject, setTeamProject] = useState(""); + const [achieve, setAchieve] = useState(""); + const [portfolioLink, setPortfolioLink] = useState(""); + + const [name, setName] = useState(""); + + const userName = useSelector((state: TestState) => state.fetcher.userName); + const userID = useSelector((state: TestState) => state.fetcher.userID); + const userPhone = useSelector((state: TestState) => state.fetcher.userPhone); + const userEmail = useSelector((state: TestState) => state.fetcher.userEmail); + const userPosition = useSelector( + (state: TestState) => state.fetcher.userPosition + ); + const userDepartment = useSelector( + (state: TestState) => state.fetcher.userDepartment + ); + + const userMotiv = useSelector((state: TestState) => state.fetcher.userMotiv); + const userHardWork = useSelector( + (state: TestState) => state.fetcher.userHardWork + ); + const userKeyWord = useSelector( + (state: TestState) => state.fetcher.userKeyWord + ); + const userMostDeeplyWork = useSelector( + (state: TestState) => state.fetcher.userMostDeeplyWork + ); + + const userWhyFrontend = useSelector( + (state: TestState) => state.fetcher.userWhyFrontend + ); + const userUsingStack = useSelector( + (state: TestState) => state.fetcher.userUsingStack + ); + const userTeamProject = useSelector( + (state: TestState) => state.fetcher.userTeamProject + ); + const userAchieve = useSelector( + (state: TestState) => state.fetcher.userAchieve + ); + const userPortfolioLink = useSelector( + (state: TestState) => state.fetcher.userPortfolioLinkFront + ); + + useEffect(() => { + document.body.style.overflow = "unset"; + if (!userName && !userID && !userPhone && !userEmail && !userPosition) { + navigate("/404"); + } - const navigate = useNavigate(); - const dispatch = useDispatch(); - - const [buttonState, setButtonState] = useState(false); - const [submitCount, setSubmitCount] = useState(0); - const [tempState, setTempState] = useState(false); - const [temp, setTemp] = useState(false); - const [complete, setComplete] = useState(false); - - const [whyFrontend, setWhyFrontend] = useState(''); - const [usingStack, setUsingStack] = useState(''); - const [teamProject, setTeamProject] = useState(''); - const [achieve, setAchieve] = useState(''); - const [portfolioLink, setPortfolioLink] = useState(''); - - const [name, setName] = useState(''); - - - const userName = useSelector((state: TestState) => state.fetcher.userName); - const userID = useSelector((state: TestState) => state.fetcher.userID); - const userPhone = useSelector((state: TestState) => state.fetcher.userPhone); - const userEmail = useSelector((state: TestState) => state.fetcher.userEmail); - const userPosition = useSelector((state: TestState) => state.fetcher.userPosition); - const userDepartment = useSelector((state: TestState) => state.fetcher.userDepartment); - - const userMotiv = useSelector((state: TestState) => state.fetcher.userMotiv); - const userHardWork = useSelector((state: TestState) => state.fetcher.userHardWork); - const userKeyWord = useSelector((state: TestState) => state.fetcher.userKeyWord); - const userMostDeeplyWork = useSelector((state: TestState) => state.fetcher.userMostDeeplyWork); - - const userWhyFrontend = useSelector((state: TestState) => state.fetcher.userWhyFrontend); - const userUsingStack = useSelector((state: TestState) => state.fetcher.userUsingStack); - const userTeamProject = useSelector((state: TestState) => state.fetcher.userTeamProject); - const userAchieve = useSelector((state: TestState) => state.fetcher.userAchieve); - const userPortfolioLink = useSelector((state: TestState) => state.fetcher.userPortfolioLinkFront); - - useEffect(() => { - document.body.style.overflow = "unset"; - if (!userName && !userID && !userPhone && !userEmail && !userPosition) { - navigate('/404') - } - - if (currentTime > endTime) { - alert("제출 기간이 마감되었습니다!"); - navigate('/notTime'); - } - - // 이전 값들을 저장하기 위해서 Redux 사용 - - if (userWhyFrontend) { - setWhyFrontend(userWhyFrontend) - } - if (userUsingStack) { - setUsingStack(userUsingStack) - } - if (userTeamProject) { - setTeamProject(userTeamProject) - } - if (userAchieve) { - setAchieve(userAchieve) - } - if (userPortfolioLink) { - setPortfolioLink(userPortfolioLink) - } - - if (userName) { - setName(userName) - } - }, []) - - useMemo(() => { - - // 프론트엔드 파트로 들어왔을 때는 공통 질문이 하나라도 작성된 상태이기 때문에 바로 임시저장이 가능함 - if (userMotiv || userHardWork || userKeyWord || userMostDeeplyWork) { - setTempState(false); - } else { - setTempState(true); - } - - if (whyFrontend && usingStack && teamProject && achieve) { - setButtonState(false) - } else { - setButtonState(true) - } - if (submitCount >= 1) { - setButtonState(true); - } - }, [whyFrontend, usingStack, teamProject, achieve, submitCount]) - - - const Back = () => { - setSubmitCount((prev) => (prev + 1)) - dispatch(saveFrontEnd({ userWhyFrontend: whyFrontend, userUsingStack: usingStack, userTeamProject: teamProject, userAchieve: achieve, userPortfolioLinkFront: portfolioLink })); - navigate('/common'); + if (currentTime > endTime) { + alert("제출 기간이 마감되었습니다!"); + navigate("/notTime"); } + // 이전 값들을 저장하기 위해서 Redux 사용 - const TempSave = () => { - setSubmitCount((prev) => (prev + 1)); - if (userPosition === "프론트엔드") { - axios.post('/frontendApplication', JSON.stringify({ - department: userDepartment, - whyFrontend: whyFrontend, - email: userEmail, - hardWork: userHardWork, - usingStack: usingStack, - keyWord: userKeyWord, - mostDeeplyWork: userMostDeeplyWork, - motive: userMotiv, - name: userName, - passOrNot: false, - sendMail: false, - phoneNumber: userPhone, - portfolioFile: "", - portfolioLink: portfolioLink, - sid: userID, - teamProject: teamProject, - achieve: achieve, - submissionStatus: false, - }), - { - headers: { - "Content-type": "application/json", - } - } - ) - .then((res) => { - setTemp(!temp); - document.body.style.overflow = "hidden"; - }) - } + if (userWhyFrontend) { + setWhyFrontend(userWhyFrontend); } - - const OpenSubmit = () => { - setComplete(!complete); + if (userUsingStack) { + setUsingStack(userUsingStack); } - - const Submit = () => { - - const time = new Date(); - - if (time > endTime) { - alert("제출 기간이 마감되었습니다!"); - navigate('/notTime'); - } - - else if (window.confirm("최중 제출을 하면 수정이 불가해요, 제출하시겠어요?")) { - setSubmitCount((prev) => (prev + 1)) - axios.post('/frontendApplication', JSON.stringify({ - department: userDepartment, - whyFrontend: whyFrontend, - email: userEmail, - hardWork: userHardWork, - usingStack: usingStack, - keyWord: userKeyWord, - mostDeeplyWork: userMostDeeplyWork, - motive: userMotiv, - name: userName, - passOrNot: false, - sendMail: false, - phoneNumber: userPhone, - portfolioFile: "", - portfolioLink: portfolioLink, - sid: userID, - teamProject: teamProject, - achieve: achieve, - submissionStatus: true, - }), - { - headers: { - "Content-type": "application/json", - } - } - ) - .then((res) => { - dispatch(saveFrontEnd({ - userWhyFrontend: '', - userUsingStack: '', - userAchieve: '', - userPortfolioLinkFront: '', - userTeamProject: '', - })); - dispatch(saveCommon({ - userMotiv: '', - userHardWork: '', - userKeyWord: '', - userMostDeeplyWork: '', - })) - dispatch(saveIndex({ - userName: '', - userID: '', - userDepartment: '', - userEmail: '', - userPhone: '', - userPosition: '', - })) - setComplete(!complete) - document.body.style.overflow = "hidden"; - }) - } + if (userTeamProject) { + setTeamProject(userTeamProject); + } + if (userAchieve) { + setAchieve(userAchieve); + } + if (userPortfolioLink) { + setPortfolioLink(userPortfolioLink); } - const handleChange = (event: ChangeEvent | ChangeEvent) => { - if (event.target.name === "동기") { - if (event.target.value.length <= 1000) { - setWhyFrontend(event.target.value); - } - } - - if (event.target.name === "프레임워크") { - if (event.target.value.length <= 1000) { - - setUsingStack(event.target.value); - } - } - - if (event.target.name === "경험") { - if (event.target.value.length <= 1000) { - setTeamProject(event.target.value); - } - } + if (userName) { + setName(userName); + } + }, []); + + useMemo(() => { + // 프론트엔드 파트로 들어왔을 때는 공통 질문이 하나라도 작성된 상태이기 때문에 바로 임시저장이 가능함 + if (userMotiv || userHardWork || userKeyWord || userMostDeeplyWork) { + setTempState(false); + } else { + setTempState(true); + } - if (event.target.name === "성장") { - if (event.target.value.length <= 1000) { - setAchieve(event.target.value); - } - } + if (whyFrontend && usingStack && teamProject && achieve) { + setButtonState(false); + } else { + setButtonState(true); + } + if (submitCount >= 1) { + setButtonState(true); + } + }, [whyFrontend, usingStack, teamProject, achieve, submitCount]); + + const Back = () => { + setSubmitCount((prev) => prev + 1); + dispatch( + saveFrontEnd({ + userWhyFrontend: whyFrontend, + userUsingStack: usingStack, + userTeamProject: teamProject, + userAchieve: achieve, + userPortfolioLinkFront: portfolioLink, + }) + ); + navigate("/common"); + }; + + const TempSave = () => { + setSubmitCount((prev) => prev + 1); + if (userPosition === "프론트엔드") { + axios + .post( + "/frontendApplication", + JSON.stringify({ + department: userDepartment, + whyFrontend: whyFrontend, + email: userEmail, + hardWork: userHardWork, + usingStack: usingStack, + keyWord: userKeyWord, + mostDeeplyWork: userMostDeeplyWork, + motive: userMotiv, + name: userName, + passOrNot: false, + sendMail: false, + phoneNumber: userPhone, + portfolioFile: "", + portfolioLink: portfolioLink, + sid: userID, + teamProject: teamProject, + achieve: achieve, + submissionStatus: false, + }), + { + headers: { + "Content-type": "application/json", + }, + } + ) + .then((res) => { + setTemp(!temp); + document.body.style.overflow = "hidden"; + }); + } + }; + + const OpenSubmit = () => { + setComplete(!complete); + }; + + const Submit = () => { + const time = new Date(); + + if (time > endTime) { + alert("제출 기간이 마감되었습니다!"); + navigate("/notTime"); + } else if ( + window.confirm("최중 제출을 하면 수정이 불가해요, 제출하시겠어요?") + ) { + setSubmitCount((prev) => prev + 1); + axios + .post( + "/frontendApplication", + JSON.stringify({ + department: userDepartment, + whyFrontend: whyFrontend, + email: userEmail, + hardWork: userHardWork, + usingStack: usingStack, + keyWord: userKeyWord, + mostDeeplyWork: userMostDeeplyWork, + motive: userMotiv, + name: userName, + passOrNot: false, + sendMail: false, + phoneNumber: userPhone, + portfolioFile: "", + portfolioLink: portfolioLink, + sid: userID, + teamProject: teamProject, + achieve: achieve, + submissionStatus: true, + }), + { + headers: { + "Content-type": "application/json", + }, + } + ) + .then((res) => { + dispatch( + saveFrontEnd({ + userWhyFrontend: "", + userUsingStack: "", + userAchieve: "", + userPortfolioLinkFront: "", + userTeamProject: "", + }) + ); + dispatch( + saveCommon({ + userMotiv: "", + userHardWork: "", + userKeyWord: "", + userMostDeeplyWork: "", + }) + ); + dispatch( + saveIndex({ + userName: "", + userID: "", + userDepartment: "", + userEmail: "", + userPhone: "", + userPosition: "", + }) + ); + setComplete(!complete); + document.body.style.overflow = "hidden"; + }); + } + }; + + const handleChange = ( + event: ChangeEvent | ChangeEvent + ) => { + if (event.target.name === "동기") { + if (event.target.value.length <= 1000) { + setWhyFrontend(event.target.value); + } + } - if (event.target.name === "포트폴리오") { - setPortfolioLink(event.target.value); - } + if (event.target.name === "프레임워크") { + if (event.target.value.length <= 1000) { + setUsingStack(event.target.value); + } } - const TempBack = async () => { - setTemp(false); - setSubmitCount(0); - setTempState(false); - setButtonState(false); - document.body.style.overflow = "unset"; + if (event.target.name === "경험") { + if (event.target.value.length <= 1000) { + setTeamProject(event.target.value); + } } - /* 처음에는 임시 저장에서 메인화면으로 가는 용도로 만들었지만, 최종 제출 후 redux를 초기화하는 로직이 동일해 최종 제출 후 홈으로 갈 때도 같이 사용*/ - const TempHome = async () => { - await dispatch(saveFrontEnd({ - userWhyFrontend: '', - userUsingStack: '', - userAchieve: '', - userPortfolioLinkFront: '', - userTeamProject: '', - })); - await dispatch(saveCommon({ - userMotiv: '', - userHardWork: '', - userKeyWord: '', - userMostDeeplyWork: '', - })) - await dispatch(saveIndex({ - userName: '', - userID: '', - userDepartment: '', - userEmail: '', - userPhone: '', - userPosition: '', - })) - await navigate('/'); + if (event.target.name === "성장") { + if (event.target.value.length <= 1000) { + setAchieve(event.target.value); + } } - return ( -
- {complete && } - {complete ? - - - - : null - } - {temp ? - - - - - : null - } - -
- 프론트엔드 트랙을 선택하게 된 이유를 구체적으로 서술해주세요 - - {whyFrontend.length} -
-
- 프론트엔드 개발과 관련된 프레임워크나 HTML, CSS, JavaScript 등의 언어를 사용해보신 경험에 대해 구체적으로 적어주세요 - - {usingStack.length} -
-
- 팀 활동이나 프로젝트를 경험해본 내용과 이를 통해 자신의 성장 경험에 대해서 서술해주세요 - - {teamProject.length} -
-
- 멋사 프론트엔드 아기사자로 활동하면서 얻어 가고 싶은 것은 무엇인가요? - - {achieve.length} -
-
- 깃허브 또는 포트폴리오 링크가 있다면 첨부해주세요 - -
- - - - - -
- ) -} \ No newline at end of file + if (event.target.name === "포트폴리오") { + setPortfolioLink(event.target.value); + } + }; + + const TempBack = async () => { + setTemp(false); + setSubmitCount(0); + setTempState(false); + setButtonState(false); + document.body.style.overflow = "unset"; + }; + + /* 처음에는 임시 저장에서 메인화면으로 가는 용도로 만들었지만, 최종 제출 후 redux를 초기화하는 로직이 동일해 최종 제출 후 홈으로 갈 때도 같이 사용*/ + const TempHome = async () => { + await dispatch( + saveFrontEnd({ + userWhyFrontend: "", + userUsingStack: "", + userAchieve: "", + userPortfolioLinkFront: "", + userTeamProject: "", + }) + ); + await dispatch( + saveCommon({ + userMotiv: "", + userHardWork: "", + userKeyWord: "", + userMostDeeplyWork: "", + }) + ); + await dispatch( + saveIndex({ + userName: "", + userID: "", + userDepartment: "", + userEmail: "", + userPhone: "", + userPosition: "", + }) + ); + await navigate("/"); + }; + + return ( +
+ {complete && } + {complete ? ( + + + + ) : null} + {temp ? ( + + + + + ) : null} + +
+ + 프론트엔드 트랙을 선택하게 된 이유를 구체적으로 서술해주세요 + {" "} + + + {whyFrontend.length} +
+
+ + 프론트엔드 개발과 관련된 프레임워크나 HTML, CSS, JavaScript 등의 + 언어를 사용해보신 경험에 대해 구체적으로 적어주세요 + {" "} + + + {usingStack.length} +
+
+ + 팀 활동이나 프로젝트를 경험해본 내용과 이를 통해 자신의 성장 경험에 + 대해서 서술해주세요 + {" "} + + + {teamProject.length} +
+
+ + 멋사 프론트엔드 아기사자로 활동하면서 얻어 가고 싶은 것은 무엇인가요? + {" "} + + + {achieve.length} +
+
+ + 깃허브 또는 포트폴리오 링크가 있다면 첨부해주세요{" "} + + +
+ + + + + +
+ ); +} diff --git a/src/hooks/KeyboardIOS.ts b/src/hooks/KeyboardIOS.ts index e3f9262..7af9178 100644 --- a/src/hooks/KeyboardIOS.ts +++ b/src/hooks/KeyboardIOS.ts @@ -1,16 +1,12 @@ -import { useEffect } from "react"; - export const KeyboardIOS = () => { - useEffect(() => { - const scrollToTopFn = () => { - if (window.Keyboard && !window.Keyboard.isVisible) { - window.scrollTo(0, 0); - window.document.body.scrollTop = 0; - } - }; - - window.addEventListener('keyboardDidHide', () => { - window.setTimeout(scrollToTopFn, 100); - }); - }, []) + const scrollToTopFn = () => { + if (window.Keyboard && !window.Keyboard.isVisible) { + window.scrollTo(0, 0); + window.document.body.scrollTop = 0; + } + }; + + window.addEventListener('keyboardDidHide', () => { + window.setTimeout(scrollToTopFn, 100); + }); } \ No newline at end of file diff --git a/src/images/notTime.png b/src/images/notTime.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc696994e24ac73f4047feba36ff8224aa06858 GIT binary patch literal 26209 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 literal 0 HcmV?d00001 diff --git a/tsconfig.json b/tsconfig.json index 2677c30..d133799 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,7 +22,7 @@ }, "include": [ "src", - "src/custom.d.ts", + "src/hooks/@types/custom.d.ts", "src/index.d.ts", ] } \ No newline at end of file