Skip to content

Commit ba38509

Browse files
committed
feat: move error strings from hardcode in VM to string resources
1 parent 182ad93 commit ba38509

12 files changed

Lines changed: 97 additions & 30 deletions

File tree

app/src/main/java/ru/kheynov/secretsanta/presentation/screens/create_room/CreateRoomFragment.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,9 @@ class CreateRoomFragment : Fragment() {
119119
when (action) {
120120
is CreateRoomFragmentViewModel.Action.ShowError -> {
121121
Toast.makeText(
122-
context, "Error: ${action.error}", Toast.LENGTH_SHORT
122+
context,
123+
"Error: ${action.error.getText(context)}",
124+
Toast.LENGTH_SHORT
123125
).show()
124126
}
125127
CreateRoomFragmentViewModel.Action.ShowSuccess -> {
@@ -135,11 +137,9 @@ class CreateRoomFragment : Fragment() {
135137
}
136138
fragment.arguments = args
137139
activity?.supportFragmentManager?.beginTransaction()
138-
?.replace(R.id.fragment_container, fragment)?.commit()
139-
?: Log.i(
140-
"CreateRoomFragment",
141-
"Unable to navigate"
142-
)
140+
?.replace(R.id.fragment_container, fragment)?.commit() ?: Log.i(
141+
"CreateRoomFragment", "Unable to navigate"
142+
)
143143
}
144144
}
145145
}

app/src/main/java/ru/kheynov/secretsanta/presentation/screens/create_room/CreateRoomFragmentViewModel.kt

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ import kotlinx.coroutines.flow.MutableStateFlow
99
import kotlinx.coroutines.flow.StateFlow
1010
import kotlinx.coroutines.flow.receiveAsFlow
1111
import kotlinx.coroutines.launch
12+
import ru.kheynov.secretsanta.R
1213
import ru.kheynov.secretsanta.domain.entities.RoomDTO
1314
import ru.kheynov.secretsanta.domain.use_cases.rooms.RoomsUseCases
1415
import ru.kheynov.secretsanta.utils.Resource
1516
import ru.kheynov.secretsanta.utils.SantaException
17+
import ru.kheynov.secretsanta.utils.UiText
1618
import java.time.LocalDate
1719
import javax.inject.Inject
1820

@@ -34,7 +36,7 @@ class CreateRoomFragmentViewModel @Inject constructor(
3436
val actions: Flow<Action> = _actions.receiveAsFlow()
3537

3638
sealed interface Action {
37-
data class ShowError(val error: String) : Action
39+
data class ShowError(val error: UiText) : Action
3840
object ShowSuccess : Action
3941
}
4042

@@ -45,7 +47,13 @@ class CreateRoomFragmentViewModel @Inject constructor(
4547
viewModelScope.launch {
4648
_state.value = State.Loading
4749
if (room.roomName.isBlank()) {
48-
_actions.send(Action.ShowError("Room name can't be empty"))
50+
_actions.send(
51+
Action.ShowError(
52+
UiText.StringResource(
53+
R.string.room_name_empty_error
54+
)
55+
)
56+
)
4957
_state.value = State.Idle
5058
return@launch
5159
}
@@ -59,7 +67,13 @@ class CreateRoomFragmentViewModel @Inject constructor(
5967
_state.value = State.Error(res.exception)
6068
} else {
6169
_state.value = State.Idle
62-
_actions.send(Action.ShowError(res.exception.javaClass.simpleName.toString()))
70+
_actions.send(
71+
Action.ShowError(
72+
UiText.PlainText(
73+
res.exception.javaClass.simpleName.toString()
74+
)
75+
)
76+
)
6377
}
6478
}
6579
}

app/src/main/java/ru/kheynov/secretsanta/presentation/screens/join_room/JoinRoomFragment.kt

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,23 +59,29 @@ class JoinRoomFragment : Fragment() {
5959
viewModel.state.collect(::updateUI)
6060
}
6161
}
62+
}
63+
64+
override fun onResume() {
65+
super.onResume()
6266
lifecycleScope.launch {
63-
repeatOnLifecycle(Lifecycle.State.STARTED) {
64-
viewModel.actions.collect(::handleAction)
65-
}
67+
viewModel.actions.collect(::handleAction)
6668
}
6769
}
6870

