Skip to content

Commit

Permalink
#18 [refactor] repository 생성
Browse files Browse the repository at this point in the history
  • Loading branch information
OliviaYJH committed Jun 7, 2024
1 parent 6536171 commit 09cb694
Show file tree
Hide file tree
Showing 9 changed files with 85 additions and 15 deletions.
9 changes: 3 additions & 6 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -87,16 +87,13 @@ dependencies {
implementation 'com.squareup.okhttp3:okhttp'
implementation 'com.squareup.okhttp3:logging-interceptor'

// dagger hilt
implementation "com.google.dagger:hilt-android:2.51"
kapt "com.google.dagger:hilt-compiler:2.48.1"

// viewmodel_ktx
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1'

// coroutine
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3'

implementation 'androidx.lifecycle:lifecycle-runtime-compose:2.8.0'
implementation 'androidx.lifecycle:lifecycle-runtime-compose:2.8.1'
implementation 'androidx.compose.runtime:runtime-livedata:1.6.7'

}
20 changes: 20 additions & 0 deletions app/src/main/java/com/sopt/now/compose/data/AuthRepositoryImpl.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.sopt.now.compose.data

import com.sopt.now.compose.datasource.AuthService
import com.sopt.now.compose.model.login.RequestLoginDto
import com.sopt.now.compose.model.signup.RequestSignUpDto
import com.sopt.now.compose.repository.AuthRepository
import com.sopt.now.compose.utils.BaseResponse
import retrofit2.Response

class AuthRepositoryImpl(
private val authService: AuthService
) : AuthRepository {
override suspend fun loginUser(data: RequestLoginDto): Response<BaseResponse<Unit>> {
return authService.login(data)
}

override suspend fun signUp(data: RequestSignUpDto): Response<BaseResponse<Unit>> {
return authService.signUp(data)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.sopt.now.compose.data

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.sopt.now.compose.presentation.auth.login.LoginViewModel
import com.sopt.now.compose.utils.ServicePool

class LoginViewModelFactory: ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(LoginViewModel::class.java)) {
val repository = AuthRepositoryImpl(ServicePool.loginService)
return LoginViewModel(repository) as T
} else {
throw IllegalArgumentException("fail ${modelClass.name}")
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.sopt.now.compose.data

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.sopt.now.compose.presentation.auth.signup.SignUpViewModel
import com.sopt.now.compose.utils.ServicePool

class SignUpViewModelFactory : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(SignUpViewModel::class.java)) {
val repository = AuthRepositoryImpl(ServicePool.authService)
return SignUpViewModel(repository) as T
} else {
throw IllegalArgumentException("fail ${modelClass.name}")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
Expand All @@ -36,6 +35,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.sopt.now.compose.ApplicationClass.SharedPreferences.sSharedPreferences
import com.sopt.now.compose.R
import com.sopt.now.compose.data.LoginViewModelFactory
import com.sopt.now.compose.model.login.RequestLoginDto
import com.sopt.now.compose.presentation.auth.signup.SignUpActivity
import com.sopt.now.compose.presentation.main.MainActivity
Expand All @@ -46,7 +46,7 @@ import com.sopt.now.compose.utils.showToast


class LoginActivity : ComponentActivity() {
private val loginViewModel by viewModels<LoginViewModel>()
private val loginViewModel: LoginViewModel by viewModels { LoginViewModelFactory() }

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.sopt.now.compose.ApplicationClass.SharedPreferences.editor
import com.sopt.now.compose.model.login.RequestLoginDto
import com.sopt.now.compose.repository.AuthRepository
import com.sopt.now.compose.utils.Constants.Companion.MEMBER_ID
import com.sopt.now.compose.utils.NetworkUtil
import com.sopt.now.compose.utils.ServicePool.loginService
Expand All @@ -13,15 +14,17 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch

class LoginViewModel : ViewModel() {
class LoginViewModel(
private val authRepository: AuthRepository
) : ViewModel() {
private val _state = MutableStateFlow<UiState>(UiState.LOADING)
val state = _state.asStateFlow()

fun postLogin(data: RequestLoginDto) {
viewModelScope.launch(Dispatchers.IO) {
_state.value = UiState.LOADING
runCatching {
loginService.login(data)
authRepository.loginUser(data)
}.onSuccess {
if (it.isSuccessful) {
editor.putString(MEMBER_ID, it.headers()["location"])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.sopt.now.compose.ApplicationClass
import com.sopt.now.compose.R
import com.sopt.now.compose.data.SignUpViewModelFactory
import com.sopt.now.compose.model.signup.RequestSignUpDto
import com.sopt.now.compose.presentation.auth.login.LoginActivity
import com.sopt.now.compose.ui.theme.NOWSOPTAndroidTheme
Expand All @@ -43,7 +44,7 @@ import com.sopt.now.compose.utils.UiState
import com.sopt.now.compose.utils.showToast

class SignUpActivity : ComponentActivity() {
private val signUpViewModel by viewModels<SignUpViewModel>()
private val signUpViewModel: SignUpViewModel by viewModels { SignUpViewModelFactory() }

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -67,9 +68,9 @@ class SignUpActivity : ComponentActivity() {
fun SignUpPage() {
val state by signUpViewModel.state.collectAsState()

when(state) {
when (state) {
is UiState.FAILURE -> showToast((state as UiState.FAILURE).errorMessage)
UiState.LOADING -> { }
UiState.LOADING -> {}
is UiState.SUCCESS<*> -> {
showToast(getString(R.string.success_signup))
navigateToLogin()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.sopt.now.compose.presentation.auth.signup
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.sopt.now.compose.model.signup.RequestSignUpDto
import com.sopt.now.compose.repository.AuthRepository
import com.sopt.now.compose.utils.NetworkUtil
import com.sopt.now.compose.utils.ServicePool.authService
import com.sopt.now.compose.utils.UiState
Expand All @@ -11,15 +12,17 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch

class SignUpViewModel : ViewModel() {
class SignUpViewModel(
private val authRepository: AuthRepository
) : ViewModel() {
private val _state = MutableStateFlow<UiState>(UiState.LOADING)
val state = _state.asStateFlow()

fun signUp(data: RequestSignUpDto) {
viewModelScope.launch(Dispatchers.IO) {
_state.value = UiState.LOADING
runCatching {
authService.signUp(data)
authRepository.signUp(data)
}.onSuccess {
if (it.isSuccessful) _state.value = UiState.SUCCESS<Unit>()
else {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.sopt.now.compose.repository

import com.sopt.now.compose.model.login.RequestLoginDto
import com.sopt.now.compose.model.signup.RequestSignUpDto
import com.sopt.now.compose.utils.BaseResponse
import retrofit2.Response

interface AuthRepository {
suspend fun loginUser(data: RequestLoginDto): Response<BaseResponse<Unit>>

suspend fun signUp(data: RequestSignUpDto): Response<BaseResponse<Unit>>
}

0 comments on commit 09cb694

Please sign in to comment.