diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/BlogPostView.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/BlogPostView.kt index 34ce69c63d92fc877c0e757401d2b1ce548807fb..f34aa343941fd007d471f7de7beda46f971886c5 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/BlogPostView.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/BlogPostView.kt @@ -68,6 +68,7 @@ import org.briarproject.briar.desktop.ui.HorizontalDivider import org.briarproject.briar.desktop.ui.Tooltip import org.briarproject.briar.desktop.ui.TrustIndicatorShort import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18n +import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18nF import org.briarproject.briar.desktop.utils.PreviewUtils.preview import org.briarproject.briar.desktop.utils.TimeUtils.getFormattedTimestamp import org.briarproject.briar.desktop.utils.UiUtils.getContactDisplayName @@ -166,6 +167,10 @@ private fun BlogPostViewHeader( onAuthorClicked = if (onAuthorClicked == null) null else { { onAuthorClicked(item.header.groupId) } }, + authorClickTooltip = if (onAuthorClicked == null) null else { + val name = getContactDisplayName(item.header.author.name, item.header.authorInfo.alias) + i18nF("blog.open.from.author", name) + }, ) if (item is BlogCommentItem) { val postHeader = item.postHeader @@ -176,6 +181,9 @@ private fun BlogPostViewHeader( onAuthorClicked = if (onAuthorClicked == null) null else { { onAuthorClicked(item.postHeader.groupId) } }, + authorClickTooltip = if (onAuthorClicked == null) null else { + i18nF("blog.open.from.author", item.postHeader.author.name) + }, ) } } @@ -188,11 +196,13 @@ private fun BlogPostViewHeader( } } +@OptIn(ExperimentalFoundationApi::class) @Composable private fun RepeatAuthorView( item: BlogPost, modifier: Modifier = Modifier, onAuthorClicked: (() -> Unit)?, + authorClickTooltip: String? = null, ) { val author = item.author val authorInfo = item.authorInfo @@ -202,36 +212,40 @@ private fun RepeatAuthorView( verticalAlignment = CenterVertically, modifier = modifier, ) { - Row( - modifier = Modifier.weight(1f) - .modifyIf(onAuthorClicked != null, Modifier.clickable { onAuthorClicked?.invoke() }), - horizontalArrangement = spacedBy(8.dp), - verticalAlignment = CenterVertically, + Tooltip( + text = authorClickTooltip ?: "", + modifier = Modifier.weight(1f), ) { - // TODO we may eventually want to move this into its own composable or integrate into ProfileCircle - Box( - contentAlignment = BottomEnd, - modifier = Modifier.size(36.dp), + Row( + modifier = Modifier.modifyIf(onAuthorClicked != null, Modifier.clickable { onAuthorClicked?.invoke() }), + horizontalArrangement = spacedBy(8.dp), + verticalAlignment = CenterVertically, ) { - ProfileCircle(36.dp, author.id, authorInfo) - if (item is BlogCommentItem) { - Icon( - imageVector = Icons.Default.Repeat, - tint = Color.Black, - contentDescription = i18n("access.blogs.reblog"), - modifier = Modifier.size(16.dp).clip(CircleShape) - .border(1.dp, Color.Black, CircleShape).background(Color.White).padding(2.dp) - ) + // TODO we may eventually want to move this into its own composable or integrate into ProfileCircle + Box( + contentAlignment = BottomEnd, + modifier = Modifier.size(36.dp), + ) { + ProfileCircle(36.dp, author.id, authorInfo) + if (item is BlogCommentItem) { + Icon( + imageVector = Icons.Default.Repeat, + tint = Color.Black, + contentDescription = i18n("access.blogs.reblog"), + modifier = Modifier.size(16.dp).clip(CircleShape) + .border(1.dp, Color.Black, CircleShape).background(Color.White).padding(2.dp) + ) + } } + Text( + modifier = Modifier.weight(1f, fill = false), + text = getContactDisplayName(author.name, authorInfo.alias), + fontWeight = if (authorInfo.status == OURSELVES) FontWeight.Bold else null, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + TrustIndicatorShort(authorInfo.status) } - Text( - modifier = Modifier.weight(1f, fill = false), - text = getContactDisplayName(author.name, authorInfo.alias), - fontWeight = if (authorInfo.status == OURSELVES) FontWeight.Bold else null, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - TrustIndicatorShort(authorInfo.status) } Text( text = getFormattedTimestamp(timestamp), diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/AuthorView.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/AuthorView.kt index c61faa3a0b97ab84617d690057004b554294e26a..71b2cd302a045ad19373ed7d533b1505fe037818 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/AuthorView.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/AuthorView.kt @@ -18,6 +18,7 @@ package org.briarproject.briar.desktop.ui +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement.spacedBy import androidx.compose.foundation.layout.Row @@ -39,6 +40,7 @@ import org.briarproject.briar.desktop.utils.TimeUtils import org.briarproject.briar.desktop.utils.UiUtils.getContactDisplayName import org.briarproject.briar.desktop.utils.UiUtils.modifyIf +@OptIn(ExperimentalFoundationApi::class) @Composable fun AuthorView( author: Author, @@ -47,27 +49,32 @@ fun AuthorView( modifier: Modifier = Modifier, avatarSize: Dp = 27.dp, onAuthorClicked: (() -> Unit)? = null, + authorClickTooltip: String? = null, ) { Row( modifier = modifier, horizontalArrangement = spacedBy(8.dp), verticalAlignment = CenterVertically, ) { - Row( - modifier = Modifier.weight(1f) - .modifyIf(onAuthorClicked != null, Modifier.clickable { onAuthorClicked?.invoke() }), - horizontalArrangement = spacedBy(8.dp), - verticalAlignment = CenterVertically, + Tooltip( + text = authorClickTooltip ?: "", + modifier = Modifier.weight(1f), ) { - ProfileCircle(avatarSize, author.id, authorInfo) - Text( - modifier = Modifier.weight(1f, fill = false), - text = getContactDisplayName(author.name, authorInfo.alias), - fontWeight = if (authorInfo.status == OURSELVES) Bold else null, - maxLines = 1, - overflow = Ellipsis, - ) - TrustIndicatorShort(authorInfo.status) + Row( + modifier = Modifier.modifyIf(onAuthorClicked != null, Modifier.clickable { onAuthorClicked?.invoke() }), + horizontalArrangement = spacedBy(8.dp), + verticalAlignment = CenterVertically, + ) { + ProfileCircle(avatarSize, author.id, authorInfo) + Text( + modifier = Modifier.weight(1f, fill = false), + text = getContactDisplayName(author.name, authorInfo.alias), + fontWeight = if (authorInfo.status == OURSELVES) Bold else null, + maxLines = 1, + overflow = Ellipsis, + ) + TrustIndicatorShort(authorInfo.status) + } } Text( text = TimeUtils.getFormattedTimestamp(timestamp), diff --git a/briar-desktop/src/main/resources/strings/BriarDesktop.properties b/briar-desktop/src/main/resources/strings/BriarDesktop.properties index 76edac5b197bba5effa6b36c311dc9e1fe06da23..e41d59318953cbfde67d999d4b64ef9a45148482 100644 --- a/briar-desktop/src/main/resources/strings/BriarDesktop.properties +++ b/briar-desktop/src/main/resources/strings/BriarDesktop.properties @@ -222,6 +222,7 @@ blog.empty.state=No posts to show blog.post.reply.intro=Reblog this post: blog.post.hint=Type your blog post blog.post.reply.hint=Add a comment (optional) +blog.open.from.author=Open blog of {0} # Introduction introduction.introduce=Make Introduction