From d689df094b300e19fad2a799abf1e0d35fdb1d8a Mon Sep 17 00:00:00 2001 From: arinming Date: Fri, 24 May 2024 17:03:34 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[Refactor]=20=EB=B7=B0=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?Side=20Effect=20Loading=20=EC=B6=94=EA=B0=80=20(#11)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 8 ++++---- .../java/com/sopt/now/compose/ui/signUp/SignUpScreen.kt | 4 ++++ .../com/sopt/now/compose/ui/signUp/SignUpSideEffect.kt | 1 + 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 96f1576..f0ea816 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -54,8 +54,8 @@ android { } dependencies { - implementation 'androidx.core:core-ktx:1.13.0' - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.7.0' + implementation 'androidx.core:core-ktx:1.13.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.8.0' implementation 'androidx.activity:activity-compose:1.9.0' implementation platform('androidx.compose:compose-bom:2024.05.00') implementation 'androidx.compose.ui:ui' @@ -73,10 +73,10 @@ dependencies { implementation 'androidx.compose.material:material:1.6.7' // Lifecycle Viewmodel - implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.0' // Fragment && Activity - implementation 'androidx.fragment:fragment-ktx:1.6.2' + implementation 'androidx.fragment:fragment-ktx:1.7.1' implementation 'androidx.activity:activity-ktx:1.9.0' // Retrofit diff --git a/app/src/main/java/com/sopt/now/compose/ui/signUp/SignUpScreen.kt b/app/src/main/java/com/sopt/now/compose/ui/signUp/SignUpScreen.kt index 5596261..8fc48dd 100644 --- a/app/src/main/java/com/sopt/now/compose/ui/signUp/SignUpScreen.kt +++ b/app/src/main/java/com/sopt/now/compose/ui/signUp/SignUpScreen.kt @@ -59,6 +59,10 @@ fun SignUpScreen( onNavigateToSignIn.navigate(context.getString(R.string.route_sign_in)) } + is SignUpSideEffect.Loading -> { + Toast.makeText(context, event.message, Toast.LENGTH_SHORT).show() + } + is SignUpSideEffect.Error -> { Toast.makeText(context, event.message, Toast.LENGTH_SHORT).show() } diff --git a/app/src/main/java/com/sopt/now/compose/ui/signUp/SignUpSideEffect.kt b/app/src/main/java/com/sopt/now/compose/ui/signUp/SignUpSideEffect.kt index 6d2bbd4..cd1cba6 100644 --- a/app/src/main/java/com/sopt/now/compose/ui/signUp/SignUpSideEffect.kt +++ b/app/src/main/java/com/sopt/now/compose/ui/signUp/SignUpSideEffect.kt @@ -2,5 +2,6 @@ package com.sopt.now.compose.ui.signUp sealed class SignUpSideEffect { data class Success(val message: String) : SignUpSideEffect() + data class Loading(val message: String) : SignUpSideEffect() data class Error(val message: String) : SignUpSideEffect() } \ No newline at end of file From 51db35c71cfc783441710ef745e3bc28b4204392 Mon Sep 17 00:00:00 2001 From: arinming Date: Fri, 7 Jun 2024 21:38:08 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[Feat]=20follower=20repository=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#18)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compose/repository/FollowerRepository.kt | 17 +++++ .../sopt/now/compose/ui/home/HomeViewModel.kt | 64 +++++++++++-------- 2 files changed, 54 insertions(+), 27 deletions(-) create mode 100644 app/src/main/java/com/sopt/now/compose/repository/FollowerRepository.kt diff --git a/app/src/main/java/com/sopt/now/compose/repository/FollowerRepository.kt b/app/src/main/java/com/sopt/now/compose/repository/FollowerRepository.kt new file mode 100644 index 0000000..99ede21 --- /dev/null +++ b/app/src/main/java/com/sopt/now/compose/repository/FollowerRepository.kt @@ -0,0 +1,17 @@ +package com.sopt.now.compose.repository + +import com.sopt.now.compose.data.model.ResponseUserDto +import com.sopt.now.compose.data.module.ServicePool +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import retrofit2.Response + +class FollowerRepository { + private val followerService = ServicePool.followerService + + suspend fun getUserList(page: Int): Response { + return withContext(Dispatchers.IO) { + followerService.getUserList(page).execute() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/compose/ui/home/HomeViewModel.kt b/app/src/main/java/com/sopt/now/compose/ui/home/HomeViewModel.kt index a79e0bb..409ddf5 100644 --- a/app/src/main/java/com/sopt/now/compose/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/sopt/now/compose/ui/home/HomeViewModel.kt @@ -1,23 +1,30 @@ package com.sopt.now.compose.ui.home import android.util.Log +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.sopt.now.compose.data.model.Profile -import com.sopt.now.compose.data.model.ResponseUserDto import com.sopt.now.compose.data.model.UserDataDto -import com.sopt.now.compose.data.module.ServicePool +import com.sopt.now.compose.repository.FollowerRepository import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response +import kotlinx.coroutines.launch +import java.io.IOException class HomeViewModel : ViewModel() { - private val followerService by lazy { ServicePool.followerService } + private val followerRepository = FollowerRepository() private val _followerState = MutableStateFlow>(emptyList()) val followerState = _followerState.asStateFlow() + private var _eventNetworkError = MutableLiveData(false) + val eventNetworkError: LiveData + get() = _eventNetworkError + + private var _isNetworkErrorShown = MutableLiveData(false) + val friendList = mutableListOf() init { @@ -25,35 +32,38 @@ class HomeViewModel : ViewModel() { } private fun fetchFollowerList() { - followerService.getUserList(page = 0).enqueue(object : Callback { - override fun onResponse( - call: Call, - response: Response, - ) { + viewModelScope.launch { + try { + val response = followerRepository.getUserList(0) if (response.isSuccessful) { - val data = response.body()?.data - if (data != null) { + response.body()?.data?.let { data -> _followerState.value = data mapFollowersToFriendList(data) } + _eventNetworkError.value = false + _isNetworkErrorShown.value = false + } else { + _eventNetworkError.value = true } + } catch (networkError: IOException) { + _eventNetworkError.value = true + Log.e("HomeError", "${networkError.message}") } + } + } - override fun onFailure(call: Call, t: Throwable) { - Log.e("HomeError", "${t.message}") - } - }) + fun onNetworkErrorShown() { + _isNetworkErrorShown.value = true } - fun mapFollowersToFriendList(followers: List) { - for (follower in followers) { - friendList.add( - Profile( - profileImage = follower.avatar, - name = "${follower.firstName} ${follower.lastName}", - description = follower.email - ) + private fun mapFollowersToFriendList(followers: List) { + friendList.clear() + friendList.addAll(followers.map { follower -> + Profile( + profileImage = follower.avatar, + name = "${follower.firstName} ${follower.lastName}", + description = follower.email ) - } + }) } -} \ No newline at end of file +} From 2dc3df5c86aa6e51466c22dca0e7b4f018576954 Mon Sep 17 00:00:00 2001 From: arinming Date: Wed, 26 Jun 2024 00:25:39 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[Feat]=20=EC=A2=85=EC=86=8D=EC=84=B1?= =?UTF-8?q?=EC=97=90=20Hilt=20=EC=B6=94=EA=B0=80=20(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 7 +++++++ app/src/main/java/com/sopt/now/compose/MainActivity.kt | 2 ++ build.gradle | 1 + 3 files changed, 10 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index f0ea816..0cb82cc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,6 +2,9 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'org.jetbrains.kotlin.plugin.serialization' + id 'com.google.dagger.hilt.android' + id 'kotlin-android' + id 'kotlin-kapt' } Properties properties = new Properties() @@ -91,4 +94,8 @@ dependencies { // Coil implementation 'io.coil-kt:coil-compose:2.6.0' + + // Hilt + implementation 'com.google.dagger:hilt-android:2.51' + kapt 'com.google.dagger:hilt-compiler:2.51.1' } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/compose/MainActivity.kt b/app/src/main/java/com/sopt/now/compose/MainActivity.kt index 47e8acd..d2074ab 100644 --- a/app/src/main/java/com/sopt/now/compose/MainActivity.kt +++ b/app/src/main/java/com/sopt/now/compose/MainActivity.kt @@ -9,7 +9,9 @@ import androidx.compose.material3.Surface import androidx.compose.ui.Modifier import com.sopt.now.compose.ui.SoptApp import com.sopt.now.compose.ui.theme.NOWSOPTAndroidTheme +import dagger.hilt.android.HiltAndroidApp +@HiltAndroidApp class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/build.gradle b/build.gradle index 4c76592..dbcc2e3 100644 --- a/build.gradle +++ b/build.gradle @@ -4,4 +4,5 @@ plugins { id 'com.android.library' version '8.3.1' apply false id 'org.jetbrains.kotlin.android' version '1.9.0' apply false id("org.jetbrains.kotlin.plugin.serialization") version "1.9.20" apply false + id 'com.google.dagger.hilt.android' version '2.51' apply false } \ No newline at end of file