diff --git a/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/ext/ContextExt.kt b/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/ext/ContextExt.kt index 0dce2e6..e55638c 100644 --- a/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/ext/ContextExt.kt +++ b/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/ext/ContextExt.kt @@ -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() +} diff --git a/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/model/PetsitterReviewModel.kt b/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/model/PetsitterReviewModel.kt new file mode 100644 index 0000000..44bd09e --- /dev/null +++ b/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/model/PetsitterReviewModel.kt @@ -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 +) + + + diff --git a/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/repository/PetsitterReviewRepository.kt b/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/repository/PetsitterReviewRepository.kt new file mode 100644 index 0000000..899185f --- /dev/null +++ b/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/repository/PetsitterReviewRepository.kt @@ -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() + 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() + } + } + +} \ No newline at end of file diff --git a/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/ui/reservation_list/fragment/PetSitterReviewWriteFragment.kt b/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/ui/reservation_list/fragment/PetSitterReviewWriteFragment.kt index 22f7922..a0ce6a8 100644 --- a/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/ui/reservation_list/fragment/PetSitterReviewWriteFragment.kt +++ b/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/ui/reservation_list/fragment/PetSitterReviewWriteFragment.kt @@ -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 @@ -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) diff --git a/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/ui/reservation_list/viewmodel/PetSitterReviewWriteViewModel.kt b/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/ui/reservation_list/viewmodel/PetSitterReviewWriteViewModel.kt new file mode 100644 index 0000000..e088f83 --- /dev/null +++ b/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/ui/reservation_list/viewmodel/PetSitterReviewWriteViewModel.kt @@ -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() + // 후기내용 → ReviewText + val textfieldPetsitterReviewWrite = MutableLiveData() +} \ No newline at end of file diff --git a/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/util/Tools.kt b/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/util/Tools.kt index 9f894bd..15f6d36 100644 --- a/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/util/Tools.kt +++ b/MungNolZa/app/src/main/java/kr/co/lion/mungnolza/util/Tools.kt @@ -22,6 +22,7 @@ object Tools { } } + // MainFragment 에서 보여줄 프래그먼트들의 이름 enum class MatchingPetsitterFragmentName(var str:String){ // 매칭화면 diff --git a/MungNolZa/app/src/main/res/layout/fragment_pet_sitter_review_write.xml b/MungNolZa/app/src/main/res/layout/fragment_pet_sitter_review_write.xml index 4891984..84a3f6d 100644 --- a/MungNolZa/app/src/main/res/layout/fragment_pet_sitter_review_write.xml +++ b/MungNolZa/app/src/main/res/layout/fragment_pet_sitter_review_write.xml @@ -1,7 +1,15 @@ - + + + + + + + android:rating="@={petSitterReviewWriteViewModel.ratingBar2}" /> + android:inputType="text|textLongMessage|textMultiLine" + android:text="@={petSitterReviewWriteViewModel.textfieldPetsitterReviewWrite}" /> - \ No newline at end of file + + + \ No newline at end of file diff --git a/MungNolZa/app/src/main/res/values/colors.xml b/MungNolZa/app/src/main/res/values/colors.xml index f1dc93f..66e0f03 100644 --- a/MungNolZa/app/src/main/res/values/colors.xml +++ b/MungNolZa/app/src/main/res/values/colors.xml @@ -23,4 +23,5 @@ #ffea9f #e0e0e0 - \ No newline at end of file + +