Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 3 additions & 2 deletions src/app/(main)/community/[category]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,14 @@ import useDebounce from '@/hooks/useDebounce';
import useCheckReviewWriteAccess from '@/lib/hooks/useCheckReviewWriteAccess';
import useGetCommentarySearchResults from '@/lib/hooks/useGetCommentarySearchResults';
import useGetTotalSearchResults from '@/lib/hooks/useGetTotalSearchResults';
import { certificateIdAtom } from '@/recoil/atom';
import { certificateIdAtom, certificateNameAtom } from '@/recoil/atom';
import { commentarySearchQuestionSequence } from '@/recoil/community/atom';
import { BoardType, SortFieldKorType, SortFieldType } from '@/types/community/type';

export default function CommunityCategoryPage() {
const [ref, inView] = useInView();
const certificateId = useRecoilValue(certificateIdAtom);
const selectedCertificationName = useRecoilValue<string>(certificateNameAtom);
//필터값
const [selectedNormalAndTipFilterContent, setSelectedNormalAndTipFilterContent] =
useState<SortFieldKorType>('최신순');
Expand Down Expand Up @@ -147,7 +148,7 @@ export default function CommunityCategoryPage() {
}}
/>
}
title={'정보처리기사 게시판'} //TODO: 게시판 내용으로 바꿀 예정
title={selectedCertificationName}
/>
<div className={'flex flex-col gap-y-4 bg-gray0 min-h-screen'}>
{/*boardType 변경 메뉴*/}
Expand Down
5 changes: 4 additions & 1 deletion src/app/(main)/exam/page.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
'use client';
import React, { useEffect, useState } from 'react';
import { useRecoilValue } from 'recoil';

import Banner from '@/components/common/Banner';
import Header from '@/components/common/Header';
Expand All @@ -12,6 +13,7 @@ import YearSelector from '@/components/exam/YearSelector';
import StopWatchActiveButton from '@/components/stopwatch/StopWatchActiveButton';
import useDelayOver from '@/hooks/useDelayOver';
import useGetMockExamYears from '@/lib/hooks/useGetMockExamYears';
import { certificateIdAtom } from '@/recoil/atom';

