Skip to content

Commit 00e51d1

Browse files
committed
feat : 채팅방 목록, 채팅방 상세 화면에서만 웹소켓을 연결하는 것으로 변경
1 parent a9b13f2 commit 00e51d1

File tree

13 files changed

+64
-63
lines changed

13 files changed

+64
-63
lines changed

feature/center-chatting/src/main/java/com/idle/center/chatting/CenterChattingFragment.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import androidx.compose.ui.text.style.TextAlign
3535
import androidx.compose.ui.text.style.TextOverflow
3636
import androidx.compose.ui.unit.dp
3737
import androidx.fragment.app.viewModels
38+
import androidx.lifecycle.compose.LifecycleStartEffect
3839
import androidx.lifecycle.compose.collectAsStateWithLifecycle
3940
import coil.compose.AsyncImage
4041
import com.idle.compose.base.BaseComposeFragment
@@ -65,7 +66,11 @@ internal class CenterChattingFragment : BaseComposeFragment() {
6566
initCenterChatting()
6667
retrieveChatRoomList()
6768
loadChatRoomList()
68-
subscribeChatMessage()
69+
}
70+
71+
LifecycleStartEffect(fragmentViewModel) {
72+
connectWebsocket()
73+
onStopOrDispose { disconnectWebsocket() }
6974
}
7075

7176
CenterChattingScreen(

feature/center-chatting/src/main/java/com/idle/center/chatting/CenterChattingViewModel.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,17 @@ class CenterChattingViewModel @Inject constructor(
4343
}.onFailure { errorHelper.sendError(it) }
4444
}
4545

