ContentDTO에서 favorites는 중복 좋아요 방지할 수 있는 유저 확인 용 변수이다.
해당 데이터 타입을 Map에서 MutableMap으로 변경
var favorites: MutableMap<String, Boolean> = HashMap()
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)
}
}