diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d81c17..d185753 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,13 +16,13 @@ android:usesCleartextTraffic="true" tools:targetApi="31"> @@ -31,7 +31,7 @@ diff --git a/app/src/main/java/com/sopt/now/compose/ApiFactory.kt b/app/src/main/java/com/sopt/now/compose/data/remote/ApiFactory.kt similarity index 63% rename from app/src/main/java/com/sopt/now/compose/ApiFactory.kt rename to app/src/main/java/com/sopt/now/compose/data/remote/ApiFactory.kt index 9b30bcd..ebee9f2 100644 --- a/app/src/main/java/com/sopt/now/compose/ApiFactory.kt +++ b/app/src/main/java/com/sopt/now/compose/data/remote/ApiFactory.kt @@ -1,11 +1,12 @@ -package com.sopt.now.compose +package com.sopt.now.compose.data.remote import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory +import com.sopt.now.compose.BuildConfig import com.sopt.now.compose.BuildConfig.AUTH_BASE_URL import com.sopt.now.compose.BuildConfig.FRIEND_BASE_URL -import com.sopt.now.compose.remote.service.AuthService -import com.sopt.now.compose.remote.service.FriendService -import com.sopt.now.compose.remote.service.UserService +import com.sopt.now.compose.data.remote.service.AuthService +import com.sopt.now.compose.data.remote.service.FriendService +import com.sopt.now.compose.data.remote.service.UserService import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaType import retrofit2.Retrofit @@ -27,7 +28,7 @@ object ApiFactory { } object ServicePool { - val userService = ApiFactory.create(AUTH_BASE_URL) - val authService = ApiFactory.create(AUTH_BASE_URL) - val friendService = ApiFactory.create(FRIEND_BASE_URL) + val userService by lazy { ApiFactory.create(AUTH_BASE_URL) } + val authService by lazy { ApiFactory.create(AUTH_BASE_URL) } + val friendService by lazy { ApiFactory.create(FRIEND_BASE_URL) } } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/compose/remote/request/RequestChangePwdDto.kt b/app/src/main/java/com/sopt/now/compose/data/remote/request/RequestChangePwdDto.kt similarity index 87% rename from app/src/main/java/com/sopt/now/compose/remote/request/RequestChangePwdDto.kt rename to app/src/main/java/com/sopt/now/compose/data/remote/request/RequestChangePwdDto.kt index b3c16ee..8b2dff4 100644 --- a/app/src/main/java/com/sopt/now/compose/remote/request/RequestChangePwdDto.kt +++ b/app/src/main/java/com/sopt/now/compose/data/remote/request/RequestChangePwdDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.remote.request +package com.sopt.now.compose.data.remote.request import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/compose/remote/request/RequestLoginDto.kt b/app/src/main/java/com/sopt/now/compose/data/remote/request/RequestLoginDto.kt similarity index 83% rename from app/src/main/java/com/sopt/now/compose/remote/request/RequestLoginDto.kt rename to app/src/main/java/com/sopt/now/compose/data/remote/request/RequestLoginDto.kt index 11e871d..5a0edb2 100644 --- a/app/src/main/java/com/sopt/now/compose/remote/request/RequestLoginDto.kt +++ b/app/src/main/java/com/sopt/now/compose/data/remote/request/RequestLoginDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.remote.request +package com.sopt.now.compose.data.remote.request import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/compose/remote/request/RequestSignUpDto.kt b/app/src/main/java/com/sopt/now/compose/data/remote/request/RequestSignUpDto.kt similarity index 87% rename from app/src/main/java/com/sopt/now/compose/remote/request/RequestSignUpDto.kt rename to app/src/main/java/com/sopt/now/compose/data/remote/request/RequestSignUpDto.kt index 8d30fc3..9258dda 100644 --- a/app/src/main/java/com/sopt/now/compose/remote/request/RequestSignUpDto.kt +++ b/app/src/main/java/com/sopt/now/compose/data/remote/request/RequestSignUpDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.remote.request +package com.sopt.now.compose.data.remote.request import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/compose/remote/response/ResponseChangePwdDto.kt b/app/src/main/java/com/sopt/now/compose/data/remote/response/ResponseChangePwdDto.kt similarity index 82% rename from app/src/main/java/com/sopt/now/compose/remote/response/ResponseChangePwdDto.kt rename to app/src/main/java/com/sopt/now/compose/data/remote/response/ResponseChangePwdDto.kt index c550da5..4d1b3e1 100644 --- a/app/src/main/java/com/sopt/now/compose/remote/response/ResponseChangePwdDto.kt +++ b/app/src/main/java/com/sopt/now/compose/data/remote/response/ResponseChangePwdDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.remote.response +package com.sopt.now.compose.data.remote.response import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/compose/remote/response/ResponseFriendsDto.kt b/app/src/main/java/com/sopt/now/compose/data/remote/response/ResponseFriendsDto.kt similarity index 94% rename from app/src/main/java/com/sopt/now/compose/remote/response/ResponseFriendsDto.kt rename to app/src/main/java/com/sopt/now/compose/data/remote/response/ResponseFriendsDto.kt index 1c8ac3d..ad8d705 100644 --- a/app/src/main/java/com/sopt/now/compose/remote/response/ResponseFriendsDto.kt +++ b/app/src/main/java/com/sopt/now/compose/data/remote/response/ResponseFriendsDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.remote.response +package com.sopt.now.compose.data.remote.response import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/compose/remote/response/ResponseLoginDto.kt b/app/src/main/java/com/sopt/now/compose/data/remote/response/ResponseLoginDto.kt similarity index 81% rename from app/src/main/java/com/sopt/now/compose/remote/response/ResponseLoginDto.kt rename to app/src/main/java/com/sopt/now/compose/data/remote/response/ResponseLoginDto.kt index 918597e..f285420 100644 --- a/app/src/main/java/com/sopt/now/compose/remote/response/ResponseLoginDto.kt +++ b/app/src/main/java/com/sopt/now/compose/data/remote/response/ResponseLoginDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.remote.response +package com.sopt.now.compose.data.remote.response import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/compose/remote/response/ResponseSignUpDto.kt b/app/src/main/java/com/sopt/now/compose/data/remote/response/ResponseSignUpDto.kt similarity index 81% rename from app/src/main/java/com/sopt/now/compose/remote/response/ResponseSignUpDto.kt rename to app/src/main/java/com/sopt/now/compose/data/remote/response/ResponseSignUpDto.kt index ff88192..2a68dec 100644 --- a/app/src/main/java/com/sopt/now/compose/remote/response/ResponseSignUpDto.kt +++ b/app/src/main/java/com/sopt/now/compose/data/remote/response/ResponseSignUpDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.remote.response +package com.sopt.now.compose.data.remote.response import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/compose/remote/response/ResponseUserInfoDto.kt b/app/src/main/java/com/sopt/now/compose/data/remote/response/ResponseUserInfoDto.kt similarity index 72% rename from app/src/main/java/com/sopt/now/compose/remote/response/ResponseUserInfoDto.kt rename to app/src/main/java/com/sopt/now/compose/data/remote/response/ResponseUserInfoDto.kt index 6a90844..c4cfa16 100644 --- a/app/src/main/java/com/sopt/now/compose/remote/response/ResponseUserInfoDto.kt +++ b/app/src/main/java/com/sopt/now/compose/data/remote/response/ResponseUserInfoDto.kt @@ -1,6 +1,6 @@ -package com.sopt.now.compose.remote.response +package com.sopt.now.compose.data.remote.response -import com.sopt.now.compose.data.User +import com.sopt.now.compose.presentation.home.User import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/compose/remote/service/AuthService.kt b/app/src/main/java/com/sopt/now/compose/data/remote/service/AuthService.kt similarity index 53% rename from app/src/main/java/com/sopt/now/compose/remote/service/AuthService.kt rename to app/src/main/java/com/sopt/now/compose/data/remote/service/AuthService.kt index d7fba09..e7c0261 100644 --- a/app/src/main/java/com/sopt/now/compose/remote/service/AuthService.kt +++ b/app/src/main/java/com/sopt/now/compose/data/remote/service/AuthService.kt @@ -1,9 +1,9 @@ -package com.sopt.now.compose.remote.service +package com.sopt.now.compose.data.remote.service -import com.sopt.now.compose.remote.request.RequestLoginDto -import com.sopt.now.compose.remote.request.RequestSignUpDto -import com.sopt.now.compose.remote.response.ResponseLoginDto -import com.sopt.now.compose.remote.response.ResponseSignUpDto +import com.sopt.now.compose.data.remote.request.RequestLoginDto +import com.sopt.now.compose.data.remote.request.RequestSignUpDto +import com.sopt.now.compose.data.remote.response.ResponseLoginDto +import com.sopt.now.compose.data.remote.response.ResponseSignUpDto import retrofit2.Response import retrofit2.http.Body import retrofit2.http.POST diff --git a/app/src/main/java/com/sopt/now/compose/remote/service/FriendService.kt b/app/src/main/java/com/sopt/now/compose/data/remote/service/FriendService.kt similarity index 65% rename from app/src/main/java/com/sopt/now/compose/remote/service/FriendService.kt rename to app/src/main/java/com/sopt/now/compose/data/remote/service/FriendService.kt index bc24891..aa693cf 100644 --- a/app/src/main/java/com/sopt/now/compose/remote/service/FriendService.kt +++ b/app/src/main/java/com/sopt/now/compose/data/remote/service/FriendService.kt @@ -1,6 +1,6 @@ -package com.sopt.now.compose.remote.service +package com.sopt.now.compose.data.remote.service -import com.sopt.now.compose.remote.response.ResponseFriendsDto +import com.sopt.now.compose.data.remote.response.ResponseFriendsDto import retrofit2.Response import retrofit2.http.GET import retrofit2.http.Query diff --git a/app/src/main/java/com/sopt/now/compose/remote/service/UserService.kt b/app/src/main/java/com/sopt/now/compose/data/remote/service/UserService.kt similarity index 65% rename from app/src/main/java/com/sopt/now/compose/remote/service/UserService.kt rename to app/src/main/java/com/sopt/now/compose/data/remote/service/UserService.kt index d223447..1ae45fe 100644 --- a/app/src/main/java/com/sopt/now/compose/remote/service/UserService.kt +++ b/app/src/main/java/com/sopt/now/compose/data/remote/service/UserService.kt @@ -1,8 +1,8 @@ -package com.sopt.now.compose.remote.service +package com.sopt.now.compose.data.remote.service -import com.sopt.now.compose.remote.request.RequestChangePwdDto -import com.sopt.now.compose.remote.response.ResponseChangePwdDto -import com.sopt.now.compose.remote.response.ResponseUserInfoDto +import com.sopt.now.compose.data.remote.request.RequestChangePwdDto +import com.sopt.now.compose.data.remote.response.ResponseChangePwdDto +import com.sopt.now.compose.data.remote.response.ResponseUserInfoDto import retrofit2.Response import retrofit2.http.Body import retrofit2.http.GET diff --git a/app/src/main/java/com/sopt/now/compose/data/repositoryImpl/AuthRepositoryImpl.kt b/app/src/main/java/com/sopt/now/compose/data/repositoryImpl/AuthRepositoryImpl.kt new file mode 100644 index 0000000..da514bb --- /dev/null +++ b/app/src/main/java/com/sopt/now/compose/data/repositoryImpl/AuthRepositoryImpl.kt @@ -0,0 +1,19 @@ +package com.sopt.now.compose.data.repositoryImpl + +import com.sopt.now.compose.data.remote.request.RequestLoginDto +import com.sopt.now.compose.data.remote.request.RequestSignUpDto +import com.sopt.now.compose.data.remote.response.ResponseLoginDto +import com.sopt.now.compose.data.remote.response.ResponseSignUpDto +import com.sopt.now.compose.data.remote.service.AuthService +import com.sopt.now.compose.domain.AuthRepository +import retrofit2.Response + +class AuthRepositoryImpl(private val authService: AuthService) : AuthRepository { + override suspend fun signUp(request: RequestSignUpDto): Response { + return authService.signUp(request) + } + + override suspend fun login(request: RequestLoginDto): Response { + return authService.login(request) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/compose/data/repositoryImpl/FollowerRepositoryImpl.kt b/app/src/main/java/com/sopt/now/compose/data/repositoryImpl/FollowerRepositoryImpl.kt new file mode 100644 index 0000000..1f38a60 --- /dev/null +++ b/app/src/main/java/com/sopt/now/compose/data/repositoryImpl/FollowerRepositoryImpl.kt @@ -0,0 +1,30 @@ +package com.sopt.now.compose.data.repositoryImpl + +import com.sopt.now.compose.data.remote.request.RequestChangePwdDto +import com.sopt.now.compose.data.remote.response.ResponseChangePwdDto +import com.sopt.now.compose.data.remote.response.ResponseFriendsDto +import com.sopt.now.compose.data.remote.response.ResponseUserInfoDto +import com.sopt.now.compose.data.remote.service.FriendService +import com.sopt.now.compose.data.remote.service.UserService +import com.sopt.now.compose.domain.FollowerRepository +import retrofit2.Response + +class FollowerRepositoryImpl( + private val userService: UserService, + private val friendService: FriendService +) : FollowerRepository { + override suspend fun getUserInfo(userId: Int): Response { + return userService.getUserInfo(userId) + } + + override suspend fun changeUserPwd( + userId: Int, + request: RequestChangePwdDto + ): Response { + return userService.changeUserPwd(userId, request) + } + + override suspend fun getFriends(page: Int): Response { + return friendService.getFriends(page) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/compose/domain/AuthRepository.kt b/app/src/main/java/com/sopt/now/compose/domain/AuthRepository.kt new file mode 100644 index 0000000..af28482 --- /dev/null +++ b/app/src/main/java/com/sopt/now/compose/domain/AuthRepository.kt @@ -0,0 +1,12 @@ +package com.sopt.now.compose.domain + +import com.sopt.now.compose.data.remote.request.RequestLoginDto +import com.sopt.now.compose.data.remote.request.RequestSignUpDto +import com.sopt.now.compose.data.remote.response.ResponseLoginDto +import com.sopt.now.compose.data.remote.response.ResponseSignUpDto +import retrofit2.Response + +interface AuthRepository { + suspend fun signUp(request: RequestSignUpDto): Response + suspend fun login(request: RequestLoginDto): Response +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/compose/domain/FollowerRepository.kt b/app/src/main/java/com/sopt/now/compose/domain/FollowerRepository.kt new file mode 100644 index 0000000..3b4486e --- /dev/null +++ b/app/src/main/java/com/sopt/now/compose/domain/FollowerRepository.kt @@ -0,0 +1,17 @@ +package com.sopt.now.compose.domain + +import com.sopt.now.compose.data.remote.request.RequestChangePwdDto +import com.sopt.now.compose.data.remote.response.ResponseChangePwdDto +import com.sopt.now.compose.data.remote.response.ResponseFriendsDto +import com.sopt.now.compose.data.remote.response.ResponseUserInfoDto +import retrofit2.Response + +interface FollowerRepository { + suspend fun getUserInfo(userId: Int): Response + suspend fun changeUserPwd( + userId: Int, + request: RequestChangePwdDto + ): Response + + suspend fun getFriends(page: Int): Response +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/compose/feature/home/HomeScreen.kt b/app/src/main/java/com/sopt/now/compose/feature/home/HomeScreen.kt deleted file mode 100644 index 42ff5e3..0000000 --- a/app/src/main/java/com/sopt/now/compose/feature/home/HomeScreen.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.sopt.now.compose.feature.home - -import android.content.Context -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.runtime.Composable -import androidx.compose.runtime.livedata.observeAsState -import androidx.lifecycle.viewmodel.compose.viewModel -import com.sopt.now.compose.feature.main.MainViewModel -import com.sopt.now.compose.profileItem.FriendProfileItem -import com.sopt.now.compose.profileItem.UserProfileItem - -@Composable -fun HomeScreen(context: Context, userId: Int) { - val homeViewModel: HomeViewModel = viewModel() - val mainViewModel: MainViewModel = viewModel() - - val userInfo = mainViewModel.userInfo.observeAsState().value - val friends = homeViewModel.friendList.observeAsState(emptyList()).value - mainViewModel.fetchUserInfo(userId) - homeViewModel.fetchFriends(2) - - LazyColumn { - item { - if (userInfo != null) { - UserProfileItem(userInfo) - } - } - items(friends.size) { friend -> FriendProfileItem(friend = friends[friend]) } - } - -} diff --git a/app/src/main/java/com/sopt/now/compose/feature/mypage/MyPageViewModel.kt b/app/src/main/java/com/sopt/now/compose/feature/mypage/MyPageViewModel.kt deleted file mode 100644 index d58c870..0000000 --- a/app/src/main/java/com/sopt/now/compose/feature/mypage/MyPageViewModel.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.sopt.now.compose.feature.mypage - -import android.content.Context -import android.content.Intent -import android.os.Bundle -import androidx.core.content.ContextCompat -import androidx.lifecycle.ViewModel -import com.sopt.now.compose.feature.changePwd.ChangePwdActivity -import com.sopt.now.compose.feature.login.LoginActivity -import com.sopt.now.compose.feature.main.MainViewModel.Companion.LOGIN_INFO - -class MyPageViewModel : ViewModel() { - - fun logoutBtnClick(context: Context) { - val intent = Intent(context, LoginActivity::class.java) - intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK - ContextCompat.startActivity(context, intent, null) - } - - fun changePwdBtnClick(context: Context, userId: Int) { - val intent = Intent(context, ChangePwdActivity::class.java) - val bundle = Bundle().apply { - putInt(LOGIN_INFO, userId) - } - intent.putExtras(bundle) - ContextCompat.startActivity(context, intent, null) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/compose/feature/changePwd/ChangePwdActivity.kt b/app/src/main/java/com/sopt/now/compose/presentation/changePwd/ChangePwdActivity.kt similarity index 79% rename from app/src/main/java/com/sopt/now/compose/feature/changePwd/ChangePwdActivity.kt rename to app/src/main/java/com/sopt/now/compose/presentation/changePwd/ChangePwdActivity.kt index 45f4e7f..3cb8464 100644 --- a/app/src/main/java/com/sopt/now/compose/feature/changePwd/ChangePwdActivity.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/changePwd/ChangePwdActivity.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.feature.changePwd +package com.sopt.now.compose.presentation.changePwd import android.os.Bundle import android.widget.Toast @@ -23,11 +23,16 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import com.sopt.now.compose.R -import com.sopt.now.compose.feature.main.MainViewModel.Companion.LOGIN_INFO -import com.sopt.now.compose.remote.request.RequestChangePwdDto -import com.sopt.now.compose.ui.theme.LabeledTextField -import com.sopt.now.compose.ui.theme.NOWSOPTAndroidTheme -import com.sopt.now.compose.ui.theme.RoundedCornerButton +import com.sopt.now.compose.data.remote.ServicePool.friendService +import com.sopt.now.compose.data.remote.ServicePool.userService +import com.sopt.now.compose.data.remote.request.RequestChangePwdDto +import com.sopt.now.compose.data.repositoryImpl.FollowerRepositoryImpl +import com.sopt.now.compose.domain.FollowerRepository +import com.sopt.now.compose.presentation.main.MainViewModel.Companion.LOGIN_INFO +import com.sopt.now.compose.util.BaseViewModelFactory +import com.sopt.now.compose.util.LabeledTextField +import com.sopt.now.compose.util.NOWSOPTAndroidTheme +import com.sopt.now.compose.util.RoundedCornerButton class ChangePwdActivity : ComponentActivity() { @@ -54,7 +59,14 @@ fun ChangePwdScreen(userId: Int) { var newPwd by remember { mutableStateOf("") } var newPwdVerification by remember { mutableStateOf("") } val context = LocalContext.current - val changePwdViewModel: ChangePwdViewModel = viewModel() + val followerRepository: FollowerRepository by lazy { + FollowerRepositoryImpl( + userService, + friendService + ) + } + val changePwdViewModel: ChangePwdViewModel = + viewModel(factory = BaseViewModelFactory { ChangePwdViewModel(followerRepository) }) val changePwdState = changePwdViewModel.changePwdState.observeAsState() changePwdState.value?.let { if (it.isSuccess) { diff --git a/app/src/main/java/com/sopt/now/compose/feature/changePwd/ChangePwdState.kt b/app/src/main/java/com/sopt/now/compose/presentation/changePwd/ChangePwdState.kt similarity index 61% rename from app/src/main/java/com/sopt/now/compose/feature/changePwd/ChangePwdState.kt rename to app/src/main/java/com/sopt/now/compose/presentation/changePwd/ChangePwdState.kt index ac6d8fd..3abd908 100644 --- a/app/src/main/java/com/sopt/now/compose/feature/changePwd/ChangePwdState.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/changePwd/ChangePwdState.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.feature.changePwd +package com.sopt.now.compose.presentation.changePwd data class ChangePwdState( val isSuccess: Boolean, diff --git a/app/src/main/java/com/sopt/now/compose/feature/changePwd/ChangePwdViewModel.kt b/app/src/main/java/com/sopt/now/compose/presentation/changePwd/ChangePwdViewModel.kt similarity index 74% rename from app/src/main/java/com/sopt/now/compose/feature/changePwd/ChangePwdViewModel.kt rename to app/src/main/java/com/sopt/now/compose/presentation/changePwd/ChangePwdViewModel.kt index e2a387c..98a3e4e 100644 --- a/app/src/main/java/com/sopt/now/compose/feature/changePwd/ChangePwdViewModel.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/changePwd/ChangePwdViewModel.kt @@ -1,24 +1,24 @@ -package com.sopt.now.compose.feature.changePwd +package com.sopt.now.compose.presentation.changePwd import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.now.compose.ServicePool -import com.sopt.now.compose.remote.request.RequestChangePwdDto +import com.sopt.now.compose.data.remote.request.RequestChangePwdDto +import com.sopt.now.compose.domain.FollowerRepository import kotlinx.coroutines.launch -class ChangePwdViewModel : ViewModel() { +class ChangePwdViewModel( + private val followerRepository: FollowerRepository +) : ViewModel() { private val _changePwdState = MutableLiveData() val changePwdState: LiveData get() = _changePwdState - private val userService by lazy { ServicePool.userService } - fun changePwd(userId: Int, request: RequestChangePwdDto) { viewModelScope.launch { runCatching { - userService.changeUserPwd(userId, request) + followerRepository.changeUserPwd(userId, request) }.onSuccess { if (it.code() in 200..299) { _changePwdState.value = ChangePwdState(true, "비밀번호 변경 성공") diff --git a/app/src/main/java/com/sopt/now/compose/data/Friend.kt b/app/src/main/java/com/sopt/now/compose/presentation/home/Friend.kt similarity index 69% rename from app/src/main/java/com/sopt/now/compose/data/Friend.kt rename to app/src/main/java/com/sopt/now/compose/presentation/home/Friend.kt index 4f768ac..59164fb 100644 --- a/app/src/main/java/com/sopt/now/compose/data/Friend.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/home/Friend.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.data +package com.sopt.now.compose.presentation.home data class Friend( val profileImage: String, diff --git a/app/src/main/java/com/sopt/now/compose/profileItem/FriendProfileItem.kt b/app/src/main/java/com/sopt/now/compose/presentation/home/FriendProfileItem.kt similarity index 95% rename from app/src/main/java/com/sopt/now/compose/profileItem/FriendProfileItem.kt rename to app/src/main/java/com/sopt/now/compose/presentation/home/FriendProfileItem.kt index a719b5b..6f65a57 100644 --- a/app/src/main/java/com/sopt/now/compose/profileItem/FriendProfileItem.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/home/FriendProfileItem.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.profileItem +package com.sopt.now.compose.presentation.home import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -17,7 +17,6 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi import com.bumptech.glide.integration.compose.GlideImage -import com.sopt.now.compose.data.Friend @OptIn(ExperimentalGlideComposeApi::class) @Composable diff --git a/app/src/main/java/com/sopt/now/compose/presentation/home/HomeScreen.kt b/app/src/main/java/com/sopt/now/compose/presentation/home/HomeScreen.kt new file mode 100644 index 0000000..11b350d --- /dev/null +++ b/app/src/main/java/com/sopt/now/compose/presentation/home/HomeScreen.kt @@ -0,0 +1,40 @@ +package com.sopt.now.compose.presentation.home + +import android.content.Context +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.runtime.Composable +import androidx.compose.runtime.livedata.observeAsState +import androidx.lifecycle.viewmodel.compose.viewModel +import com.sopt.now.compose.data.remote.ServicePool.friendService +import com.sopt.now.compose.data.remote.ServicePool.userService +import com.sopt.now.compose.data.repositoryImpl.FollowerRepositoryImpl +import com.sopt.now.compose.domain.FollowerRepository +import com.sopt.now.compose.util.BaseViewModelFactory + +@Composable +fun HomeScreen(context: Context, userId: Int) { + val followerRepository: FollowerRepository by lazy { + FollowerRepositoryImpl( + userService, + friendService + ) + } + val viewModel: HomeViewModel = + viewModel(factory = BaseViewModelFactory { HomeViewModel(followerRepository) }) + val userInfo = viewModel.userInfo.observeAsState().value + val friends = viewModel.friendList.observeAsState(emptyList()).value + viewModel.fetchUserInfo(userId) + viewModel.fetchFriends(PAGE) + + LazyColumn { + item { + if (userInfo != null) { + UserProfileItem(userInfo) + } + } + items(friends.size) { friend -> FriendProfileItem(friend = friends[friend]) } + } + +} + +const val PAGE = 2 \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/compose/feature/home/HomeViewModel.kt b/app/src/main/java/com/sopt/now/compose/presentation/home/HomeViewModel.kt similarity index 52% rename from app/src/main/java/com/sopt/now/compose/feature/home/HomeViewModel.kt rename to app/src/main/java/com/sopt/now/compose/presentation/home/HomeViewModel.kt index b270660..2df8701 100644 --- a/app/src/main/java/com/sopt/now/compose/feature/home/HomeViewModel.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/home/HomeViewModel.kt @@ -1,26 +1,46 @@ -package com.sopt.now.compose.feature.home +package com.sopt.now.compose.presentation.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.ServicePool -import com.sopt.now.compose.data.Friend +import com.sopt.now.compose.domain.FollowerRepository import kotlinx.coroutines.launch import retrofit2.HttpException -class HomeViewModel : ViewModel() { +class HomeViewModel( + private val followerRepository: FollowerRepository +) : ViewModel() { private val _friendList = MutableLiveData>() val friendList: LiveData> get() = _friendList - private val friendService by lazy { ServicePool.friendService } + + private val _userInfo = MutableLiveData() + val userInfo: LiveData + get() = _userInfo + + fun fetchUserInfo(userId: Int) { + viewModelScope.launch { + runCatching { + followerRepository.getUserInfo(userId) + }.onSuccess { + _userInfo.value = it.body()?.data + }.onFailure { + if (it is HttpException) { + Log.e("HomeViewModel", "서버통신 오류") + } else { + Log.e("HomeViewModel", it.message.toString()) + } + } + } + } fun fetchFriends(page: Int) { viewModelScope.launch { runCatching { - friendService.getFriends(page) + followerRepository.getFriends(page) }.onSuccess { val friends = it.body()?.data ?: emptyList() _friendList.postValue(friends.map { Friend(it.avatar, it.firstName, it.email) }) diff --git a/app/src/main/java/com/sopt/now/compose/data/User.kt b/app/src/main/java/com/sopt/now/compose/presentation/home/User.kt similarity index 77% rename from app/src/main/java/com/sopt/now/compose/data/User.kt rename to app/src/main/java/com/sopt/now/compose/presentation/home/User.kt index 31527a1..13d4052 100644 --- a/app/src/main/java/com/sopt/now/compose/data/User.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/home/User.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.data +package com.sopt.now.compose.presentation.home import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/compose/profileItem/UserProfileItem.kt b/app/src/main/java/com/sopt/now/compose/presentation/home/UserProfileItem.kt similarity index 95% rename from app/src/main/java/com/sopt/now/compose/profileItem/UserProfileItem.kt rename to app/src/main/java/com/sopt/now/compose/presentation/home/UserProfileItem.kt index a3ddaf3..23f0f94 100644 --- a/app/src/main/java/com/sopt/now/compose/profileItem/UserProfileItem.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/home/UserProfileItem.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.profileItem +package com.sopt.now.compose.presentation.home import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column @@ -20,7 +20,6 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil.compose.AsyncImage import com.sopt.now.compose.R -import com.sopt.now.compose.data.User @Composable fun UserProfileItem(user: User) { diff --git a/app/src/main/java/com/sopt/now/compose/feature/login/LoginActivity.kt b/app/src/main/java/com/sopt/now/compose/presentation/login/LoginActivity.kt similarity index 79% rename from app/src/main/java/com/sopt/now/compose/feature/login/LoginActivity.kt rename to app/src/main/java/com/sopt/now/compose/presentation/login/LoginActivity.kt index cef10b9..0568f73 100644 --- a/app/src/main/java/com/sopt/now/compose/feature/login/LoginActivity.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/login/LoginActivity.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.feature.login +package com.sopt.now.compose.presentation.login import android.content.Intent import android.os.Bundle @@ -31,12 +31,17 @@ import androidx.compose.ui.unit.sp import androidx.core.content.ContextCompat.startActivity import androidx.lifecycle.viewmodel.compose.viewModel import com.sopt.now.compose.R -import com.sopt.now.compose.feature.main.MainActivity -import com.sopt.now.compose.feature.main.MainViewModel.Companion.LOGIN_INFO -import com.sopt.now.compose.remote.request.RequestLoginDto -import com.sopt.now.compose.ui.theme.LabeledTextField -import com.sopt.now.compose.ui.theme.NOWSOPTAndroidTheme -import com.sopt.now.compose.ui.theme.RoundedCornerButton +import com.sopt.now.compose.data.remote.ServicePool.authService +import com.sopt.now.compose.data.remote.request.RequestLoginDto +import com.sopt.now.compose.data.repositoryImpl.AuthRepositoryImpl +import com.sopt.now.compose.domain.AuthRepository +import com.sopt.now.compose.presentation.main.MainActivity +import com.sopt.now.compose.presentation.main.MainViewModel.Companion.LOGIN_INFO +import com.sopt.now.compose.presentation.signup.SignUpActivity +import com.sopt.now.compose.util.BaseViewModelFactory +import com.sopt.now.compose.util.LabeledTextField +import com.sopt.now.compose.util.NOWSOPTAndroidTheme +import com.sopt.now.compose.util.RoundedCornerButton class LoginActivity : ComponentActivity() { @@ -62,7 +67,9 @@ fun LoginScreen() { val context = LocalContext.current - val viewModel: LoginViewModel = viewModel() + val authRepository: AuthRepository by lazy { AuthRepositoryImpl(authService) } + val viewModel: LoginViewModel = + viewModel(factory = BaseViewModelFactory { LoginViewModel(authRepository) }) val loginState = viewModel.loginState.observeAsState() val userId = viewModel.userId.observeAsState() loginState.value?.let { @@ -120,7 +127,8 @@ fun LoginScreen() { RoundedCornerButton( buttonText = R.string.signup_btn_text, onClick = { - viewModel.navigateToSignUp(context) + val intent = Intent(context, SignUpActivity::class.java) + startActivity(context, intent, null) } ) Spacer(modifier = Modifier.height(30.dp)) diff --git a/app/src/main/java/com/sopt/now/compose/feature/login/LoginState.kt b/app/src/main/java/com/sopt/now/compose/presentation/login/LoginState.kt similarity index 61% rename from app/src/main/java/com/sopt/now/compose/feature/login/LoginState.kt rename to app/src/main/java/com/sopt/now/compose/presentation/login/LoginState.kt index daca245..3b1715c 100644 --- a/app/src/main/java/com/sopt/now/compose/feature/login/LoginState.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/login/LoginState.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.feature.login +package com.sopt.now.compose.presentation.login data class LoginState( val isSuccess: Boolean, diff --git a/app/src/main/java/com/sopt/now/compose/feature/login/LoginViewModel.kt b/app/src/main/java/com/sopt/now/compose/presentation/login/LoginViewModel.kt similarity index 63% rename from app/src/main/java/com/sopt/now/compose/feature/login/LoginViewModel.kt rename to app/src/main/java/com/sopt/now/compose/presentation/login/LoginViewModel.kt index 86d2a2a..837f5b8 100644 --- a/app/src/main/java/com/sopt/now/compose/feature/login/LoginViewModel.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/login/LoginViewModel.kt @@ -1,18 +1,16 @@ -package com.sopt.now.compose.feature.login +package com.sopt.now.compose.presentation.login -import android.content.Context -import android.content.Intent import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.now.compose.ServicePool -import com.sopt.now.compose.feature.signup.SignUpActivity -import com.sopt.now.compose.remote.request.RequestLoginDto +import com.sopt.now.compose.data.remote.request.RequestLoginDto +import com.sopt.now.compose.domain.AuthRepository import kotlinx.coroutines.launch -import retrofit2.HttpException -class LoginViewModel : ViewModel() { +class LoginViewModel( + private val authRepository: AuthRepository +) : ViewModel() { private val _loginState = MutableLiveData() val loginState: LiveData get() = _loginState @@ -21,14 +19,12 @@ class LoginViewModel : ViewModel() { val userId: LiveData get() = _userId - private val authService by lazy { ServicePool.authService } - fun login(request: RequestLoginDto) { viewModelScope.launch { runCatching { - authService.login(request) + authRepository.login(request) }.onSuccess { it -> - if(it.code() in 200..299) { + if (it.code() in 200..299) { _loginState.value = LoginState(true, "로그인 성공") val userId = it.headers()["location"] _userId.value = userId.toString() @@ -42,9 +38,4 @@ class LoginViewModel : ViewModel() { } } } - - fun navigateToSignUp(context: Context) { - val intent = Intent(context, SignUpActivity::class.java) - context.startActivity(intent) - } } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/compose/feature/base/BottomNavigationItem.kt b/app/src/main/java/com/sopt/now/compose/presentation/main/BottomNavigationItem.kt similarity index 75% rename from app/src/main/java/com/sopt/now/compose/feature/base/BottomNavigationItem.kt rename to app/src/main/java/com/sopt/now/compose/presentation/main/BottomNavigationItem.kt index 2e6f87e..0b55f6b 100644 --- a/app/src/main/java/com/sopt/now/compose/feature/base/BottomNavigationItem.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/main/BottomNavigationItem.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.feature.base +package com.sopt.now.compose.presentation.main import androidx.compose.ui.graphics.vector.ImageVector diff --git a/app/src/main/java/com/sopt/now/compose/feature/main/MainActivity.kt b/app/src/main/java/com/sopt/now/compose/presentation/main/MainActivity.kt similarity index 90% rename from app/src/main/java/com/sopt/now/compose/feature/main/MainActivity.kt rename to app/src/main/java/com/sopt/now/compose/presentation/main/MainActivity.kt index 6883186..945f1ea 100644 --- a/app/src/main/java/com/sopt/now/compose/feature/main/MainActivity.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/main/MainActivity.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.feature.main +package com.sopt.now.compose.presentation.main import android.os.Bundle import android.util.Log @@ -31,11 +31,11 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import com.sopt.now.compose.R -import com.sopt.now.compose.feature.base.BottomNavigationItem -import com.sopt.now.compose.feature.home.HomeScreen -import com.sopt.now.compose.feature.main.MainViewModel.Companion.LOGIN_INFO -import com.sopt.now.compose.feature.mypage.MyPageScreen -import com.sopt.now.compose.ui.theme.NOWSOPTAndroidTheme +import com.sopt.now.compose.presentation.home.HomeScreen +import com.sopt.now.compose.presentation.main.MainViewModel.Companion.LOGIN_INFO +import com.sopt.now.compose.presentation.mypage.MyPageScreen +import com.sopt.now.compose.presentation.search.SearchScreen +import com.sopt.now.compose.util.NOWSOPTAndroidTheme class MainActivity : ComponentActivity() { @@ -48,7 +48,6 @@ class MainActivity : ComponentActivity() { color = MaterialTheme.colorScheme.background ) { val userId = intent.getStringExtra(LOGIN_INFO) - Log.e("MainActivity", "userId: $userId") userId?.let { id -> MainScreen(userId = id.toInt()) } @@ -113,7 +112,7 @@ class MainActivity : ComponentActivity() { } 1 -> { - Text("검색") + SearchScreen() } 2 -> { diff --git a/app/src/main/java/com/sopt/now/compose/presentation/main/MainViewModel.kt b/app/src/main/java/com/sopt/now/compose/presentation/main/MainViewModel.kt new file mode 100644 index 0000000..65c41a1 --- /dev/null +++ b/app/src/main/java/com/sopt/now/compose/presentation/main/MainViewModel.kt @@ -0,0 +1,9 @@ +package com.sopt.now.compose.presentation.main + +import androidx.lifecycle.ViewModel + +class MainViewModel : ViewModel() { + companion object { + const val LOGIN_INFO = "LoginInfo" + } +} diff --git a/app/src/main/java/com/sopt/now/compose/feature/mypage/MyPageScreen.kt b/app/src/main/java/com/sopt/now/compose/presentation/mypage/MyPageScreen.kt similarity index 68% rename from app/src/main/java/com/sopt/now/compose/feature/mypage/MyPageScreen.kt rename to app/src/main/java/com/sopt/now/compose/presentation/mypage/MyPageScreen.kt index db99a35..968b304 100644 --- a/app/src/main/java/com/sopt/now/compose/feature/mypage/MyPageScreen.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/mypage/MyPageScreen.kt @@ -1,6 +1,8 @@ -package com.sopt.now.compose.feature.mypage +package com.sopt.now.compose.presentation.mypage import android.content.Context +import android.content.Intent +import android.os.Bundle import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -27,16 +29,29 @@ import androidx.compose.ui.unit.sp import androidx.lifecycle.viewmodel.compose.viewModel import coil.compose.AsyncImage import com.sopt.now.compose.R -import com.sopt.now.compose.feature.main.MainViewModel -import com.sopt.now.compose.ui.theme.NOWSOPTAndroidTheme -import com.sopt.now.compose.ui.theme.RoundedCornerButton +import com.sopt.now.compose.data.remote.ServicePool.friendService +import com.sopt.now.compose.data.remote.ServicePool.userService +import com.sopt.now.compose.data.repositoryImpl.FollowerRepositoryImpl +import com.sopt.now.compose.domain.FollowerRepository +import com.sopt.now.compose.presentation.changePwd.ChangePwdActivity +import com.sopt.now.compose.presentation.login.LoginActivity +import com.sopt.now.compose.presentation.main.MainViewModel.Companion.LOGIN_INFO +import com.sopt.now.compose.util.BaseViewModelFactory +import com.sopt.now.compose.util.NOWSOPTAndroidTheme +import com.sopt.now.compose.util.RoundedCornerButton @Composable fun MyPageScreen(context: Context, userId: Int) { - val myPageViewModel: MyPageViewModel = viewModel() - val mainViewModel: MainViewModel = viewModel() - val userInfo = mainViewModel.userInfo.observeAsState().value - mainViewModel.fetchUserInfo(userId) + val followerRepository: FollowerRepository by lazy { + FollowerRepositoryImpl( + userService, + friendService + ) + } + val viewModel: MyPageViewModel = + viewModel(factory = BaseViewModelFactory { MyPageViewModel(followerRepository) }) + val userInfo = viewModel.userInfo.observeAsState().value + viewModel.fetchUserInfo(userId) Column( modifier = Modifier .fillMaxSize() @@ -93,12 +108,19 @@ fun MyPageScreen(context: Context, userId: Int) { RoundedCornerButton( buttonText = R.string.change_pwd_btn_text, onClick = { - myPageViewModel.changePwdBtnClick(context, userId) + val intent = Intent(context, ChangePwdActivity::class.java) + val bundle = Bundle().apply { + putInt(LOGIN_INFO, userId) + } + intent.putExtras(bundle) + context.startActivity(intent) }) RoundedCornerButton( buttonText = R.string.logout_btn_text, onClick = { - myPageViewModel.logoutBtnClick(context) + val intent = Intent(context, LoginActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK + context.startActivity(intent) } ) Spacer(modifier = Modifier.height(30.dp)) diff --git a/app/src/main/java/com/sopt/now/compose/feature/main/MainViewModel.kt b/app/src/main/java/com/sopt/now/compose/presentation/mypage/MyPageViewModel.kt similarity index 70% rename from app/src/main/java/com/sopt/now/compose/feature/main/MainViewModel.kt rename to app/src/main/java/com/sopt/now/compose/presentation/mypage/MyPageViewModel.kt index 7a3654b..c98b0df 100644 --- a/app/src/main/java/com/sopt/now/compose/feature/main/MainViewModel.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/mypage/MyPageViewModel.kt @@ -1,24 +1,26 @@ -package com.sopt.now.compose.feature.main +package com.sopt.now.compose.presentation.mypage 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.ServicePool -import com.sopt.now.compose.data.User +import com.sopt.now.compose.domain.FollowerRepository +import com.sopt.now.compose.presentation.home.User import kotlinx.coroutines.launch import retrofit2.HttpException -class MainViewModel : ViewModel() { +class MyPageViewModel( + private val followerRepository: FollowerRepository +) : ViewModel() { private val _userInfo = MutableLiveData() val userInfo: LiveData get() = _userInfo - private val userService by lazy { ServicePool.userService } + fun fetchUserInfo(userId: Int) { viewModelScope.launch { runCatching { - userService.getUserInfo(userId) + followerRepository.getUserInfo(userId) }.onSuccess { _userInfo.value = it.body()?.data }.onFailure { @@ -30,8 +32,4 @@ class MainViewModel : ViewModel() { } } } - - companion object { - const val LOGIN_INFO = "LoginInfo" - } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/compose/presentation/search/SearchScreen.kt b/app/src/main/java/com/sopt/now/compose/presentation/search/SearchScreen.kt new file mode 100644 index 0000000..23aba34 --- /dev/null +++ b/app/src/main/java/com/sopt/now/compose/presentation/search/SearchScreen.kt @@ -0,0 +1,9 @@ +package com.sopt.now.compose.presentation.search + +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable + +@Composable +fun SearchScreen() { + Text(text = "Search") +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/compose/feature/signup/SignUpActivity.kt b/app/src/main/java/com/sopt/now/compose/presentation/signup/SignUpActivity.kt similarity index 86% rename from app/src/main/java/com/sopt/now/compose/feature/signup/SignUpActivity.kt rename to app/src/main/java/com/sopt/now/compose/presentation/signup/SignUpActivity.kt index 7d73dcd..e74b23f 100644 --- a/app/src/main/java/com/sopt/now/compose/feature/signup/SignUpActivity.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/signup/SignUpActivity.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.feature.signup +package com.sopt.now.compose.presentation.signup import android.os.Bundle import android.widget.Toast @@ -30,10 +30,14 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.viewmodel.compose.viewModel import com.sopt.now.compose.R -import com.sopt.now.compose.remote.request.RequestSignUpDto -import com.sopt.now.compose.ui.theme.LabeledTextField -import com.sopt.now.compose.ui.theme.NOWSOPTAndroidTheme -import com.sopt.now.compose.ui.theme.RoundedCornerButton +import com.sopt.now.compose.data.remote.ServicePool.authService +import com.sopt.now.compose.data.remote.request.RequestSignUpDto +import com.sopt.now.compose.data.repositoryImpl.AuthRepositoryImpl +import com.sopt.now.compose.domain.AuthRepository +import com.sopt.now.compose.util.BaseViewModelFactory +import com.sopt.now.compose.util.LabeledTextField +import com.sopt.now.compose.util.NOWSOPTAndroidTheme +import com.sopt.now.compose.util.RoundedCornerButton class SignUpActivity : ComponentActivity() { @@ -59,7 +63,10 @@ fun SignUpScreen() { var userNickname by remember { mutableStateOf("") } var userPhone by remember { mutableStateOf("") } val context = LocalContext.current - val viewModel: SignUpViewModel = viewModel() + val authRepository: AuthRepository by lazy { AuthRepositoryImpl(authService) } + val viewModel: SignUpViewModel = viewModel(factory = BaseViewModelFactory { + SignUpViewModel(authRepository) + }) val signUpState = viewModel.signUpState.observeAsState() signUpState.value?.let { if (it.isSuccess) { diff --git a/app/src/main/java/com/sopt/now/compose/feature/signup/SignUpState.kt b/app/src/main/java/com/sopt/now/compose/presentation/signup/SignUpState.kt similarity index 61% rename from app/src/main/java/com/sopt/now/compose/feature/signup/SignUpState.kt rename to app/src/main/java/com/sopt/now/compose/presentation/signup/SignUpState.kt index 1357caa..5df6e92 100644 --- a/app/src/main/java/com/sopt/now/compose/feature/signup/SignUpState.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/signup/SignUpState.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.feature.signup +package com.sopt.now.compose.presentation.signup data class SignUpState( val isSuccess: Boolean, diff --git a/app/src/main/java/com/sopt/now/compose/feature/signup/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/compose/presentation/signup/SignUpViewModel.kt similarity index 75% rename from app/src/main/java/com/sopt/now/compose/feature/signup/SignUpViewModel.kt rename to app/src/main/java/com/sopt/now/compose/presentation/signup/SignUpViewModel.kt index 5af1fa3..0425f55 100644 --- a/app/src/main/java/com/sopt/now/compose/feature/signup/SignUpViewModel.kt +++ b/app/src/main/java/com/sopt/now/compose/presentation/signup/SignUpViewModel.kt @@ -1,22 +1,24 @@ -package com.sopt.now.compose.feature.signup +package com.sopt.now.compose.presentation.signup import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.now.compose.ServicePool -import com.sopt.now.compose.remote.request.RequestSignUpDto +import com.sopt.now.compose.data.remote.request.RequestSignUpDto +import com.sopt.now.compose.domain.AuthRepository import kotlinx.coroutines.launch -class SignUpViewModel : ViewModel() { +class SignUpViewModel( + private val authRepository: AuthRepository +) : ViewModel() { private val _signUpState = MutableLiveData() val signUpState: LiveData get() = _signUpState - private val authService by lazy { ServicePool.authService } + fun signUp(request: RequestSignUpDto) { viewModelScope.launch { runCatching { - authService.signUp(request) + authRepository.signUp(request) }.onSuccess { if (it.code() in 200..299) { _signUpState.value = SignUpState(true, "회원가입 성공") diff --git a/app/src/main/java/com/sopt/now/compose/util/BaseViewModelFactory.kt b/app/src/main/java/com/sopt/now/compose/util/BaseViewModelFactory.kt new file mode 100644 index 0000000..3c2395e --- /dev/null +++ b/app/src/main/java/com/sopt/now/compose/util/BaseViewModelFactory.kt @@ -0,0 +1,10 @@ +package com.sopt.now.compose.util + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider + +class BaseViewModelFactory(private val creator: () -> T) : ViewModelProvider.Factory { + override fun create(modelClass: Class): V { + return creator() as V + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/compose/ui/theme/Color.kt b/app/src/main/java/com/sopt/now/compose/util/Color.kt similarity index 86% rename from app/src/main/java/com/sopt/now/compose/ui/theme/Color.kt rename to app/src/main/java/com/sopt/now/compose/util/Color.kt index 58ffdfc..f509b49 100644 --- a/app/src/main/java/com/sopt/now/compose/ui/theme/Color.kt +++ b/app/src/main/java/com/sopt/now/compose/util/Color.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.ui.theme +package com.sopt.now.compose.util import androidx.compose.ui.graphics.Color diff --git a/app/src/main/java/com/sopt/now/compose/ui/theme/LabeledTextField.kt b/app/src/main/java/com/sopt/now/compose/util/LabeledTextField.kt similarity index 97% rename from app/src/main/java/com/sopt/now/compose/ui/theme/LabeledTextField.kt rename to app/src/main/java/com/sopt/now/compose/util/LabeledTextField.kt index f123305..4b47c67 100644 --- a/app/src/main/java/com/sopt/now/compose/ui/theme/LabeledTextField.kt +++ b/app/src/main/java/com/sopt/now/compose/util/LabeledTextField.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.ui.theme +package com.sopt.now.compose.util import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth diff --git a/app/src/main/java/com/sopt/now/compose/ui/theme/RoundedCornerButton.kt b/app/src/main/java/com/sopt/now/compose/util/RoundedCornerButton.kt similarity index 94% rename from app/src/main/java/com/sopt/now/compose/ui/theme/RoundedCornerButton.kt rename to app/src/main/java/com/sopt/now/compose/util/RoundedCornerButton.kt index bc640a2..30ec8e8 100644 --- a/app/src/main/java/com/sopt/now/compose/ui/theme/RoundedCornerButton.kt +++ b/app/src/main/java/com/sopt/now/compose/util/RoundedCornerButton.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.ui.theme +package com.sopt.now.compose.util import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.shape.RoundedCornerShape diff --git a/app/src/main/java/com/sopt/now/compose/ui/theme/Theme.kt b/app/src/main/java/com/sopt/now/compose/util/Theme.kt similarity index 98% rename from app/src/main/java/com/sopt/now/compose/ui/theme/Theme.kt rename to app/src/main/java/com/sopt/now/compose/util/Theme.kt index da5ac84..b710c37 100644 --- a/app/src/main/java/com/sopt/now/compose/ui/theme/Theme.kt +++ b/app/src/main/java/com/sopt/now/compose/util/Theme.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.ui.theme +package com.sopt.now.compose.util import android.app.Activity import android.os.Build diff --git a/app/src/main/java/com/sopt/now/compose/ui/theme/Type.kt b/app/src/main/java/com/sopt/now/compose/util/Type.kt similarity index 96% rename from app/src/main/java/com/sopt/now/compose/ui/theme/Type.kt rename to app/src/main/java/com/sopt/now/compose/util/Type.kt index a5c1079..024f70e 100644 --- a/app/src/main/java/com/sopt/now/compose/ui/theme/Type.kt +++ b/app/src/main/java/com/sopt/now/compose/util/Type.kt @@ -1,4 +1,4 @@ -package com.sopt.now.compose.ui.theme +package com.sopt.now.compose.util import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle