Skip to content
This repository was archived by the owner on Aug 21, 2025. It is now read-only.

Commit 3fa5690

Browse files
Add private email&phone to the UserSharePreferences
1 parent 3c67cd3 commit 3fa5690

File tree

12 files changed

+77
-113
lines changed

12 files changed

+77
-113
lines changed

homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/share/ShareEvent.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ package com.gravatar.app.homeUi.presentation.home.share
22

33
internal sealed class ShareEvent {
44
data class OnEmailValueChanged(val value: String) : ShareEvent()
5-
data class OnEmailSharingChanged(val isShared: Boolean) : ShareEvent()
65
data class OnPhoneValueChanged(val value: String) : ShareEvent()
7-
data class OnPhoneSharingChanged(val isShared: Boolean) : ShareEvent()
86
data class OnUserSharePreferencesChanged(val shareFieldType: ShareFieldType) : ShareEvent()
97
data object OnAboutAppClicked : ShareEvent()
108
data object OnDismissAboutAppDialog : ShareEvent()

homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/share/ShareScreen.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,15 @@ internal fun ShareScreen(uiState: ShareUiState, onEvent: (ShareEvent) -> Unit) {
6060
.fillMaxWidth(),
6161
)
6262
SharePrivateContactInfo(
63-
privateContactInfo = uiState.privateContactInfo,
63+
privateContactState = uiState.privateContactState,
6464
onEmailValueChange = { onEvent(ShareEvent.OnEmailValueChanged(it)) },
65-
onEmailSwitchCheckedChange = { onEvent(ShareEvent.OnEmailSharingChanged(it)) },
65+
onEmailSwitchCheckedChange = {
66+
onEvent(ShareEvent.OnUserSharePreferencesChanged(ShareFieldType.PrivateEmail(it)))
67+
},
6668
onPhoneValueChange = { onEvent(ShareEvent.OnPhoneValueChanged(it)) },
67-
onPhoneSwitchCheckedChange = { onEvent(ShareEvent.OnPhoneSharingChanged(it)) },
69+
onPhoneSwitchCheckedChange = {
70+
onEvent(ShareEvent.OnUserSharePreferencesChanged(ShareFieldType.PrivatePhone(it)))
71+
},
6872
modifier = Modifier.padding(16.dp),
6973
)
7074
ItemDivider()

homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/share/ShareUiState.kt

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,30 @@
11
package com.gravatar.app.homeUi.presentation.home.share
22

3+
import com.gravatar.app.usercomponent.domain.model.PrivateContactInfo
34
import com.gravatar.app.usercomponent.domain.model.UserSharePreferences
45
import com.gravatar.restapi.models.Profile
56

67
internal data class ShareUiState(
78
val profile: Profile? = null,
89
val avatarUrl: String? = null,
910
val isAboutAppDialogVisible: Boolean = false,
10-
val privateContactInfo: PrivateContactInfo = PrivateContactInfo(),
11-
val userSharePreferences: UserSharePreferences = UserSharePreferences(
12-
name = true,
13-
location = true,
14-
title = true,
15-
organization = true,
16-
description = true,
17-
profileUrl = true
18-
)
11+
val privateContactInfo: PrivateContactInfo = PrivateContactInfo.Default,
12+
val userSharePreferences: UserSharePreferences = UserSharePreferences.Default
1913
) {
14+
15+
val privateContactState = PrivateContactState(
16+
emailValue = privateContactInfo.privateEmail,
17+
isEmailShared = userSharePreferences.privateEmail,
18+
phoneValue = privateContactInfo.privatePhone,
19+
isPhoneShared = userSharePreferences.privatePhone,
20+
)
21+
2022
fun copyWithUserSharePreferences(
2123
shareFieldType: ShareFieldType,
2224
): ShareUiState = this.copy(
2325
userSharePreferences = userSharePreferences.copy(
26+
privateEmail = if (shareFieldType is ShareFieldType.PrivateEmail) shareFieldType.checked else userSharePreferences.privateEmail,
27+
privatePhone = if (shareFieldType is ShareFieldType.PrivatePhone) shareFieldType.checked else userSharePreferences.privatePhone,
2428
name = if (shareFieldType is ShareFieldType.Name) shareFieldType.checked else userSharePreferences.name,
2529
location = if (shareFieldType is ShareFieldType.Location) shareFieldType.checked else userSharePreferences.location,
2630
title = if (shareFieldType is ShareFieldType.Title) shareFieldType.checked else userSharePreferences.title,
@@ -31,7 +35,7 @@ internal data class ShareUiState(
3135
)
3236
}
3337

34-
internal data class PrivateContactInfo(
38+
internal data class PrivateContactState(
3539
val emailValue: String = "",
3640
val isEmailShared: Boolean = false,
3741
val phoneValue: String = "",
@@ -64,4 +68,12 @@ internal sealed class ShareFieldType {
6468
data class ProfileUrl(
6569
override val checked: Boolean
6670
) : ShareFieldType()
71+
72+
data class PrivateEmail(
73+
override val checked: Boolean
74+
) : ShareFieldType()
75+
76+
data class PrivatePhone(
77+
override val checked: Boolean
78+
) : ShareFieldType()
6779
}

homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/share/ShareViewModel.kt

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,7 @@ internal class ShareViewModel(
3636
_uiState.update {
3737
it.copy(
3838
privateContactInfo = it.privateContactInfo.copy(
39-
emailValue = shareEvent.value
40-
)
41-
)
42-
}
43-
}
44-
45-
is ShareEvent.OnEmailSharingChanged -> {
46-
_uiState.update {
47-
it.copy(
48-
privateContactInfo = it.privateContactInfo.copy(
49-
isEmailShared = shareEvent.isShared
39+
privateEmail = shareEvent.value
5040
)
5141
)
5242
}
@@ -56,17 +46,7 @@ internal class ShareViewModel(
5646
_uiState.update {
5747
it.copy(
5848
privateContactInfo = it.privateContactInfo.copy(
59-
phoneValue = shareEvent.value
60-
)
61-
)
62-
}
63-
}
64-
65-
is ShareEvent.OnPhoneSharingChanged -> {
66-
_uiState.update {
67-
it.copy(
68-
privateContactInfo = it.privateContactInfo.copy(
69-
isPhoneShared = shareEvent.isShared
49+
privatePhone = shareEvent.value
7050
)
7151
)
7252
}

homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/share/components/SharePrivateContactInfo.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ import androidx.compose.ui.Modifier
88
import androidx.compose.ui.tooling.preview.Preview
99
import androidx.compose.ui.unit.dp
1010
import com.gravatar.app.homeUi.R
11-
import com.gravatar.app.homeUi.presentation.home.share.PrivateContactInfo
11+
import com.gravatar.app.homeUi.presentation.home.share.PrivateContactState
1212

1313
@Composable
1414
internal fun SharePrivateContactInfo(
15-
privateContactInfo: PrivateContactInfo,
15+
privateContactState: PrivateContactState,
1616
onEmailValueChange: (String) -> Unit,
1717
onEmailSwitchCheckedChange: (Boolean) -> Unit,
1818
onPhoneValueChange: (String) -> Unit,
@@ -28,16 +28,16 @@ internal fun SharePrivateContactInfo(
2828
)
2929
ShareEditableField(
3030
placeholder = R.string.share_tab_private_contact_email_placeholder,
31-
value = privateContactInfo.emailValue,
31+
value = privateContactState.emailValue,
3232
onValueChange = onEmailValueChange,
33-
switchChecked = privateContactInfo.isEmailShared,
33+
switchChecked = privateContactState.isEmailShared,
3434
onSwitchCheckedChange = onEmailSwitchCheckedChange,
3535
)
3636
ShareEditableField(
3737
placeholder = R.string.share_tab_private_contact_phone_number_placeholder,
38-
value = privateContactInfo.phoneValue,
38+
value = privateContactState.phoneValue,
3939
onValueChange = onPhoneValueChange,
40-
switchChecked = privateContactInfo.isPhoneShared,
40+
switchChecked = privateContactState.isPhoneShared,
4141
onSwitchCheckedChange = onPhoneSwitchCheckedChange,
4242
)
4343
}
@@ -47,7 +47,7 @@ internal fun SharePrivateContactInfo(
4747
@Composable
4848
private fun SharePrivateContactInfoPreview() {
4949
SharePrivateContactInfo(
50-
privateContactInfo = PrivateContactInfo(
50+
privateContactState = PrivateContactState(
5151
emailValue = "example@email.com",
5252
isEmailShared = true,
5353
phoneValue = "123-456-7890",

homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/share/components/SharePublicContactInfo.kt

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -111,14 +111,7 @@ private fun SharePublicContactInfoPreview() {
111111
GravatarAppTheme {
112112
SharePublicContactInfo(
113113
profile = defaultProfile(hash = "hash"),
114-
userSharePreferences = UserSharePreferences(
115-
name = true,
116-
location = true,
117-
title = true,
118-
organization = true,
119-
description = true,
120-
profileUrl = true
121-
),
114+
userSharePreferences = UserSharePreferences.Default,
122115
onUserPreferenceChanged = {},
123116
)
124117
}

homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/share/ShareViewModelTest.kt

Lines changed: 4 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -91,21 +91,7 @@ class ShareViewModelTest {
9191

9292
// Then
9393
viewModel.uiState.test {
94-
assertEquals(newEmailValue, awaitItem().privateContactInfo.emailValue)
95-
}
96-
}
97-
98-
@Test
99-
fun `when OnEmailSharingChanged event is triggered then isEmailShared is updated`() = runTest {
100-
// Given
101-
val isShared = true
102-
103-
// When
104-
viewModel.onEvent(ShareEvent.OnEmailSharingChanged(isShared))
105-
106-
// Then
107-
viewModel.uiState.test {
108-
assertEquals(isShared, awaitItem().privateContactInfo.isEmailShared)
94+
assertEquals(newEmailValue, awaitItem().privateContactState.emailValue)
10995
}
11096
}
11197

@@ -119,21 +105,7 @@ class ShareViewModelTest {
119105

120106
// Then
121107
viewModel.uiState.test {
122-
assertEquals(newPhoneValue, awaitItem().privateContactInfo.phoneValue)
123-
}
124-
}
125-
126-
@Test
127-
fun `when OnPhoneSharingChanged event is triggered then isPhoneShared is updated`() = runTest {
128-
// Given
129-
val isShared = true
130-
131-
// When
132-
viewModel.onEvent(ShareEvent.OnPhoneSharingChanged(isShared))
133-
134-
// Then
135-
viewModel.uiState.test {
136-
assertEquals(isShared, awaitItem().privateContactInfo.isPhoneShared)
108+
assertEquals(newPhoneValue, awaitItem().privateContactState.phoneValue)
137109
}
138110
}
139111

@@ -313,13 +285,10 @@ class ShareViewModelTest {
313285
@Test
314286
fun `when user share preferences are emitted then uiState is updated with preferences`() = runTest {
315287
// Given
316-
val testPreferences = UserSharePreferences(
288+
val testPreferences = UserSharePreferences.Default.copy(
317289
name = false,
318-
location = true,
319290
title = false,
320-
organization = true,
321291
description = false,
322-
profileUrl = true
323292
)
324293

325294
// When
@@ -345,13 +314,8 @@ class ShareViewModelTest {
345314
viewModel.onEvent(ShareEvent.OnUserSharePreferencesChanged(shareFieldType))
346315

347316
// Then
348-
val expectedSharePreferences = UserSharePreferences(
317+
val expectedSharePreferences = initialState.userSharePreferences.copy(
349318
name = newNamePreference,
350-
location = initialState.userSharePreferences.location,
351-
title = initialState.userSharePreferences.title,
352-
organization = initialState.userSharePreferences.organization,
353-
description = initialState.userSharePreferences.description,
354-
profileUrl = initialState.userSharePreferences.profileUrl
355319
)
356320
assertEquals(expectedSharePreferences, awaitItem())
357321
}

homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/share/components/SharePrivateContactInfoTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import androidx.compose.foundation.layout.padding
55
import androidx.compose.ui.Modifier
66
import androidx.compose.ui.unit.dp
77
import com.gravatar.app.design.theme.GravatarAppTheme
8-
import com.gravatar.app.homeUi.presentation.home.share.PrivateContactInfo
8+
import com.gravatar.app.homeUi.presentation.home.share.PrivateContactState
99
import com.gravatar.app.testUtils.roborazzi.RoborazziTest
1010
import org.junit.Test
1111

@@ -15,7 +15,7 @@ class SharePrivateContactInfoTest : RoborazziTest() {
1515
fun sharePrivateContactInfo_bothSwitchesOn() = screenshotTest {
1616
GravatarAppTheme {
1717
SharePrivateContactInfo(
18-
privateContactInfo = PrivateContactInfo(
18+
privateContactState = PrivateContactState(
1919
emailValue = "example@email.com",
2020
isEmailShared = true,
2121
phoneValue = "123-456-7890",
@@ -36,7 +36,7 @@ class SharePrivateContactInfoTest : RoborazziTest() {
3636
fun sharePrivateContactInfo_bothSwitchesOff() = screenshotTest {
3737
GravatarAppTheme {
3838
SharePrivateContactInfo(
39-
privateContactInfo = PrivateContactInfo(
39+
privateContactState = PrivateContactState(
4040
emailValue = "example@email.com",
4141
isEmailShared = false,
4242
phoneValue = "123-456-7890",
@@ -57,7 +57,7 @@ class SharePrivateContactInfoTest : RoborazziTest() {
5757
fun sharePrivateContactInfo_emptyValues() = screenshotTest {
5858
GravatarAppTheme {
5959
SharePrivateContactInfo(
60-
privateContactInfo = PrivateContactInfo(
60+
privateContactState = PrivateContactState(
6161
emailValue = "",
6262
isEmailShared = true,
6363
phoneValue = "",

homeUi/src/test/kotlin/com/gravatar/app/homeUi/presentation/home/share/components/SharePublicContactInfoTest.kt

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,7 @@ class SharePublicContactInfoTest : RoborazziTest() {
3434
GravatarAppTheme {
3535
SharePublicContactInfo(
3636
profile = fullProfile,
37-
userSharePreferences = UserSharePreferences(
38-
name = true,
39-
location = true,
40-
title = true,
41-
organization = true,
42-
description = true,
43-
profileUrl = true
44-
),
37+
userSharePreferences = UserSharePreferences.Default,
4538
onUserPreferenceChanged = {},
4639
modifier = Modifier.fillMaxWidth()
4740
)
@@ -59,7 +52,9 @@ class SharePublicContactInfoTest : RoborazziTest() {
5952
title = false,
6053
organization = false,
6154
description = false,
62-
profileUrl = false
55+
profileUrl = false,
56+
privateEmail = false,
57+
privatePhone = false,
6358
),
6459
onUserPreferenceChanged = {},
6560
modifier = Modifier.fillMaxWidth()
@@ -72,14 +67,7 @@ class SharePublicContactInfoTest : RoborazziTest() {
7267
GravatarAppTheme {
7368
SharePublicContactInfo(
7469
profile = defaultProfile(hash = "hash"),
75-
userSharePreferences = UserSharePreferences(
76-
name = true,
77-
location = true,
78-
title = true,
79-
organization = true,
80-
description = true,
81-
profileUrl = true
82-
),
70+
userSharePreferences = UserSharePreferences.Default,
8371
onUserPreferenceChanged = {},
8472
modifier = Modifier.fillMaxWidth()
8573
)

userComponent/src/main/kotlin/com/gravatar/app/usercomponent/data/UserPrefsStorage.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ internal class DatastoreUserPrefsStorage(
5858
private const val USER_SHARE_ORGANIZATION_KEY = "share_organization"
5959
private const val USER_SHARE_DESCRIPTION_KEY = "share_description"
6060
private const val USER_SHARE_PROFILE_URL_KEY = "share_profile_url"
61+
private const val USER_SHARE_PRIVATE_EMAIL_KEY = "share_private_email"
62+
private const val USER_SHARE_PRIVATE_PHONE_KEY = "share_private_phone"
6163
}
6264

6365
private val tokenKey = stringPreferencesKey(AUTH_TOKEN_KEY)
@@ -68,6 +70,8 @@ internal class DatastoreUserPrefsStorage(
6870
private val userShareOrganizationKey = booleanPreferencesKey(USER_SHARE_ORGANIZATION_KEY)
6971
private val userShareDescriptionKey = booleanPreferencesKey(USER_SHARE_DESCRIPTION_KEY)
7072
private val userShareProfileUrlKey = booleanPreferencesKey(USER_SHARE_PROFILE_URL_KEY)
73+
private val userSharePrivateEmailKey = booleanPreferencesKey(USER_SHARE_PRIVATE_EMAIL_KEY)
74+
private val userSharePrivatePhoneKey = booleanPreferencesKey(USER_SHARE_PRIVATE_PHONE_KEY)
7175

7276
override suspend fun getToken(): String? {
7377
return try {
@@ -119,6 +123,8 @@ internal class DatastoreUserPrefsStorage(
119123
return dataStore.data
120124
.map { preferences ->
121125
UserSharePreferences(
126+
privateEmail = preferences[userSharePrivateEmailKey] ?: true,
127+
privatePhone = preferences[userSharePrivatePhoneKey] ?: true,
122128
name = preferences[userShareNameKey] ?: true,
123129
location = preferences[userShareLocationKey] ?: true,
124130
title = preferences[userShareTitleKey] ?: true,
@@ -135,6 +141,8 @@ internal class DatastoreUserPrefsStorage(
135141
userSharePreferences: UserSharePreferences
136142
): Unit = withContext(dispatcherProvider.io) {
137143
dataStore.edit { preferences ->
144+
preferences[userSharePrivateEmailKey] = userSharePreferences.privateEmail
145+
preferences[userSharePrivatePhoneKey] = userSharePreferences.privatePhone
138146
preferences[userShareNameKey] = userSharePreferences.name
139147
preferences[userShareLocationKey] = userSharePreferences.location
140148
preferences[userShareTitleKey] = userSharePreferences.title

0 commit comments

Comments
 (0)