Project/sendbird를 활용한 웹 채팅
[Sendbird를 활용한 웹 채팅] 12. 채팅 페이지 라우팅의 변천사 & 그룹 채팅 메세지 읽음 동기화(electron)
반응형
1. 채팅 페이지 라우팅의 변천사
사실 현재 카테고리의 8번 포스팅에서 작성한 채팅 리스트 페이지에서 채팅 페이지로 넘어갈 때 window.open
의 주소가 초기 라우팅 값이 아니었다.
초기
Pages/GroupChat.js & Pages/OpenChat.js
const windowObj = window.open(
"/chatting"
);
windowObj.location.state = {
chat: channel,
isOpen: false,
};
처음에는 window.open("/chatting")
으로 주소는 고정시키고 각 채팅 방의 url
과 오픈채팅여부는 state
로 넘겨주었었다. 하지만 state
를 받은 컴포넌트에서 새로고침을 하면 state
가 날라가는 문제가 발생했다. 따라서 localstorage
로 state
을 저장하고 값을 localstorage
에서 불러와 사용하는 것으로 해결하였으나.. 멀티 채팅을 구현하는데서 두 번째 문제가 발생했다.
🔒 문제
- 채팅 리스트에서 1번 채팅 클릭 → 1번 채팅 정보 localstorage에 저장 → 1번 채팅 방 오픈
- 채팅 리스트에서 2번 채팅 클릭 → 2번 채팅 정보 localsotarge에 저장 → 2번 채팅 방 오픈
- 1번 채팅 방 탭으로 가서 새로 고침 → 2번 채팅 방으로 바뀜(localstorage에 2번 채팅 정보가 담겨있기 때문에)
🔒 문제 2
- 채팅 리스트에서 1번 채팅 클릭 → 1번 채팅 정보 localstorage에 저장 → 1번 채팅 방 오픈
- 채팅 리스트에서 2번 채팅 클릭 → 2번 채팅 정보 localsotarge에 저장 → 2번 채팅 방 오픈
- 2번 채팅 방에서 메세지 전송 → 정상 동작
- 1번 채팅 방에서 메세지 전송 → 채팅 방 UI에서 보이지 않음(서버 전달은 ok)
- localstorage에는 하나의 채팅 정보만 담겨있기 때문에 발생하는 문제
🔑 해결
- 채팅 방 각각이 유니크한
url
을 갖도록 하고params
로 채팅 정보를 넘긴다.
현재
각각의 채팅 방은 고유한 주소를 가지고 새로운 탭으로 열린다.
Pages/GroupChat.js & Pages/OpenChat.js
window.open(`/chatting/${chat.url}/${true}`, chat.url, `repace=true`);
빌드 시 에러 발생
라우팅 변경 후 빌드했더니 다음과 같은 에러가 발생했다.
Uncaught SyntaxError: Unexpected token '<'
🔑 해결
public/index.html
head에 아래 코드를 추가하면 된다.
<base href="/" />
2. 그룹 채팅 메세지 읽음 동기화
🔒 문제
- 멀티 채팅(여러 개의 채팅방을 띄우고 각각에서 채팅 가능한 것)을 구현하면서 발생한 문제이다.
- 채팅 리스트에서 하나 클릭 시 채팅 방으로 넘어가는 순간 읽지 않은 메세지의 수가 사라져야 하는데 그대로 남아있다.
history.push("/chtting")
로 페이지 전환할 때(하나의 채팅방만 열 때)는 다시 돌아올 때 채팅 리스트 페이지가 새로 고침 되므로 자동으로 최신 값이 반영되었지만,window.open("/chatting")
로 페이지를 전환하면서 채팅 리스트 페이지는 그대로 있기 때문에 발생한 문제이다.
🔑 해결1
상위 브라우저(채팅 리스트 페이지) 강제 새로 고침
public/electron.js
win.webContents.on("did-create-window", (childWin, details) => {
setTimeout(() => {
win.webContents.reload();
}, 1000);
});
🔑 해결 2
getGroupChannels 함수 호출해 새로 고침 느낌 내기
Pages/GroupChat.js
const onClickBtn = useCallback(
(chat) => {
window.open(`/chatting/${chat.url}/${false}`, chat.url, `repace=true`);
setTimeout(() => {
getGroupChannels(true);
}, 1500);
},
[getGroupChannels]
);
-> 이를 통해 해결했으나 뭔가 찝찝하다. 더 좋은 방법을 찾아봐야겠다.
반응형
'Project > sendbird를 활용한 웹 채팅' 카테고리의 다른 글
[Sendbird를 활용한 웹 채팅] 14. Electron tray(트레이) (0) | 2021.09.24 |
---|---|
[Sendbird를 활용한 웹 채팅] 13. Electron window open 설정 - setWindowOpenHandler, 윈도우 포커스 맞추기 (0) | 2021.09.22 |
[Sendbird를 활용한 웹 채팅] 11. CRA 프로젝트 Electron으로 패키징하기 (0) | 2021.09.21 |
[Sendbird를 활용한 웹 채팅] 10. 채팅 페이지2 - scrollToBottom, 관리자 공지, Push 알림 (0) | 2021.09.20 |
[Sendbird를 활용한 웹 채팅] 9. 채팅 페이지 - 메세지 송수신, UI, 파일 다운로드 (0) | 2021.09.16 |