Skip to content

Commit

Permalink
feat: 가게 프로필에서 채팅하기 버튼 클릭 시 채팅방이 이미 존재하면 새로운 채팅방을 생성하지 않고 바로 채팅방으로 넘어…
Browse files Browse the repository at this point in the history
…가는 기능 추가 #109

feat: 가게 프로필에서 채팅하기 버튼 클릭 시 채팅방이 이미 존재하면 새로운 채팅방을 생성하지 않고 바로 채팅방으로 넘어가는 기능 추가
  • Loading branch information
Joonhyung-Choi committed Feb 22, 2024
1 parent a283810 commit bf0da80
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 22 deletions.
2 changes: 2 additions & 0 deletions src/apis/controller/chatPage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ export const getUserInfo = async () => {
};

export const postChatRoom = async (storeId: number) => {
console.log("postChatRoom");

const response = await sendApi.post(`/mypage/room`, {
storeId: storeId,
});
Expand Down
11 changes: 1 addition & 10 deletions src/container/myPage/chatPage/ChatPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,6 @@ export type roomInfoType = {
};

function ChatPage() {
const [roomIdState, setRoomIdState] = useState<number>();
const getRoomIdState = (id: number) => {
setRoomIdState(id);
};
const [chatRoomList, setChatRoomList] = useState<roomInfoType[]>();
const [userInfoState, setUserInfoState] = useState<userInfoType>();
const [partnerNameState, setPartnerNameState] = useState<string>();
Expand Down Expand Up @@ -55,15 +51,10 @@ function ChatPage() {
<Wrapper>
<ChatList
chatRoomList={chatRoomList}
getRoomIdState={getRoomIdState}
getPartnerNameState={getPartnerNameState}
userInfo={userInfoState}
/>
<ChatRoom
roomIdState={roomIdState}
userInfo={userInfoState}
partnerName={partnerNameState}
/>
<ChatRoom userInfo={userInfoState} partnerName={partnerNameState} />
</Wrapper>
</Layout>
);
Expand Down
7 changes: 4 additions & 3 deletions src/container/myPage/chatPage/components/ChatList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import styled from "styled-components";
import SerchImage from "../../../../../public/SVG/myPage/chatPage/searchImage.svg";
import ChatListItem from "./ChatListItem";
import { userInfoType } from "../ChatPage";
import { useRoomIdState } from "../../../../recoil/chat/roomIdStateAtom";

type roomInfoType = {
roomId: number;
Expand All @@ -14,15 +15,15 @@ type roomInfoType = {

function ChatList({
chatRoomList,
getRoomIdState,
getPartnerNameState,
userInfo,
}: {
chatRoomList?: roomInfoType[];
getRoomIdState: (id: number) => void;
getPartnerNameState: (partnerName: string) => void;
userInfo?: userInfoType;
}) {
const [roomIdState, setRoomIdState] = useRoomIdState();

return (
<Wrapper>
<Header>
Expand Down Expand Up @@ -50,7 +51,7 @@ function ChatList({
}
thumbnailMessage={item.thumbnailMessage}
onClickItem={() => {
getRoomIdState(item.roomId);
setRoomIdState(item.roomId);
getPartnerNameState(
userInfo?.userRole === "MANAGER"
? item.customerName
Expand Down
5 changes: 3 additions & 2 deletions src/container/myPage/chatPage/components/ChatRoom.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,17 @@ import * as StompJs from "@stomp/stompjs";
import { useTokenService } from "../../../../hooks/useTokenService";
import { getChatHistory } from "../../../../apis/controller/chatPage";
import { userInfoType } from "../ChatPage";
import { useRoomIdState } from "../../../../recoil/chat/roomIdStateAtom";

function ChatRoom({
roomIdState,
userInfo,
partnerName,
}: {
roomIdState?: number;
userInfo?: userInfoType;
partnerName?: string;
}) {
const [roomIdState, setRoomIdState] = useRoomIdState();

const { getAccessToken } = useTokenService();
const client = new StompJs.Client({
brokerURL: "wss://api.dessert-gallery.site/ws/chat/websocket",
Expand Down
26 changes: 19 additions & 7 deletions src/container/storePage/components/StoreProfile.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { useFollowAction } from "../../../hooks/useFollowAction";
import { useGetStoreInfo } from "../../../hooks/useStore";
import { getChatRoom, postChatRoom } from "../../../apis/controller/chatPage";
import { roomInfoType } from "../../myPage/chatPage/ChatPage";
import { useRoomIdState } from "../../../recoil/chat/roomIdStateAtom";

const StoreProfile = () => {
const router = useRouter();
Expand All @@ -18,20 +19,26 @@ const StoreProfile = () => {

const { postFollowMutate, putUnFollowMutate } = useFollowAction(storeId);

const [isChatRoomExist, setIsChatRoomExist] = useState<boolean>(false);
const [isChatRoomExist, setIsChatRoomExist] = useState<{
exist: boolean;
roomId: number;
}>({ exist: false, roomId: 0 });

const [roomIdState, setRoomIdState] = useRoomIdState();

const checkChatRoom = async () => {
const chatRoom = await getChatRoom();
console.log(chatRoom);
chatRoom.map((item: roomInfoType, index: number) => {
chatRoom.map((item: roomInfoType) => {
if (data && data.name === item.storeName) {
console.log("방이 존재합니다.", index);
setIsChatRoomExist(true);
console.log("방이 존재합니다.", item.roomId);
setIsChatRoomExist({ exist: true, roomId: item.roomId });
}
});
};

useEffect(() => {
setRoomIdState(0);
checkChatRoom();
}, [data]);

Expand Down Expand Up @@ -94,9 +101,14 @@ const StoreProfile = () => {
height="30px"
fontSize="12px"
onClickHandler={() => {
console.log(storeId);
postChatRoom(storeId);
router.push("/myPage/chat");
if (isChatRoomExist.exist) {
setRoomIdState(isChatRoomExist.roomId);
router.push("/myPage/chat");
} else {
console.log(storeId);
postChatRoom(storeId);
router.push("/myPage/chat");
}
}}
/>
</BtnList>
Expand Down
34 changes: 34 additions & 0 deletions src/recoil/chat/roomIdStateAtom.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { useEffect, useState } from "react";
import { atom, useRecoilState } from "recoil";
import { recoilPersist } from "recoil-persist";

// next.js에서 sessionStorage를 사용하기 위한 코드
const sessionStorage =
typeof window !== "undefined" ? window.sessionStorage : undefined;

// persistAtom 선언
const { persistAtom } = recoilPersist({
key: "roomIdSessionStorage", //원하는 key 값 입력
storage: sessionStorage,
});

const defaultValue: number = 0;

// 리코일 atom 선언, effects_UNSTABLE 속성을 이용해 웹스토리지 사용 정의
export const roomIdStateAtom = atom<number>({
key: "roomIdDataState",
default: defaultValue,
effects_UNSTABLE: [persistAtom],
});

// next.js에서 recoil-persist 사용 시 발생하는 hydration 에러를 해결하기 위한 코드
export function useRoomIdState() {
const [isInitial, setIsInitial] = useState(true);
const [value, setValue] = useRecoilState(roomIdStateAtom);

useEffect(() => {
setIsInitial(false);
}, []);

return [isInitial ? defaultValue : value, setValue] as const;
}

0 comments on commit bf0da80

Please sign in to comment.