Skip to content

Commit 003a744

Browse files
Merge pull request #643 from Automattic/feature/quick_editor_about_info
Feature/quick editor about info
2 parents ae201ff + 30bf785 commit 003a744

File tree

100 files changed

+4987
-762
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

100 files changed

+4987
-762
lines changed

build-logic/convention/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
22

33
plugins {
44
`kotlin-dsl`
5-
kotlin("jvm") version "2.0.21"
65
alias(libs.plugins.ktlint)
76
alias(libs.plugins.detekt)
87
}

demo-app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ dependencies {
118118
implementation(libs.androidx.activity)
119119
implementation(libs.androidx.constraintlayout)
120120
implementation(libs.ucrop)
121+
implementation(libs.composables.core)
121122
implementation(project(":gravatar"))
122123
implementation(project(":gravatar-ui"))
123124
implementation(project(":gravatar-quickeditor"))

demo-app/src/main/java/com/gravatar/demoapp/ui/AvatarUpdateTab.kt

Lines changed: 241 additions & 75 deletions
Large diffs are not rendered by default.
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.gravatar.demoapp.ui
2+
3+
import androidx.compose.foundation.layout.Box
4+
import androidx.compose.foundation.layout.fillMaxWidth
5+
import androidx.compose.foundation.layout.padding
6+
import androidx.compose.foundation.shape.CircleShape
7+
import androidx.compose.material3.Card
8+
import androidx.compose.material3.CardDefaults
9+
import androidx.compose.runtime.Composable
10+
import androidx.compose.ui.Modifier
11+
import androidx.compose.ui.draw.clip
12+
import androidx.compose.ui.tooling.preview.Preview
13+
import androidx.compose.ui.unit.dp
14+
import com.gravatar.restapi.models.Profile
15+
import com.gravatar.types.Email
16+
import com.gravatar.ui.GravatarTheme
17+
import com.gravatar.ui.components.ComponentState
18+
import com.gravatar.ui.components.ProfileSummary
19+
import com.gravatar.ui.components.atomic.Avatar
20+
21+
@Composable
22+
fun DemoProfileSummaryCard(
23+
email: String,
24+
profileState: ComponentState<Profile> = ComponentState.Loading,
25+
avatarCache: String? = null,
26+
modifier: Modifier = Modifier,
27+
) {
28+
Card(
29+
modifier = modifier.fillMaxWidth(),
30+
elevation = CardDefaults.cardElevation(defaultElevation = 1.dp),
31+
) {
32+
ProfileSummary(
33+
profileState,
34+
modifier = Modifier
35+
.fillMaxWidth()
36+
.padding(10.dp),
37+
avatar = {
38+
Avatar(
39+
email = Email(email),
40+
size = 72.dp,
41+
cacheBuster = avatarCache,
42+
modifier = Modifier.clip(CircleShape),
43+
)
44+
},
45+
)
46+
}
47+
}
48+
49+
@Preview(showBackground = true)
50+
@Composable
51+
private fun GravatarProfileSummaryPreview() {
52+
GravatarTheme {
53+
Box(
54+
modifier = Modifier
55+
.fillMaxWidth()
56+
.padding(16.dp),
57+
) {
58+
DemoProfileSummaryCard(
59+
email = "[email protected]",
60+
)
61+
}
62+
}
63+
}

demo-app/src/main/java/com/gravatar/demoapp/ui/activity/QuickEditorTestActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class QuickEditorTestActivity : AppCompatActivity() {
8888
},
8989
),
9090
onAvatarSelected = {
91-
Toast.makeText(this, it.toString(), Toast.LENGTH_SHORT).show()
91+
profileChanges++
9292
},
9393
onDismiss = {
9494
Toast.makeText(this, it.toString(), Toast.LENGTH_SHORT).show()
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
package com.gravatar.demoapp.ui.components
2+
3+
import android.content.Context
4+
import androidx.compose.animation.animateColorAsState
5+
import androidx.compose.foundation.background
6+
import androidx.compose.foundation.layout.Column
7+
import androidx.compose.foundation.layout.PaddingValues
8+
import androidx.compose.foundation.layout.Row
9+
import androidx.compose.foundation.layout.WindowInsets
10+
import androidx.compose.foundation.layout.WindowInsetsSides
11+
import androidx.compose.foundation.layout.asPaddingValues
12+
import androidx.compose.foundation.layout.fillMaxWidth
13+
import androidx.compose.foundation.layout.imePadding
14+
import androidx.compose.foundation.layout.navigationBars
15+
import androidx.compose.foundation.layout.only
16+
import androidx.compose.foundation.layout.padding
17+
import androidx.compose.foundation.layout.widthIn
18+
import androidx.compose.foundation.shape.CircleShape
19+
import androidx.compose.foundation.shape.RoundedCornerShape
20+
import androidx.compose.material3.MaterialTheme
21+
import androidx.compose.material3.Surface
22+
import androidx.compose.material3.Text
23+
import androidx.compose.material3.surfaceColorAtElevation
24+
import androidx.compose.runtime.Composable
25+
import androidx.compose.runtime.getValue
26+
import androidx.compose.ui.Alignment
27+
import androidx.compose.ui.Modifier
28+
import androidx.compose.ui.draw.clip
29+
import androidx.compose.ui.draw.shadow
30+
import androidx.compose.ui.platform.LocalContext
31+
import androidx.compose.ui.tooling.preview.Preview
32+
import androidx.compose.ui.unit.dp
33+
import com.composables.core.ModalBottomSheet
34+
import com.composables.core.ModalSheetProperties
35+
import com.composables.core.Scrim
36+
import com.composables.core.Sheet
37+
import com.composables.core.SheetDetent
38+
import com.composables.core.rememberModalBottomSheetState
39+
import com.composeunstyled.Thumb
40+
import com.composeunstyled.ToggleSwitch
41+
import com.gravatar.quickeditor.ui.editor.AboutInputField
42+
43+
@Composable
44+
internal fun AboutFieldsBottomSheet(
45+
aboutFields: Set<AboutInputField>,
46+
onFieldsChanged: (Set<AboutInputField>) -> Unit,
47+
onDismiss: () -> Unit = {},
48+
) {
49+
ModalBottomSheet(
50+
state = rememberModalBottomSheetState(
51+
initialDetent = SheetDetent.FullyExpanded,
52+
),
53+
onDismiss = onDismiss,
54+
properties = ModalSheetProperties(
55+
dismissOnBackPress = true,
56+
dismissOnClickOutside = true,
57+
),
58+
) {
59+
Scrim(
60+
scrimColor = MaterialTheme.colorScheme.scrim.copy(alpha = 0.32f),
61+
)
62+
Sheet(
63+
modifier = Modifier
64+
.imePadding()
65+
.clip(RoundedCornerShape(topStart = 28.dp, topEnd = 28.dp))
66+
.background(MaterialTheme.colorScheme.surfaceColorAtElevation(1.dp))
67+
.widthIn(max = 640.dp)
68+
.fillMaxWidth()
69+
.padding(
70+
WindowInsets.navigationBars
71+
.only(WindowInsetsSides.Vertical)
72+
.asPaddingValues(),
73+
),
74+
) {
75+
Surface(
76+
modifier = Modifier
77+
.padding(24.dp)
78+
.fillMaxWidth(),
79+
tonalElevation = 1.dp,
80+
) {
81+
Column(
82+
horizontalAlignment = Alignment.CenterHorizontally,
83+
) {
84+
AboutInputField.all.forEach { field ->
85+
Row(
86+
modifier = Modifier
87+
.padding(4.dp)
88+
.fillMaxWidth(),
89+
) {
90+
val fieldsChecked = aboutFields.contains(field)
91+
92+
val animatedColor by animateColorAsState(
93+
if (fieldsChecked) {
94+
MaterialTheme.colorScheme.primary
95+
} else {
96+
MaterialTheme.colorScheme.inversePrimary
97+
},
98+
)
99+
Text(
100+
text = field.translatedValue(LocalContext.current),
101+
modifier = Modifier
102+
.weight(1f),
103+
)
104+
ToggleSwitch(
105+
toggled = fieldsChecked,
106+
backgroundColor = MaterialTheme.colorScheme.surfaceContainerHigh,
107+
shape = RoundedCornerShape(100),
108+
contentPadding = PaddingValues(2.dp),
109+
onToggled = { toggled ->
110+
if (toggled) {
111+
onFieldsChanged(aboutFields + field)
112+
} else {
113+
onFieldsChanged(aboutFields - field)
114+
}
115+
},
116+
thumb = {
117+
Thumb(
118+
shape = CircleShape,
119+
color = animatedColor,
120+
modifier = Modifier.shadow(elevation = 4.dp, CircleShape),
121+
)
122+
},
123+
)
124+
}
125+
}
126+
}
127+
}
128+
}
129+
}
130+
}
131+
132+
internal fun AboutInputField.translatedValue(context: Context): String {
133+
return when (this) {
134+
AboutInputField.DisplayName -> com.gravatar.quickeditor.R.string.gravatar_qe_about_field_label_display_name
135+
AboutInputField.AboutMe -> com.gravatar.quickeditor.R.string.gravatar_qe_about_field_label_about_me
136+
AboutInputField.Pronouns -> com.gravatar.quickeditor.R.string.gravatar_qe_about_field_label_pronouns
137+
AboutInputField.Pronunciation -> com.gravatar.quickeditor.R.string.gravatar_qe_about_field_label_pronunciation
138+
AboutInputField.Location -> com.gravatar.quickeditor.R.string.gravatar_qe_about_field_label_location
139+
AboutInputField.JobTitle -> com.gravatar.quickeditor.R.string.gravatar_qe_about_field_label_job_title
140+
AboutInputField.Company -> com.gravatar.quickeditor.R.string.gravatar_qe_about_field_label_company
141+
AboutInputField.FirstName -> com.gravatar.quickeditor.R.string.gravatar_qe_about_field_label_first_name
142+
AboutInputField.LastName -> com.gravatar.quickeditor.R.string.gravatar_qe_about_field_label_last_name
143+
else -> com.gravatar.quickeditor.R.string.gravatar_qe_about_field_label_display_name
144+
}.let { context.getString(it) }
145+
}
146+
147+
@Preview
148+
@Composable
149+
private fun AboutFieldsBottomSheetPreview() {
150+
AboutFieldsBottomSheet(
151+
aboutFields = setOf(
152+
AboutInputField.DisplayName,
153+
AboutInputField.AboutMe,
154+
AboutInputField.Pronouns,
155+
AboutInputField.Pronunciation,
156+
AboutInputField.Location,
157+
AboutInputField.JobTitle,
158+
AboutInputField.Company,
159+
AboutInputField.FirstName,
160+
AboutInputField.LastName,
161+
),
162+
onFieldsChanged = {},
163+
)
164+
}

demo-app/src/main/res/values/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
<string name="text_url">Url: %1$s</string>
1818
<string name="button_load_gravatar">Load Gravatar</string>
1919
<string name="theme_label">Theme</string>
20-
<string name="update_avatar_button_label">Update Avatar</string>
2120
<string name="avatar_update_upload_success_toast">Upload success</string>
2221
<string name="avatar_update_upload_failed_toast">Upload error: %1$s</string>
2322
<string name="raw_profile_title">Raw Profile</string>
23+
<string name="open_qe_label">Open QE</string>
2424
</resources>

gradle/libs.versions.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ appcompat = "1.7.0"
77
binaryValidator = "0.15.0-Beta.2"
88
browser = "1.8.0"
99
coil = "2.7.0"
10-
composablesCore = "1.15.0"
10+
composablesCore = "1.30.0"
1111
composeBom = "2024.02.00"
1212
composeUiTest = "1.7.2"
1313
constraintlayout = "2.1.4"
@@ -34,7 +34,7 @@ startup = "1.1.1"
3434
testCoreKtx = "1.6.1"
3535
turbine = "1.1.0"
3636
ucrop = "2.2.11"
37-
mavenPublish = "0.31.0"
37+
mavenPublish = "0.32.0"
3838
kotlinCompilerExtension = "1.5.15"
3939

4040
[libraries]

0 commit comments

Comments
 (0)