From 33859b27c5ef3631748f36259ea7f409b0620fba Mon Sep 17 00:00:00 2001
From: jyjy1229 <kimjy18@kaist.ac.kr>
Date: Tue, 12 Mar 2024 23:31:34 +0900
Subject: [PATCH 01/21] Add click event to profile image

---
 .../Chat/MessagesBody/MessageSet/index.tsx    | 87 ++++++++++---------
 1 file changed, 47 insertions(+), 40 deletions(-)

diff --git a/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx b/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
index 5bd3cf8f5..af9d369bf 100644
--- a/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
+++ b/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
@@ -1,9 +1,10 @@
-import { memo, useCallback } from "react";
+import { memo, useCallback, useState } from "react";
 
 import type { BotChat, LayoutType, UserChat } from "@/types/chat";
 
 import { useValueRecoilState } from "@/hooks/useFetchRecoilState";
 
+import { ModalChatReport } from "@/components/ModalPopup";
 import ProfileImage from "@/components/User/ProfileImage";
 
 import MessageAccount from "./MessageAccount";
@@ -58,7 +59,11 @@ type MessageSetProps = {
 };
 
 const MessageSet = ({ chats, layoutType, roomInfo }: MessageSetProps) => {
+  const [isOpenReport, setIsOpenReport] = useState<boolean>(false);
   const { oid: userOid } = useValueRecoilState("loginInfo") || {};
+
+  const onClickReport = useCallback(() => setIsOpenReport(true), []);
+
   const authorId = chats?.[0]?.authorId;
   const authorProfileUrl =
     "authorProfileUrl" in chats?.[0] ? chats?.[0].authorProfileUrl : "";
@@ -135,48 +140,50 @@ const MessageSet = ({ chats, layoutType, roomInfo }: MessageSetProps) => {
   };
 
   return (
-    <div css={style}>
-      <div css={styleProfileSection}>
-        {authorId !== userOid && (
-          <div
-            css={styleProfile}
-            onClick={() => {
-              /* @fixme @todo */
-            }}
-          >
-            {authorId === "bot" ? (
-              <TaxiIcon css={{ width: "100%", height: "100%" }} />
-            ) : (
-              <ProfileImage url={authorProfileUrl} />
-            )}
-          </div>
-        )}
-      </div>
-      <div css={styleMessageSection}>
-        {authorId !== userOid && (
-          <div css={styleName} className="selectable">
-            {authorName}
-          </div>
-        )}
-        {chats.map((chat, index) => (
-          <div key={getChatUniquewKey(chat)} css={styleMessageWrap}>
-            <div css={styleChat(chat.type)}>
-              <MessageBody
-                type={chat.type}
-                content={chat.content}
-                roomInfo={roomInfo}
-                color={authorId === userOid ? theme.white : theme.black}
-              />
+    <>
+      <div css={style}>
+        <div css={styleProfileSection}>
+          {authorId !== userOid && (
+            <div css={styleProfile} onClick={onClickReport}>
+              {authorId === "bot" ? (
+                <TaxiIcon css={{ width: "100%", height: "100%" }} />
+              ) : (
+                <ProfileImage url={authorProfileUrl} />
+              )}
             </div>
-            {index === chats.length - 1 && (
-              <div css={styleTime} className="selectable">
-                {dayjs(chat.time).format("H시 mm분")}
+          )}
+        </div>
+        <div css={styleMessageSection}>
+          {authorId !== userOid && (
+            <div css={styleName} className="selectable">
+              {authorName}
+            </div>
+          )}
+          {chats.map((chat, index) => (
+            <div key={getChatUniquewKey(chat)} css={styleMessageWrap}>
+              <div css={styleChat(chat.type)}>
+                <MessageBody
+                  type={chat.type}
+                  content={chat.content}
+                  roomInfo={roomInfo}
+                  color={authorId === userOid ? theme.white : theme.black}
+                />
               </div>
-            )}
-          </div>
-        ))}
+              {index === chats.length - 1 && (
+                <div css={styleTime} className="selectable">
+                  {dayjs(chat.time).format("H시 mm분")}
+                </div>
+              )}
+            </div>
+          ))}
+        </div>
       </div>
-    </div>
+      <ModalChatReport
+        roomInfo={roomInfo}
+        isOpen={isOpenReport}
+        onChangeIsOpen={setIsOpenReport}
+      />
+    </>
   );
 };
 

From 38abfbdaa63b24802382cd664bb660d43dcf4e98 Mon Sep 17 00:00:00 2001
From: jyjy1229 <kimjy18@kaist.ac.kr>
Date: Tue, 12 Mar 2024 23:52:40 +0900
Subject: [PATCH 02/21] Remove click event to taxi bot profile image

---
 .../Chat/MessagesBody/MessageSet/index.tsx     | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx b/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
index af9d369bf..baa0e287d 100644
--- a/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
+++ b/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
@@ -101,6 +101,9 @@ const MessageSet = ({ chats, layoutType, roomInfo }: MessageSetProps) => {
     alignItems: "flex-end",
     gap: "4px",
   };