6971
private fun handleAction(action: JoinRoomViewModel.Action) {
7072
when (action) {
7173
JoinRoomViewModel.Action.NavigateBack -> {
72-
activity?.supportFragmentManager
73-
?.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
74+
activity?.supportFragmentManager?.popBackStack(
75+
null,
76+
FragmentManager.POP_BACK_STACK_INCLUSIVE
77+
)
7478
activity?.viewModels<MainActivityViewModel>()?.value?.navigateToRoomsList()
7579
}
7680
is JoinRoomViewModel.Action.ShowError -> {
77-
Log.e("JoinRoomFragment", action.error)
78-
Toast.makeText(context, action.error, Toast.LENGTH_SHORT).show()
81+
Log.e("JoinRoomFragment", action.error.getText(context))
82+
Toast.makeText(
83+
context, action.error.getText(context), Toast.LENGTH_SHORT
84+
).show()
7985
}
8086
}
8187
}

app/src/main/java/ru/kheynov/secretsanta/presentation/screens/join_room/JoinRoomViewModel.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ import kotlinx.coroutines.flow.MutableStateFlow
99
import kotlinx.coroutines.flow.StateFlow
1010
import kotlinx.coroutines.flow.receiveAsFlow
1111
import kotlinx.coroutines.launch
12+
import ru.kheynov.secretsanta.R
1213
import ru.kheynov.secretsanta.domain.use_cases.game.GameUseCases
1314
import ru.kheynov.secretsanta.utils.Resource
1415
import ru.kheynov.secretsanta.utils.SantaException
16+
import ru.kheynov.secretsanta.utils.UiText
1517
import javax.inject.Inject
1618

1719
@HiltViewModel
@@ -26,7 +28,7 @@ class JoinRoomViewModel @Inject constructor(
2628
}
2729

2830
sealed interface Action {
29-
data class ShowError(val error: String) : Action
31+
data class ShowError(val error: UiText) : Action
3032
object NavigateBack : Action
3133
}
3234

@@ -40,7 +42,7 @@ class JoinRoomViewModel @Inject constructor(
4042
viewModelScope.launch {
4143
_state.value = State.Loading
4244
if (roomId.isBlank()) {
43-
_actions.send(Action.ShowError("Room ID can't be empty"))
45+
_actions.send(Action.ShowError(UiText.StringResource(R.string.room_id_empty_error)))
4446
_state.value = State.Idle
4547
return@launch
4648
}
@@ -53,7 +55,13 @@ class JoinRoomViewModel @Inject constructor(
5355
_state.value = State.Error(res.exception)
5456
} else {
5557
_state.value = State.Idle
56-
_actions.send(Action.ShowError(res.exception.javaClass.simpleName.toString()))
58+
_actions.send(
59+
Action.ShowError(
60+
UiText.PlainText(
61+
res.exception.javaClass.simpleName.toString()
62+
)
63+
)
64+
)
5765
}
5866
}
5967
}

app/src/main/java/ru/kheynov/secretsanta/presentation/screens/profile/EditUserFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class EditUserFragment : Fragment() {
7272
when (action) {
7373
Action.NavigateBack -> activity?.supportFragmentManager?.popBackStack()
7474
is Action.ShowError -> Toast.makeText(
75-
context, "Error: ${action.error}", Toast.LENGTH_SHORT
75+
context, "Error: ${action.error.getText(context)}", Toast.LENGTH_SHORT
7676
).show()
7777
}
7878
}

app/src/main/java/ru/kheynov/secretsanta/presentation/screens/profile/EditUserViewModel.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ import kotlinx.coroutines.flow.MutableStateFlow
99
import kotlinx.coroutines.flow.StateFlow
1010
import kotlinx.coroutines.flow.receiveAsFlow
1111
import kotlinx.coroutines.launch
12+
import ru.kheynov.secretsanta.R
1213
import ru.kheynov.secretsanta.domain.entities.UpdateUser
1314
import ru.kheynov.secretsanta.domain.use_cases.users.UsersUseCases
1415
import ru.kheynov.secretsanta.utils.Resource
16+
import ru.kheynov.secretsanta.utils.UiText
1517
import javax.inject.Inject
1618

