Skip to content

Commit f704cca

Browse files
committed
Fall back to initials avatar when image avatar doesn't work
Initially I had it implemented such that it would only fallback on error, but actually it's nice to have also while loading if it takes a while to load the avatar.
1 parent a46ff73 commit f704cca

File tree

2 files changed

+18
-8
lines changed
  • changelog.d
  • libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar

2 files changed

+18
-8
lines changed

changelog.d/2667.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fall back to name-based generated avatars when image avatars don't load.

libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import androidx.compose.foundation.layout.Row
2323
import androidx.compose.foundation.layout.size
2424
import androidx.compose.foundation.shape.CircleShape
2525
import androidx.compose.runtime.Composable
26+
import androidx.compose.runtime.SideEffect
2627
import androidx.compose.ui.Alignment
2728
import androidx.compose.ui.Modifier
2829
import androidx.compose.ui.draw.clip
@@ -32,12 +33,13 @@ import androidx.compose.ui.tooling.preview.Preview
3233
import androidx.compose.ui.tooling.preview.PreviewParameter
3334
import androidx.compose.ui.unit.dp
3435
import androidx.compose.ui.unit.sp
35-
import coil.compose.AsyncImage
36+
import coil.compose.AsyncImagePainter
37+
import coil.compose.SubcomposeAsyncImage
38+
import coil.compose.SubcomposeAsyncImageContent
3639
import io.element.android.compound.theme.ElementTheme
3740
import io.element.android.libraries.designsystem.colors.AvatarColorsProvider
3841
import io.element.android.libraries.designsystem.preview.ElementThemedPreview
3942
import io.element.android.libraries.designsystem.preview.PreviewGroup
40-
import io.element.android.libraries.designsystem.preview.debugPlaceholderAvatar
4143
import io.element.android.libraries.designsystem.text.toSp
4244
import io.element.android.libraries.designsystem.theme.components.Text
4345
import timber.log.Timber
@@ -71,16 +73,23 @@ private fun ImageAvatar(
7173
modifier: Modifier = Modifier,
7274
contentDescription: String? = null,
7375
) {
74-
AsyncImage(
76+
SubcomposeAsyncImage(
7577
model = avatarData,
76-
onError = {
77-
Timber.e(it.result.throwable, "Error loading avatar $it\n${it.result}")
78-
},
7978
contentDescription = contentDescription,
8079
contentScale = ContentScale.Crop,
81-
placeholder = debugPlaceholderAvatar(),
8280
modifier = modifier
83-
)
81+
) {
82+
when (val state = painter.state) {
83+
is AsyncImagePainter.State.Success -> SubcomposeAsyncImageContent()
84+
is AsyncImagePainter.State.Error -> {
85+
SideEffect {
86+
Timber.e(state.result.throwable, "Error loading avatar $state\n${state.result}")
87+
}
88+
InitialsAvatar(avatarData = avatarData)
89+
}
90+
else -> InitialsAvatar(avatarData = avatarData)
91+
}
92+
}
8493
}
8594

8695
@Composable

0 commit comments

Comments
 (0)