diff --git a/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx b/packages/web/src/components/Chat/MessagesBody/MessageSet/index.tsx index 5bd3cf8f5..ab62a70a1 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,12 +59,18 @@ type MessageSetProps = { }; const MessageSet = ({ chats, layoutType, roomInfo }: MessageSetProps) => { + const [isOpenReport, setIsOpenReport] = useState(false); const { oid: userOid } = useValueRecoilState("loginInfo") || {}; + + const onClickProfileImage = useCallback(() => setIsOpenReport(true), []); + const authorId = chats?.[0]?.authorId; const authorProfileUrl = "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", @@ -96,6 +103,7 @@ const MessageSet = ({ chats, layoutType, roomInfo }: MessageSetProps) => { alignItems: "flex-end", gap: "4px", }; + const styleChat = useCallback( (type: (UserChat | BotChat)["type"]) => ({ maxWidth: "max(75%, 210px)", @@ -135,48 +143,54 @@ const MessageSet = ({ chats, layoutType, roomInfo }: MessageSetProps) => { }; return ( -
-
- {authorId !== userOid && ( -
{ - /* @fixme @todo */ - }} - > - {authorId === "bot" ? ( - - ) : ( - - )} -
- )} -
-
- {authorId !== userOid && ( -
- {authorName} -
- )} - {chats.map((chat, index) => ( -
-
- + <> +
+
+ {authorId !== userOid && ( +
!isBot && onClickProfileImage()} + > + {isBot ? ( + + ) : ( + + )} +
+ )} +
+
+ {authorId !== userOid && ( +
+ {authorName}
- {index === chats.length - 1 && ( -
- {dayjs(chat.time).format("H시 mm분")} + )} + {chats.map((chat, index) => ( +
+
+
- )} -
- ))} + {index === chats.length - 1 && ( +
+ {dayjs(chat.time).format("H시 mm분")} +
+ )} +
+ ))} +
-
+ + ); }; diff --git a/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectType.tsx b/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectType.tsx index 523a853a7..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"; @@ -32,7 +31,7 @@ import EditRoundedIcon from "@mui/icons-material/EditRounded"; type BodyChatReportSelectTypeProps = { roomInfo: Room; reportedId: Report["reportedId"]; - clearReportedId: () => void; + setIsSelected: Dispatch>; setIsSubmitted: Dispatch>; }; @@ -45,12 +44,11 @@ const selectOptions = [ const BodyChatReportSelectType = ({ roomInfo, reportedId, - clearReportedId, + setIsSelected, setIsSubmitted, }: BodyChatReportSelectTypeProps) => { const axios = useAxios(); const setAlert = useSetRecoilState(alertAtom); - const { oid: userOid } = useValueRecoilState("loginInfo") || {}; const wrapRef = useRef(null); const textareaRef = useRef(null); const [height, setHeight] = useState("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(() => { @@ -228,7 +224,7 @@ const BodyChatReportSelectType = ({ borderRadius: "8px", ...theme.font14, }} - onClick={clearReportedId} + onClick={() => setIsSelected(false)} > 이전 diff --git a/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectUser.tsx b/packages/web/src/components/ModalPopup/Body/BodyChatReportSelectUser.tsx index c27eff87f..ef684168f 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,20 @@ import CheckRoundedIcon from "@mui/icons-material/CheckRounded"; type BodyChatReportSelectUserProps = { roomInfo: Room; + reportedId: Nullable; setReportedId: Dispatch>>; + setIsSelected: Dispatch>; onChangeIsOpen?: (isOpen: boolean) => void; }; const BodyChatReportSelectUser = ({ roomInfo, + reportedId, setReportedId, + setIsSelected, onChangeIsOpen, }: BodyChatReportSelectUserProps) => { - const [selectedUser, setSelectedUser] = - useState>(null); + const { oid: userOid } = useValueRecoilState("loginInfo") || {}; const isDeparted = useIsTimeOver(dayServerToClient(roomInfo.time)); // 방 출발 여부 const styleText = { @@ -80,26 +84,31 @@ const BodyChatReportSelectUser = ({
신고할 사용자를 선택해주세요.
- {roomInfo.part.map((user) => ( -
setSelectedUser(user._id)} - > -
- {selectedUser === user._id && ( - - )} -
- -
- ))} + {roomInfo.part.map( + (user) => + user._id !== userOid && ( +
setReportedId(user._id)} + > +
+ {reportedId === user._id && ( + + )} +
+ +
+ ) + )}
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>(); + const [isSelected, setIsSelected] = useState(false); const [isSubmitted, setIsSubmitted] = useState(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 = ({ 신고하기
- {!reportedId ? ( + {!reportedId || !isSelected ? ( ) : !isSubmitted ? ( setReportedId(undefined)} + setIsSelected={setIsSelected} setIsSubmitted={setIsSubmitted} /> ) : (