본문 바로가기
CodeLab/Firebase

Firebase Web 채팅앱 만들기 - Realtime Database를 이용한 채팅기능 구현 - 채팅방 리스팅화면

by 블리드카가 2017. 12. 3.
728x90





채팅방 리스팅 화면입니다. 아래와 같이 두번째탭에 자신이 속해있는 채팅방 목록이 나오는 화면 입니다.


메세지를 저장할 때 UserRooms위치에도 데이터를 저장했는데 이 위치에 저장된 데이터를 채팅방 리스팅 화면에 활용하게 됩니다.

채팅방 리스트 화면을 만들기 위해 다음 코드를 추가해주십시오.




채팅방 목록을 불러오는 코드입니다. 로그인 인증이 완료된 후 수행되는 setLogin 메소드 안에서 loadRoomList메소드를 호출합니다. 

loadRoomList메소드를 확인을 해보면 유저리스트와 는 다르게 메세지를 받을 때마다 목록을 갱신시켜 주기위해 once메소드가 아닌 on메소드를 사용하였습니다.  

getRoomList메소드는 loadRoomList에서 채팅방 목록을 데이터를 받을 때마다 화면을 만드는 메소드 입니다. underscore라이브러리의 template 메소드로 화면을 그립니다.

채팅방 목록의 데이터는 채팅방 상단 타이틀을 갱신하기 위한 용도로도 사용이됩니다. 

var arrRoomUserName val.roomUserName.split(this.SPLIT_CHAR);
arrRoomUserName.splice(arrRoomUserName.indexOf(this.auth.currentUser.displayName), 1); 
var eachRoomTitle arrRoomUserName.length ?

                                  arrRoomUserName[0] + " 외 " + (arrRoomUserName.length 1) + "명" arrRoomUserName[0] +'님';

if(data.key === this.roomId && this.isOpenRoom){ //현재 메세지 상단 제목을 갱신해준다.
       this.spTitle.innerHTML  eachRoomTitle;
} 

방목록을 클릭을 하면 채팅방을 오픈해야하는데 채팅방을 오픈하기 위해서 필요한 정보를 미리 각각의 채팅방을 감싸는 li태그의 data 속성으로 값을 저장합니다. 




그리고 채팅방을 오픈하는데 정보로 사용할 데이터 이외에 roomType이라는 데이터가 있습니다. roomType은 'ONE_VS_ONE' 또는 'MULTI' 값입니다. 1대1 채팅방인지 아니면 3명이상이 사용하는 채팅방인지 구분하는 구분값입니다. 유저리스트에서 유저를 클릭할 시에 새로운 채팅방을 만들지 않고 채팅방 리스트 화면을 확인해서 채팅방을 오픈하기 위한 용도입니다. 

Realtime Database에서는 아쉽게도 내림차순의 정렬이 없습니다. 보통 내림 차순을 위한 데이터를 저장을 하는 방법을 쓰거나 아래와 같이 데이터를 받아서 역순으로 정렬합니다. 최신의 메세지를 받은 채팅방을 가장 상위에 올리기 위해서 아래와 같이 배열 값을 반대로 바꾸었습니다.
this.ulRoomList.innerHTML = arrRoomListHtml.reverse().join(''); // 역순 정렬
getRoomList 메소드 하단에는 채팅방을 클릭할 시 방을 오픈하는 동작을 하는 onRoomListClick 메소드가 바인딩 되어 있습니다.
var arrLiList this.ulRoomList.getElementsByTagName('li')
    var arrLiListLength arrLiList.length;
    for(var i=0arrLiListLengthi++){
        arrLiList[i].addEventListener('click'this.onRoomListClick.bind(this));
    }

onRoomListClick 메소드는 채팅방 목록 화면에 저장해둔 data 속성들을 가지고와 채팅방을 오픈하는데 필요한 변수를 설정하고 채팅방을 열어 줍니다.

유저리스트 화면 클릭시 채팅방 목록을 검색 후 오픈하는 기능을 추가하겠습니다. onUserListClick 메소드를 아래와 같이 수정해주세요.




아래 코드 구문이 채팅방 목록에서 1대1 타입의 채팅방 중에 클릭한 유저의 uid 를 찾는 코드 입니다.
var roomListTarget document.querySelectorAll('[data-roomType="'this.ONE_VS_ONE+'"][data-roomOneVSOneTarget="'targetUserUid +'"]')[0];

해당 타겟이 있다면 채팅방 목록에서 해당항목을 클릭하게되고, 아닌경우는 새로운 채팅방을 오픈하게 됩니다.

유저리스트에서 채팅방을 오픈하는 것과 채팅방리스트에서 채팅방을 오픈하는 것이 완성되었습니다. 이제 채팅방 화면에서 뒤로 가기 버튼을 눌렀을 시에 동작을 구현하겠습니다.

유저리스트에서 채팅방을 오픈하였는지 아니면 채팅방 리스트에서 채팅방을 오픈하였는지 구분 값이 필요합니다. onUserListClick 메소드와 onRoomListClick 메소드에 코드를 추가해주십시오.




그리고 채팅방 화면의 좌측 상단 백버튼에 이벤트를 바인딩하고 메소드를 연결하겠습니다.




백버튼에 onBackBtnClick 메소드를 연결하였습니다. onBackBtnClick메소드는 방 오픈 여부 상태값을 false로 변경하고, 백버튼과 초대 버튼을 숨기고, 채팅방 오픈 전 탭으로 되돌아가며, 상단타이틀을 복원하는 코드가 들어가 있습니다.

챕터 완성 소스  :

8.Realtime Database를 이용한 채팅기능 구현 - 채팅방 리스팅화면.zip





  1. 예제 소개
  2. Firebase 설정하기
  3. Hosting을 활용한 프로젝트 준비 작업
  4. Authentication을 이용한 유저 가입 및 로그인 구현하기
  5. Realtime Database를 이용한 채팅기능 구현 - Reatime Database 특징 및 데이터 구조
  6. Realtime Database를 이용한 채팅기능 구현 - 유저데이터 저장하기
  7. Realtime Database를 이용한 채팅기능 구현 - 유저리스팅 화면
  8. Realtime Database를 이용한 채팅기능 구현 - 채팅화면 및 채팅메세지 리스팅
  9. Realtime Database를 이용한 채팅기능 구현 - 채팅메세지 전송기능
  10. Realtime Database를 이용한 채팅기능 구현 - 채팅방 리스팅화면
  11. Realtime Database를 이용한 채팅기능 구현 - 채팅방 초대 기능
  12. Realtime Database를 이용한 채팅기능 구현 - 접속 중인 유저 표시하기
  13. Storage를 이용한 파일 전송기능
  14. Cloud Messaging과 Functions을 이용한 푸시메세지 기능 - FCM Token 정보 저장
  15. Cloud Messaging과 Functions을 이용한 푸시메세지 기능 - Functions를 통한 FCM 발송
  16. Cloud Messaging과 Functions을 이용한 푸시메세지 기능 - Service worker를 이용한 FCM수신
  17. Realtime Database 권한 설정

 







728x90