+  const styleHover = {
+    cursor: "pointer",
+  };
   const styleChat = useCallback(
     (type: (UserChat | BotChat)["type"]) => ({
       maxWidth: "max(75%, 210px)",
@@ -144,13 +147,20 @@ const MessageSet = ({ chats, layoutType, roomInfo }: MessageSetProps) => {
       <div css={style}>
         <div css={styleProfileSection}>
           {authorId !== userOid && (
-            <div css={styleProfile} onClick={onClickReport}>
+            <>
               {authorId === "bot" ? (
-                <TaxiIcon css={{ width: "100%", height: "100%" }} />
+                <div css={styleProfile}>
+                  <TaxiIcon css={{ width: "100%", height: "100%" }} />
+                </div>
               ) : (
-                <ProfileImage url={authorProfileUrl} />
+                <div
+                  css={{ ...styleProfile, ...styleHover }}
+                  onClick={onClickReport}
+                >
+                  <ProfileImage url={authorProfileUrl} />
+                </div>
               )}
-            </div>
+            </>
           )}
         </div>
         <div css={styleMessageSection}>

From d993f20b2353c8e583223886e1e5220059e5d49f Mon Sep 17 00:00:00 2001
From: jyjy1229 <kimjy18@kaist.ac.kr>
Date: Tue, 19 Mar 2024 23:00:14 +0900
Subject: [PATCH 03/21] Fix jsx code

---
 .../Chat/MessagesBody/MessageSet/index.tsx    | 22 +++++++++----------
 1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx b/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
index baa0e287d..f5153be90 100644
--- a/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
+++ b/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
@@ -69,6 +69,8 @@ const MessageSet = ({ chats, layoutType, roomInfo }: MessageSetProps) => {
     "authorProfileUrl" in chats?.[0] ? chats?.[0].authorProfileUrl : "";
   const authorName = "authorName" in chats?.[0] ? chats?.[0].authorName : "";
 
+  const isBot = authorId === "bot";
+
   const style = {
     position: "relative" as any,
     display: "flex",
@@ -147,20 +149,16 @@ const MessageSet = ({ chats, layoutType, roomInfo }: MessageSetProps) => {
       <div css={style}>
         <div css={styleProfileSection}>
           {authorId !== userOid && (
-            <>
-              {authorId === "bot" ? (
-                <div css={styleProfile}>
-                  <TaxiIcon css={{ width: "100%", height: "100%" }} />
-                </div>
+            <div
+              css={{ ...styleProfile, ...(!isBot && styleHover) }}
+              onClick={() => !isBot && onClickReport()}
+            >
+              {isBot ? (
+                <TaxiIcon css={{ width: "100%", height: "100%" }} />
               ) : (
-                <div
-                  css={{ ...styleProfile, ...styleHover }}
-                  onClick={onClickReport}
-                >
-                  <ProfileImage url={authorProfileUrl} />
-                </div>
+                <ProfileImage url={authorProfileUrl} />
               )}
-            </>
+            </div>
           )}
         </div>
         <div css={styleMessageSection}>

From 35a9e2c331c8687fd04b39bbfb882d6aa21893c9 Mon Sep 17 00:00:00 2001
From: jyjy1229 <kimjy18@kaist.ac.kr>
Date: Tue, 19 Mar 2024 23:01:04 +0900
Subject: [PATCH 04/21] Add userOid props to modal

---
 .../web/src/components/Chat/MessagesBody/MessageSet/index.tsx    | 1 +
 1 file changed, 1 insertion(+)

diff --git a/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx b/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
index f5153be90..df55ab7ea 100644
--- a/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
+++ b/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
@@ -190,6 +190,7 @@ const MessageSet = ({ chats, layoutType, roomInfo }: MessageSetProps) => {
         roomInfo={roomInfo}
         isOpen={isOpenReport}
         onChangeIsOpen={setIsOpenReport}
+        userOid={authorId}
       />
     </>
   );

From 1a861cbb184533f17a693f49ac97cfd4e03fd934 Mon Sep 17 00:00:00 2001
From: jyjy1229 <kimjy18@kaist.ac.kr>
Date: Tue, 19 Mar 2024 23:02:26 +0900
Subject: [PATCH 05/21] Rename function

---
 .../web/src/components/Chat/MessagesBody/MessageSet/index.tsx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx b/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
index df55ab7ea..e6749d7a5 100644
--- a/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
+++ b/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
@@ -62,7 +62,7 @@ const MessageSet = ({ chats, layoutType, roomInfo }: MessageSetProps) => {
   const [isOpenReport, setIsOpenReport] = useState<boolean>(false);
   const { oid: userOid } = useValueRecoilState("loginInfo") || {};
 
-  const onClickReport = useCallback(() => setIsOpenReport(true), []);
+  const onClickProfileImage = useCallback(() => setIsOpenReport(true), []);
 
   const authorId = chats?.[0]?.authorId;
   const authorProfileUrl =
@@ -151,7 +151,7 @@ const MessageSet = ({ chats, layoutType, roomInfo }: MessageSetProps) => {
           {authorId !== userOid && (
             <div
               css={{ ...styleProfile, ...(!isBot && styleHover) }}
-              onClick={() => !isBot && onClickReport()}
+              onClick={() => !isBot && onClickProfileImage()}
             >
               {isBot ? (
                 <TaxiIcon css={{ width: "100%", height: "100%" }} />

From 719f9a3e29da573a70b84173ce9d72435c54409f Mon Sep 17 00:00:00 2001
From: jyjy1229 <kimjy18@kaist.ac.kr>
Date: Tue, 19 Mar 2024 23:21:20 +0900
Subject: [PATCH 06/21] Fix css

---
 .../src/components/Chat/MessagesBody/MessageSet/index.tsx   | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx b/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
index e6749d7a5..ab62a70a1 100644
--- a/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
+++ b/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
@@ -103,9 +103,7 @@ const MessageSet = ({ chats, layoutType, roomInfo }: MessageSetProps) => {
     alignItems: "flex-end",
     gap: "4px",
   };
-  const styleHover = {
-    cursor: "pointer",
-  };
+
   const styleChat = useCallback(
     (type: (UserChat | BotChat)["type"]) => ({
       maxWidth: "max(75%, 210px)",
@@ -150,7 +148,7 @@ const MessageSet = ({ chats, layoutType, roomInfo }: MessageSetProps) => {
         <div css={styleProfileSection}>
           {authorId !== userOid && (
             <div
-              css={{ ...styleProfile, ...(!isBot && styleHover) }}
+              css={{ ...styleProfile, cursor: !isBot ? "pointer" : undefined }}
               onClick={() => !isBot && onClickProfileImage()}
             >
               {isBot ? (

From c065077c405e10bd45deee1b8b7ff6492ec8df84 Mon Sep 17 00:00:00 2001
From: ybmin <nimby@sparcs.org>
Date: Tue, 26 Mar 2024 20:26:42 +0900
Subject: [PATCH 07/21] Add: channelTalk openChat with given message

---
 .../useChannelTalkEffect/channelService.js        |  3 +++
 .../hooks/skeleton/useChannelTalkEffect/index.tsx | 11 +++++++++++
 packages/web/src/pages/Mypage/Menu.tsx            |  3 +++
 packages/web/src/pages/Mypage/index.tsx           | 15 ++++++++++++---
 packages/web/src/pages/Mypage/langs/en.json       |  1 +
 packages/web/src/pages/Mypage/langs/ko.json       |  1 +
 6 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/packages/web/src/hooks/skeleton/useChannelTalkEffect/channelService.js b/packages/web/src/hooks/skeleton/useChannelTalkEffect/channelService.js
index c6a7638b4..ea3b249a9 100644
--- a/packages/web/src/hooks/skeleton/useChannelTalkEffect/channelService.js
+++ b/packages/web/src/hooks/skeleton/useChannelTalkEffect/channelService.js
@@ -42,6 +42,9 @@ class ChannelService {
   updateUser(options) {
     window.ChannelIO("updateUser", options);
   }
+  openChat(message) {
+    window.ChannelIO("openChat", undefined, message);
+  }
   shutdown() {
     window.ChannelIO("shutdown");
   }
diff --git a/packages/web/src/hooks/skeleton/useChannelTalkEffect/index.tsx b/packages/web/src/hooks/skeleton/useChannelTalkEffect/index.tsx
index 3f2dec5b8..21e8ed292 100644
--- a/packages/web/src/hooks/skeleton/useChannelTalkEffect/index.tsx
+++ b/packages/web/src/hooks/skeleton/useChannelTalkEffect/index.tsx
@@ -36,4 +36,15 @@ export default () => {
       });
     }
   }, [pathname, error]);
+
+  const openWithdraw = () => {
+    if (channelTalkPluginKey) {
+      ChannelService.openChat({
+        chatId: undefined,
+        message:
+          "스팍스 택시 서비스의 계정 탈퇴를 신청하고 싶습니다.\n신청 사유는 다음과 같습니다: ",
+      });
+    }
+  };
+  return { openWithdraw };
 };
diff --git a/packages/web/src/pages/Mypage/Menu.tsx b/packages/web/src/pages/Mypage/Menu.tsx
index fcc0dddf1..d63d2d08a 100644
--- a/packages/web/src/pages/Mypage/Menu.tsx
+++ b/packages/web/src/pages/Mypage/Menu.tsx
@@ -12,6 +12,7 @@ import ExitToAppRoundedIcon from "@mui/icons-material/ExitToAppRounded";
 import HelpOutlineRoundedIcon from "@mui/icons-material/HelpOutlineRounded";
 import KeyboardArrowLeftRoundedIcon from "@mui/icons-material/KeyboardArrowLeftRounded";
 import LanguageRoundedIcon from "@mui/icons-material/LanguageRounded";
+import PersonRemoveRoundedIcon from "@mui/icons-material/PersonRemoveRounded";
 import PortraitRoundedIcon from "@mui/icons-material/PortraitRounded";
 import StarRoundedIcon from "@mui/icons-material/StarRounded";
 
@@ -46,6 +47,8 @@ const getIcon = (icon: string) => {
       return <AlarmOffRoundedIcon style={styleIcon} />;
     case "logout":
       return <ExitToAppRoundedIcon style={styleIcon} />;
+    case "withdraw":
+      return <PersonRemoveRoundedIcon style={styleIcon} />;
     case "beta":
       return <StarRoundedIcon style={styleIcon} />;
   }
diff --git a/packages/web/src/pages/Mypage/index.tsx b/packages/web/src/pages/Mypage/index.tsx
index f2d4e3005..725d82647 100644
--- a/packages/web/src/pages/Mypage/index.tsx
+++ b/packages/web/src/pages/Mypage/index.tsx
@@ -1,6 +1,7 @@
 import { useCallback, useState } from "react";
 import { useTranslation } from "react-i18next";
 
+import useChannelTalkEffect from "@/hooks/skeleton/useChannelTalkEffect";
 import { useValueRecoilState } from "@/hooks/useFetchRecoilState";
 
 import AdaptiveDiv from "@/components/AdaptiveDiv";
@@ -63,6 +64,9 @@ const Mypage = () => {
   );
   const onClickEventPolicy = useCallback(() => setIsOpenEventPolicy(true), []);
   const onClickMembers = useCallback(() => setOpenIsMembers(true), []);
+  const onClickWithdraw = useCallback(() => {
+    useChannelTalkEffect().openWithdraw();
+  }, []);
 
   const styleProfImg = {
     width: "50px",
@@ -194,9 +198,14 @@ const Mypage = () => {
             {t("credit")}
           </Menu>
           {userId && (
-            <LinkLogout>
-              <Menu icon="logout">{t("logout")}</Menu>
-            </LinkLogout>
+            <>
+              <Menu icon="withdraw" onClick={onClickWithdraw}>
+                {t("withdraw")}
+              </Menu>
+              <LinkLogout>
+                <Menu icon="logout">{t("logout")}</Menu>
+              </LinkLogout>
+            </>
           )}
         </div>
       </WhiteContainer>
diff --git a/packages/web/src/pages/Mypage/langs/en.json b/packages/web/src/pages/Mypage/langs/en.json
index 365791c93..fe6dddb8d 100644
--- a/packages/web/src/pages/Mypage/langs/en.json
+++ b/packages/web/src/pages/Mypage/langs/en.json
@@ -16,6 +16,7 @@
   "terms_privacy": "Collection and Use of Personal Information",
   "privacy_policy": "Privacy Policy",
   "credit": "Credit",
+  "withdraw": "Withdraw Account",
   "logout": "Logout",
   "page_modify": {
     "cancel": "Cancel",
diff --git a/packages/web/src/pages/Mypage/langs/ko.json b/packages/web/src/pages/Mypage/langs/ko.json
index 99afcaebe..e6c52dbab 100644
--- a/packages/web/src/pages/Mypage/langs/ko.json
+++ b/packages/web/src/pages/Mypage/langs/ko.json
@@ -16,6 +16,7 @@
   "terms_privacy": "개인정보 수집 및 이용",
   "privacy_policy": "개인정보 처리방침",
   "credit": "만든 사람들",
+  "withdraw": "회원 탈퇴하기",
   "logout": "로그아웃",
   "page_modify": {
     "cancel": "취소",

From 2c67424934f61c2864b7134464c813583bc80de6 Mon Sep 17 00:00:00 2001
From: ybmin <nimby@sparcs.org>
Date: Tue, 26 Mar 2024 20:39:33 +0900
Subject: [PATCH 08/21] Fix: conflict with dev

---
 .../src/hooks/skeleton/useChannelTalkEffect/index.tsx | 11 -----------
 packages/web/src/pages/Mypage/index.tsx               |  8 ++++++--
 2 files changed, 6 insertions(+), 13 deletions(-)

diff --git a/packages/web/src/hooks/skeleton/useChannelTalkEffect/index.tsx b/packages/web/src/hooks/skeleton/useChannelTalkEffect/index.tsx
index 21e8ed292..3f2dec5b8 100644
--- a/packages/web/src/hooks/skeleton/useChannelTalkEffect/index.tsx
+++ b/packages/web/src/hooks/skeleton/useChannelTalkEffect/index.tsx
@@ -36,15 +36,4 @@ export default () => {
       });
     }
   }, [pathname, error]);
-
-  const openWithdraw = () => {
-    if (channelTalkPluginKey) {
-      ChannelService.openChat({
-        chatId: undefined,
-        message:
-          "스팍스 택시 서비스의 계정 탈퇴를 신청하고 싶습니다.\n신청 사유는 다음과 같습니다: ",
-      });
-    }
-  };
-  return { openWithdraw };
 };
diff --git a/packages/web/src/pages/Mypage/index.tsx b/packages/web/src/pages/Mypage/index.tsx
index 725d82647..4937a2d83 100644
--- a/packages/web/src/pages/Mypage/index.tsx
+++ b/packages/web/src/pages/Mypage/index.tsx
@@ -1,7 +1,7 @@
 import { useCallback, useState } from "react";
 import { useTranslation } from "react-i18next";
 
-import useChannelTalkEffect from "@/hooks/skeleton/useChannelTalkEffect";
+import channelService from "@/hooks/skeleton/useChannelTalkEffect/channelService";
 import { useValueRecoilState } from "@/hooks/useFetchRecoilState";
 
 import AdaptiveDiv from "@/components/AdaptiveDiv";
@@ -65,7 +65,11 @@ const Mypage = () => {
   const onClickEventPolicy = useCallback(() => setIsOpenEventPolicy(true), []);
   const onClickMembers = useCallback(() => setOpenIsMembers(true), []);
   const onClickWithdraw = useCallback(() => {
-    useChannelTalkEffect().openWithdraw();
+    channelService.openChat({
+      chatId: undefined,
+      message:
+        "스팍스 택시 서비스의 계정 탈퇴를 신청하고 싶습니다.\n신청 사유는 다음과 같습니다:\n",
+    });
   }, []);
 
   const styleProfImg = {

From 5736a6ca58c4c7d03215d5aa990b8fb805e3de7d Mon Sep 17 00:00:00 2001
From: jyjy1229 <kimjy18@kaist.ac.kr>
Date: Tue, 26 Mar 2024 23:06:28 +0900
Subject: [PATCH 09/21] Keep the selected user when press the previous button

---
 .../Body/BodyChatReportSelectType.tsx         |  6 +++---
 .../Body/BodyChatReportSelectUser.tsx         | 19 +++++++++++--------
 .../components/ModalPopup/ModalChatReport.tsx |  9 +++++++--
 3 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectType.tsx b/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectType.tsx
index 523a853a7..1227eeedf 100644
--- a/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectType.tsx
+++ b/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectType.tsx
@@ -32,7 +32,7 @@ import EditRoundedIcon from "@mui/icons-material/EditRounded";
 type BodyChatReportSelectTypeProps = {
   roomInfo: Room;
   reportedId: Report["reportedId"];
-  clearReportedId: () => void;
+  setIsSelected: Dispatch<SetStateAction<boolean>>;
   setIsSubmitted: Dispatch<SetStateAction<boolean>>;
 };
 
@@ -45,7 +45,7 @@ const selectOptions = [
 const BodyChatReportSelectType = ({
   roomInfo,
   reportedId,
-  clearReportedId,
+  setIsSelected,
   setIsSubmitted,
 }: BodyChatReportSelectTypeProps) => {
   const axios = useAxios();
@@ -228,7 +228,7 @@ const BodyChatReportSelectType = ({
             borderRadius: "8px",
             ...theme.font14,
           }}
-          onClick={clearReportedId}
+          onClick={() => setIsSelected(false)}
         >
           이전
         </Button>
diff --git a/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectUser.tsx b/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectUser.tsx
index c27eff87f..6a3599936 100644
--- a/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectUser.tsx
+++ b/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectUser.tsx
@@ -1,7 +1,8 @@
-import { Dispatch, SetStateAction, useState } from "react";
+import { Dispatch, SetStateAction } from "react";
 
 import type { Report } from "@/types/report";
 
+import { useValueRecoilState } from "@/hooks/useFetchRecoilState";
 import useIsTimeOver from "@/hooks/useIsTimeOver";
 
 import Button from "@/components/Button";
@@ -15,17 +16,19 @@ import CheckRoundedIcon from "@mui/icons-material/CheckRounded";
 
 type BodyChatReportSelectUserProps = {
   roomInfo: Room;
+  reportedId: Nullable<Report["reportedId"]>;
   setReportedId: Dispatch<SetStateAction<Nullable<Report["reportedId"]>>>;
+  setIsSelected: Dispatch<SetStateAction<boolean>>;
   onChangeIsOpen?: (isOpen: boolean) => void;
 };
 
 const BodyChatReportSelectUser = ({
   roomInfo,
+  reportedId,
   setReportedId,
+  setIsSelected,
   onChangeIsOpen,
 }: BodyChatReportSelectUserProps) => {
-  const [selectedUser, setSelectedUser] =
-    useState<Nullable<Report["reportedId"]>>(null);
   const isDeparted = useIsTimeOver(dayServerToClient(roomInfo.time)); // 방 출발 여부
 
   const styleText = {
@@ -84,16 +87,16 @@ const BodyChatReportSelectUser = ({
           <div
             key={user._id}
             css={styleUser}
-            onClick={() => setSelectedUser(user._id)}
+            onClick={() => setReportedId(user._id)}
           >
             <div
               css={{
                 ...styleCheckBox,
                 background:
-                  selectedUser === user._id ? theme.purple : theme.purple_light,
+                  reportedId === user._id ? theme.purple : theme.purple_light,
               }}
             >
-              {selectedUser === user._id && (
+              {reportedId === user._id && (
                 <CheckRoundedIcon style={styleCheckBoxIcon} />
               )}
             </div>
@@ -122,8 +125,8 @@ const BodyChatReportSelectUser = ({
             borderRadius: "8px",
             ...theme.font14_bold,
           }}
-          onClick={() => setReportedId(selectedUser)}
-          disabled={!selectedUser}
+          onClick={() => setIsSelected(true)}
+          disabled={!reportedId}
         >
           다음
         </Button>
diff --git a/packages/web/src/components/ModalPopup/ModalChatReport.tsx b/packages/web/src/components/ModalPopup/ModalChatReport.tsx
index 68dca9a16..fa241eb4e 100644
--- a/packages/web/src/components/ModalPopup/ModalChatReport.tsx
+++ b/packages/web/src/components/ModalPopup/ModalChatReport.tsx
@@ -24,14 +24,17 @@ const ModalChatReport = ({
 }: ModalChatReportProps) => {
   const [reportedId, setReportedId] =
     useState<Nullable<Report["reportedId"]>>();
+  const [isSelected, setIsSelected] = useState<boolean>(false);
   const [isSubmitted, setIsSubmitted] = useState<boolean>(false);
 
   useEffect(() => {
     if (userOid && roomInfo.part.find((user) => user._id === userOid)) {
       setReportedId(userOid);
+      setIsSelected(true);
       setIsSubmitted(false);
     } else {
       setReportedId(undefined);
+      setIsSelected(false);
       setIsSubmitted(false);
     }
   }, [roomInfo, userOid, modalProps.isOpen]);
@@ -53,17 +56,19 @@ const ModalChatReport = ({
         <ReportGmailerrorredRoundedIcon style={styleIcon} />
         신고하기
       </div>
-      {!reportedId ? (
+      {!reportedId || !isSelected ? (
         <BodyChatReportSelectUser
           roomInfo={roomInfo}
+          reportedId={reportedId}
           setReportedId={setReportedId}
+          setIsSelected={setIsSelected}
           onChangeIsOpen={modalProps?.onChangeIsOpen}
         />
       ) : !isSubmitted ? (
         <BodyChatReportSelectType
           roomInfo={roomInfo}
           reportedId={reportedId}
-          clearReportedId={() => setReportedId(undefined)}
+          setIsSelected={setIsSelected}
           setIsSubmitted={setIsSubmitted}
         />
       ) : (

From 39574e46a353e4b95ec9e4499826958ccbb5eaa1 Mon Sep 17 00:00:00 2001
From: jyjy1229 <kimjy18@kaist.ac.kr>
Date: Tue, 26 Mar 2024 23:07:16 +0900
Subject: [PATCH 10/21] Remove own account in report modal

---
 .../Body/BodyChatReportSelectUser.tsx         | 46 +++++++++++--------
 1 file changed, 26 insertions(+), 20 deletions(-)

diff --git a/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectUser.tsx b/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectUser.tsx
index 6a3599936..ef684168f 100644
--- a/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectUser.tsx
+++ b/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectUser.tsx
@@ -29,6 +29,7 @@ const BodyChatReportSelectUser = ({
   setIsSelected,
   onChangeIsOpen,
 }: BodyChatReportSelectUserProps) => {
+  const { oid: userOid } = useValueRecoilState("loginInfo") || {};
   const isDeparted = useIsTimeOver(dayServerToClient(roomInfo.time)); // 방 출발 여부
 
   const styleText = {
@@ -83,26 +84,31 @@ const BodyChatReportSelectUser = ({
       <div css={styleText}>신고할 사용자를 선택해주세요.</div>
       <DottedLine />
       <div css={styleUsers}>
-        {roomInfo.part.map((user) => (
-          <div
-            key={user._id}
-            css={styleUser}
-            onClick={() => setReportedId(user._id)}
-          >
-            <div
-              css={{
-                ...styleCheckBox,
-                background:
-                  reportedId === user._id ? theme.purple : theme.purple_light,
-              }}
-            >
-              {reportedId === user._id && (
-                <CheckRoundedIcon style={styleCheckBoxIcon} />
-              )}
-            </div>
-            <User value={user} isDeparted={isDeparted} />
-          </div>
-        ))}
+        {roomInfo.part.map(
+          (user) =>
+            user._id !== userOid && (
+              <div
+                key={user._id}
+                css={styleUser}
+                onClick={() => setReportedId(user._id)}
+              >
+                <div
+                  css={{
+                    ...styleCheckBox,
+                    background:
+                      reportedId === user._id
+                        ? theme.purple
+                        : theme.purple_light,
+                  }}
+                >
+                  {reportedId === user._id && (
+                    <CheckRoundedIcon style={styleCheckBoxIcon} />
+                  )}
+                </div>
+                <User value={user} isDeparted={isDeparted} />
+              </div>
+            )
+        )}
       </div>
       <div css={styleButtons}>
         <Button

From 0429cfc885151edb215bf22e8a7aa9c6ff4aa7e0 Mon Sep 17 00:00:00 2001
From: static <kmc7468@naver.com>
Date: Tue, 26 Mar 2024 23:09:17 +0900
Subject: [PATCH 11/21] Refactor: change the default value of eventMode in
 loadenv.ts

---
 packages/web/src/tools/loadenv.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/web/src/tools/loadenv.ts b/packages/web/src/tools/loadenv.ts
index 9f2681a14..7919646c1 100644
--- a/packages/web/src/tools/loadenv.ts
+++ b/packages/web/src/tools/loadenv.ts
@@ -13,7 +13,7 @@ export const kakaoSDKKey = env.REACT_APP_KAKAO_SDK_KEY; // optional
 export const gaTrackingId = env.REACT_APP_GA_TRACKING_ID; // optional
 export const firebaseConfig: Nullable<FirebaseConfig> =
   env.REACT_APP_FIREBASE_CONFIG && JSON.parse(env.REACT_APP_FIREBASE_CONFIG); // optional
-export const eventMode = env.REACT_APP_EVENT_MODE || "2024spring"; // optional. "2023fall"로 설정 가능
+export const eventMode = env.REACT_APP_EVENT_MODE || null; // optional. "2023fall"로 설정 가능
 
 // devicet-type 감지
 const userAgent = navigator.userAgent.toLowerCase();

From e01914201346fc3a09dfffc86f4d28bf5f68a8ca Mon Sep 17 00:00:00 2001
From: jyjy1229 <kimjy18@kaist.ac.kr>
Date: Tue, 26 Mar 2024 23:23:27 +0900
Subject: [PATCH 12/21] Remove legacy code

---
 .../components/ModalPopup/Body/BodyChatReportSelectType.tsx | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectType.tsx b/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectType.tsx
index 1227eeedf..c8b6bb9d1 100644
--- a/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectType.tsx
+++ b/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectType.tsx
@@ -11,7 +11,6 @@ import {
 
 import type { Report } from "@/types/report";
 
-import { useValueRecoilState } from "@/hooks/useFetchRecoilState";
 import useIsTimeOver from "@/hooks/useIsTimeOver";
 import { useAxios } from "@/hooks/useTaxiAPI";
 
@@ -50,7 +49,6 @@ const BodyChatReportSelectType = ({
 }: BodyChatReportSelectTypeProps) => {
   const axios = useAxios();
   const setAlert = useSetRecoilState(alertAtom);
-  const { oid: userOid } = useValueRecoilState("loginInfo") || {};
   const wrapRef = useRef<HTMLDivElement>(null);
   const textareaRef = useRef<HTMLTextAreaElement>(null);
   const [height, setHeight] = useState<CSSProperties["height"]>("28px");
@@ -76,10 +74,8 @@ const BodyChatReportSelectType = ({
         ? "기타 사유를 입력해주세요."
         : type === "etc-reason" && !regExpTest.reportMsg(etcDetail)
         ? "기타 사유는 1500자 까지 입력이 허용됩니다."
-        : userOid === reportedUser?._id
-        ? "나 자신은 신고할 수 없습니다."
         : null,
-    [type, etcDetail, isDeparted, userOid, reportedUser]
+    [type, etcDetail, isDeparted, reportedUser]
   );
 
   const resizeEvent = useCallback(() => {

From 97f218b7c2392fa3f038cc49a5fb91e3955f3b47 Mon Sep 17 00:00:00 2001
From: ybmin <nimby@sparcs.org>
Date: Tue, 2 Apr 2024 22:08:33 +0900
Subject: [PATCH 13/21] =?UTF-8?q?Style:=20=EC=88=9C=EC=84=9C,=20=ED=83=9D?=
 =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 packages/web/src/pages/Mypage/index.tsx | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/packages/web/src/pages/Mypage/index.tsx b/packages/web/src/pages/Mypage/index.tsx
index 9054174cd..0b7a4c77d 100644
--- a/packages/web/src/pages/Mypage/index.tsx
+++ b/packages/web/src/pages/Mypage/index.tsx
@@ -78,7 +78,7 @@ const Mypage = () => {
     channelService.openChat({
       chatId: undefined,
       message:
-        "스팍스 택시 서비스의 계정 탈퇴를 신청하고 싶습니다.\n신청 사유는 다음과 같습니다:\n",
+        "SPARCS Taxi 서비스의 계정 탈퇴를 신청하고 싶습니다.\n신청 사유는 다음과 같습니다:\n",
     });
   }, []);
 
@@ -213,12 +213,12 @@ const Mypage = () => {
           </Menu>
           {userId && (
             <>
-              <Menu icon="withdraw" onClick={onClickWithdraw}>
-                {t("withdraw")}
-              </Menu>
               <LinkLogout>
                 <Menu icon="logout">{t("logout")}</Menu>
               </LinkLogout>
+              <Menu icon="withdraw" onClick={onClickWithdraw}>
+                {t("withdraw")}
+              </Menu>
             </>
           )}
         </div>

From c106ec1f9ebbb9688a22b30ef58485b371e8a3df Mon Sep 17 00:00:00 2001
From: jinhyeonkwon <athexplorer@kaist.ac.kr>
Date: Tue, 2 Apr 2024 23:04:30 +0900
Subject: [PATCH 14/21] Add: shortcut button in the modal of already joined
 room

---
 .../src/components/ModalPopup/Body/BodyRoomSelection.tsx | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx b/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx
index 306f1a2cc..edf92ce34 100644
--- a/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx
+++ b/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx
@@ -125,6 +125,11 @@ const BodyRoomSelection = ({ roomInfo }: BodyRoomSelectionProps) => {
   const isDepart = useIsTimeOver(dayServerToClient(roomInfo.time)); // 방 출발 여부
 
   const requestJoin = useCallback(async () => {
+    if (isAlreadyPart) {
+      // 이미 참여 중인 방에서 버튼을 누르면 API 호출 관련 로직을 건너뛰고 해당 방으로 이동합니다.
+      history.push(`/myroom/${roomInfo._id}`);
+      return;
+    }
     if (onCall.current) return;
     onCall.current = true;
     await axios({
@@ -204,7 +209,7 @@ const BodyRoomSelection = ({ roomInfo }: BodyRoomSelectionProps) => {
       {isLogin || isRoomFull || isDepart ? (
         <Button
           type="purple"
-          disabled={isRoomFull || isDepart || isAlreadyPart || isMaxPart}
+          disabled={isRoomFull || isDepart || isMaxPart}
           css={{
             padding: "10px 0 9px",
             borderRadius: "8px",
@@ -213,7 +218,7 @@ const BodyRoomSelection = ({ roomInfo }: BodyRoomSelectionProps) => {
           onClick={requestJoin}
         >
           {isAlreadyPart
-            ? "이미 참여 중입니다"
+            ? "참여 중인 방 - 바로가기"
             : isDepart
             ? "출발 시각이 현재 이전인 방은 참여할 수 없습니다"
             : isRoomFull

From 1c809401f424bd11ea0474a328226536cb3bb333 Mon Sep 17 00:00:00 2001
From: jinhyeonkwon <athexplorer@kaist.ac.kr>
Date: Tue, 2 Apr 2024 23:23:16 +0900
Subject: [PATCH 15/21] Fix: conditions of room join button - disabled
 condition and text

---
 .../src/components/ModalPopup/Body/BodyRoomSelection.tsx  | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx b/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx
index edf92ce34..3862baf9d 100644
--- a/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx
+++ b/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx
@@ -209,7 +209,7 @@ const BodyRoomSelection = ({ roomInfo }: BodyRoomSelectionProps) => {
       {isLogin || isRoomFull || isDepart ? (
         <Button
           type="purple"
-          disabled={isRoomFull || isDepart || isMaxPart}
+          disabled={isRoomFull || (isDepart && !isAlreadyPart) || isMaxPart}
           css={{
             padding: "10px 0 9px",
             borderRadius: "8px",
@@ -217,10 +217,10 @@ const BodyRoomSelection = ({ roomInfo }: BodyRoomSelectionProps) => {
           }}
           onClick={requestJoin}
         >
-          {isAlreadyPart
-            ? "참여 중인 방 - 바로가기"
-            : isDepart
+          {isDepart
             ? "출발 시각이 현재 이전인 방은 참여할 수 없습니다"
+            : isAlreadyPart
+            ? "참여 중인 방 - 바로가기"
             : isRoomFull
             ? "남은 인원이 0명인 방은 참여할 수 없습니다"
             : isMaxPart

From c7352ad6bb76d9f445922d57c2138a09dfb3b836 Mon Sep 17 00:00:00 2001
From: jinhyeonkwon <athexplorer@kaist.ac.kr>
Date: Mon, 8 Apr 2024 13:33:30 +0900
Subject: [PATCH 16/21] Fix : Button Message

---
 .../web/src/components/ModalPopup/Body/BodyRoomSelection.tsx    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx b/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx
index 3862baf9d..c5ac6e7af 100644
--- a/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx
+++ b/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx
@@ -220,7 +220,7 @@ const BodyRoomSelection = ({ roomInfo }: BodyRoomSelectionProps) => {
           {isDepart
             ? "출발 시각이 현재 이전인 방은 참여할 수 없습니다"
             : isAlreadyPart
-            ? "참여 중인 방 - 바로가기"
+            ? "이미 참여 중입니다 : 바로가기"
             : isRoomFull
             ? "남은 인원이 0명인 방은 참여할 수 없습니다"
             : isMaxPart

From 9239357f79bf35aa7ec14ec477262e6f187a504f Mon Sep 17 00:00:00 2001
From: jinhyeonkwon <athexplorer@kaist.ac.kr>
Date: Mon, 8 Apr 2024 13:56:13 +0900
Subject: [PATCH 17/21] Fix: apply comments from static

---
 .../web/src/components/ModalPopup/Body/BodyRoomSelection.tsx   | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx b/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx
index c5ac6e7af..4833cacaf 100644
--- a/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx
+++ b/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx
@@ -130,6 +130,7 @@ const BodyRoomSelection = ({ roomInfo }: BodyRoomSelectionProps) => {
       history.push(`/myroom/${roomInfo._id}`);
       return;
     }
+    // 여기부터는 이미 참여 중인 방이 아닌 경우의 로직입니다.
     if (onCall.current) return;
     onCall.current = true;
     await axios({
@@ -217,7 +218,7 @@ const BodyRoomSelection = ({ roomInfo }: BodyRoomSelectionProps) => {
           }}
           onClick={requestJoin}
         >
-          {isDepart
+          {isDepart && !isAlreadyPart
             ? "출발 시각이 현재 이전인 방은 참여할 수 없습니다"
             : isAlreadyPart
             ? "이미 참여 중입니다 : 바로가기"

From 55fa949712059ff9ec9cd4c100ad8cb6c63e071f Mon Sep 17 00:00:00 2001
From: Jinhyeon Kwon <athexplorer@kaist.ac.kr>
Date: Tue, 23 Apr 2024 21:38:17 +0900
Subject: [PATCH 18/21] Fix: Issue solved

---
 .../web/src/components/ModalPopup/Body/BodyRoomSelection.tsx    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx b/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx
index 4833cacaf..e37671da8 100644
--- a/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx
+++ b/packages/web/src/components/ModalPopup/Body/BodyRoomSelection.tsx
@@ -210,7 +210,7 @@ const BodyRoomSelection = ({ roomInfo }: BodyRoomSelectionProps) => {
       {isLogin || isRoomFull || isDepart ? (
         <Button
           type="purple"
-          disabled={isRoomFull || (isDepart && !isAlreadyPart) || isMaxPart}
+          disabled={(isRoomFull || isDepart || isMaxPart) && !isAlreadyPart}
           css={{
             padding: "10px 0 9px",
             borderRadius: "8px",

From 50fea47d6885d6b4d0543d5254e1935e6aca913a Mon Sep 17 00:00:00 2001
From: ybmin <nimby@sparcs.org>
Date: Tue, 23 Apr 2024 21:55:07 +0900
Subject: [PATCH 19/21] Fix: params type

---
 packages/web/src/pages/Mypage/index.tsx | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/packages/web/src/pages/Mypage/index.tsx b/packages/web/src/pages/Mypage/index.tsx
index 0b7a4c77d..067fba6f3 100644
--- a/packages/web/src/pages/Mypage/index.tsx
+++ b/packages/web/src/pages/Mypage/index.tsx
@@ -75,11 +75,9 @@ const Mypage = () => {
   const onClickEventPolicy = useCallback(() => setIsOpenEventPolicy(true), []);
   const onClickMembers = useCallback(() => setOpenIsMembers(true), []);
   const onClickWithdraw = useCallback(() => {
-    channelService.openChat({
-      chatId: undefined,
-      message:
-        "SPARCS Taxi 서비스의 계정 탈퇴를 신청하고 싶습니다.\n신청 사유는 다음과 같습니다:\n",
-    });
+    channelService.openChat(
+      "SPARCS Taxi 서비스의 계정 탈퇴를 신청하고 싶습니다.\n신청 사유는 다음과 같습니다:\n"
+    );
   }, []);
 
   const styleProfImg = {

From 9af8598811575e57cff50dd16230e98be3ff49d5 Mon Sep 17 00:00:00 2001
From: jyjy1229 <kimjy18@kaist.ac.kr>
Date: Tue, 23 Apr 2024 22:17:43 +0900
Subject: [PATCH 20/21] Fix

---
 packages/web/src/components/Chat/Header/SideMenu.tsx   | 10 ++++++++--
 .../components/Chat/MessagesBody/MessageSet/index.tsx  |  8 ++++++--
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/packages/web/src/components/Chat/Header/SideMenu.tsx b/packages/web/src/components/Chat/Header/SideMenu.tsx
index f9808ef39..cfdafcf09 100644
--- a/packages/web/src/components/Chat/Header/SideMenu.tsx
+++ b/packages/web/src/components/Chat/Header/SideMenu.tsx
@@ -90,6 +90,8 @@ const SideMenu = ({ roomInfo, isOpen, setIsOpen }: SideMenuProps) => {
   const onClickCallTaxi = useCallback(() => setIsOpenCallTaxi(true), []);
   const onClickReport = useCallback(() => setIsOpenReport(true), []);
 
+  const isAlone = roomInfo.part.length === 1;
+
   const styleBackground = {
     position: "absolute" as any,
     top: 0,
@@ -192,8 +194,12 @@ const SideMenu = ({ roomInfo, isOpen, setIsOpen }: SideMenuProps) => {
           <SideMenuButton type="share" onClick={onClikcShare} />
           <DottedLine />
           <SideMenuButton type="taxi" onClick={onClickCallTaxi} />
-          <DottedLine />
-          <SideMenuButton type="report" onClick={onClickReport} />
+          {!isAlone && (
+            <>
+              <DottedLine />
+              <SideMenuButton type="report" onClick={onClickReport} />
+            </>
+          )}
         </div>
         <DottedLine />
         <div css={styleNameSection} onClick={onClickCancel}>
diff --git a/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx b/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
index ab62a70a1..06864f170 100644
--- a/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
+++ b/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx
@@ -70,6 +70,7 @@ const MessageSet = ({ chats, layoutType, roomInfo }: MessageSetProps) => {
   const authorName = "authorName" in chats?.[0] ? chats?.[0].authorName : "";
 
   const isBot = authorId === "bot";
+  const isAlone = roomInfo.part.length === 1;
 
   const style = {
     position: "relative" as any,
@@ -148,8 +149,11 @@ const MessageSet = ({ chats, layoutType, roomInfo }: MessageSetProps) => {
         <div css={styleProfileSection}>
           {authorId !== userOid && (
             <div
-              css={{ ...styleProfile, cursor: !isBot ? "pointer" : undefined }}
-              onClick={() => !isBot && onClickProfileImage()}
+              css={{
+                ...styleProfile,
+                cursor: !isBot && !isAlone ? "pointer" : undefined,
+              }}
+              onClick={() => !isBot && !isAlone && onClickProfileImage()}
             >
               {isBot ? (
                 <TaxiIcon css={{ width: "100%", height: "100%" }} />

From 27b101f80e5b7fa771bcfd31e7d6da1c8f681044 Mon Sep 17 00:00:00 2001
From: ybmin <nimby@sparcs.org>
Date: Thu, 25 Apr 2024 16:03:46 +0900
Subject: [PATCH 21/21] Fix: show only on mobile

---
 packages/web/src/pages/Mypage/Menu.tsx      |  2 +-
 packages/web/src/pages/Mypage/index.tsx     | 20 ++++++++++----------
 packages/web/src/pages/Mypage/langs/en.json |  2 +-
 packages/web/src/pages/Mypage/langs/ko.json |  2 +-
 4 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/packages/web/src/pages/Mypage/Menu.tsx b/packages/web/src/pages/Mypage/Menu.tsx
index d63d2d08a..4c809a4ca 100644
--- a/packages/web/src/pages/Mypage/Menu.tsx
+++ b/packages/web/src/pages/Mypage/Menu.tsx
@@ -47,7 +47,7 @@ const getIcon = (icon: string) => {
       return <AlarmOffRoundedIcon style={styleIcon} />;
     case "logout":
       return <ExitToAppRoundedIcon style={styleIcon} />;
-    case "withdraw":
+    case "cancel_account":
       return <PersonRemoveRoundedIcon style={styleIcon} />;
     case "beta":
       return <StarRoundedIcon style={styleIcon} />;
diff --git a/packages/web/src/pages/Mypage/index.tsx b/packages/web/src/pages/Mypage/index.tsx
index 067fba6f3..ac10c4073 100644
--- a/packages/web/src/pages/Mypage/index.tsx
+++ b/packages/web/src/pages/Mypage/index.tsx
@@ -25,7 +25,7 @@ import WhiteContainerSuggestLogin from "@/components/WhiteContainer/WhiteContain
 
 import Menu from "./Menu";
 
-import { eventMode, isDev } from "@/tools/loadenv";
+import { deviceType, eventMode, isDev } from "@/tools/loadenv";
 import theme from "@/tools/theme";
 import { isNotificationOn } from "@/tools/trans";
 
@@ -74,7 +74,7 @@ const Mypage = () => {
   );
   const onClickEventPolicy = useCallback(() => setIsOpenEventPolicy(true), []);
   const onClickMembers = useCallback(() => setOpenIsMembers(true), []);
-  const onClickWithdraw = useCallback(() => {
+  const onClickCancelAccount = useCallback(() => {
     channelService.openChat(
       "SPARCS Taxi 서비스의 계정 탈퇴를 신청하고 싶습니다.\n신청 사유는 다음과 같습니다:\n"
     );
@@ -210,14 +210,14 @@ const Mypage = () => {
             {t("credit")}
           </Menu>
           {userId && (
-            <>
-              <LinkLogout>
-                <Menu icon="logout">{t("logout")}</Menu>
-              </LinkLogout>
-              <Menu icon="withdraw" onClick={onClickWithdraw}>
-                {t("withdraw")}
-              </Menu>
-            </>
+            <LinkLogout>
+              <Menu icon="logout">{t("logout")}</Menu>
+            </LinkLogout>
+          )}
+          {userId && deviceType.startsWith("app/") && (
+            <Menu icon="cancel_account" onClick={onClickCancelAccount}>
+              {t("cancel_account")}
+            </Menu>
           )}
         </div>
       </WhiteContainer>
diff --git a/packages/web/src/pages/Mypage/langs/en.json b/packages/web/src/pages/Mypage/langs/en.json
index fe6dddb8d..7c8413599 100644
--- a/packages/web/src/pages/Mypage/langs/en.json
+++ b/packages/web/src/pages/Mypage/langs/en.json
@@ -16,7 +16,7 @@
   "terms_privacy": "Collection and Use of Personal Information",
   "privacy_policy": "Privacy Policy",
   "credit": "Credit",
-  "withdraw": "Withdraw Account",
+  "cancel_account": "Cancel Account",
   "logout": "Logout",
   "page_modify": {
     "cancel": "Cancel",
diff --git a/packages/web/src/pages/Mypage/langs/ko.json b/packages/web/src/pages/Mypage/langs/ko.json
index e6c52dbab..c235bb6f7 100644
--- a/packages/web/src/pages/Mypage/langs/ko.json
+++ b/packages/web/src/pages/Mypage/langs/ko.json
@@ -16,7 +16,7 @@
   "terms_privacy": "개인정보 수집 및 이용",
   "privacy_policy": "개인정보 처리방침",
   "credit": "만든 사람들",
-  "withdraw": "회원 탈퇴하기",
+  "cancel_account": "회원 탈퇴하기",
   "logout": "로그아웃",
   "page_modify": {
     "cancel": "취소",