From c69004634eac0d7d34700cb3ce712775c7ec1b32 Mon Sep 17 00:00:00 2001 From: Bandal Date: Mon, 7 Aug 2023 23:46:27 +0900 Subject: [PATCH 1/8] =?UTF-8?q?feat:=20=ED=88=B4=EB=B0=94=20=EB=92=A4?= =?UTF-8?q?=EB=A1=9C=EA=B0=80=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EC=84=A4?= =?UTF-8?q?=EB=AA=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../team201/presentation/studyDetail/StudyDetailActivity.kt | 1 + android/app/src/main/res/values/strings.xml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailActivity.kt b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailActivity.kt index b9a9f3688..44d1b09b8 100644 --- a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailActivity.kt +++ b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailActivity.kt @@ -44,6 +44,7 @@ class StudyDetailActivity : setSupportActionBar(binding.tbStudyDetailAppBar) supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setDisplayShowTitleEnabled(false) + supportActionBar?.setHomeActionContentDescription(R.string.toolbar_back_text) supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_back) } diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 81e3b3fa5..3899329ca 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,6 +1,9 @@ Team201 + + 뒤로가기 + 로그인 후 이용이 가능합니다. 깃허브로 시작하기 From afa411e1db7805e6f0ebcdd723a419da11af9ce0 Mon Sep 17 00:00:00 2001 From: Bandal Date: Tue, 8 Aug 2023 10:07:43 +0900 Subject: [PATCH 2/8] =?UTF-8?q?refactor:=20=EB=84=88=EB=AC=B4=20=EA=B8=B8?= =?UTF-8?q?=EC=97=88=EB=8D=98=20=EB=B2=84=ED=8A=BC=20=ED=85=8D=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/main/res/layout/activity_study_detail.xml | 2 +- android/app/src/main/res/values/strings.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/android/app/src/main/res/layout/activity_study_detail.xml b/android/app/src/main/res/layout/activity_study_detail.xml index 93b5b7d2e..a6323bb2e 100644 --- a/android/app/src/main/res/layout/activity_study_detail.xml +++ b/android/app/src/main/res/layout/activity_study_detail.xml @@ -216,7 +216,7 @@ app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_weight="4" app:layout_constraintStart_toEndOf="@+id/btn_study_detail_sub" - tools:text="참여하기(3/6)" /> + tools:text="@string/study_detail_study_accept_waiting" /> diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 3899329ca..829a2880d 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -58,8 +58,8 @@ 참여하기(%d/%d) 시작하기(%d/%d) 스터디장에게 문의하기 - 스터디장의 수락을 기다리고있어요. - 스터디 시작을 기다리고있어요. + 수락을 기다리고 있어요 + 시작을 기다리고 있어요 더이상 스터디 멤버를 받을 수 없습니다. %d일 %d주 From 483b45a60adcdc03dde6cef1af18f869397aa0ab Mon Sep 17 00:00:00 2001 From: Bandal Date: Tue, 8 Aug 2023 13:43:47 +0900 Subject: [PATCH 3/8] =?UTF-8?q?refactor:=20=ED=94=84=EB=A1=9C=ED=8D=BC?= =?UTF-8?q?=ED=8B=B0=20=EB=AA=85=EC=9D=84=20=EC=A2=80=20=EB=8D=94=20?= =?UTF-8?q?=EC=9E=90=EC=97=B0=EC=8A=A4=EB=9F=BD=EA=B2=8C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/studyDetail/model/StudyDetailUIModel.kt | 3 ++- android/app/src/main/res/layout/activity_study_detail.xml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/java/com/created/team201/presentation/studyDetail/model/StudyDetailUIModel.kt b/android/app/src/main/java/com/created/team201/presentation/studyDetail/model/StudyDetailUIModel.kt index e5b6de155..7d9461287 100644 --- a/android/app/src/main/java/com/created/team201/presentation/studyDetail/model/StudyDetailUIModel.kt +++ b/android/app/src/main/java/com/created/team201/presentation/studyDetail/model/StudyDetailUIModel.kt @@ -12,6 +12,7 @@ data class StudyDetailUIModel( val startDate: String, val period: String, val cycle: String, - val applicantCount: Int, + val memberCount: Int, + val canStartStudy: Boolean, val studyMembers: List, ) diff --git a/android/app/src/main/res/layout/activity_study_detail.xml b/android/app/src/main/res/layout/activity_study_detail.xml index a6323bb2e..4212e4305 100644 --- a/android/app/src/main/res/layout/activity_study_detail.xml +++ b/android/app/src/main/res/layout/activity_study_detail.xml @@ -208,7 +208,7 @@ android:enabled="@{viewModel.state.mainButtonIsEnabled}" android:gravity="center" android:onClick="@{() -> activity.initMainButtonOnClick(viewModel.study.isMaster)}" - android:text="@{context.getString(viewModel.state.mainButtonText, viewModel.study.applicantCount, viewModel.study.peopleCount)}" + android:text="@{context.getString(viewModel.state.mainButtonText, viewModel.study.memberCount, viewModel.study.peopleCount)}" android:textAppearance="@style/button_sb18" android:textColor="@{context.getColor(viewModel.state.mainButtonTextColor)}" app:layout_constraintBottom_toBottomOf="parent" From 1629af9a690b552f0081a90f87c8af5943b470a3 Mon Sep 17 00:00:00 2001 From: Bandal Date: Tue, 8 Aug 2023 13:47:17 +0900 Subject: [PATCH 4/8] =?UTF-8?q?feat:=20=EB=A9=94=EC=9D=B8=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 스터디 시작 조건에 맞을 때 활성화 되게끔 수정 - 스터디원 신청자를 수락받으면 바로 멤버 수가 변경 되도록 수정 --- .../studyDetail/StudyDetailActivity.kt | 21 +++++++++++++++++++ .../studyDetail/StudyDetailState.kt | 4 ++-- .../studyDetail/StudyDetailViewModel.kt | 17 +++++++++++---- .../com/created/domain/model/StudyDetail.kt | 9 +++++++- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailActivity.kt b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailActivity.kt index 44d1b09b8..e44b650db 100644 --- a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailActivity.kt +++ b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailActivity.kt @@ -32,6 +32,8 @@ class StudyDetailActivity : initStudyDetailInformation() observeStudyDetailParticipants() observeStartStudy() + observeCanStartStudy() + observeParticipantsCount() } private fun initViewModel() { @@ -112,6 +114,19 @@ class StudyDetailActivity : startActivity(ProfileActivity.getIntent(this, memberId)) } + private fun observeParticipantsCount() { + studyDetailViewModel.studyMemberCount.observe(this) { + if (studyDetailViewModel.state.value is StudyDetailState.Master) { + binding.btnStudyDetailMainNotStudyMaster.text = + getString( + R.string.study_detail_button_start_study, + studyDetailViewModel.studyMemberCount.value, + studyDetailViewModel.study.value?.peopleCount, + ) + } + } + } + private fun observeStartStudy() { studyDetailViewModel.isStartStudy.observe(this) { isStartStudy -> if (isStartStudy) { @@ -128,6 +143,12 @@ class StudyDetailActivity : } } + private fun observeCanStartStudy() { + studyDetailViewModel.canStudyStart.observe(this) { cantStartStudy -> + binding.btnStudyDetailMainNotStudyMaster.isEnabled = cantStartStudy + } + } + companion object { private const val FIRST_PAGE = 1 private const val ROLE_INDEX_STUDY_MASTER = 0 diff --git a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailState.kt b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailState.kt index c660a3623..cbd407300 100644 --- a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailState.kt +++ b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailState.kt @@ -16,12 +16,12 @@ sealed class StudyDetailState( @DrawableRes val subButtonSrc: Int, ) { - object Master : StudyDetailState( + data class Master(private val canStartStudy: Boolean) : StudyDetailState( appBarTitle = R.string.study_detail_app_bar_study_master_title, mainButtonText = R.string.study_detail_button_start_study, mainButtonTextColor = R.color.white, subButtonSrc = R.drawable.ic_edit_20, - mainButtonIsEnabled = true, + mainButtonIsEnabled = canStartStudy, ) object Member : diff --git a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailViewModel.kt b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailViewModel.kt index 0006e2169..6d9c2d2d6 100644 --- a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailViewModel.kt +++ b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailViewModel.kt @@ -31,6 +31,10 @@ class StudyDetailViewModel private constructor( val isStartStudy: LiveData get() = _isStartStudy private val _isFullMember: MutableLiveData = MutableLiveData(false) val isFullMember: LiveData get() = _isFullMember + private val _canStudyStart: MutableLiveData = MutableLiveData() + val canStudyStart: LiveData get() = _canStudyStart + private val _studyMemberCount: MutableLiveData = MutableLiveData() + val studyMemberCount: LiveData get() = _studyMemberCount fun fetchStudyDetail(studyId: Long) { viewModelScope.launch { @@ -41,7 +45,9 @@ class StudyDetailViewModel private constructor( _study.value = it _studyParticipants.value = it.studyMembers _isFullMember.value = it.peopleCount == _studyParticipants.value!!.size - _state.value = it.role.toStudyDetailState() + _state.value = it.role.toStudyDetailState(it.canStartStudy) + _studyMemberCount.value = it.memberCount + _canStudyStart.value = it.canStartStudy if (it.role == Role.MASTER) fetchApplicants(studyId) } } @@ -95,6 +101,8 @@ class StudyDetailViewModel private constructor( studyParticipants.find { it.id == memberId } ?: StudyMemberUIModel.DUMMY _studyParticipants.value = studyParticipants.minus(acceptedMember) + acceptedMember.copy(isApplicant = false) + _canStudyStart.value = StudyDetail.canStartStudy(studyParticipants.size) + _studyMemberCount.value = _studyMemberCount.value?.plus(1) } } } @@ -109,7 +117,8 @@ class StudyDetailViewModel private constructor( startDate = this.startAt, period = this.totalRoundCount.toString(), cycle = this.periodOfRound, - applicantCount = this.members.count(), + memberCount = this.members.size, + canStartStudy = StudyDetail.canStartStudy(this.numberOfCurrentMembers), studyMembers = this.members.map { it.toUIModel(this.studyMasterId, isApplicant = false) }, ) @@ -124,8 +133,8 @@ class StudyDetailViewModel private constructor( tier = this.tier, ) - private fun Role.toStudyDetailState(): StudyDetailState = when (this) { - Role.MASTER -> StudyDetailState.Master + private fun Role.toStudyDetailState(canStartStudy: Boolean): StudyDetailState = when (this) { + Role.MASTER -> StudyDetailState.Master(canStartStudy) Role.MEMBER -> StudyDetailState.Member Role.APPLICANT -> StudyDetailState.Applicant Role.NOTHING -> StudyDetailState.Nothing diff --git a/android/domain/src/main/java/com/created/domain/model/StudyDetail.kt b/android/domain/src/main/java/com/created/domain/model/StudyDetail.kt index 4e599535e..55dce5f93 100644 --- a/android/domain/src/main/java/com/created/domain/model/StudyDetail.kt +++ b/android/domain/src/main/java/com/created/domain/model/StudyDetail.kt @@ -15,4 +15,11 @@ data class StudyDetail( val introduction: String, val members: List, val rounds: List, -) +) { + companion object { + private const val START_MEMBER_CONDITION = 2 + + fun canStartStudy(numberOfCurrentMembers: Int): Boolean = + numberOfCurrentMembers >= START_MEMBER_CONDITION + } +} From 2f71e1328c53774e6f751c24749319ed535205af Mon Sep 17 00:00:00 2001 From: Bandal Date: Tue, 8 Aug 2023 23:05:32 +0900 Subject: [PATCH 5/8] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A7=80=EC=97=AD=EB=B3=80=EC=88=98=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../team201/presentation/studyDetail/StudyDetailViewModel.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailViewModel.kt b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailViewModel.kt index 6d9c2d2d6..b60fddfb7 100644 --- a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailViewModel.kt +++ b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailViewModel.kt @@ -39,8 +39,7 @@ class StudyDetailViewModel private constructor( fun fetchStudyDetail(studyId: Long) { viewModelScope.launch { runCatching { - val studyDetail = studyDetailRepository.getStudyDetail(studyId).toUIModel() - studyDetail + studyDetailRepository.getStudyDetail(studyId).toUIModel() }.onSuccess { _study.value = it _studyParticipants.value = it.studyMembers From 1b3e6e32f05434311c0dc78882d3bdf16f129918 Mon Sep 17 00:00:00 2001 From: Bandal Date: Tue, 8 Aug 2023 23:13:21 +0900 Subject: [PATCH 6/8] =?UTF-8?q?refactor:=20=EC=96=B4=EC=9A=B8=EB=A6=AC?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=B3=80=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/studyDetail/StudyDetailActivity.kt | 4 ++-- android/app/src/main/res/layout/activity_study_detail.xml | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailActivity.kt b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailActivity.kt index e44b650db..537084eed 100644 --- a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailActivity.kt +++ b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailActivity.kt @@ -117,7 +117,7 @@ class StudyDetailActivity : private fun observeParticipantsCount() { studyDetailViewModel.studyMemberCount.observe(this) { if (studyDetailViewModel.state.value is StudyDetailState.Master) { - binding.btnStudyDetailMainNotStudyMaster.text = + binding.btnStudyDetailMain.text = getString( R.string.study_detail_button_start_study, studyDetailViewModel.studyMemberCount.value, @@ -145,7 +145,7 @@ class StudyDetailActivity : private fun observeCanStartStudy() { studyDetailViewModel.canStudyStart.observe(this) { cantStartStudy -> - binding.btnStudyDetailMainNotStudyMaster.isEnabled = cantStartStudy + binding.btnStudyDetailMain.isEnabled = cantStartStudy } } diff --git a/android/app/src/main/res/layout/activity_study_detail.xml b/android/app/src/main/res/layout/activity_study_detail.xml index 4212e4305..96261ffea 100644 --- a/android/app/src/main/res/layout/activity_study_detail.xml +++ b/android/app/src/main/res/layout/activity_study_detail.xml @@ -169,7 +169,7 @@ android:orientation="vertical" android:overScrollMode="never" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" - app:layout_constraintBottom_toTopOf="@id/btn_study_detail_main_not_study_master" + app:layout_constraintBottom_toTopOf="@id/btn_study_detail_main" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tv_study_detail_study_people_title" @@ -190,7 +190,7 @@ android:padding="16dp" android:src="@{context.getDrawable(viewModel.state.subButtonSrc)}" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@+id/btn_study_detail_main_not_study_master" + app:layout_constraintEnd_toStartOf="@id/btn_study_detail_main" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_chainStyle="spread" app:layout_constraintHorizontal_weight="1" @@ -198,7 +198,7 @@ tools:src="@drawable/ic_dm" /> From c1fa5112c68dcf91bfa25c2dac896755bf2237fa Mon Sep 17 00:00:00 2001 From: Bandal Date: Wed, 9 Aug 2023 11:21:34 +0900 Subject: [PATCH 7/8] =?UTF-8?q?refactor:=20NonNullLiveData=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=20=EB=B0=8F=20=EA=B8=B0=ED=83=80=20=EB=8D=94=EB=AF=B8?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../studyDetail/StudyDetailActivity.kt | 32 ++++++----- .../studyDetail/StudyDetailViewModel.kt | 57 +++++++++++-------- .../studyDetail/model/StudyDetailUIModel.kt | 19 ++++++- .../studyDetail/model/StudyMemberUIModel.kt | 2 +- android/app/src/main/res/values/strings.xml | 1 + 5 files changed, 73 insertions(+), 38 deletions(-) diff --git a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailActivity.kt b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailActivity.kt index 537084eed..e5045e8bb 100644 --- a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailActivity.kt +++ b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailActivity.kt @@ -6,12 +6,14 @@ import android.os.Bundle import android.view.MenuItem import android.widget.Toast import androidx.activity.viewModels +import androidx.annotation.StringRes import com.created.team201.R import com.created.team201.databinding.ActivityStudyDetailBinding import com.created.team201.presentation.common.BindingActivity import com.created.team201.presentation.profile.ProfileActivity import com.created.team201.presentation.studyDetail.adapter.StudyParticipantsAdapter import com.created.team201.presentation.studyDetail.model.PeriodFormat +import com.created.team201.presentation.studyDetail.model.StudyDetailUIModel import com.created.team201.presentation.studyManagement.StudyManagementActivity class StudyDetailActivity : @@ -52,7 +54,7 @@ class StudyDetailActivity : private fun validateStudyId() { if (studyId == NON_EXISTENCE_STUDY_ID) { - Toast.makeText(this, "스터디를 찾을 수 없습니다.", Toast.LENGTH_SHORT).show() + showToast(R.string.study_detail_notify_invalid_study) finish() } } @@ -63,7 +65,12 @@ class StudyDetailActivity : } private fun initStudyDetailInformation() { - studyDetailViewModel.fetchStudyDetail(studyId) + studyDetailViewModel.fetchStudyDetail(studyId) { + if (studyDetailViewModel.study.value == StudyDetailUIModel.INVALID_STUDY_DETAIL) { + showToast(R.string.study_detail_notify_invalid_study) + } + finish() + } } override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -79,10 +86,11 @@ class StudyDetailActivity : } } - fun convertPeriodOfCountFormat(periodOfCount: String?): String { + fun convertPeriodOfCountFormat(periodOfCount: String): String { + if (periodOfCount == "") return "" val stringRes = - PeriodFormat.valueOf(periodOfCount?.last() ?: DEFAULT_PERIOD_SYMBOL).res - return getString(stringRes, periodOfCount?.dropLast(STRING_LAST_INDEX)?.toInt()) + PeriodFormat.valueOf(periodOfCount.last()).res + return getString(stringRes, periodOfCount.dropLast(STRING_LAST_INDEX).toInt()) } fun initMainButtonOnClick(isMaster: Boolean) { @@ -99,12 +107,8 @@ class StudyDetailActivity : } override fun onAcceptApplicantClick(memberId: Long) { - if (studyDetailViewModel.isFullMember.value == true) { - Toast.makeText( - this, - getString(R.string.study_detail_do_not_accept_member_anymore), - Toast.LENGTH_SHORT, - ).show() + if (studyDetailViewModel.isFullMember.value) { + showToast(R.string.study_detail_do_not_accept_member_anymore) return } studyDetailViewModel.acceptApplicant(studyId, memberId) @@ -121,7 +125,7 @@ class StudyDetailActivity : getString( R.string.study_detail_button_start_study, studyDetailViewModel.studyMemberCount.value, - studyDetailViewModel.study.value?.peopleCount, + studyDetailViewModel.study.value.peopleCount, ) } } @@ -149,11 +153,13 @@ class StudyDetailActivity : } } + private fun showToast(@StringRes stringRes: Int) = + Toast.makeText(this, getString(stringRes), Toast.LENGTH_SHORT).show() + companion object { private const val FIRST_PAGE = 1 private const val ROLE_INDEX_STUDY_MASTER = 0 private const val NON_EXISTENCE_STUDY_ID = 0L - private const val DEFAULT_PERIOD_SYMBOL = 'd' private const val STRING_LAST_INDEX = 1 private const val KEY_STUDY_ID = "KEY_STUDY_ID" fun getIntent(context: Context, studyId: Long): Intent = diff --git a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailViewModel.kt b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailViewModel.kt index b60fddfb7..f483bb488 100644 --- a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailViewModel.kt +++ b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailViewModel.kt @@ -1,7 +1,6 @@ package com.created.team201.presentation.studyDetail import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope @@ -14,40 +13,52 @@ import com.created.team201.data.remote.NetworkServiceModule import com.created.team201.data.repository.StudyDetailRepositoryImpl import com.created.team201.presentation.studyDetail.model.StudyDetailUIModel import com.created.team201.presentation.studyDetail.model.StudyMemberUIModel +import com.created.team201.util.NonNullLiveData +import com.created.team201.util.NonNullMutableLiveData import kotlinx.coroutines.launch class StudyDetailViewModel private constructor( private val studyDetailRepository: StudyDetailRepository, ) : ViewModel() { - private val _study: MutableLiveData = MutableLiveData() - val study: LiveData get() = _study - private val _studyParticipants: MutableLiveData> = MutableLiveData() - val studyParticipants: LiveData> get() = _studyParticipants - private val _state: MutableLiveData = - MutableLiveData(StudyDetailState.Nothing) + private val _study: NonNullMutableLiveData = + NonNullMutableLiveData(StudyDetailUIModel.INVALID_STUDY_DETAIL) + val study: NonNullLiveData get() = _study + + private val _studyParticipants: NonNullMutableLiveData> = + NonNullMutableLiveData(listOf()) + val studyParticipants: NonNullLiveData> get() = _studyParticipants + + private val _state: NonNullMutableLiveData = + NonNullMutableLiveData(StudyDetailState.Nothing) val state: LiveData get() = _state - private val _isStartStudy: MutableLiveData = MutableLiveData(false) - val isStartStudy: LiveData get() = _isStartStudy - private val _isFullMember: MutableLiveData = MutableLiveData(false) - val isFullMember: LiveData get() = _isFullMember - private val _canStudyStart: MutableLiveData = MutableLiveData() - val canStudyStart: LiveData get() = _canStudyStart - private val _studyMemberCount: MutableLiveData = MutableLiveData() - val studyMemberCount: LiveData get() = _studyMemberCount - - fun fetchStudyDetail(studyId: Long) { + + private val _isStartStudy: NonNullMutableLiveData = NonNullMutableLiveData(false) + val isStartStudy: NonNullLiveData get() = _isStartStudy + + private val _isFullMember: NonNullMutableLiveData = NonNullMutableLiveData(false) + val isFullMember: NonNullLiveData get() = _isFullMember + + private val _canStudyStart: NonNullMutableLiveData = NonNullMutableLiveData(false) + val canStudyStart: NonNullLiveData get() = _canStudyStart + + private val _studyMemberCount: NonNullMutableLiveData = NonNullMutableLiveData(0) + val studyMemberCount: NonNullLiveData get() = _studyMemberCount + + fun fetchStudyDetail(studyId: Long, notifyInvalidStudy: () -> Unit) { viewModelScope.launch { runCatching { studyDetailRepository.getStudyDetail(studyId).toUIModel() }.onSuccess { _study.value = it _studyParticipants.value = it.studyMembers - _isFullMember.value = it.peopleCount == _studyParticipants.value!!.size + _isFullMember.value = it.peopleCount == _studyParticipants.value.size _state.value = it.role.toStudyDetailState(it.canStartStudy) _studyMemberCount.value = it.memberCount _canStudyStart.value = it.canStartStudy if (it.role == Role.MASTER) fetchApplicants(studyId) + }.onFailure { + notifyInvalidStudy() } } } @@ -68,10 +79,10 @@ class StudyDetailViewModel private constructor( studyDetailRepository.getStudyApplicants(studyId) }.onSuccess { members -> _studyParticipants.value = - _studyParticipants.value?.plus( + _studyParticipants.value.plus( members.map { it.toUIModel( - study.value?.studyMasterId ?: 0L, + study.value.studyMasterId, true, ) }, @@ -95,13 +106,13 @@ class StudyDetailViewModel private constructor( runCatching { studyDetailRepository.acceptApplicant(studyId, memberId) }.onFailure { // 204 No Content가 onFailure로 가는 현상이 있습니다. - val studyParticipants = _studyParticipants.value ?: listOf() + val studyParticipants = _studyParticipants.value val acceptedMember = - studyParticipants.find { it.id == memberId } ?: StudyMemberUIModel.DUMMY + studyParticipants.find { it.id == memberId } ?: StudyMemberUIModel.INVALID_STUDY_MEMBER _studyParticipants.value = studyParticipants.minus(acceptedMember) + acceptedMember.copy(isApplicant = false) _canStudyStart.value = StudyDetail.canStartStudy(studyParticipants.size) - _studyMemberCount.value = _studyMemberCount.value?.plus(1) + _studyMemberCount.value = _studyMemberCount.value.plus(1) } } } diff --git a/android/app/src/main/java/com/created/team201/presentation/studyDetail/model/StudyDetailUIModel.kt b/android/app/src/main/java/com/created/team201/presentation/studyDetail/model/StudyDetailUIModel.kt index 7d9461287..aaefa539b 100644 --- a/android/app/src/main/java/com/created/team201/presentation/studyDetail/model/StudyDetailUIModel.kt +++ b/android/app/src/main/java/com/created/team201/presentation/studyDetail/model/StudyDetailUIModel.kt @@ -15,4 +15,21 @@ data class StudyDetailUIModel( val memberCount: Int, val canStartStudy: Boolean, val studyMembers: List, -) +) { + companion object { + val INVALID_STUDY_DETAIL = StudyDetailUIModel( + studyMasterId = 0, + isMaster = false, + title = "", + introduction = "", + peopleCount = 0, + role = Role.NOTHING, + startDate = "", + period = "", + cycle = "", + memberCount = 0, + canStartStudy = false, + studyMembers = listOf(), + ) + } +} diff --git a/android/app/src/main/java/com/created/team201/presentation/studyDetail/model/StudyMemberUIModel.kt b/android/app/src/main/java/com/created/team201/presentation/studyDetail/model/StudyMemberUIModel.kt index 3a2bb446a..1a545bcf5 100644 --- a/android/app/src/main/java/com/created/team201/presentation/studyDetail/model/StudyMemberUIModel.kt +++ b/android/app/src/main/java/com/created/team201/presentation/studyDetail/model/StudyMemberUIModel.kt @@ -10,7 +10,7 @@ data class StudyMemberUIModel( val tier: Int, ) { companion object { - val DUMMY = StudyMemberUIModel( + val INVALID_STUDY_MEMBER = StudyMemberUIModel( id = 0L, isMaster = true, isApplicant = false, diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 1463959ff..9b5053f97 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -78,6 +78,7 @@ %d일 %d주 %s회차 + 스터디를 찾을 수 없습니다. 스터디 성공률 %d%% From d19e20b43fad1e7078552d1f4c9549cb65437dd3 Mon Sep 17 00:00:00 2001 From: Bandal Date: Wed, 9 Aug 2023 12:51:58 +0900 Subject: [PATCH 8/8] =?UTF-8?q?refactor:=20member=EB=A5=BC=20=EC=B0=BE?= =?UTF-8?q?=EC=9D=84=20=EC=88=98=20=EC=97=86=EB=8B=A4=EB=A9=B4=20=ED=95=B4?= =?UTF-8?q?=EB=8B=B9=20=ED=95=A8=EC=88=98=EB=A5=BC=20=EC=A2=85=EB=A3=8C?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../studyDetail/StudyDetailViewModel.kt | 2 +- .../studyDetail/model/StudyMemberUIModel.kt | 14 +------------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailViewModel.kt b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailViewModel.kt index f483bb488..a9aaeb9e8 100644 --- a/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailViewModel.kt +++ b/android/app/src/main/java/com/created/team201/presentation/studyDetail/StudyDetailViewModel.kt @@ -108,7 +108,7 @@ class StudyDetailViewModel private constructor( }.onFailure { // 204 No Content가 onFailure로 가는 현상이 있습니다. val studyParticipants = _studyParticipants.value val acceptedMember = - studyParticipants.find { it.id == memberId } ?: StudyMemberUIModel.INVALID_STUDY_MEMBER + studyParticipants.find { it.id == memberId } ?: return@launch _studyParticipants.value = studyParticipants.minus(acceptedMember) + acceptedMember.copy(isApplicant = false) _canStudyStart.value = StudyDetail.canStartStudy(studyParticipants.size) diff --git a/android/app/src/main/java/com/created/team201/presentation/studyDetail/model/StudyMemberUIModel.kt b/android/app/src/main/java/com/created/team201/presentation/studyDetail/model/StudyMemberUIModel.kt index 1a545bcf5..bd499b0e3 100644 --- a/android/app/src/main/java/com/created/team201/presentation/studyDetail/model/StudyMemberUIModel.kt +++ b/android/app/src/main/java/com/created/team201/presentation/studyDetail/model/StudyMemberUIModel.kt @@ -8,16 +8,4 @@ data class StudyMemberUIModel( val name: String, val successRate: Int, val tier: Int, -) { - companion object { - val INVALID_STUDY_MEMBER = StudyMemberUIModel( - id = 0L, - isMaster = true, - isApplicant = false, - tier = 3, - name = "bandal", - successRate = 90, - profileImageUrl = "https://opgg-com-image.akamaized.net/attach/images/20200321020018.373875.jpg", - ) - } -} +)