Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Design] Mobile ver. - 결과 페이지 반응형 #370

Merged
merged 19 commits into from
Aug 12, 2024
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
5f0e746
fix: SOPT makers 전용 결과 문구 반영
lydiacho Aug 9, 2024
9c55440
design: contentWrapper 반응형
lydiacho Aug 9, 2024
5e8e60d
design: 합격페이지 배경 로고 margin반응형
lydiacho Aug 9, 2024
edd32ed
design: content 스크롤 추가 및 paddingBottom
lydiacho Aug 9, 2024
41fc561
design: 스크롤 bottom 그라데이션 구현
lydiacho Aug 9, 2024
8e0d6d4
design: 구글폼 주소 개행 관련 작업
lydiacho Aug 10, 2024
a549b92
chore: 누락된 코드 추가
lydiacho Aug 10, 2024
128298d
chore: 누락된 코드 추가
lydiacho Aug 10, 2024
75cc41d
Merge branch 'design/#369_mobile-result' of https://github.com/sopt-m…
lydiacho Aug 10, 2024
a9ceb34
chore: 누락된 코드 추가
lydiacho Aug 10, 2024
60b72b3
Merge branch 'design/#369_mobile-result' of https://github.com/sopt-m…
lydiacho Aug 10, 2024
a9a1407
design: SOPT makers 조건부 수정 및 서류페이지 누락된 스크롤 작업 추가
lydiacho Aug 11, 2024
7cfabaf
design: 합격페이지 애니메이션 zIndex 최상위 이동
lydiacho Aug 11, 2024
06ba80f
chore: 테스트를 위한 조건수정 복구
lydiacho Aug 11, 2024
fffc75d
Merge branch 'develop' of https://github.com/sopt-makers/sopt-recruit…
lydiacho Aug 11, 2024
a944f66
chore: 잘못들어간 코드 삭제
lydiacho Aug 11, 2024
2d7b416
fix: 결과확인 버튼에 모바일접속제한 해제
lydiacho Aug 11, 2024
fddc6ef
fix: 스크롤 이슈 해결
lydiacho Aug 12, 2024
099f19f
chore: 테스트용 코드 삭제
lydiacho Aug 12, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/common/constants/zIndex.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ export const Z_INDEX = {
applyCategory: 99,
applyHeader: 99,
resultContent: 2,
resultGrad: 3,
};
91 changes: 67 additions & 24 deletions src/views/ResultPage/components/FinalResult.tsx
Original file line number Diff line number Diff line change
@@ -1,55 +1,94 @@
import { format } from 'date-fns';
import { ko } from 'date-fns/locale';
import { useContext, useEffect } from 'react';

import Title from '@components/Title';
import { useDevice } from '@hooks/useDevice';
import { RecruitingInfoContext } from '@store/recruitingInfoContext';
import BigLoading from 'views/loadings/BigLoding';

import { bottomAnimation, bottomImg, bottomSvg, container, content, contentWrapper, strongText } from './style.css';
import {
bottomAnimation,
bottomImg,
bottomSvg,
container,
contentVar,
contentWrapperVar,
link,
scrollBottomGradVar,
strongText,
} from './style.css';
import IconMakersLogo from '../assets/IconMakersLogo';
import imgSoptLogo from '../assets/imgSoptLogo.png';
import imgSoptLogoWebp from '../assets/imgSoptLogo.webp';
import useGetFinalResult from '../hooks/useGetFinalResult';