const Exam = () => {
return (
Expand All @@ -24,7 +26,8 @@ const Exam = () => {
};

const SolveExamBox = () => {
const { examYears, examYearsIsLoading } = useGetMockExamYears();
const certificateId = useRecoilValue(certificateIdAtom);
const { examYears, examYearsIsLoading } = useGetMockExamYears(certificateId);
const [isClickedYearSelector, setIsClickedYearSelector] = useState<boolean>(false);
const [selectedYear, setSelectedYear] = useState<number | null>(null);
const [isRandomMockExamModalOpen, setIsRandomMockExamModalOpen] = useState(false);
Expand Down
54 changes: 35 additions & 19 deletions src/app/(main)/home/goal-setting/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import { useRouter } from 'next/navigation';
import * as React from 'react';
import { useEffect, useState } from 'react';
import { useState } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil';
import { useSWRConfig } from 'swr';

Expand All @@ -15,12 +15,14 @@ import SetGoalScore from '@/components/home/goal-setting/SetGoalScore';
import SettingNewGoalModal from '@/components/home/goal-setting/SettingNewGoalModal';
import { postGoalSettingData, putGoalSettingData } from '@/lib/api/home';
import useGetGoalSettingData from '@/lib/hooks/useGetGoalSettingData';
import useGetMockExams from '@/lib/hooks/useGetMockExams';
import useGetUserGoals from '@/lib/hooks/useGetUserGoals';
import { certificateIdAtom } from '@/recoil/atom';
import { goalSettingCertificateId, goalSettingState } from '@/recoil/home/atom';

const GoalSetting = () => {
const certificateId = useRecoilValue(certificateIdAtom);
const { mockExams } = useGetMockExams(certificateId, 2024);
// 선택된 자격증 Id
const [selectedCertificationId, setSelectedCertificationId] = useRecoilState<number | undefined>(
goalSettingCertificateId,
Expand Down Expand Up @@ -67,18 +69,33 @@ const GoalSetting = () => {
* 목표를 새로 생성할 때, state를 변경하는 함수
*/
const resetGoalSettingState = () => {
return {
goalScore: 100,
prepareStartDateTime: new Date().toISOString(),
prepareFinishDateTime: new Date().toISOString(),
goalPrepareDays: 0,
mockExamsPerDay: 0,
goalMockExams: 0,
mockExamRepeatDays: [],
studyTimePerDay: 0,
goalStudyTime: 0,
studyRepeatDays: [],
};
if (mockExams && mockExams.length > 0) {
return {
goalScore: mockExams[0].maxScore as number,
prepareStartDateTime: new Date().toISOString(),
prepareFinishDateTime: new Date().toISOString(),
goalPrepareDays: 0,
mockExamsPerDay: 0,
goalMockExams: 0,
mockExamRepeatDays: [],
studyTimePerDay: 0,
goalStudyTime: 0,
studyRepeatDays: [],
};
} else {
return {
goalScore: 100,
prepareStartDateTime: new Date().toISOString(),
prepareFinishDateTime: new Date().toISOString(),
goalPrepareDays: 0,
mockExamsPerDay: 0,
goalMockExams: 0,
mockExamRepeatDays: [],
studyTimePerDay: 0,
goalStudyTime: 0,
studyRepeatDays: [],
};
}
};

/**
Expand Down Expand Up @@ -108,10 +125,6 @@ const GoalSetting = () => {
setGoalData(resetState);
};

// useEffect(() => {
// console.log('goalData', goalData);
// }, [goalData]);

return (
<div className={'min-h-screen'}>
{isSettingNewGoalModalOpen && userGoals ? (
Expand All @@ -131,7 +144,9 @@ const GoalSetting = () => {
isResetButtonClick ? (
<Button
onClick={async () => {
await postGoalSettingData(goalData, selectedCertificationId);
await postGoalSettingData(goalData, selectedCertificationId).then((r) => {
console.log('목표 저장 성공~r', r);
});
await mutate(`/certificates/${certificateId}/goals`);
setIsResetButtonClick(false);
router.push('/home');
Expand All @@ -143,6 +158,7 @@ const GoalSetting = () => {
<Button
onClick={() => {
putGoalSettingData(goalData, getLastGoalId() || 0).then((r) => {
console.log('목표 수정 성공', r);
router.push('/home');
});
}}
Expand All @@ -151,7 +167,7 @@ const GoalSetting = () => {
</Button>
)
}></Header>
<div className="flex flex-col gap-y-8 mx-5">
<div className="flex flex-col gap-y-8 mx-5 mb-8">
{/*자격증 선택*/}
{isResetButtonClick ? <SelectCertification /> : null}
{/*목표 점수 설정*/}
Expand Down
78 changes: 50 additions & 28 deletions src/app/(main)/home/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ import BestTip from '@/components/home/BestTip';
import GoalSettingStatusModal from '@/components/home/goal-setting/GoalSettingStatusModal';
import GoalBox from '@/components/home/GoalBox';
import RecentGrowthChart from '@/components/home/RecentGrowthChart';
import AverageAccurayChatSkeleton from '@/components/home/skeleton/AverageAccurayChatSkeleton';
import AverageTakenTimeGraphReportSkeleton from '@/components/home/skeleton/AverageTakenTimeGraphReportSkeleton';
import GoalBoxSkeleton from '@/components/home/skeleton/GoalBoxSkeleton';
import HomeSkeleton from '@/components/home/skeleton/HomeSkeleton';
import TodayGoalSkeleton from '@/components/home/skeleton/TodayGoalSkeleton';
import StopWatchActiveButton from '@/components/stopwatch/StopWatchActiveButton';
import TodayGoal from '@/components/TodayGoal';
import useAverageSubjectInfo from '@/lib/hooks/useAverageSubjectInfo';
Expand Down Expand Up @@ -143,34 +148,51 @@ function HomeComponents() {
<div className="bg-gray0 h-screen overflow-y-auto">
<Header />
<Header headerType={'second'}></Header>
<div className={'mt-4 px-5 flex flex-col gap-y-5'}>
{goalAchievementData && (
<GoalBox
goalMockExams={goalAchievementData.result.goalMockExams}
currentMockExams={goalAchievementData.result.currentMockExams}
goalStudyTime={goalAchievementData.result.goalStudyTime}
currentStudyTime={goalAchievementData.result.currentStudyTime}
maxScore={goalAchievementData.result.maxScore}
goalScore={goalAchievementData.result.goalScore}
/>
)}
{goalAchievementData && (
<TodayGoal
todayMockExams={goalAchievementData.result.todayMockExams}
mockExamsPerDay={goalAchievementData.result.mockExamsPerDay}
todayStudyTime={goalAchievementData.result.todayStudyTime}
studyTimePerDay={goalAchievementData.result.studyTimePerDay}
/>
)}
<RecentGrowthChart />
<AverageAccurayChat subjectResults={averageSubjectList || []} />
<AverageTakenTimeGraphReport
totalTakenTime={sumTotalTakenTime()}
subjectResults={averageSubjectList}
timeLimit={averageSubjectList && averageSubjectList.length > 0 ? averageSubjectList[0].timeLimit : 0}
/>
<BestTip />
</div>
{userGoals ? (
<div className={'mt-4 px-5 flex flex-col gap-y-5'}>
{goalAchievementData ? (
<GoalBox
goalMockExams={goalAchievementData.result.goalMockExams}
currentMockExams={goalAchievementData.result.currentMockExams}
goalStudyTime={goalAchievementData.result.goalStudyTime}
currentStudyTime={goalAchievementData.result.currentStudyTime}
maxScore={goalAchievementData.result.maxScore}
goalScore={goalAchievementData.result.goalScore}
/>
) : (
<GoalBoxSkeleton />
)}
{goalAchievementData ? (
<TodayGoal
todayMockExams={goalAchievementData.result.todayMockExams}
mockExamsPerDay={goalAchievementData.result.mockExamsPerDay}
todayStudyTime={goalAchievementData.result.todayStudyTime}
studyTimePerDay={goalAchievementData.result.studyTimePerDay}
/>
) : (
<TodayGoalSkeleton />
)}
<RecentGrowthChart />

{averageSubjectList ? (
<AverageAccurayChat subjectResults={averageSubjectList} />
) : (
<AverageAccurayChatSkeleton />
)}
{averageSubjectList ? (
<AverageTakenTimeGraphReport
totalTakenTime={sumTotalTakenTime()}
subjectResults={averageSubjectList}
timeLimit={averageSubjectList && averageSubjectList.length > 0 ? averageSubjectList[0].timeLimit : 0}
/>
) : (
<AverageTakenTimeGraphReportSkeleton />
)}
<BestTip />
</div>
) : (
<HomeSkeleton />
)}
<div className={'h-[120px]'}></div>
<StopWatchActiveButton />
<NavBar />
Expand Down
37 changes: 20 additions & 17 deletions src/app/(main)/mypage/comment/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,27 +46,30 @@ export default function MyComment() {
};

return (
<>
<div className={'bg-gray0'}>
<Header headerType={'dynamic'} title={'내가 작성한 댓글'} rightElement={<EmptyIcon />} />
<div className={'py-6 bg-gray0 min-h-screen'}>
<div className={'py-6 min-h-screen'}>
<div className={'relative px-5 flex flex-col gap-y-4 '}>
{/*필터*/}
<div className={' w-fit flex px-3 py-1 rounded-full bg-white '}>
<span className={'text-gray4 text-h6'}>{selectedFilterContent}</span>
<div className={'relative'}>
<div className={'w-fit flex px-3 py-1 rounded-full bg-white'}>
<span className={'text-gray4 text-h6'}>{selectedFilterContent}</span>
{isOpenFilter ? (
<ActivationIcon onClick={() => setIsOpenFilter(!isOpenFilter)} />
) : (
<DisableIcon onClick={() => setIsOpenFilter(!isOpenFilter)} />
)}
</div>
{isOpenFilter ? (
<ActivationIcon onClick={() => setIsOpenFilter(!isOpenFilter)} />
) : (
<DisableIcon onClick={() => setIsOpenFilter(!isOpenFilter)} />
)}
<MyPageFilter
isFilterOpen={isOpenFilter}
setSelectedFilterContent={setSelectedFilterContent}
setIsFilterOpen={setIsOpenFilter}
data={filterContent}
className={'top-8'}
/>
) : null}
</div>
{isOpenFilter ? (
<MyPageFilter
isFilterOpen={isOpenFilter}
setSelectedFilterContent={setSelectedFilterContent}
setIsFilterOpen={setIsOpenFilter}
data={filterContent}
/>
) : null}
<div className={'flex flex-col gap-y-4'}>
{userCommentPostsList
? userCommentPostsList.map((userCommentPosts: MyPostsResponseType) => {
Expand Down Expand Up @@ -110,7 +113,7 @@ export default function MyComment() {
<div className={'h-[100px]'} />
<StopWatchActiveButton />
<NavBar />
</>
</div>
);
}
const DisableIcon = (props: SVGProps<SVGSVGElement>) => (
Expand Down
30 changes: 15 additions & 15 deletions src/app/(main)/mypage/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export default function MyPage() {
const [isUnRegisterModalOpen, setIsUnRegisterModalOpen] = useState<boolean>(false);

return (
<>
<div className={'bg-gray0'}>
{isLogoutModalOpen ? (
<LogoutModal isLogoutModalOpen={isLogoutModalOpen} setIsLogoutModalOpen={setIsLogoutModalOpen} />
) : null}
Expand All @@ -26,7 +26,7 @@ export default function MyPage() {
/>
) : null}
<Header />
<div className={'flex flex-col gap-y-6 bg-gray0 min-h-screen border-t-[1px] border-t-gray1'}>
<div className={'flex flex-col gap-y-6 min-h-screen border-t-[1px] border-t-gray1'}>
<MyPageHeader />
<div className={'mx-5 flex flex-col gap-y-3'}>
{/* 게시판 */}
Expand All @@ -39,21 +39,21 @@ export default function MyPage() {
<div className={'flex flex-col gap-y-3 bg-white rounded-[24px] p-4'}>
<div className={'text-h6 text-gray4'}>계정관리</div>
<div className={'flex flex-col gap-y-2'}>
<div className={'px-5 py-5 flex justify-between bg-gray0 rounded-[16px] '}>
<div
onClick={() => {
setIsLogoutModalOpen(!isLogoutModalOpen);
}}
className={'px-5 py-5 flex justify-between bg-gray0 rounded-[16px] cursor-pointer'}>
<div className={'text-h6'}>로그아웃</div>
<MoveIcon
onClick={() => {
setIsLogoutModalOpen(!isLogoutModalOpen);
}}
/>
<MoveIcon />
</div>
<div className={'px-5 py-5 flex justify-between bg-gray0 rounded-[16px] '}>
<div
onClick={() => {
setIsUnRegisterModalOpen(!isUnRegisterModalOpen);
}}
className={'px-5 py-5 flex justify-between bg-gray0 rounded-[16px] '}>
<div className={'text-h6'}>탈퇴하기</div>
<MoveIcon
onClick={() => {
setIsUnRegisterModalOpen(!isUnRegisterModalOpen);
}}
/>
<MoveIcon />
</div>
</div>
</div>
Expand All @@ -64,7 +64,7 @@ export default function MyPage() {
<div className={'h-[100px] bg-gray0'} />
<StopWatchActiveButton />
<NavBar />
</>
</div>
);
}

Expand Down
4 changes: 1 addition & 3 deletions src/app/(main)/mypage/profile/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,7 @@ const ProfileSettings = () => {

<button
type={'submit'}
className={
'w-full bg-gray2 h-[100px] rounded-t-[32px] text-white text-h3 fixed bottom-0 hover:bg-primary transition'
}>
className={'w-full h-[100px] rounded-t-[32px] text-white text-h3 fixed bottom-0 bg-primary transition'}>
<div className="text-white text-h3 py-[25px]">완료</div>
</button>
</form>
Expand Down
Loading