Skip to content

Commit 6088935

Browse files
authored
fix: 모임 인원 초과 및 결과 생성 완료 시 Toast 커스텀 기능 추가 (#116)
* fix: ToastLinkButton 컴포넌트를 추가로 개발하여 Toast 에 추가 진행 * fix: 모임 인원이 다 찼거나 이미 결과가 생성된 경우에 대한 Toast 커스텀 진행 * fix: 닉네임 중복인 경우에 대해서도 추천 결과 보기로 리디렉션 되도록 수정
1 parent 30d23d2 commit 6088935

File tree

4 files changed

+54
-29
lines changed

4 files changed

+54
-29
lines changed
Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
"use client";
22

3+
import { compact } from "es-toolkit";
4+
import { useParams, useRouter } from "next/navigation";
35
import { useForm } from "react-hook-form";
46
import { zodResolver } from "@hookform/resolvers/zod";
7+
8+
import { useCreateParticipant } from "#/hooks/apis";
9+
import { ToastLinkButton } from "#/pageComponents/gathering/opinion";
510
import {
611
opinionFormSchema,
712
distanceRangeToKm,
813
type OpinionFormSchema,
914
} from "#/schemas/gathering";
10-
import { useCreateParticipant } from "../apis/participant";
11-
import { useParams, useRouter } from "next/navigation";
1215
import { ERROR_CODES, isApiError } from "#/utils/api";
1316
import { toast } from "#/utils/toast";
14-
import { compact } from "es-toolkit";
15-
import { createElement } from "react";
16-
import { ArrowLeftIcon } from "#/icons/arrowLeftIcon";
1717

1818
export function useOpinionForm() {
1919
const router = useRouter();
@@ -53,29 +53,24 @@ export function useOpinionForm() {
5353
router.replace(`/gathering/${accessKey}/opinion/pending`);
5454
} catch (error) {
5555
if (isApiError(error)) {
56-
if (error.errorCode === ERROR_CODES.GATHERING_FULL) {
57-
toast.warning(error.message, {
58-
action: createElement(
59-
"button",
60-
{
61-
type: "button",
62-
className:
63-
"ygi:flex ygi:ml-auto ygi:items-center ygi:gap-0.5 ygi:justify-center ygi:cursor-pointer ygi:text-palette-primary-500 ygi:body-14-sb",
64-
onClick: () => {
65-
router.push(
66-
`/gathering/${accessKey}/opinion/result`,
67-
);
68-
},
69-
},
70-
"추천 결과 보기",
71-
createElement(ArrowLeftIcon, {
72-
size: 20,
73-
className:
74-
"ygi:text-palette-primary-500 ygi:rotate-180",
75-
}),
76-
),
77-
});
78-
return;
56+
switch (error.errorCode) {
57+
case ERROR_CODES.GATHERING_FULL:
58+
case ERROR_CODES.DUPLICATE_NICKNAME:
59+
case ERROR_CODES.RECOMMEND_ALREADY_PROCEEDED: {
60+
toast.warning(error.message, {
61+
action: (
62+
<ToastLinkButton
63+
label="추천 결과 보기"
64+
onClick={() => {
65+
router.push(
66+
`/gathering/${accessKey}/opinion/result`,
67+
);
68+
}}
69+
/>
70+
),
71+
});
72+
return;
73+
}
7974
}
8075

8176
toast.warning(error.message);
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"use client";
2+
3+
import { twJoin } from "tailwind-merge";
4+
5+
import { ArrowLeftIcon } from "#/icons/arrowLeftIcon";
6+
7+
interface ToastLinkButtonProps {
8+
label: string;
9+
onClick: () => void;
10+
}
11+
12+
export const ToastLinkButton = ({ label, onClick }: ToastLinkButtonProps) => {
13+
return (
14+
<button
15+
type="button"
16+
className={twJoin(
17+
"ygi:ml-auto ygi:flex ygi:items-center ygi:justify-center ygi:gap-0.5",
18+
"ygi:cursor-pointer ygi:body-14-sb ygi:text-palette-primary-500",
19+
)}
20+
onClick={onClick}
21+
>
22+
{label}
23+
<ArrowLeftIcon
24+
size={20}
25+
className="ygi:rotate-180 ygi:text-palette-primary-500"
26+
/>
27+
</button>
28+
);
29+
};

src/pageComponents/gathering/opinion/form/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ export { OpinionFormPage } from "./OpinionFormPage";
22
export { NicknameStep } from "./NicknameStep";
33
export { DistanceStep } from "./DistanceStep";
44
export { DislikeStep } from "./DislikeStep";
5+
export { ToastLinkButton } from "./ToastLinkButton";
56
export { PreferenceStep } from "./PreferenceStep";

src/pageComponents/gathering/opinion/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export { LandingPage } from "./landing";
2-
export { OpinionFormPage } from "./form";
2+
export { OpinionFormPage, ToastLinkButton } from "./form";
33
export { PendingPage } from "./pending";
44
export { CompletePage } from "./complete";
55
export { ResultPage } from "./result";

0 commit comments

Comments
 (0)