Skip to content

Commit

Permalink
Merge pull request #38 from APP-Android2/21-feature-펫시터-후기-작성-기능-구현
Browse files Browse the repository at this point in the history
[#21] feature 펫시터 후기 작성 기능 구현
  • Loading branch information
cny1213 authored Apr 12, 2024
2 parents 68cb83f + 9046818 commit 654df68
Show file tree
Hide file tree
Showing 8 changed files with 235 additions and 18 deletions.
10 changes: 10 additions & 0 deletions MungNolZa/app/src/main/java/kr/co/lion/mungnolza/ext/ContextExt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,13 @@ fun Context.showSoftInput(view: View) {
inputMethodManger.showSoftInput(view, 0)
}

// 입력 요소가 비어있을때 보여줄 다이얼로그를 구성하는 메서드
fun showErrorDialog(context: Context, view: View, title: String, message: String) {
val materialAlertDialogBuilder = MaterialAlertDialogBuilder(context)
materialAlertDialogBuilder.setTitle(title)
materialAlertDialogBuilder.setMessage(message)
materialAlertDialogBuilder.setPositiveButton("확인") { dialogInterface: DialogInterface, i: Int ->
context.showSoftInput(view)
}
materialAlertDialogBuilder.show()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package kr.co.lion.mungnolza.model

data class PetsitterReviewModel(
// 후기글번호 → reviewIdx
// 펫시터 번호 → petsitterIdx
// 사용자(작성자) 번호 → reviewWriterIdx
// 사용자 이름 → reviewWriterName
// 작성날짜 → reviewWriteDate
// 별점 → reviewStarCount
// 후기내용 → reviewText

var reviewIdx: Int,
/*var petsitterIdx : Int,
var reviewWriterIdx : Int,
var reviewWriterName : String,*/
var reviewWriteDate : String,
var reviewStarCount: Float?,
var reviewText: String
)



Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package kr.co.lion.mungnolza.repository

import com.google.firebase.Firebase
import com.google.firebase.firestore.firestore
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.tasks.await
import kr.co.lion.mungnolza.model.PetsitterReviewModel

class PetsitterReviewRepository {

companion object{
// 후기글 번호 시퀀스값을 가져온다.
suspend fun getReviewIdx() : Int{

var reviewIdxSequence = 0

val job1 = CoroutineScope(Dispatchers.IO).launch {
// 컬렉션에 접근할 수 있는 객체를 가져온다
val collectionReference = Firebase.firestore.collection("petsitterReviewModel")
// 후기글 번호 시퀀스값을 가지고 있는 문서에 접근할 수 있는 객체를 가져온다.
val documentReference = collectionReference.document("reviewIdxSequence")
// 문서내에 있는 데이터를 가져올 수 있는 객체를 가져온다.
val documentSnapShot = documentReference.get().await()
//reviewIdxSequence = documentSnapShot.getLong("petsitterIdx")?.toInt()!!
reviewIdxSequence = documentSnapShot.getLong("reviewIdx")?.toInt() ?: 0

}
job1.join()

return reviewIdxSequence
}

// 후기글번호 시퀀스값을 업데이트 한다.
suspend fun updateReviewIdx(reviewIdxSequence:Int){
val job1 = CoroutineScope(Dispatchers.IO).launch {
// 컬렉션에 접근할 수 있는 객체를 가져온다.
val collectionReference = Firebase.firestore.collection("petsitterReviewModel")
// 후기글 번호 시퀀스값을 가지고 있는 문서에 접근할 수 있는 객체를 가져온다.
val documentReference = collectionReference.document("reviewIdxSequence")
// 저장할 데이터를 담을 HaskMap을 만들어준다.
val map = mutableMapOf<String, Long>()
map["reviewIdx"] = reviewIdxSequence.toLong()
// 저장한다
documentReference.set(map)
}
job1.join()
}

// 펫시터후기 정보를 저장한다.
suspend fun insertPetsitterReviewData(petsitterReviewModel: PetsitterReviewModel){
val job1 = CoroutineScope(Dispatchers.IO).launch {
// 컬렉션에 접근할 수 있는 객체를 가져온다.
val collectionReference = Firebase.firestore.collection("petsitterReviewModel")
// 컬렉션에 문서를 추가한다.
// 문서를 추가할 때 객체나 맵을 지정한다.
// 추가된 문서 내부의 필드는 객체가 가진 프로퍼티의 이름이나 맵에 있는 데이터의 이름과 동일하게 결정된다.
collectionReference.add(petsitterReviewModel)
}
job1.join()
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,52 @@ package kr.co.lion.mungnolza.ui.reservation_list.fragment

import android.content.DialogInterface
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kr.co.lion.mungnolza.ui.reservation_list.ReservationListActivity
import kr.co.lion.mungnolza.R
import kr.co.lion.mungnolza.repository.PetsitterReviewRepository
import kr.co.lion.mungnolza.databinding.FragmentPetSitterReviewWriteBinding
import kr.co.lion.mungnolza.model.PetsitterReviewModel
import kr.co.lion.mungnolza.ui.reservation_list.viewmodel.PetSitterReviewWriteViewModel
import kr.co.lion.mungnolza.util.ReservationListFragmentName
import java.text.SimpleDateFormat
import java.util.Date
// ContextExt.kt에 정의된 확장 함수를 import
import kr.co.lion.mungnolza.ext.hideSoftInput
import kr.co.lion.mungnolza.ext.showErrorDialog

class PetSitterReviewWriteFragment : Fragment() {

lateinit var fragmentPetSitterReviewWriteBinding: FragmentPetSitterReviewWriteBinding
lateinit var reservationListActivity: ReservationListActivity

lateinit var petSitterReviewWriteViewModel : PetSitterReviewWriteViewModel

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment

fragmentPetSitterReviewWriteBinding = FragmentPetSitterReviewWriteBinding.inflate(layoutInflater)
reservationListActivity = activity as ReservationListActivity

// ViewModel 객체를 생성한다.
petSitterReviewWriteViewModel = PetSitterReviewWriteViewModel()
// 생성한 ViewModel 객체를 layout 파일에 설정해준다.
fragmentPetSitterReviewWriteBinding.petSitterReviewWriteViewModel = petSitterReviewWriteViewModel
// ViewModel의 생명주기를 Fragment와 일치시킨다. Fragment가 살아 있을 때 ViewModel 객체도 살아 있게끔 해준다.
fragmentPetSitterReviewWriteBinding.lifecycleOwner = this


setToolbar()
setEvent()
setButtonDone()
setTextField()
initData()

return fragmentPetSitterReviewWriteBinding.root
Expand All @@ -43,27 +67,97 @@ class PetSitterReviewWriteFragment : Fragment() {
}
}

// 이벤트 설정
fun setEvent(){
// 작성 완료 버튼 (이벤트 설정)
fun setButtonDone(){
// buttonPetsitterReviewWriteDone 작성완료 버튼 설정
fragmentPetSitterReviewWriteBinding.apply {
buttonPetsitterReviewWriteDone.apply {
// 버튼을 눌럿을 때
setOnClickListener {
// 작성완료 다이어로그를 띄운다
val materialAlertDialogBuilder = MaterialAlertDialogBuilder(reservationListActivity)
materialAlertDialogBuilder.setTitle("작성 완료")
materialAlertDialogBuilder.setMessage("후기 작성이 완료되었습니다 !")
materialAlertDialogBuilder.setPositiveButton("확인"){ dialogInterface: DialogInterface, i: Int ->
// 메인화면으로 넘어간다.
// 입력을 검사한다. -유효성 검사
val chk = checkTextInput()

// 입력이 모두 잘 되어 있다면..
// 데이터를 저장하고 이동한다.
if(chk == true){
// (추가예정) 사용자가 입력한 데이터를 저장한다.
savePetsitterReviewData()

// 키보드를 내려준다
context.hideSoftInput(reservationListActivity)

// 작성완료 다이어로그를 띄운다
val materialAlertDialogBuilder = MaterialAlertDialogBuilder(reservationListActivity)
materialAlertDialogBuilder.setTitle("작성 완료")
materialAlertDialogBuilder.setMessage("후기 작성이 완료되었습니다 !")
materialAlertDialogBuilder.setPositiveButton("확인"){ dialogInterface: DialogInterface, i: Int ->
// (추가예정) 메인화면으로 넘어간다.
}
materialAlertDialogBuilder.show()
}
materialAlertDialogBuilder.show()
}
}
}
}

// 초기 데이터 셋팅
// 데잍
fun savePetsitterReviewData() {
CoroutineScope(Dispatchers.Main).launch {
// 펫시터 후기 번호 시퀀스 값을 가져온다.
val reviewIdxSequence = PetsitterReviewRepository.getReviewIdx()
Log.d("test1234", "reviewIdxSequence : $reviewIdxSequence")
// 시퀀스 값을 1 증가시켜 덮어씌워준다.
PetsitterReviewRepository.updateReviewIdx(reviewIdxSequence + 1)

// 저장할 데이터를 가져온다
val reviewIdx = reviewIdxSequence + 1
//val petsitterIdx
//val reviewWriterIdx
//val reviewWriterName
val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd")
val reviewWriteDate = simpleDateFormat.format(Date())
val reviewStarCount = petSitterReviewWriteViewModel.ratingBar2.value
val reviewText = petSitterReviewWriteViewModel.textfieldPetsitterReviewWrite.value!!

// 저장할 데이터를 객체에 담는다.
val petsitterReviewModel = PetsitterReviewModel(reviewIdx, reviewWriteDate, reviewStarCount, reviewText)

// 펫시터 후기 정보를 저장한다.
PetsitterReviewRepository.insertPetsitterReviewData(petsitterReviewModel)
}
}

// 입력요소 유효성 검사 메서드
fun checkTextInput(): Boolean {
// 사용자가 입력한 내용을 가져온다
val starCount = petSitterReviewWriteViewModel.ratingBar2.value
val reviewText = petSitterReviewWriteViewModel.textfieldPetsitterReviewWrite.value!!

// 별점수를 입력하지 않았다면
if(starCount == 0f){
// 다이어로그 띄워준다
showErrorDialog(reservationListActivity, fragmentPetSitterReviewWriteBinding.ratingBar2, "별점 입력 오류", "펫시터에게 별점을 남겨주세요.")
return false
}

// 후기 내용을 입력하지 않았다면
if(reviewText.isEmpty()){
// 다이어로그 띄워준다
// 다이어로그의 확인 클릭시, 뷰에 포커스를 주고 키보드를 올린다.
showErrorDialog(reservationListActivity, fragmentPetSitterReviewWriteBinding.textfieldPetsitterReviewWrite, "후기 작성 오류", "펫시터에게 후기를 작성해주세요.")
return false
}
return true
}

// 입력요소 초기설정
fun setTextField(){
// 입력 요소들을 초기화 한다.
petSitterReviewWriteViewModel.ratingBar2.value = 0f
petSitterReviewWriteViewModel.textfieldPetsitterReviewWrite.value = ""
}

// 임시 가짜 데이터 셋팅
fun initData(){
fragmentPetSitterReviewWriteBinding.apply {
imageViewPetSitterReviewWrite.setImageResource(R.drawable.petsitter)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package kr.co.lion.mungnolza.ui.reservation_list.viewmodel

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

// 펫시터 후기 작성

class PetSitterReviewWriteViewModel : ViewModel() {
// 별점 → starCount
val ratingBar2 = MutableLiveData<Float>()
// 후기내용 → ReviewText
val textfieldPetsitterReviewWrite = MutableLiveData<String>()
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ object Tools {
}
}


// MainFragment 에서 보여줄 프래그먼트들의 이름
enum class MatchingPetsitterFragmentName(var str:String){
// 매칭화면
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:tools="http://schemas.android.com/tools">

<data>
<variable
name="petSitterReviewWriteViewModel"
type="kr.co.lion.mungnolza.ui.reservation_list.viewmodel.PetSitterReviewWriteViewModel" />
</data>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
Expand Down Expand Up @@ -114,7 +122,7 @@
android:layout_gravity="center"
android:layout_marginTop="40dp"
android:isIndicator="false"
android:numStars="5" />
android:rating="@={petSitterReviewWriteViewModel.ratingBar2}" />

<TextView
android:id="@+id/textView5"
Expand All @@ -134,7 +142,6 @@
android:text="남겨주신 후기는 펫시터의 프로필에 공개됩니다." />

<com.google.android.material.textfield.TextInputLayout
android:id="@+id/textfieldPetsitterReviewWrite"
android:layout_width="match_parent"
android:layout_height="350dp"
android:layout_marginLeft="20dp"
Expand All @@ -144,10 +151,12 @@
app:endIconMode="clear_text">

<com.google.android.material.textfield.TextInputEditText
android:id="@+id/textfieldPetsitterReviewWrite"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="start"
android:inputType="text|textLongMessage|textMultiLine" />
android:inputType="text|textLongMessage|textMultiLine"
android:text="@={petSitterReviewWriteViewModel.textfieldPetsitterReviewWrite}" />
</com.google.android.material.textfield.TextInputLayout>

<androidx.appcompat.widget.AppCompatButton
Expand All @@ -160,4 +169,6 @@
android:padding="10dp"
android:text="작성 완료" />

</LinearLayout>
</LinearLayout>

</layout>
3 changes: 2 additions & 1 deletion MungNolZa/app/src/main/res/values/colors.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,5 @@
<!-- 선택된 버튼의 색상 -->
<color name="selectedButtonColor">#ffea9f</color>
<color name="defaultButtonColor">#e0e0e0</color>
</resources>

</resources>

0 comments on commit 654df68

Please sign in to comment.