46-
internal fun subscribeChatMessage() = viewModelScope.launch {
46+
internal fun connectWebsocket() = viewModelScope.launch {
47+
chatRepository.connectWebSocket().onSuccess {
48+
subscribeChatMessage()
49+
}
50+
}
51+
52+
internal fun disconnectWebsocket() = viewModelScope.launch {
53+
chatRepository.disconnectWebSocket()
54+
}
55+
56+
private fun subscribeChatMessage() = viewModelScope.launch {
4757
chatRepository.subscribeChatMessage(_myProfile.value?.centerId ?: return@launch)
4858
.collect { message ->
4959
when (message) {

feature/chatting-detail/src/main/java/com/idle/chatting_detail/ChattingDetailFragment.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.compose.runtime.LaunchedEffect
55
import androidx.compose.runtime.getValue
66
import androidx.compose.runtime.rememberCoroutineScope
77
import androidx.fragment.app.viewModels
8+
import androidx.lifecycle.compose.LifecycleStartEffect
89
import androidx.lifecycle.compose.collectAsStateWithLifecycle
910
import androidx.navigation.fragment.findNavController
1011
import com.idle.chatting_detail.ui.ChattingDetailLoadingScreen
@@ -34,10 +35,15 @@ internal class ChattingDetailFragment : BaseComposeFragment() {
3435
LaunchedEffect(Unit) {
3536
getUserProfile()
3637
getChatMessages()
37-
subscribeChatMessage()
3838
readMessage()
3939
}
4040

41+
LifecycleStartEffect(fragmentViewModel) {
42+
connectWebsocket()
43+
onStopOrDispose { disconnectWebsocket() }
44+
}
45+
46+
4147
if (chatMessages != null && workerProfile != null && centerProfile != null) {
4248
ChattingDetailScreen(
4349
receiverId = receiverId,

feature/chatting-detail/src/main/java/com/idle/chatting_detail/ChattingDetailViewModel.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,17 @@ class ChattingDetailViewModel @Inject constructor(
134134
}
135135
}
136136

137-
internal suspend fun subscribeChatMessage() {
137+
internal fun connectWebsocket() = viewModelScope.launch {
138+
chatRepository.connectWebSocket().onSuccess {
139+
subscribeChatMessage()
140+
}
141+
}
142+
143+
internal fun disconnectWebsocket() = viewModelScope.launch {
144+
chatRepository.disconnectWebSocket()
145+
}
146+
147+
private suspend fun subscribeChatMessage() {
138148
chatRepository.subscribeChatMessage(myId)
139149
.catch {
140150
errorHelper.sendError(it)

feature/setting/src/main/java/com/idle/setting/center/CenterSettingViewModel.kt

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import com.idle.analytics.AnalyticsHelper
66
import com.idle.domain.model.error.ErrorHelper
77
import com.idle.domain.model.profile.CenterProfile
88
import com.idle.domain.repositorry.AuthRepository
9-
import com.idle.domain.repositorry.ChatRepository
109
import com.idle.domain.usecase.profile.GetMyCenterProfileUseCase
1110
import com.idle.setting.SettingEvent
1211
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -21,15 +20,13 @@ import javax.inject.Inject
2120
class CenterSettingViewModel @Inject constructor(
2221
private val getMyCenterProfileUseCase: GetMyCenterProfileUseCase,
2322
private val authRepository: AuthRepository,
24-
private val chatRepository: ChatRepository,
2523
private val analyticsHelper: AnalyticsHelper,
2624
private val errorHelper: ErrorHelper,
2725
val navigationHelper: com.idle.navigation.NavigationHelper,
2826
) : ViewModel() {
29-
private val _centerProfile =
30-
MutableStateFlow<CenterProfile>(
31-
CenterProfile("", "", "", "", "", "", 0.0, 0.0, "", "")
32-
)
27+
private val _centerProfile = MutableStateFlow<CenterProfile>(
28+
CenterProfile("", "", "", "", "", "", 0.0, 0.0, "", "")
29+
)
3330
val centerProfile = _centerProfile.asStateFlow()
3431

3532
private val _centerSettingEvent = MutableSharedFlow<SettingEvent>()
@@ -48,7 +45,6 @@ class CenterSettingViewModel @Inject constructor(
4845
fun logout() = viewModelScope.launch {
4946
authRepository.logoutCenter().onSuccess {
5047
analyticsHelper.setUserId(null)
51-
chatRepository.disconnectWebSocket()
5248
navigationHelper.navigateTo(
5349
com.idle.navigation.NavigationEvent.ToAuthWithClearBackStack(
5450
toastMsg = "로그아웃이 완료되었습니다.",

feature/setting/src/main/java/com/idle/setting/worker/WorkerSettingViewModel.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import com.idle.analytics.AnalyticsHelper
66
import com.idle.domain.model.error.ErrorHelper
77
import com.idle.domain.model.profile.WorkerProfile
88
import com.idle.domain.repositorry.AuthRepository
9-
import com.idle.domain.repositorry.ChatRepository
109
import com.idle.domain.usecase.profile.GetMyWorkerProfileUseCase
1110
import com.idle.setting.SettingEvent
1211
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -20,7 +19,6 @@ import javax.inject.Inject
2019
class WorkerSettingViewModel @Inject constructor(
2120
private val getMyWorkerProfileUseCase: GetMyWorkerProfileUseCase,
2221
private val authRepository: AuthRepository,
23-
private val chatRepository: ChatRepository,
2422
private val analyticsHelper: AnalyticsHelper,
2523
private val errorHelper: ErrorHelper,
2624
val navigationHelper: com.idle.navigation.NavigationHelper,
@@ -43,7 +41,6 @@ class WorkerSettingViewModel @Inject constructor(
4341
fun logout() = viewModelScope.launch {
4442
authRepository.logoutWorker().onSuccess {
4543
analyticsHelper.setUserId(null)
46-
chatRepository.disconnectWebSocket()
4744
navigationHelper.navigateTo(
4845
com.idle.navigation.NavigationEvent.ToAuthWithClearBackStack(
4946
toastMsg = "로그아웃이 완료되었습니다.",

feature/signin/src/main/java/com/idle/signin/center/CenterSignInViewModel.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import com.idle.domain.model.error.HttpResponseException
1313
import com.idle.domain.model.error.HttpResponseStatus
1414
import com.idle.domain.model.profile.CenterManagerAccountStatus
1515
import com.idle.domain.repositorry.AuthRepository
16-
import com.idle.domain.repositorry.ChatRepository
1716
import com.idle.domain.repositorry.ProfileRepository
1817
import com.idle.navigation.DeepLinkDestination.CenterHome
1918
import com.idle.navigation.DeepLinkDestination.CenterPending
@@ -29,7 +28,6 @@ import javax.inject.Inject
2928
@HiltViewModel
3029
class CenterSignInViewModel @Inject constructor(
3130
private val authRepository: AuthRepository,
32-
private val chatRepository: ChatRepository,
3331
private val profileRepository: ProfileRepository,
3432
private val analyticsHelper: AnalyticsHelper,
3533
private val errorHelper: ErrorHelper,
@@ -109,7 +107,6 @@ class CenterSignInViewModel @Inject constructor(
109107

110108
private fun fetchAndNavigateToProfile() = viewModelScope.launch {
111109
profileRepository.getMyCenterProfile().onSuccess {
112-
chatRepository.connectWebSocket()
113110
navigationHelper.navigateTo(To(CenterHome, R.id.centerSignInFragment))
114111
}.onFailure {
115112
val error = it as HttpResponseException

feature/signup/src/main/java/com/idle/signup/worker/WorkerSignUpViewModel.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import com.idle.domain.model.error.ErrorHelper
1313
import com.idle.domain.model.error.HttpResponseException
1414
import com.idle.domain.model.error.HttpResponseStatus
1515
import com.idle.domain.repositorry.AuthRepository
16-
import com.idle.domain.repositorry.ChatRepository
1716
import com.idle.domain.repositorry.ProfileRepository
1817
import com.idle.domain.util.formatPhoneNumber
1918
import com.idle.navigation.DeepLinkDestination.SignUpComplete
@@ -32,7 +31,6 @@ import javax.inject.Inject
3231
class WorkerSignUpViewModel @Inject constructor(
3332
private val profileRepository: ProfileRepository,
3433
private val authRepository: AuthRepository,
35-
private val chatRepository: ChatRepository,
3634
private val countDownTimer: CountDownTimer,
3735
private val analyticsHelper: AnalyticsHelper,
3836
private val errorHelper: ErrorHelper,
@@ -153,7 +151,6 @@ class WorkerSignUpViewModel @Inject constructor(
153151
authCode = _workerAuthCode.value,
154152
).onSuccess {
155153
profileRepository.getWorkerId().onSuccess { analyticsHelper.setUserId(it) }
156-
chatRepository.connectWebSocket()
157154
navigationHelper.navigateTo(
158155
com.idle.navigation.NavigationEvent.To(
159156
WorkerHome,
@@ -189,7 +186,6 @@ class WorkerSignUpViewModel @Inject constructor(
189186
lotNumberAddress = _lotNumberAddress.value,
190187
).onSuccess {
191188
profileRepository.getWorkerId().onSuccess { analyticsHelper.setUserId(it) }
192-
chatRepository.connectWebSocket()
193189
navigationHelper.navigateTo(
194190
com.idle.navigation.NavigationEvent.To(
195191
SignUpComplete,

feature/withdrawal/src/main/java/com/idle/withdrawal/WithdrawalViewModel.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import com.idle.domain.model.error.ApiErrorCode
1313
import com.idle.domain.model.error.ErrorHelper
1414
import com.idle.domain.model.error.HttpResponseException
1515
import com.idle.domain.repositorry.AuthRepository
16-
import com.idle.domain.repositorry.ChatRepository
1716
import com.idle.domain.util.formatPhoneNumber
1817
import dagger.hilt.android.lifecycle.HiltViewModel
1918
import kotlinx.coroutines.Job
@@ -25,7 +24,6 @@ import javax.inject.Inject
2524
@HiltViewModel
2625
class WithdrawalViewModel @Inject constructor(
2726
private val authRepository: AuthRepository,
28-
private val chatRepository: ChatRepository,
2927
private val countDownTimer: CountDownTimer,
3028
private val analyticsHelper: AnalyticsHelper,
3129
private val errorHelper: ErrorHelper,
@@ -167,7 +165,6 @@ class WithdrawalViewModel @Inject constructor(
167165
password = password.value
168166
).onSuccess {
169167
analyticsHelper.setUserId(null)
170-
chatRepository.disconnectWebSocket()
171168
navigationHelper.navigateTo(
172169
com.idle.navigation.NavigationEvent.ToAuthWithClearBackStack(
173170
"회원탈퇴가 완료되었어요."
@@ -190,7 +187,6 @@ class WithdrawalViewModel @Inject constructor(
190187
.joinToString("|"),
191188
).onSuccess {
192189
analyticsHelper.setUserId(null)
193-
chatRepository.disconnectWebSocket()
194190
navigationHelper.navigateTo(
195191
com.idle.navigation.NavigationEvent.ToAuthWithClearBackStack(
196192
"회원탈퇴가 완료되었어요."

feature/worker-chatting/src/main/java/com/idle/worker/chatting/WorkerChattingFragment.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import androidx.compose.ui.text.style.TextAlign
3535
import androidx.compose.ui.text.style.TextOverflow
3636
import androidx.compose.ui.unit.dp
3737
import androidx.fragment.app.viewModels
38+
import androidx.lifecycle.compose.LifecycleStartEffect
3839
import androidx.lifecycle.compose.collectAsStateWithLifecycle
3940
import coil.compose.AsyncImage
4041
import com.idle.compose.base.BaseComposeFragment
@@ -50,7 +51,6 @@ import com.idle.domain.util.formatUnReadNumber
5051
import com.idle.navigation.DeepLinkDestination
5152
import com.idle.navigation.NavigationEvent
5253
import dagger.hilt.android.AndroidEntryPoint
53-
import kotlinx.coroutines.launch
5454

5555
@AndroidEntryPoint
5656
internal class WorkerChattingFragment : BaseComposeFragment() {
@@ -64,11 +64,13 @@ internal class WorkerChattingFragment : BaseComposeFragment() {
6464

6565
LaunchedEffect(Unit) {
6666
initWorkerChatting()
67-
launch {
68-
retrieveChatRoomList()
69-
loadChatRoomList()
70-
}
71-
launch { subscribeChatMessage() }
67+
retrieveChatRoomList()
68+
loadChatRoomList()
69+
}
70+
71+
LifecycleStartEffect(fragmentViewModel) {
72+
connectWebsocket()
73+
onStopOrDispose { disconnectWebsocket() }
7274
}
7375

7476
if (chatRoomList != null) {

0 commit comments

Comments
 (0)