1719
@HiltViewModel
@@ -27,7 +29,7 @@ class EditUserViewModel @Inject constructor(
2729

2830
sealed interface Action {
2931
object NavigateBack : Action
30-
data class ShowError(val error: String) : Action
32+
data class ShowError(val error: UiText) : Action
3133
}
3234

3335
private val _state = MutableStateFlow<State>(State.Loading)
@@ -54,10 +56,10 @@ class EditUserViewModel @Inject constructor(
5456
_state.value = State.Loading
5557
with(name) {
5658
if (isBlank()) {
57-
_actions.send(Action.ShowError("Name couldn't be blank"))
59+
_actions.send(Action.ShowError(UiText.StringResource(R.string.name_blank_error)))
5860
}
5961
if (length > 15) {
60-
_actions.send(Action.ShowError("Name too long"))
62+
_actions.send(Action.ShowError(UiText.StringResource(R.string.name_too_long)))
6163
}
6264
}
6365
useCases.updateUserUseCase(updateUser = UpdateUser(username = name))

app/src/main/java/ru/kheynov/secretsanta/presentation/screens/profile/ProfileFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ class ProfileFragment : Fragment() {
113113
}
114114
is Action.ShowError -> Toast.makeText(
115115
context!!,
116-
"Error: ${action.error}",
116+
"Error: ${action.error.getText(context)}",
117117
Toast.LENGTH_SHORT
118118
)
119119
.show()

app/src/main/java/ru/kheynov/secretsanta/presentation/screens/profile/ProfileFragmentViewModel.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import retrofit2.HttpException
1313
import ru.kheynov.secretsanta.domain.use_cases.users.UsersUseCases
1414
import ru.kheynov.secretsanta.utils.Resource
1515
import ru.kheynov.secretsanta.utils.SantaException
16+
import ru.kheynov.secretsanta.utils.UiText
1617
import javax.inject.Inject
1718

1819
@HiltViewModel
@@ -28,7 +29,7 @@ class ProfileFragmentViewModel @Inject constructor(
2829
sealed interface Action {
2930
object NavigateToLoginScreen : Action
3031
object NavigateToEditUser : Action
31-
data class ShowError(val error: String) : Action
32+
data class ShowError(val error: UiText) : Action
3233
}
3334

3435
private val _state = MutableStateFlow<State>(State.Loading)
@@ -51,7 +52,13 @@ class ProfileFragmentViewModel @Inject constructor(
5152
if (res.exception is SantaException || res.exception is HttpException) {
5253
_state.value = State.Error(res.exception)
5354
} else {
54-
_actions.send(Action.ShowError(res.exception.javaClass.simpleName.toString()))
55+
_actions.send(
56+
Action.ShowError(
57+
UiText.PlainText(
58+
res.exception.javaClass.simpleName.toString()
59+
)
60+
)
61+
)
5562
}
5663
}
5764
is Resource.Success -> {

app/src/main/java/ru/kheynov/secretsanta/presentation/screens/register_screen/RegisterActivity.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,15 @@ class RegisterActivity : AppCompatActivity() {
4545
.setText(viewModel.username)
4646

4747
registerButton.visibility = registerUsernameInput.visibility
48-
4948
registerTitleText.visibility = registerUsernameInput.visibility
5049
}
5150
}
5251
}
5352
}
53+
}
54+
55+
override fun onResume() {
56+
super.onResume()
5457
lifecycleScope.launch {
5558
viewModel.actions.collect(::handleActions)
5659
}
@@ -61,7 +64,7 @@ class RegisterActivity : AppCompatActivity() {
6164
RegisterActivityViewModel.Action.RouteToMain -> navigateToLoginScreen(this)
6265
is RegisterActivityViewModel.Action.ShowError -> Toast.makeText(
6366
this,
64-
"Error: ${action.error}",
67+
"Error: ${action.error.getText(this)}",
6568
Toast.LENGTH_SHORT
6669
).show()
6770
}

app/src/main/java/ru/kheynov/secretsanta/presentation/screens/register_screen/RegisterActivityViewModel.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import ru.kheynov.secretsanta.domain.entities.RegisterUser
1515
import ru.kheynov.secretsanta.domain.use_cases.users.UsersUseCases
1616
import ru.kheynov.secretsanta.utils.Resource
1717
import ru.kheynov.secretsanta.utils.SantaException
18+
import ru.kheynov.secretsanta.utils.UiText
1819
import javax.inject.Inject
1920

2021
@HiltViewModel
@@ -38,7 +39,7 @@ class RegisterActivityViewModel @Inject constructor(
3839
val actions: Flow<Action> = _actions.receiveAsFlow()
3940

4041
sealed interface Action {
41-
data class ShowError(val error: String) : Action
42+
data class ShowError(val error: UiText) : Action
4243
object RouteToMain : Action
4344
}
4445

@@ -51,7 +52,13 @@ class RegisterActivityViewModel @Inject constructor(
5152
_state.value = State.Error(res.exception)
5253
} else {
5354
_state.value = State.Idle
54-
_actions.send(Action.ShowError(res.exception.message.toString()))
55+
_actions.send(
56+
Action.ShowError(
57+
UiText.PlainText(
58+
res.exception.message.toString()
59+
)
60+
)
61+
)
5562
}
5663
}
5764
is Resource.Success -> {

0 commit comments

Comments
 (0)