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