From 2311bd9e689cf49de1d2b277ded122e25e4a5f3e Mon Sep 17 00:00:00 2001 From: kimdowoo Date: Wed, 5 Apr 2023 10:51:38 +0900 Subject: [PATCH] =?UTF-8?q?[BUD-39]=20feat=20:=20customToast=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84(#23)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/deploymentTargetDropDown.xml | 2 +- common-ui/build.gradle | 1 + .../com/nocapstone/common_ui/CustomToast.kt | 38 +++++++++++++++++++ .../com/nocapstone/diary/data/DiaryService.kt | 14 +++---- .../com/nocapstone/diary/ui/DiaryFragment.kt | 6 +-- .../com/nocapstone/diary/ui/DiaryViewModel.kt | 12 +++--- .../nocapstone/diary/ui/WriteDiaryFragment.kt | 12 +++--- .../nocapstone/onboarding/ui/LoginFragment.kt | 3 ++ settings.gradle | 2 + 9 files changed, 68 insertions(+), 22 deletions(-) create mode 100644 common-ui/src/main/java/com/nocapstone/common_ui/CustomToast.kt diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index fc95090..7c681e8 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -12,6 +12,6 @@ - + \ No newline at end of file diff --git a/common-ui/build.gradle b/common-ui/build.gradle index d839517..cf4114b 100644 --- a/common-ui/build.gradle +++ b/common-ui/build.gradle @@ -42,6 +42,7 @@ dependencies { api project(path: ':foundation') + implementation 'com.github.Spikeysanju:MotionToast:1.4' implementation 'de.hdodenhof:circleimageview:3.1.0' api "androidx.navigation:navigation-fragment-ktx:$rootProject.nav_version" diff --git a/common-ui/src/main/java/com/nocapstone/common_ui/CustomToast.kt b/common-ui/src/main/java/com/nocapstone/common_ui/CustomToast.kt new file mode 100644 index 0000000..3d67001 --- /dev/null +++ b/common-ui/src/main/java/com/nocapstone/common_ui/CustomToast.kt @@ -0,0 +1,38 @@ +package com.nocapstone.common_ui + + +import androidx.core.content.res.ResourcesCompat +import androidx.fragment.app.Fragment +import www.sanju.motiontoast.MotionToast +import www.sanju.motiontoast.MotionToastStyle + + +object CustomToast { + fun createToast(fragment: Fragment, message: String, toastType: ToastType) { + MotionToast.createColorToast( + fragment.requireActivity(), + toastType.title, + message, + toastType.style, + MotionToast.GRAVITY_BOTTOM, + MotionToast.SHORT_DURATION, + ResourcesCompat.getFont( + fragment.requireContext(), + www.sanju.motiontoast.R.font.helvetica_regular + ) + ) + } +} + + +enum class ToastType(val style: MotionToastStyle, val title: String) { + SUCCESS(MotionToastStyle.SUCCESS, "성공 \uD83D\uDE0D"), + ERROR(MotionToastStyle.ERROR, "에러 ☹ "), + INFO(MotionToastStyle.INFO, "알림") +} + +data class ToastSet( + val message: String, + val type: ToastType +) + diff --git a/diary/src/main/java/com/nocapstone/diary/data/DiaryService.kt b/diary/src/main/java/com/nocapstone/diary/data/DiaryService.kt index 5d29110..6c4c634 100644 --- a/diary/src/main/java/com/nocapstone/diary/data/DiaryService.kt +++ b/diary/src/main/java/com/nocapstone/diary/data/DiaryService.kt @@ -26,13 +26,13 @@ interface DiaryService { ): CommonResponse - @Multipart - @POST("diary/{diaryId}/image") - suspend fun createDiaryImage( - @Header("Authorization") token: String, - @Path("diaryId") diaryId: Long, - @Part image: List - ): CommonResponse + @Multipart + @POST("diary/{diaryId}/image") + suspend fun createDiaryImage( + @Header("Authorization") token: String, + @Path("diaryId") diaryId: Long, + @Part image: List + ): CommonResponse @GET("diary/{diaryId}") diff --git a/diary/src/main/java/com/nocapstone/diary/ui/DiaryFragment.kt b/diary/src/main/java/com/nocapstone/diary/ui/DiaryFragment.kt index 8f801d5..c625863 100644 --- a/diary/src/main/java/com/nocapstone/diary/ui/DiaryFragment.kt +++ b/diary/src/main/java/com/nocapstone/diary/ui/DiaryFragment.kt @@ -14,6 +14,7 @@ import androidx.navigation.fragment.findNavController import com.example.diary.R import com.example.diary.databinding.FragmentDiaryBinding import com.nocapstone.common_ui.CalendarUtil +import com.nocapstone.common_ui.CustomToast import com.nocapstone.common_ui.DialogForDateNoDay import com.nocapstone.common_ui.MainActivityUtil import com.nocapstone.diary.DiaryAdapter @@ -67,14 +68,13 @@ class DiaryFragment : Fragment() { } diaryViewModel.readDiaryList(testYear, testMonth) } - observeToast() } private fun observeToast() { lifecycleScope.launch { diaryViewModel.toastMessage.collectLatest { - if (it.isNotEmpty()) { - Toast.makeText(requireContext(), it, Toast.LENGTH_SHORT).show() + if (it != null) { + CustomToast.createToast(this@DiaryFragment, it.message, it.type) } } } diff --git a/diary/src/main/java/com/nocapstone/diary/ui/DiaryViewModel.kt b/diary/src/main/java/com/nocapstone/diary/ui/DiaryViewModel.kt index e6aa2ad..88ef65a 100644 --- a/diary/src/main/java/com/nocapstone/diary/ui/DiaryViewModel.kt +++ b/diary/src/main/java/com/nocapstone/diary/ui/DiaryViewModel.kt @@ -7,6 +7,8 @@ import androidx.lifecycle.viewModelScope import com.nocapstone.common.domain.usecase.DataStoreUseCase import com.nocapstone.common.util.ImageUtil import com.nocapstone.common.util.printLog +import com.nocapstone.common_ui.ToastSet +import com.nocapstone.common_ui.ToastType import com.nocapstone.diary.DiaryUtil import com.nocapstone.diary.domain.CreateDiaryRequest import com.nocapstone.diary.domain.DiaryUseCase @@ -37,8 +39,8 @@ class DiaryViewModel @Inject constructor( private val _diaryList = MutableStateFlow>(mutableListOf()) val diaryList: StateFlow> = _diaryList - private val _toastMessage = MutableStateFlow("") - val toastMessage: StateFlow = _toastMessage + private val _toastMessage = MutableStateFlow(null) + val toastMessage: StateFlow = _toastMessage fun readDiaryList(year: Int, month: Int) { viewModelScope.launch(Dispatchers.IO) { @@ -97,9 +99,9 @@ class DiaryViewModel @Inject constructor( _imageUriList.value = newUriList.toMutableList() } - private fun setToastMessage(newMessage: String) { - _toastMessage.value = "" - _toastMessage.value = newMessage + fun setToastMessage(newMessage: String, toastType: ToastType) { + _toastMessage.value = null + _toastMessage.value = ToastSet(newMessage,toastType) } } diff --git a/diary/src/main/java/com/nocapstone/diary/ui/WriteDiaryFragment.kt b/diary/src/main/java/com/nocapstone/diary/ui/WriteDiaryFragment.kt index e3ad4f6..dd34473 100644 --- a/diary/src/main/java/com/nocapstone/diary/ui/WriteDiaryFragment.kt +++ b/diary/src/main/java/com/nocapstone/diary/ui/WriteDiaryFragment.kt @@ -12,12 +12,10 @@ import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import com.example.diary.R import com.example.diary.databinding.FragmentWriteDiaryBinding +import com.nocapstone.common_ui.* import com.nocapstone.common_ui.CalendarUtil.Companion.getTodayDate import com.nocapstone.common_ui.CalendarUtil.Companion.parseDateToFormatString import com.nocapstone.common_ui.CalendarUtil.Companion.parseStringToDate -import com.nocapstone.common_ui.DialogForDatePicker -import com.nocapstone.common_ui.ImageAdapter -import com.nocapstone.common_ui.MainActivityUtil import com.nocapstone.diary.domain.CreateDiaryRequest import dagger.hilt.android.AndroidEntryPoint import gun0912.tedimagepicker.builder.TedImagePicker @@ -43,6 +41,8 @@ class WriteDiaryFragment : Fragment() { setVisibilityBottomAppbar(View.GONE) } + diaryViewModel.setToastMessage("안녕",ToastType.SUCCESS) + return binding.root } @@ -105,7 +105,7 @@ class WriteDiaryFragment : Fragment() { titleTv.text.toString(), contentTv.text.toString() ).let { - diaryViewModel.createDiary(it){ + diaryViewModel.createDiary(it) { findNavController().popBackStack() } } @@ -120,8 +120,8 @@ class WriteDiaryFragment : Fragment() { private fun observeToast() { lifecycleScope.launch { diaryViewModel.toastMessage.collectLatest { - if (it.isNotEmpty()) { - Toast.makeText(requireContext(), it, Toast.LENGTH_SHORT).show() + if (it != null) { + CustomToast.createToast(this@WriteDiaryFragment, it.message, it.type) } } } diff --git a/onboarding/src/main/java/com/nocapstone/onboarding/ui/LoginFragment.kt b/onboarding/src/main/java/com/nocapstone/onboarding/ui/LoginFragment.kt index e3a8333..ef22022 100644 --- a/onboarding/src/main/java/com/nocapstone/onboarding/ui/LoginFragment.kt +++ b/onboarding/src/main/java/com/nocapstone/onboarding/ui/LoginFragment.kt @@ -1,10 +1,12 @@ package com.nocapstone.onboarding.ui +import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.activity.OnBackPressedCallback +import androidx.core.content.res.ResourcesCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController @@ -46,6 +48,7 @@ class LoginFragment : Fragment() { viewLifecycleOwner, callback ) + binding.kakaoLoginBtn.setOnClickListener { LoginUtil.loginWithKaKao(requireContext()) { token -> splashViewModel.signup(token!!, { diff --git a/settings.gradle b/settings.gradle index 2d9fc96..014a799 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,6 +11,8 @@ dependencyResolutionManagement { google() mavenCentral() maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' } + maven { url 'https://jitpack.io' } + } } rootProject.name = "buddyvet"