[Clone] 인스타그램 클론 프로젝트(7) - 좋아요

minnie·2022년 9월 16일
0

클론프로젝트

목록 보기
8/8
post-thumbnail

1. ContentDTO 데이터 타입 변경

ContentDTO에서 favorites는 중복 좋아요 방지할 수 있는 유저 확인 용 변수이다.
해당 데이터 타입을 Map에서 MutableMap으로 변경

var favorites: MutableMap<String, Boolean> = HashMap()

2. 좋아요 이벤트

firebase의 데이터 적재 스타일을 보면 collection - document - (collection|field) 와 같은 형식을 따른다.
images collection의 해당 uid를 가진 document 좋아요에 대한 정보를 넣어주기 위해 가져온다.

데이터를 저장하기 위해서 transaction을 사용한다.

좋아요 버튼을 누르면 favoriteCount를 1 증가시켜주고, favorites[uid]의 값을 true로 변경 시켜준다.

onBindViewHolder에서는 버튼을 눌렀을 때 favoriteEvent 함수를 호출하고 좋아요 상태에 따라 이미지를 적용시켜준다.

private fun favoriteEvent(position: Int) {
	val tsDoc = firestore?.collection("images")
                ?.document(contentUIDList[position]) // images collection에서 원하는 uid의 document에 대한 정보
    // 데이터를 저장하기 위해 transaction 사용
    firestore?.runTransaction { transaction ->
                uid = FirebaseAuth.getInstance().currentUser?.uid // uid 값 가져옴
                val contentDTO = transaction.get(tsDoc!!) // 해당 document 받아오기
                    .toObject(ContentDTO::class.java)//트랜젝션의 데이터를 ContentDTO로 캐스팅
                if (contentDTO!!.favorites.containsKey(uid)) { //좋아요 버튼이 이미 클릭 되어있으면 -> favorites 값이 true이면
                    //When the button is clicked
                    contentDTO.favoriteCount = contentDTO.favoriteCount - 1
                    contentDTO.favorites.remove(uid);
                } else {
                    //When the button is not clicked
                    contentDTO.favoriteCount = contentDTO.favoriteCount + 1
                    contentDTO.favorites[uid!!] = true
                }
                transaction.set(tsDoc,contentDTO) // 해당 document에 Dto 객체 저장 , 트랜젝션을 다시 서버로 돌려줌
            }
        }
        
  override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { 
   //This code is when the button is clicked
   binding.detailviewitemFavoriteImageview.setOnClickListener {
                favoriteEvent(position)
   }
   //This code is when the page is loaded
   if(contentDTOs[position].favorites.containsKey(uid)){ // 좋아요 상태에 따라 이미지 적용
	    //This is like status     	
    	binding.detailviewitemFavoriteImageview.setImageResource(R.drawable.ic_favorite)
   }else{
        //This is unlike status
        binding.detailviewitemFavoriteImageview.setImageResource(R.drawable.ic_favorite_border)
   }

}
        
profile
Android Developer

0개의 댓글