From 65f0cb8292cb560f88611244b9bae63f08b1f37e Mon Sep 17 00:00:00 2001 From: heka1024 Date: Thu, 7 Dec 2023 00:42:14 +0900 Subject: [PATCH] =?UTF-8?q?ViewModel=20=EC=9C=84=EC=B9=98=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/frontend/MapActivity.kt | 2 +- .../com/example/frontend/MeetupActivity.kt | 37 ++++---- .../frontend/repository/FriendsRepository.kt | 38 -------- .../frontend/repository/UsersRepository.kt | 88 ----------------- .../frontend/ui/friend/FriendActivity.kt | 2 +- .../frontend/ui/friend/FriendListUI.kt | 4 +- .../frontend/ui/friend/FriendRequestUI.kt | 2 +- .../example/frontend/ui/friend/UserListUI.kt | 4 +- .../frontend/viewmodel/FriendsViewModel.kt | 29 ++++++ .../viewmodel/InviteFriendViewModel.kt | 18 ++++ .../frontend/viewmodel/UsersViewModel.kt | 94 +++++++++++++++++++ 11 files changed, 166 insertions(+), 152 deletions(-) create mode 100644 frontend/app/src/main/java/com/example/frontend/viewmodel/FriendsViewModel.kt create mode 100644 frontend/app/src/main/java/com/example/frontend/viewmodel/InviteFriendViewModel.kt create mode 100644 frontend/app/src/main/java/com/example/frontend/viewmodel/UsersViewModel.kt diff --git a/frontend/app/src/main/java/com/example/frontend/MapActivity.kt b/frontend/app/src/main/java/com/example/frontend/MapActivity.kt index 178f8dd4..83a611f2 100644 --- a/frontend/app/src/main/java/com/example/frontend/MapActivity.kt +++ b/frontend/app/src/main/java/com/example/frontend/MapActivity.kt @@ -38,10 +38,10 @@ import androidx.compose.ui.unit.dp import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.lifecycle.viewmodel.compose.viewModel -import com.example.frontend.repository.FriendsViewModel import com.example.frontend.ui.component.BottomBar import com.example.frontend.ui.component.MapWithMarker import com.example.frontend.ui.theme.FrontendTheme +import com.example.frontend.viewmodel.FriendsViewModel import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.LocationCallback import com.google.android.gms.location.LocationRequest diff --git a/frontend/app/src/main/java/com/example/frontend/MeetupActivity.kt b/frontend/app/src/main/java/com/example/frontend/MeetupActivity.kt index 69c208d7..54829d3d 100644 --- a/frontend/app/src/main/java/com/example/frontend/MeetupActivity.kt +++ b/frontend/app/src/main/java/com/example/frontend/MeetupActivity.kt @@ -1,6 +1,5 @@ package com.example.frontend -import android.content.Intent import android.os.Build import android.os.Bundle import android.widget.Toast @@ -28,15 +27,28 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Search import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.DatePicker +import androidx.compose.material3.DisplayMode import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Surface import androidx.compose.material3.Text +import androidx.compose.material3.TimeInput +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.rememberDatePickerState +import androidx.compose.material3.rememberTimePickerState import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -48,31 +60,18 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.example.frontend.ui.component.CustomButton -import com.example.frontend.ui.theme.FrontendTheme -import com.example.frontend.ui.theme.Purple80 -import androidx.compose.material3.DatePicker -import androidx.compose.material3.DisplayMode -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.TimeInput -import androidx.compose.material3.TopAppBar -import androidx.compose.material3.rememberDatePickerState -import androidx.compose.material3.rememberTimePickerState -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.MutableState -import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.runtime.mutableStateMapOf -import androidx.compose.runtime.saveable.rememberSaveable import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import com.example.frontend.model.UserWithLocationModel -import com.example.frontend.repository.FriendsViewModel -import com.example.frontend.repository.InviteFriendViewModel +import com.example.frontend.ui.component.CustomButton +import com.example.frontend.ui.theme.FrontendTheme +import com.example.frontend.ui.theme.Purple80 import com.example.frontend.usecase.ListFriendUseCase +import com.example.frontend.viewmodel.FriendsViewModel +import com.example.frontend.viewmodel.InviteFriendViewModel import com.google.android.gms.maps.model.LatLng import dagger.hilt.android.AndroidEntryPoint diff --git a/frontend/app/src/main/java/com/example/frontend/repository/FriendsRepository.kt b/frontend/app/src/main/java/com/example/frontend/repository/FriendsRepository.kt index d93ac09f..42e4eb0c 100644 --- a/frontend/app/src/main/java/com/example/frontend/repository/FriendsRepository.kt +++ b/frontend/app/src/main/java/com/example/frontend/repository/FriendsRepository.kt @@ -1,10 +1,6 @@ package com.example.frontend.repository import android.content.Context -import androidx.compose.runtime.mutableStateMapOf -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import com.example.frontend.api.FriendService import com.example.frontend.api.UserService import com.example.frontend.callback.FriendLocationCallback @@ -13,18 +9,14 @@ import com.example.frontend.model.UserWithLocationModel import dagger.Module import dagger.Provides import dagger.hilt.InstallIn -import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow import okhttp3.OkHttpClient import retrofit2.Call import retrofit2.Callback import retrofit2.Response import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory -import javax.inject.Inject class FriendsRepository(private val friendService: FriendService) { @@ -51,36 +43,6 @@ class FriendsRepository(private val friendService: FriendService) { } } -@HiltViewModel -class FriendsViewModel @Inject constructor(private val repository: FriendsRepository) : - ViewModel() { - private val _friendsList = MutableLiveData>() - val friendsList: LiveData> = _friendsList - - fun fetchFriends() { - repository.getNearbyFriends(object : FriendLocationCallback { - override fun onResult(result: List) { - _friendsList.postValue(result) - } - - override fun onError(error: Throwable) { - // Handle error - } - }) - } -} - -class InviteFriendViewModel : ViewModel() { - - private val _checkedStates = mutableStateMapOf() - private val _checkedStatesFlow = MutableStateFlow>(_checkedStates) - - val checkedStatesFlow = _checkedStatesFlow.asStateFlow() - fun updateCheckedState(friendId: Long, isChecked: Boolean) { - _checkedStates[friendId] = isChecked - _checkedStatesFlow.value = _checkedStates.toMap() - } -} @Module @InstallIn(SingletonComponent::class) object AppModule { diff --git a/frontend/app/src/main/java/com/example/frontend/repository/UsersRepository.kt b/frontend/app/src/main/java/com/example/frontend/repository/UsersRepository.kt index b6102819..6c357a04 100644 --- a/frontend/app/src/main/java/com/example/frontend/repository/UsersRepository.kt +++ b/frontend/app/src/main/java/com/example/frontend/repository/UsersRepository.kt @@ -1,13 +1,7 @@ package com.example.frontend.repository -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope import com.example.frontend.api.UserService import com.example.frontend.model.UserModel -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.launch import retrofit2.Response import javax.inject.Inject @@ -33,85 +27,3 @@ class UsersRepository @Inject constructor(private val userService: UserService) } } -@HiltViewModel -class UsersViewModel @Inject constructor(private val usersRepository: UsersRepository) : - ViewModel() { - - private val _users = MutableLiveData>() - val users: LiveData> = _users - - private val _friends = MutableLiveData>() - val friends: LiveData> = _friends - - private val _requestStatus = MutableLiveData() - val requestStatus: LiveData = _requestStatus - - private val _pendingRequests = MutableLiveData>() - val pendingRequests: LiveData> = _pendingRequests - - fun getUsers() { - viewModelScope.launch { - try { - val userList = usersRepository.getUsers() - _users.postValue(userList) - } catch (e: Exception) { - // Handle error - } - } - } - - fun getFriends() { - viewModelScope.launch { - try { - val friendList = usersRepository.getFriends() - _friends.postValue(friendList) - } catch (e: Exception) { - // Handle error - } - } - } - - fun sendFriendRequest(userId: Long) { - viewModelScope.launch { - try { - val response = usersRepository.sendFriendRequest(userId) - if (response.isSuccessful) { - _requestStatus.postValue("Friend request has been sent") - } else { - _requestStatus.postValue("이미 친구이거나 친구 요청이 존재하는 유저입니다.%${Math.random()}") - } - } catch (e: Exception) { - // Handle error - } - } - } - - fun getPendingRequests() { - viewModelScope.launch { - try { - val pendingRequests = usersRepository.getPendingRequests() - _pendingRequests.postValue(pendingRequests) - } catch (e: Exception) { - // Handle error - } - } - } - - fun confirmRequest(friendId: Long) { - viewModelScope.launch { - try { - usersRepository.confirmRequest(friendId) - val updatedList = _pendingRequests.value?.filterNot { it.id == friendId } - _pendingRequests.postValue(updatedList!!) - } catch (e: Exception) { - // Handle error - } - } - } - - fun clearRequestStatus() { - _requestStatus.value = null - } - - -} \ No newline at end of file diff --git a/frontend/app/src/main/java/com/example/frontend/ui/friend/FriendActivity.kt b/frontend/app/src/main/java/com/example/frontend/ui/friend/FriendActivity.kt index 473d47f5..373e363b 100644 --- a/frontend/app/src/main/java/com/example/frontend/ui/friend/FriendActivity.kt +++ b/frontend/app/src/main/java/com/example/frontend/ui/friend/FriendActivity.kt @@ -17,11 +17,11 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.lifecycle.viewmodel.compose.viewModel -import com.example.frontend.repository.UsersViewModel import com.example.frontend.ui.component.MyTopAppBar import com.example.frontend.ui.theme.FrontendTheme import com.example.frontend.ui.theme.Purple40 import com.example.frontend.ui.theme.Purple80 +import com.example.frontend.viewmodel.UsersViewModel import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint diff --git a/frontend/app/src/main/java/com/example/frontend/ui/friend/FriendListUI.kt b/frontend/app/src/main/java/com/example/frontend/ui/friend/FriendListUI.kt index 8af72dde..6166b881 100644 --- a/frontend/app/src/main/java/com/example/frontend/ui/friend/FriendListUI.kt +++ b/frontend/app/src/main/java/com/example/frontend/ui/friend/FriendListUI.kt @@ -15,7 +15,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.example.frontend.model.UserModel -import com.example.frontend.repository.UsersViewModel +import com.example.frontend.viewmodel.UsersViewModel @Composable fun FriendListUI(viewModel: UsersViewModel) { @@ -43,4 +43,4 @@ fun FriendItem(friend: UserModel) { ) { Text(text = friend.name) } -} \ No newline at end of file +} diff --git a/frontend/app/src/main/java/com/example/frontend/ui/friend/FriendRequestUI.kt b/frontend/app/src/main/java/com/example/frontend/ui/friend/FriendRequestUI.kt index a6190c73..faf4f8d8 100644 --- a/frontend/app/src/main/java/com/example/frontend/ui/friend/FriendRequestUI.kt +++ b/frontend/app/src/main/java/com/example/frontend/ui/friend/FriendRequestUI.kt @@ -17,8 +17,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.example.frontend.model.UserModel -import com.example.frontend.repository.UsersViewModel import com.example.frontend.ui.theme.Purple80 +import com.example.frontend.viewmodel.UsersViewModel @Composable fun FriendRequestUI( diff --git a/frontend/app/src/main/java/com/example/frontend/ui/friend/UserListUI.kt b/frontend/app/src/main/java/com/example/frontend/ui/friend/UserListUI.kt index 7d484fa5..5817ff1d 100644 --- a/frontend/app/src/main/java/com/example/frontend/ui/friend/UserListUI.kt +++ b/frontend/app/src/main/java/com/example/frontend/ui/friend/UserListUI.kt @@ -24,7 +24,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import com.example.frontend.model.UserModel -import com.example.frontend.repository.UsersViewModel +import com.example.frontend.viewmodel.UsersViewModel import com.example.frontend.ui.theme.Purple80 @Composable @@ -81,4 +81,4 @@ fun UserItem(user: UserModel, onSendRequest: (UserModel) -> Unit) { Text("Send Request") } } -} \ No newline at end of file +} diff --git a/frontend/app/src/main/java/com/example/frontend/viewmodel/FriendsViewModel.kt b/frontend/app/src/main/java/com/example/frontend/viewmodel/FriendsViewModel.kt new file mode 100644 index 00000000..1355b23d --- /dev/null +++ b/frontend/app/src/main/java/com/example/frontend/viewmodel/FriendsViewModel.kt @@ -0,0 +1,29 @@ +package com.example.frontend.viewmodel + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.example.frontend.callback.FriendLocationCallback +import com.example.frontend.model.UserWithLocationModel +import com.example.frontend.repository.FriendsRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class FriendsViewModel @Inject constructor(private val repository: FriendsRepository) : + ViewModel() { + private val _friendsList = MutableLiveData>() + val friendsList: LiveData> = _friendsList + + fun fetchFriends() { + repository.getNearbyFriends(object : FriendLocationCallback { + override fun onResult(result: List) { + _friendsList.postValue(result) + } + + override fun onError(error: Throwable) { + // Handle error + } + }) + } +} diff --git a/frontend/app/src/main/java/com/example/frontend/viewmodel/InviteFriendViewModel.kt b/frontend/app/src/main/java/com/example/frontend/viewmodel/InviteFriendViewModel.kt new file mode 100644 index 00000000..e586ec03 --- /dev/null +++ b/frontend/app/src/main/java/com/example/frontend/viewmodel/InviteFriendViewModel.kt @@ -0,0 +1,18 @@ +package com.example.frontend.viewmodel + +import androidx.compose.runtime.mutableStateMapOf +import androidx.lifecycle.ViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow + +class InviteFriendViewModel : ViewModel() { + + private val _checkedStates = mutableStateMapOf() + private val _checkedStatesFlow = MutableStateFlow>(_checkedStates) + + val checkedStatesFlow = _checkedStatesFlow.asStateFlow() + fun updateCheckedState(friendId: Long, isChecked: Boolean) { + _checkedStates[friendId] = isChecked + _checkedStatesFlow.value = _checkedStates.toMap() + } +} diff --git a/frontend/app/src/main/java/com/example/frontend/viewmodel/UsersViewModel.kt b/frontend/app/src/main/java/com/example/frontend/viewmodel/UsersViewModel.kt new file mode 100644 index 00000000..aecf6fb4 --- /dev/null +++ b/frontend/app/src/main/java/com/example/frontend/viewmodel/UsersViewModel.kt @@ -0,0 +1,94 @@ +package com.example.frontend.viewmodel + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.example.frontend.model.UserModel +import com.example.frontend.repository.UsersRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class UsersViewModel @Inject constructor(private val usersRepository: UsersRepository) : + ViewModel() { + + private val _users = MutableLiveData>() + val users: LiveData> = _users + + private val _friends = MutableLiveData>() + val friends: LiveData> = _friends + + private val _requestStatus = MutableLiveData() + val requestStatus: LiveData = _requestStatus + + private val _pendingRequests = MutableLiveData>() + val pendingRequests: LiveData> = _pendingRequests + + fun getUsers() { + viewModelScope.launch { + try { + val userList = usersRepository.getUsers() + _users.postValue(userList) + } catch (e: Exception) { + // Handle error + } + } + } + + fun getFriends() { + viewModelScope.launch { + try { + val friendList = usersRepository.getFriends() + _friends.postValue(friendList) + } catch (e: Exception) { + // Handle error + } + } + } + + fun sendFriendRequest(userId: Long) { + viewModelScope.launch { + try { + val response = usersRepository.sendFriendRequest(userId) + if (response.isSuccessful) { + _requestStatus.postValue("Friend request has been sent") + } else { + _requestStatus.postValue("이미 친구이거나 친구 요청이 존재하는 유저입니다.%${Math.random()}") + } + } catch (e: Exception) { + // Handle error + } + } + } + + fun getPendingRequests() { + viewModelScope.launch { + try { + val pendingRequests = usersRepository.getPendingRequests() + _pendingRequests.postValue(pendingRequests) + } catch (e: Exception) { + // Handle error + } + } + } + + fun confirmRequest(friendId: Long) { + viewModelScope.launch { + try { + usersRepository.confirmRequest(friendId) + val updatedList = _pendingRequests.value?.filterNot { it.id == friendId } + _pendingRequests.postValue(updatedList!!) + } catch (e: Exception) { + // Handle error + } + } + } + + fun clearRequestStatus() { + _requestStatus.value = null + } + + +}