const Content = ({ pass }: { pass?: boolean }) => {
const DEVICE_TYPE = useDevice();
const {
recruitingInfo: { name, soptName, season, group, isMakers },
recruitingInfo: { name, soptName, season, group, isMakers, finalPassConfirmStart },
} = useContext(RecruitingInfoContext);

if (!name) return;

const finalDate = new Date(finalPassConfirmStart || '');
const formattedFinalPassConfirmStart = format(finalDate, 'M월 dd일 EEEE', {
locale: ko,
});

return (
<>
{pass ? (
<p className={content}>
<span>{`안녕하세요. ${season}기 ${soptName} 입니다.\n\n`}</span>
<p className={contentVar[DEVICE_TYPE]}>
<span>{`안녕하세요. SOPT ${soptName} 입니다.\n\n`}</span>
<strong className={strongText[isMakers ? 'makers' : 'sopt']}>{`축하드립니다!`}</strong>
<span>
{`
${name}님은 ${season}기 ${soptName} ${!isMakers ? group : ''} 신입회원 모집에 최종 합격하셨습니다.
${name}님은 ${season}기 SOPT ${soptName} ${!isMakers ? group : ''} 신입회원 모집에 최종 합격하셨습니다.
lydiacho marked this conversation as resolved.
Show resolved Hide resolved

${name}님과 함께하게 되어 진심으로 기쁩니다.
향후 활동은 ${soptName} 공식 노션과 카카오톡 단체 대화방, SOPT 공식 디스코드를 통해
운영 및 진행됩니다.
향후 활동은 SOPT ${soptName} 공식 노션과 슬랙,카카오톡 단체 대화방, SOPT ${soptName} 공식 디스코드 등을 통해 운영 및 진행됩니다.

오늘 중으로 카카오톡 단체 대화방에 초대해드릴 예정이니 참고 부탁드립니다.\n
아래 구글 폼으로 각 워크스페이스 이메일 계정 및 필수 정보를 제출해주시길 바랍니다.
( 제출 마감 : ${formattedFinalPassConfirmStart} 오후 11:59 )
`}
</span>
<span>{`( 구글폼 : `}</span>
<a
className={link}
href={`https://${import.meta.env.VITE_FINAL_PASS_LINK}`}
target="_blank"
rel="noreferrer noopener">
{`https://${DEVICE_TYPE !== 'DESK' && '\n'}${import.meta.env.VITE_FINAL_PASS_LINK}`}
</a>
<span>{` )\n`}</span>
<br />
<span>
{`
제출해주신 구글 폼을 통해 순차적으로 워크스페이스 초대해드릴 예정이며
금일 중으로 카카오톡 단체 대화방에 초대해드릴 예정이니 참고 부탁드립니다.

다시 한 번 SOPT ${soptName} ${season}기 합류를 진심으로 축하드립니다!

SOPT ${soptName} 운영진 드림
`}
</span>
<strong
className={
strongText[isMakers ? 'makers' : 'sopt']
}>{`SOPT의 ${season}번째 열정이 되신 것을 축하드립니다!`}</strong>
</p>
) : (
<p className={content}>
{`안녕하세요. ${soptName} 입니다.
${name}님은 ${season}기 ${soptName} ${!isMakers ? group : ''} 신입회원 모집에 불합격하셨습니다.
<p className={contentVar[DEVICE_TYPE]}>
{`안녕하세요, SOPT ${soptName}입니다.

SOPT makers에 관심을 갖고 지원해 주셔서 감사드립니다.

지원자님의 뛰어난 역량과 잠재력에도 불구하고 안타깝게도 귀하의 최종 합격 소식을
전해드리지 못하게 되었습니다.
${name}님의 뛰어난 역량과 잠재력에도 불구하고 안타깝게도 귀하의 합격 소식을 전해드리지 못하게 되었습니다.

한 분 한 분에게 개별적인 피드백을 드리기는 어렵겠으나 저희 SOPT에 지원하셨던
경험이 한 사람의 IT 창업인으로서 멋진 역할을 해나가시는 데 큰 도움이 되기를 바랍니다.
비록 이번 ${season}기 ${soptName}에 모시지 못하게 되었으나, ${soptName}에 지원하시고자 쓰인 소중한 시간과 노력이 지원자님께서 IT 창업인으로서 멋진 역할을 해나가시는 데 작게나마 도움이 되는 경험이 되시길 바랍니다.

SOPT ${soptName}에 귀한 시간을 내어주셔서 다시 한 번 깊이 감사드립니다 :)
향후에 더 좋은 인연으로 뵙기를 기다리겠습니다.
감사합니다.

SOPT ${soptName} 운영진 드림
`}
</p>
)}
Expand All @@ -58,6 +97,7 @@ const Content = ({ pass }: { pass?: boolean }) => {
};

const FinalResult = () => {
const DEVICE_TYPE = useDevice();
const { finalResult, finalResultIsLoading } = useGetFinalResult();
const {
recruitingInfo: { isMakers },
Expand All @@ -76,11 +116,13 @@ const FinalResult = () => {

return (
<section className={container}>
<div className={contentWrapper}>
<Title>결과 확인</Title>
<Content pass={pass} />
<div style={{ overflow: 'auto', height: '100%' }}>
<div className={contentWrapperVar[DEVICE_TYPE]}>
<Title>결과 확인</Title>
<Content pass={pass} />
</div>
</div>
{pass && (
{DEVICE_TYPE !== 'MOB' && pass && (
<>
<div className={bottomAnimation[isMakers ? 'makers' : 'sopt']} />
{isMakers ? (
Expand All @@ -95,6 +137,7 @@ const FinalResult = () => {
)}
</>
)}
<div className={scrollBottomGradVar[DEVICE_TYPE]} />
</section>
);
};
Expand Down
78 changes: 44 additions & 34 deletions src/views/ResultPage/components/ScreeningResult.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { ko } from 'date-fns/locale';
import { useContext, useEffect } from 'react';

import Title from '@components/Title';
import { useDevice } from '@hooks/useDevice';
import { RecruitingInfoContext } from '@store/recruitingInfoContext';
import BigLoading from 'views/loadings/BigLoding';

Expand All @@ -12,7 +13,7 @@ import {
bottomSvg,
container,
content,
contentWrapper,
contentWrapperVar,
link,
strongText,
} from './style.css';
Expand All @@ -22,17 +23,9 @@ import imgSoptLogoWebp from '../assets/imgSoptLogo.webp';
import useGetScreeningResult from '../hooks/useGetScreeningResult';

const Content = ({ pass }: { pass?: boolean }) => {
const DEVICE_TYPE = useDevice();
const {
recruitingInfo: {
name,
soptName,
season,
group,
interviewStart,
interviewEnd,
applicationPassConfirmStart,
isMakers,
},
recruitingInfo: { name, soptName, season, interviewStart, interviewEnd, applicationPassConfirmStart, isMakers },
} = useContext(RecruitingInfoContext);

if (!name) return;
Expand All @@ -41,54 +34,70 @@ const Content = ({ pass }: { pass?: boolean }) => {
const applicationPassConfirmNextDay = new Date(applicationDate);
applicationPassConfirmNextDay.setDate(applicationDate.getDate() + 1);

const formattedInterviewStart = format(new Date(interviewStart || ''), 'M/dd(E)', { locale: ko });
const formattedInterviewEnd = format(new Date(interviewEnd || ''), 'M/dd(E)', { locale: ko });
const formattedApplicationPassConfirmStart = format(applicationDate, 'dd일 EEEE', {
const formattedInterviewStart = format(new Date(interviewStart || ''), 'M월 dd일', { locale: ko });
const formattedInterviewEnd = format(new Date(interviewEnd || ''), 'M월 dd일', { locale: ko });
const formattedApplicationPassConfirmStart = format(applicationDate, 'M월 dd일 EEEE', {
locale: ko,
});
const formattedApplicationPassConfirmNextDay = format(new Date(applicationPassConfirmNextDay || ''), 'dd일 EEEE', {
const formattedApplicationPassConfirmNextDay = format(new Date(applicationPassConfirmNextDay || ''), 'M월 dd일', {
locale: ko,
});

return (
<>
{pass ? (
<p className={content}>
<span>{`안녕하세요. ${season}기 ${soptName} 입니다.\n\n`}</span>
<span>{`안녕하세요. SOPT ${soptName} 입니다.\n\n`}</span>
<strong className={strongText[isMakers ? 'makers' : 'sopt']}>{`축하드립니다!`}</strong>
<span>
{`
서류 검토 결과, ${name}님은 면접 대상자로 선정되셨습니다.
서류 검토 결과, ${name}님은 인터뷰 대상자로 선정되셨습니다.

${season}기 SOPT ${soptName} 인터뷰는 ${formattedInterviewStart} ~ ${formattedInterviewEnd} 기간 중 진행될 예정입니다.

${season}기 ${soptName} ${!isMakers ? group : ''} 면접은 ${formattedInterviewStart} ~ ${formattedInterviewEnd} 양일 간 오프라인 으로 진행될 예정입니다.
모든 면접 대상자 분들은 아래 구글폼을 제출해주세요.
원할한 면접 진행을 위해, 아래 구글 폼에 불가능한 시간대를 모두 선택해 제출 부탁드립니다.
( 제출 마감 : ${formattedApplicationPassConfirmStart} 오후 8시 )
`}
</span>
<a className={link} href="https://sopt.org" target="_blank" rel="noreferrer noopener">
{import.meta.env.VITE_PASS_LINK}
<span>{`( 구글폼 : `}</span>
<a
className={link}
href={`https://${import.meta.env.VITE_SCREENING_PASS_LINK}`}
target="_blank"
rel="noreferrer noopener">
{`https://${DEVICE_TYPE !== 'DESK' && '\n'}${import.meta.env.VITE_SCREENING_PASS_LINK}`}
</a>
<span>{` )\n`}</span>
<br />
<span>
{`
위 구글폼은 금일 20시 정각(${formattedApplicationPassConfirmStart} 오후 8시)까지 제출해주셔야 합니다.
면접 안내 사항 및 폼 제출 내용을 기반으로 한 면접 시간표를
내일(${formattedApplicationPassConfirmNextDay}) 오후 12시 전으로 이메일을 통해 전해드리겠습니다.

제출해주신 폼 내용을 기반으로 확정된 면접 일정 및 면접 안내를 내일(${formattedApplicationPassConfirmNextDay}) 오후 12시 전으로 이메일을 통해 공유드리겠습니다.

다시 한 번 진심으로 축하드리며, 인터뷰에서 뵙겠습니다!

문의 사항 및 궁금한 점은 아래 연락처로 문의 부탁드립니다.
정동규 : 010-8696-3713
감사합니다.

SOPT makers 운영진 드림
`}
</span>
<span>{`다시 한 번 진심으로 축하드리며, 면접에서 뵙도록 하겠습니다. :)`}</span>
</p>
) : (
<p className={content}>
{`안녕하세요. ${soptName}입니다.

${name}님은 ${season}기 ${soptName} ${!isMakers ? group : ''} 신입회원 서류 모집에 불합격하셨습니다.
{`안녕하세요, SOPT ${soptName}입니다.

SOPT makers에 관심을 갖고 지원해 주셔서 감사드립니다.

${name}님의 뛰어난 역량과 잠재력에도 불구하고 안타깝게도 귀하의 합격 소식을 전해드리지 못하게 되었습니다.

지원자님의 뛰어난 역량과 잠재력에도 불구하고 안타깝게도 귀하의 합격 소식을
전해드리지 못하게 되었습니다.
비록 이번 ${season}기 ${soptName}에 모시지 못하게 되었으나, ${soptName}에 지원하시고자 쓰인 소중한 시간과 노력이 지원자님께서 IT 창업인으로서 멋진 역할을 해나가시는 데 작게나마 도움이 되는 경험이 되시길 바랍니다.

한 분 한 분에게 개별적인 피드백을 드리기는 어렵겠으나 저희 SOPT에 지원하셨던
경험이 한 사람의 IT 창업인으로서 멋진 역할을 해나가시는 데 큰 도움이 되기를 바랍니다.
SOPT ${soptName}에 귀한 시간을 내어주셔서 다시 한 번 깊이 감사드립니다 :)
향후에 더 좋은 인연으로 뵙기를 기다리겠습니다.
감사합니다.

SOPT ${soptName} 운영진 드림
`}
</p>
)}
Expand All @@ -97,6 +106,7 @@ const Content = ({ pass }: { pass?: boolean }) => {
};

const ScreeningResult = () => {
const DEVICE_TYPE = useDevice();
const {
recruitingInfo: { isMakers },
handleSaveRecruitingInfo,
Expand All @@ -117,7 +127,7 @@ const ScreeningResult = () => {

return (
<section className={container}>
<div className={contentWrapper}>
<div className={contentWrapperVar[DEVICE_TYPE]}>
<Title>결과 확인</Title>
<Content pass={pass} />
</div>
Expand Down
Loading