Skip to content

Commit 884694a

Browse files
committed
Add success case to custom list action result data
1 parent 4228ccc commit 884694a

13 files changed

+80
-78
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,53 @@
11
package net.mullvad.mullvadvpn.compose.communication
22

33
import android.os.Parcelable
4-
import kotlinx.parcelize.IgnoredOnParcel
54
import kotlinx.parcelize.Parcelize
65
import net.mullvad.mullvadvpn.lib.model.CustomListName
76

87
sealed interface CustomListActionResultData : Parcelable {
9-
val undo: CustomListAction?
10-
11-
@Parcelize
12-
data class CreatedWithLocations(
13-
val customListName: CustomListName,
14-
val locationNames: List<String>,
15-
override val undo: CustomListAction
16-
) : CustomListActionResultData
17-
18-
@Parcelize
19-
data class Deleted(
20-
val customListName: CustomListName,
21-
override val undo: CustomListAction.Create
22-
) : CustomListActionResultData
23-
24-
@Parcelize
25-
data class Renamed(val newName: CustomListName, override val undo: CustomListAction.Rename) :
26-
CustomListActionResultData
27-
28-
@Parcelize
29-
data class LocationAdded(
30-
val customListName: CustomListName,
31-
val locationName: String,
32-
override val undo: CustomListAction
33-
) : CustomListActionResultData
34-
35-
@Parcelize
36-
data class LocationRemoved(
37-
val customListName: CustomListName,
38-
val locationName: String,
39-
override val undo: CustomListAction
40-
) : CustomListActionResultData
41-
42-
@Parcelize
43-
data class LocationChanged(
44-
val customListName: CustomListName,
45-
override val undo: CustomListAction
46-
) : CustomListActionResultData
47-
48-
@Parcelize
49-
data object GenericError : CustomListActionResultData {
50-
@IgnoredOnParcel override val undo: CustomListAction? = null
8+
9+
sealed interface Success : CustomListActionResultData, Parcelable {
10+
val undo: CustomListAction
11+
12+
@Parcelize
13+
data class CreatedWithLocations(
14+
val customListName: CustomListName,
15+
val locationNames: List<String>,
16+
override val undo: CustomListAction
17+
) : Success
18+
19+
@Parcelize
20+
data class Deleted(
21+
val customListName: CustomListName,
22+
override val undo: CustomListAction.Create
23+
) : Success
24+
25+
@Parcelize
26+
data class Renamed(
27+
val newName: CustomListName,
28+
override val undo: CustomListAction.Rename
29+
) : Success
30+
31+
@Parcelize
32+
data class LocationAdded(
33+
val customListName: CustomListName,
34+
val locationName: String,
35+
override val undo: CustomListAction
36+
) : Success
37+
38+
@Parcelize
39+
data class LocationRemoved(
40+
val customListName: CustomListName,
41+
val locationName: String,
42+
override val undo: CustomListAction
43+
) : Success
44+
45+
@Parcelize
46+
data class LocationChanged(
47+
val customListName: CustomListName,
48+
override val undo: CustomListAction
49+
) : Success
5150
}
5251

53-
fun hasUndo() = undo != null
52+
@Parcelize data object GenericError : CustomListActionResultData
5453
}

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CreateCustomListDialog.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ data class CreateCustomListNavArgs(val locationCode: GeoLocationId?)
6363
)
6464
fun CreateCustomList(
6565
navigator: DestinationsNavigator,
66-
backNavigator: ResultBackNavigator<CustomListActionResultData.CreatedWithLocations>,
66+
backNavigator: ResultBackNavigator<CustomListActionResultData.Success.CreatedWithLocations>,
6767
) {
6868
val vm: CreateCustomListDialogViewModel = koinViewModel()
6969
LaunchedEffect(key1 = Unit) {

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteCustomListConfirmationDialog.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ data class DeleteCustomListNavArgs(val customListId: CustomListId, val name: Cus
3939
navArgs = DeleteCustomListNavArgs::class
4040
)
4141
fun DeleteCustomList(
42-
navigator: ResultBackNavigator<CustomListActionResultData.Deleted>,
42+
navigator: ResultBackNavigator<CustomListActionResultData.Success.Deleted>,
4343
) {
4444
val viewModel: DeleteCustomListConfirmationViewModel = koinViewModel()
4545
val state by viewModel.uiState.collectAsStateWithLifecycle()

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/EditCustomListNameDialog.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ data class EditCustomListNameNavArgs(
5050
navArgs = EditCustomListNameNavArgs::class
5151
)
5252
fun EditCustomListName(
53-
backNavigator: ResultBackNavigator<CustomListActionResultData.Renamed>,
53+
backNavigator: ResultBackNavigator<CustomListActionResultData.Success.Renamed>,
5454
) {
5555
val vm: EditCustomListNameDialogViewModel = koinViewModel()
5656
LaunchedEffectCollect(vm.uiSideEffect) { sideEffect ->

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListsScreen.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ private fun PreviewCustomListsScreen() {
6565
fun CustomLists(
6666
navigator: DestinationsNavigator,
6767
editCustomListResultRecipient:
68-
ResultRecipient<EditCustomListDestination, CustomListActionResultData.Deleted>
68+
ResultRecipient<EditCustomListDestination, CustomListActionResultData.Success.Deleted>
6969
) {
7070
val viewModel = koinViewModel<CustomListsViewModel>()
7171
val state by viewModel.uiState.collectAsStateWithLifecycle()

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/EditCustomListScreen.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ data class EditCustomListNavArgs(val customListId: CustomListId)
8484
)
8585
fun EditCustomList(
8686
navigator: DestinationsNavigator,
87-
backNavigator: ResultBackNavigator<CustomListActionResultData.Deleted>,
87+
backNavigator: ResultBackNavigator<CustomListActionResultData.Success.Deleted>,
8888
confirmDeleteListResultRecipient:
89-
ResultRecipient<DeleteCustomListDestination, CustomListActionResultData.Deleted>
89+
ResultRecipient<DeleteCustomListDestination, CustomListActionResultData.Success.Deleted>
9090
) {
9191
val viewModel = koinViewModel<EditCustomListViewModel>()
9292

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SelectLocationScreen.kt

+15-11
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,12 @@ fun SelectLocation(
131131
createCustomListDialogResultRecipient:
132132
ResultRecipient<
133133
CreateCustomListDestination,
134-
CustomListActionResultData.CreatedWithLocations
134+
CustomListActionResultData.Success.CreatedWithLocations
135135
>,
136136
editCustomListNameDialogResultRecipient:
137-
ResultRecipient<EditCustomListNameDestination, CustomListActionResultData.Renamed>,
137+
ResultRecipient<EditCustomListNameDestination, CustomListActionResultData.Success.Renamed>,
138138
deleteCustomListDialogResultRecipient:
139-
ResultRecipient<DeleteCustomListDestination, CustomListActionResultData.Deleted>,
139+
ResultRecipient<DeleteCustomListDestination, CustomListActionResultData.Success.Deleted>,
140140
updateCustomListResultRecipient:
141141
ResultRecipient<CustomListLocationsDestination, CustomListActionResultData>
142142
) {
@@ -832,18 +832,22 @@ private suspend fun SnackbarHostState.showResultSnackbar(
832832
showSnackbarImmediately(
833833
message = result.message(context),
834834
actionLabel =
835-
if (result.hasUndo()) context.getString(R.string.undo)
835+
if (result is CustomListActionResultData.Success) context.getString(R.string.undo)
836836
else {
837837
null
838838
},
839839
duration = SnackbarDuration.Long,
840-
onAction = { result.undo?.let { onUndo(it) } }
840+
onAction = {
841+
if (result is CustomListActionResultData.Success) {
842+
onUndo(result.undo)
843+
}
844+
}
841845
)
842846
}
843847

844848
private fun CustomListActionResultData.message(context: Context): String =
845849
when (this) {
846-
is CustomListActionResultData.CreatedWithLocations ->
850+
is CustomListActionResultData.Success.CreatedWithLocations ->
847851
if (locationNames.size == 1) {
848852
context.getString(
849853
R.string.location_was_added_to_list,
@@ -853,15 +857,15 @@ private fun CustomListActionResultData.message(context: Context): String =
853857
} else {
854858
context.getString(R.string.create_custom_list_message, customListName)
855859
}
856-
is CustomListActionResultData.Deleted ->
860+
is CustomListActionResultData.Success.Deleted ->
857861
context.getString(R.string.delete_custom_list_message, customListName)
858-
is CustomListActionResultData.LocationAdded ->
862+
is CustomListActionResultData.Success.LocationAdded ->
859863
context.getString(R.string.location_was_added_to_list, locationName, customListName)
860-
is CustomListActionResultData.LocationRemoved ->
864+
is CustomListActionResultData.Success.LocationRemoved ->
861865
context.getString(R.string.location_was_removed_from_list, locationName, customListName)
862-
is CustomListActionResultData.LocationChanged ->
866+
is CustomListActionResultData.Success.LocationChanged ->
863867
context.getString(R.string.locations_were_changed_for, customListName)
864-
is CustomListActionResultData.Renamed ->
868+
is CustomListActionResultData.Success.Renamed ->
865869
context.getString(R.string.name_was_changed_to, newName)
866870
CustomListActionResultData.GenericError -> context.getString(R.string.error_occurred)
867871
}

android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/CreateCustomListDialogViewModel.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class CreateCustomListDialogViewModel(
5959
} else {
6060
_uiSideEffect.send(
6161
CreateCustomListDialogSideEffect.ReturnWithResult(
62-
CustomListActionResultData.CreatedWithLocations(
62+
CustomListActionResultData.Success.CreatedWithLocations(
6363
customListName = it.name,
6464
locationNames = it.locationNames,
6565
undo = it.undo
@@ -82,6 +82,6 @@ sealed interface CreateCustomListDialogSideEffect {
8282
data class NavigateToCustomListLocationsScreen(val customListId: CustomListId) :
8383
CreateCustomListDialogSideEffect
8484

85-
data class ReturnWithResult(val result: CustomListActionResultData.CreatedWithLocations) :
85+
data class ReturnWithResult(val result: CustomListActionResultData.Success.CreatedWithLocations) :
8686
CreateCustomListDialogSideEffect
8787
}

android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/CustomListLocationsViewModel.kt

+5-5
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ class CustomListLocationsViewModel(
120120
{ result ->
121121
val resultData =
122122
if (navArgs.newList) {
123-
CustomListActionResultData.CreatedWithLocations(
123+
CustomListActionResultData.Success.CreatedWithLocations(
124124
customListName = result.name,
125125
locationNames = locationsToSave.map { it.name },
126126
undo = CustomListAction.Delete(id = result.id)
@@ -129,7 +129,7 @@ class CustomListLocationsViewModel(
129129
when {
130130
result.addedLocations.size == 1 &&
131131
result.removedLocations.isEmpty() ->
132-
CustomListActionResultData.LocationAdded(
132+
CustomListActionResultData.Success.LocationAdded(
133133
customListName = result.name,
134134
relayListRepository
135135
.find(result.removedLocations.first())!!
@@ -138,7 +138,7 @@ class CustomListLocationsViewModel(
138138
)
139139
result.removedLocations.size == 1 &&
140140
result.addedLocations.isEmpty() ->
141-
CustomListActionResultData.LocationRemoved(
141+
CustomListActionResultData.Success.LocationRemoved(
142142
customListName = result.name,
143143
locationName =
144144
relayListRepository
@@ -147,7 +147,7 @@ class CustomListLocationsViewModel(
147147
undo = result.undo
148148
)
149149
else ->
150-
CustomListActionResultData.LocationChanged(
150+
CustomListActionResultData.Success.LocationChanged(
151151
customListName = result.name,
152152
undo = result.undo
153153
)
@@ -315,7 +315,7 @@ class CustomListLocationsViewModel(
315315
}
316316

317317
sealed interface CustomListLocationsSideEffect {
318-
data class ReturnWithResultData(val result: CustomListActionResultData) :
318+
data class ReturnWithResultData(val result: CustomListActionResultData.Success) :
319319
CustomListLocationsSideEffect
320320

321321
data object Error : CustomListLocationsSideEffect

android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/DeleteCustomListConfirmationViewModel.kt

+2-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import kotlinx.coroutines.flow.stateIn
1313
import kotlinx.coroutines.launch
1414
import net.mullvad.mullvadvpn.compose.communication.CustomListAction
1515
import net.mullvad.mullvadvpn.compose.communication.CustomListActionResultData
16-
import net.mullvad.mullvadvpn.compose.communication.Deleted
1716
import net.mullvad.mullvadvpn.compose.state.DeleteCustomListUiState
1817
import net.mullvad.mullvadvpn.lib.model.CustomListId
1918
import net.mullvad.mullvadvpn.lib.model.CustomListName
@@ -51,7 +50,7 @@ class DeleteCustomListConfirmationViewModel(
5150
{
5251
_uiSideEffect.send(
5352
DeleteCustomListConfirmationSideEffect.ReturnWithResult(
54-
CustomListActionResultData.Deleted(
53+
CustomListActionResultData.Success.Deleted(
5554
customListName = it.name,
5655
undo = it.undo
5756
)
@@ -64,6 +63,6 @@ class DeleteCustomListConfirmationViewModel(
6463
}
6564

6665
sealed interface DeleteCustomListConfirmationSideEffect {
67-
data class ReturnWithResult(val result: CustomListActionResultData.Deleted) :
66+
data class ReturnWithResult(val result: CustomListActionResultData.Success.Deleted) :
6867
DeleteCustomListConfirmationSideEffect
6968
}

android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/EditCustomListNameDialogViewModel.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class EditCustomListNameDialogViewModel(
5555
{
5656
_uiSideEffect.send(
5757
EditCustomListNameDialogSideEffect.ReturnWithResult(
58-
CustomListActionResultData.Renamed(
58+
CustomListActionResultData.Success.Renamed(
5959
newName = it.name,
6060
undo = it.undo
6161
)
@@ -73,6 +73,6 @@ class EditCustomListNameDialogViewModel(
7373
}
7474

7575
sealed interface EditCustomListNameDialogSideEffect {
76-
data class ReturnWithResult(val result: CustomListActionResultData.Renamed) :
76+
data class ReturnWithResult(val result: CustomListActionResultData.Success.Renamed) :
7777
EditCustomListNameDialogSideEffect
7878
}

android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SelectLocationViewModel.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -371,13 +371,13 @@ class SelectLocationViewModel(
371371
{ CustomListActionResultData.GenericError },
372372
{
373373
if (it.removedLocations.isEmpty()) {
374-
CustomListActionResultData.LocationAdded(
374+
CustomListActionResultData.Success.LocationAdded(
375375
customListName = it.name,
376376
locationName = item.name,
377377
undo = it.undo
378378
)
379379
} else {
380-
CustomListActionResultData.LocationChanged(
380+
CustomListActionResultData.Success.LocationChanged(
381381
customListName = it.name,
382382
undo = it.undo
383383
)
@@ -405,13 +405,13 @@ class SelectLocationViewModel(
405405
)
406406
.bind()
407407
if (success.addedLocations.isEmpty()) {
408-
CustomListActionResultData.LocationRemoved(
408+
CustomListActionResultData.Success.LocationRemoved(
409409
customListName = success.name,
410410
locationName = item.name,
411411
undo = success.undo
412412
)
413413
} else {
414-
CustomListActionResultData.LocationChanged(
414+
CustomListActionResultData.Success.LocationChanged(
415415
customListName = success.name,
416416
undo = success.undo
417417
)

android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/EditCustomListNameDialogViewModelTest.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class EditCustomListNameDialogViewModelTest {
3535
val customListName = CustomListName.fromString("list")
3636
val undo: CustomListAction.Rename = mockk()
3737
val expectedResult =
38-
CustomListActionResultData.Renamed(newName = customListName, undo = undo)
38+
CustomListActionResultData.Success.Renamed(newName = customListName, undo = undo)
3939
every { renamed.name } returns customListName
4040
every { renamed.undo } returns undo
4141
val viewModel = createViewModel(customListId, customListName.value)

0 commit comments

Comments
 (0)