From 5db68ba186e96923dd3ca2f180b6a3c363acc589 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Thu, 14 Nov 2024 01:15:54 +0530 Subject: [PATCH] feat: highlight story author in comments --- .../claw/common/comments/CommentNode.kt | 2 ++ .../claw/common/comments/CommentsHandler.kt | 19 +++++++++++++------ .../claw/common/comments/CommentsPageImpl.kt | 16 ++++++++++++++-- .../claw/model/LobstersPostDetails.kt | 1 + .../kotlin/dev/msfjarvis/claw/model/UIPost.kt | 2 +- 5 files changed, 31 insertions(+), 9 deletions(-) diff --git a/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentNode.kt b/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentNode.kt index feff7b0d..191fce65 100644 --- a/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentNode.kt +++ b/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentNode.kt @@ -10,6 +10,7 @@ import dev.msfjarvis.claw.model.Comment internal data class CommentNode( val comment: Comment, + val isPostAuthor: Boolean, private var parent: CommentNode? = null, val children: MutableList = mutableListOf(), val isUnread: Boolean = false, @@ -27,6 +28,7 @@ internal data class CommentNode( ?.addChild( CommentNode( comment = child.comment, + isPostAuthor = child.isPostAuthor, parent = child.parent, isUnread = child.isUnread, indentLevel = child.indentLevel + 1, diff --git a/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentsHandler.kt b/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentsHandler.kt index e4f52433..621601d2 100644 --- a/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentsHandler.kt +++ b/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentsHandler.kt @@ -17,16 +17,22 @@ internal class CommentsHandler { private val _listItems: MutableStateFlow> = MutableStateFlow(emptyList()) val listItems: StateFlow> = _listItems.asStateFlow() - fun createListNode(comments: List, commentState: PostComments?) { + fun createListNode( + comments: List, + commentState: PostComments?, + isPostAuthor: (Comment) -> Boolean, + ) { val commentNodes = mutableListOf() val isUnread = { id: String -> commentState?.commentIds?.contains(id) == false } for (i in comments.indices) { - if (comments[i].parentComment == null) { + val comment = comments[i] + if (comment.parentComment == null) { commentNodes.add( CommentNode( - comment = comments[i], - isUnread = isUnread(comments[i].shortId), + comment = comment, + isPostAuthor = isPostAuthor(comment), + isUnread = isUnread(comment.shortId), indentLevel = 1, ) ) @@ -34,8 +40,9 @@ internal class CommentsHandler { commentNodes.lastOrNull()?.let { commentNode -> commentNode.addChild( CommentNode( - comment = comments[i], - isUnread = isUnread(comments[i].shortId), + comment = comment, + isPostAuthor = isPostAuthor(comment), + isUnread = isUnread(comment.shortId), indentLevel = commentNode.indentLevel + 1, ) ) diff --git a/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentsPageImpl.kt b/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentsPageImpl.kt index b29f4bb9..0b0b23b9 100644 --- a/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentsPageImpl.kt +++ b/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentsPageImpl.kt @@ -38,11 +38,14 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import dev.msfjarvis.claw.common.posts.PostActions @@ -69,7 +72,9 @@ internal fun CommentsPageInternal( ) { val commentsHandler = CommentsHandler() LaunchedEffect(key1 = details, key2 = commentState) { - commentsHandler.createListNode(details.comments, commentState) + commentsHandler.createListNode(details.comments, commentState) { comment -> + details.userIsAuthor && comment.user == details.submitter + } } val onToggleExpandedState = { shortId: String, isExpanded: Boolean -> @@ -221,6 +226,8 @@ private fun CommentEntry( score = comment.score, createdAt = comment.createdAt, updatedAt = comment.updatedAt, + nameColorOverride = + if (commentNode.isPostAuthor) MaterialTheme.colorScheme.tertiary else null, ), avatarUrl = "https://lobste.rs/avatars/${comment.user}-100.png", contentDescription = "User avatar for ${comment.user}", @@ -241,6 +248,7 @@ private fun buildCommenterString( score: Int, createdAt: TemporalAccessor, updatedAt: TemporalAccessor, + nameColorOverride: Color? = null, ): AnnotatedString { val now = System.currentTimeMillis() val createdRelative = @@ -256,7 +264,11 @@ private fun buildCommenterString( DateUtils.MINUTE_IN_MILLIS, ) return buildAnnotatedString { - append(commenterName) + if (nameColorOverride != null) { + withStyle(SpanStyle(color = nameColorOverride)) { append(commenterName) } + } else { + append(commenterName) + } append(' ') append('•') append(' ') diff --git a/model/src/main/kotlin/dev/msfjarvis/claw/model/LobstersPostDetails.kt b/model/src/main/kotlin/dev/msfjarvis/claw/model/LobstersPostDetails.kt index b00aad5d..a2a17ff8 100644 --- a/model/src/main/kotlin/dev/msfjarvis/claw/model/LobstersPostDetails.kt +++ b/model/src/main/kotlin/dev/msfjarvis/claw/model/LobstersPostDetails.kt @@ -36,4 +36,5 @@ class LobstersPostDetails( @SerialName("submitter_user") val submitter: String, val tags: List, val comments: List, + @SerialName("user_is_author") val userIsAuthor: Boolean = false, ) diff --git a/model/src/main/kotlin/dev/msfjarvis/claw/model/UIPost.kt b/model/src/main/kotlin/dev/msfjarvis/claw/model/UIPost.kt index e032a4ae..015252ae 100644 --- a/model/src/main/kotlin/dev/msfjarvis/claw/model/UIPost.kt +++ b/model/src/main/kotlin/dev/msfjarvis/claw/model/UIPost.kt @@ -27,7 +27,7 @@ data class UIPost( @SerialName("submitter_user") val submitter: String, val tags: List, val comments: List = emptyList(), - val userIsAuthor: Boolean = false, + @SerialName("user_is_author") val userIsAuthor: Boolean = false, ) { @KonvertFrom( value = SavedPost::class,