diff --git a/apps/admin/public/images/logo.jpeg b/apps/admin/public/images/logo.jpeg deleted file mode 100644 index fa344690..00000000 Binary files a/apps/admin/public/images/logo.jpeg and /dev/null differ diff --git a/apps/admin/public/images/logo.png b/apps/admin/public/images/logo.png new file mode 100644 index 00000000..7031e3a0 Binary files /dev/null and b/apps/admin/public/images/logo.png differ diff --git a/apps/admin/src/components/GNB.tsx b/apps/admin/src/components/GNB.tsx index c0665510..cdc7ab0a 100644 --- a/apps/admin/src/components/GNB.tsx +++ b/apps/admin/src/components/GNB.tsx @@ -6,7 +6,7 @@ const GNB = () => { return (
- 로고이미지 + 로고이미지
diff --git a/apps/service/src/app/@modal/(.)comming-soon-modal/page.tsx b/apps/service/src/app/@modal/(.)comming-soon-modal/page.tsx new file mode 100644 index 00000000..e0605706 --- /dev/null +++ b/apps/service/src/app/@modal/(.)comming-soon-modal/page.tsx @@ -0,0 +1,24 @@ +'use client'; +import { BaseModalTemplate, RouteModal } from '@components'; +import { useRouter } from 'next/navigation'; + +const page = () => { + const router = useRouter(); + + return ( + + + + + + + router.back()}> + 닫기 + + + + + ); +}; + +export default page; diff --git a/apps/service/src/app/@modal/(.)image-modal/page.tsx b/apps/service/src/app/@modal/(.)image-modal/page.tsx index 9aae96ed..7dfcb836 100644 --- a/apps/service/src/app/@modal/(.)image-modal/page.tsx +++ b/apps/service/src/app/@modal/(.)image-modal/page.tsx @@ -8,11 +8,9 @@ const page = () => { return ( - full image +
+ full image +
); }; diff --git a/apps/service/src/app/@modal/comming-soon-modal/page.tsx b/apps/service/src/app/@modal/comming-soon-modal/page.tsx new file mode 100644 index 00000000..1554449f --- /dev/null +++ b/apps/service/src/app/@modal/comming-soon-modal/page.tsx @@ -0,0 +1,7 @@ +import { redirect } from 'next/navigation'; + +const page = () => { + redirect('/'); +}; + +export default page; diff --git a/apps/service/src/app/problem/solve/[publishId]/[problemId]/SolveButtonsClient.tsx b/apps/service/src/app/problem/solve/[publishId]/[problemId]/SolveButtonsClient.tsx index 992ea96d..3dcbb8cf 100644 --- a/apps/service/src/app/problem/solve/[publishId]/[problemId]/SolveButtonsClient.tsx +++ b/apps/service/src/app/problem/solve/[publishId]/[problemId]/SolveButtonsClient.tsx @@ -2,7 +2,7 @@ import { SolveButton } from '@components'; import { getChildData, postChildProblemSubmit, postProblemSubmit } from '@apis'; import { useRouter } from 'next/navigation'; -import { useTrackEvent } from '@hooks'; +import { useInvalidate, useTrackEvent } from '@hooks'; interface SolveButtonsClientProps { publishId: string; @@ -11,26 +11,29 @@ interface SolveButtonsClientProps { const SolveButtonsClient = ({ publishId, problemId }: SolveButtonsClientProps) => { const router = useRouter(); + const { invalidateAll } = useInvalidate(); const { trackEvent } = useTrackEvent(); const { data } = getChildData(publishId, problemId); - const childProblemId = data?.data?.childProblemIds[0].toString(); + const childProblemId = data?.data?.childProblemIds[0]; const handleClickDirect = async () => { trackEvent('problem_solve_direct_button_click'); await postProblemSubmit(publishId, problemId); + invalidateAll(); router.push(`/problem/solve/${publishId}/${problemId}/main-problem`); }; const handleClickStep = async () => { trackEvent('problem_solve_step_button_click'); await postChildProblemSubmit(publishId, problemId); + invalidateAll(); router.push(`/problem/solve/${publishId}/${problemId}/child-problem/${childProblemId}`); }; return (
- + {childProblemId && }
); }; diff --git a/apps/service/src/app/problem/solve/[publishId]/[problemId]/child-problem/[childProblemId]/page.tsx b/apps/service/src/app/problem/solve/[publishId]/[problemId]/child-problem/[childProblemId]/page.tsx index c3e71cf9..33315c6b 100644 --- a/apps/service/src/app/problem/solve/[publishId]/[problemId]/child-problem/[childProblemId]/page.tsx +++ b/apps/service/src/app/problem/solve/[publishId]/[problemId]/child-problem/[childProblemId]/page.tsx @@ -14,6 +14,7 @@ import { ChildAnswerCheckModalTemplate, TwoButtonModalTemplate, AnswerModalTemplate, + Tag, } from '@components'; import { useInvalidate, useModal, useTrackEvent } from '@hooks'; import { components } from '@schema'; @@ -142,9 +143,21 @@ const Page = () => {
-

- 새끼 문제 {problemNumber}-{childProblemNumber}번 -

+
+

+ 새끼 문제 {problemNumber}-{childProblemNumber}번 +

+ {isSolved && ( + + 정답 + + )} + {status === 'INCORRECT' && ( + + 오답 + + )} +
{`새끼 { diff --git a/apps/service/src/app/problem/solve/[publishId]/[problemId]/main-problem/page.tsx b/apps/service/src/app/problem/solve/[publishId]/[problemId]/main-problem/page.tsx index 60501f9f..fef64c3f 100644 --- a/apps/service/src/app/problem/solve/[publishId]/[problemId]/main-problem/page.tsx +++ b/apps/service/src/app/problem/solve/[publishId]/[problemId]/main-problem/page.tsx @@ -9,10 +9,10 @@ import { MainAnswerCheckModalTemplate, PortalModal, Tag, - TimeTag, ProgressHeader, SmallButton, NavigationFooter, + TimeTag, } from '@components'; import { useInvalidate, useModal, useTrackEvent } from '@hooks'; import { ProblemStatus } from '@types'; @@ -62,7 +62,7 @@ const Page = () => { const isSolved = status === 'CORRECT' || status === 'RETRY_CORRECT'; const isSubmitted = status === 'CORRECT' || status === 'RETRY_CORRECT' || status === 'INCORRECT'; const isDirect = - childProblemStatuses.length === 0 || + childProblemStatuses.length > 0 && childProblemStatuses[childProblemStatuses.length - 1] === 'NOT_STARTED'; const prevButtonLabel = isDirect @@ -114,8 +114,20 @@ const Page = () => {
-

메인 문제 {number}번

- +
+

메인 문제 {number}번

+ +
+ {isSolved && ( + + 정답 + + )} + {status === 'INCORRECT' && ( + + 오답 + + )}
{
)} -
- {!isDirect && childProblemStatuses.length > 0 && ( -
-

새끼 문제 정답

-
- {childProblemStatuses.map((childProblemStatus, index) => ( -
- - {number}-{index + 1}번 - - - {statusLabel[childProblemStatus]} - -
- ))} + {!isDirect && childProblemStatuses.length > 0 && ( +
+

새끼 문제 정답

+
+ {childProblemStatuses.map((childProblemStatus, index) => ( +
+ + {number}-{index + 1}번 + + + {statusLabel[childProblemStatus]} + +
+ ))} +
-
- )} + )} +
diff --git a/apps/service/src/app/report/[publishId]/[problemId]/analysis/page.tsx b/apps/service/src/app/report/[publishId]/[problemId]/analysis/page.tsx index 4a5d781f..e65b3402 100644 --- a/apps/service/src/app/report/[publishId]/[problemId]/analysis/page.tsx +++ b/apps/service/src/app/report/[publishId]/[problemId]/analysis/page.tsx @@ -12,8 +12,13 @@ const Page = () => { const router = useRouter(); const { publishId, problemId } = useParams(); const { trackEvent } = useTrackEvent(); - const { problemNumber, answer, mainAnalysisImageUrl, mainHandwritingExplanationImageUrl } = - useReportContext(); + const { + problemNumber, + answerType, + answer, + mainAnalysisImageUrl, + mainHandwritingExplanationImageUrl, + } = useReportContext(); const [selectedTab, setSelectedTab] = useState<'분석' | '손해설'>('분석'); const handleClickTab = (tab: '분석' | '손해설') => { @@ -43,7 +48,10 @@ const Page = () => {

메인 문제 {problemNumber}번

정답 - {answer}번 + + {answer} + {answerType === 'MULTIPLE_CHOICE' && '번'} +
diff --git a/apps/service/src/assets/svg/IcCalendar.tsx b/apps/service/src/assets/svg/IcCalendar.tsx new file mode 100644 index 00000000..95af7f5e --- /dev/null +++ b/apps/service/src/assets/svg/IcCalendar.tsx @@ -0,0 +1,36 @@ +import type { SVGProps } from 'react'; +import { memo } from 'react'; +interface SVGRProps { + title?: string; + titleId?: string; +} +const SvgIcCalendar = ({ title, titleId, ...props }: SVGProps & SVGRProps) => ( + + {title ? {title} : null} + + + + + + + + + + + + +); +const Memo = memo(SvgIcCalendar); +export default Memo; diff --git a/apps/service/src/assets/svg/index.ts b/apps/service/src/assets/svg/index.ts index e22885dc..c18c0573 100644 --- a/apps/service/src/assets/svg/index.ts +++ b/apps/service/src/assets/svg/index.ts @@ -1,3 +1,4 @@ +export { default as IcCalendar } from './IcCalendar'; export { default as IcCopy } from './IcCopy'; export { default as IcCorrect } from './IcCorrect'; export { default as IcDirect } from './IcDirect'; diff --git a/apps/service/src/components/home/GuideButton.tsx b/apps/service/src/components/home/GuideButton.tsx index 8f9a0145..a014a365 100644 --- a/apps/service/src/components/home/GuideButton.tsx +++ b/apps/service/src/components/home/GuideButton.tsx @@ -3,7 +3,7 @@ import Link from 'next/link'; const GuideButton = () => { return ( - +
diff --git a/apps/service/src/components/home/ProblemSwiper/ProblemSwiper.tsx b/apps/service/src/components/home/ProblemSwiper/ProblemSwiper.tsx index 5374fe23..c3b3a89b 100644 --- a/apps/service/src/components/home/ProblemSwiper/ProblemSwiper.tsx +++ b/apps/service/src/components/home/ProblemSwiper/ProblemSwiper.tsx @@ -42,13 +42,9 @@ const renderProblemCard = (problem: ProblemSetHomeFeedResponse, dateString: stri }; const ProblemSwiper = ({ problemSets }: ProblemSwiperProps) => { - const initialSlide = problemSets.findIndex( - (problem) => problem.date === dayjs().format('YYYY-MM-DD') - ); + const dayOfWeek = dayjs().day(); - if (initialSlide === -1) { - return null; - } + const initialSlide = dayOfWeek === 0 || dayOfWeek === 6 ? 4 : dayOfWeek - 1; return (