1
1
package net.mullvad.mullvadvpn.repository
2
2
3
+ import arrow.optics.Every
4
+ import arrow.optics.copy
5
+ import arrow.optics.dsl.every
3
6
import kotlinx.coroutines.CoroutineDispatcher
4
7
import kotlinx.coroutines.CoroutineScope
5
8
import kotlinx.coroutines.Dispatchers
6
9
import kotlinx.coroutines.flow.Flow
7
10
import kotlinx.coroutines.flow.SharingStarted
8
11
import kotlinx.coroutines.flow.StateFlow
12
+ import kotlinx.coroutines.flow.combine
9
13
import kotlinx.coroutines.flow.distinctUntilChanged
10
14
import kotlinx.coroutines.flow.map
11
15
import kotlinx.coroutines.flow.stateIn
@@ -17,18 +21,41 @@ import net.mullvad.mullvadvpn.lib.model.RelayItem
17
21
import net.mullvad.mullvadvpn.lib.model.RelayItemId
18
22
import net.mullvad.mullvadvpn.lib.model.WireguardConstraints
19
23
import net.mullvad.mullvadvpn.lib.model.WireguardEndpointData
24
+ import net.mullvad.mullvadvpn.lib.model.cities
25
+ import net.mullvad.mullvadvpn.lib.model.name
26
+ import net.mullvad.mullvadvpn.lib.shared.RelayLocationTranslationRepository
20
27
import net.mullvad.mullvadvpn.relaylist.findByGeoLocationId
21
28
22
29
class RelayListRepository (
23
30
private val managementService : ManagementService ,
31
+ private val translationRepository : RelayLocationTranslationRepository ,
24
32
dispatcher : CoroutineDispatcher = Dispatchers .IO
25
33
) {
26
34
val relayList: StateFlow <List <RelayItem .Location .Country >> =
27
- managementService.relayCountries.stateIn(
28
- CoroutineScope (dispatcher),
29
- SharingStarted .WhileSubscribed (),
30
- emptyList()
31
- )
35
+ combine(managementService.relayCountries, translationRepository.translations) {
36
+ countries,
37
+ translations ->
38
+ countries.translateRelay(translations).sortedBy { it.name.lowercase() }
39
+ }
40
+ .stateIn(CoroutineScope (dispatcher), SharingStarted .WhileSubscribed (), emptyList())
41
+
42
+ private fun List<RelayItem.Location.Country>.translateRelay (
43
+ translations : Map <String , String >
44
+ ): List <RelayItem .Location .Country > {
45
+ if (translations.isEmpty()) {
46
+ return this
47
+ }
48
+
49
+ return Every .list<RelayItem .Location .Country >().modify(this ) {
50
+ it.copy<RelayItem .Location .Country > {
51
+ RelayItem .Location .Country .name set translations.getOrDefault(it.name, it.name)
52
+ RelayItem .Location .Country .cities.every(Every .list()).name transform
53
+ { cityName ->
54
+ translations.getOrDefault(cityName, cityName)
55
+ }
56
+ }
57
+ }
58
+ }
32
59
33
60
val wireguardEndpointData: StateFlow <WireguardEndpointData > =
34
61
managementService.wireguardEndpointData.stateIn(
0 commit comments