Skip to content

Commit b07a739

Browse files
authored
Implement hide/show highlights on ArticleDetailsScreen (#253)
1 parent 680e68f commit b07a739

File tree

13 files changed

+373
-5
lines changed

13 files changed

+373
-5
lines changed

app/detekt-baseline.xml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<ManuallySuppressedIssues></ManuallySuppressedIssues>
44
<CurrentIssues>
55
<ID>ComplexCondition:NostrResources.kt$isNote() || isNoteUri() || isNEventUri() || isNEvent()</ID>
6-
<ID>CyclomaticComplexMethod:ArticleDetailsScreen.kt$@OptIn(ExperimentalLayoutApi::class) @Composable private fun ArticleContentWithComments( state: ArticleDetailsContract.UiState, articleParts: List&lt;ArticlePartRender&gt;, listState: LazyListState = rememberLazyListState(), paddingValues: PaddingValues, onArticleCommentClick: (naddr: String) -&gt; Unit, onArticleHashtagClick: (hashtag: String) -&gt; Unit, onZapOptionsClick: () -&gt; Unit, noteCallbacks: NoteCallbacks, onGoToWallet: () -&gt; Unit, onPostAction: ((FeedPostAction) -&gt; Unit)? = null, onPostLongPressAction: ((FeedPostAction) -&gt; Unit)? = null, onFollowUnfollowClick: (() -&gt; Unit)? = null, onUiError: ((UiError) -&gt; Unit)? = null, )</ID>
6+
<ID>CyclomaticComplexMethod:ArticleDetailsScreen.kt$@OptIn(ExperimentalLayoutApi::class) @Composable private fun ArticleContentWithComments( state: ArticleDetailsContract.UiState, articleParts: List&lt;ArticlePartRender&gt;, listState: LazyListState = rememberLazyListState(), showHighlights: Boolean, paddingValues: PaddingValues, onArticleCommentClick: (naddr: String) -&gt; Unit, onArticleHashtagClick: (hashtag: String) -&gt; Unit, onZapOptionsClick: () -&gt; Unit, noteCallbacks: NoteCallbacks, onGoToWallet: () -&gt; Unit, onPostAction: ((FeedPostAction) -&gt; Unit)? = null, onPostLongPressAction: ((FeedPostAction) -&gt; Unit)? = null, onFollowUnfollowClick: (() -&gt; Unit)? = null, onUiError: ((UiError) -&gt; Unit)? = null, )</ID>
77
<ID>CyclomaticComplexMethod:ArticleDetailsScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable private fun ArticleDetailsScreen( detailsState: ArticleDetailsContract.UiState, articleState: ArticleContract.UiState, detailsEventPublisher: (UiEvent) -&gt; Unit, articleEventPublisher: (ArticleContract.UiEvent) -&gt; Unit, onArticleHashtagClick: (hashtag: String) -&gt; Unit, noteCallbacks: NoteCallbacks, onGoToWallet: () -&gt; Unit, onClose: () -&gt; Unit, )</ID>
88
<ID>CyclomaticComplexMethod:ChatScreen.kt$@Composable private fun ChatMessageListItem( chatMessage: ChatMessageUi, previousMessage: ChatMessageUi? = null, nextMessage: ChatMessageUi? = null, onUrlClick: (String) -&gt; Unit, noteCallbacks: NoteCallbacks, )</ID>
99
<ID>CyclomaticComplexMethod:CreateTransactionScreen.kt$@ExperimentalComposeUiApi @ExperimentalMaterial3Api @Composable fun CreateTransactionScreen( state: CreateTransactionContract.UiState, eventPublisher: (CreateTransactionContract.UiEvent) -&gt; Unit, onClose: () -&gt; Unit, )</ID>
@@ -33,11 +33,10 @@
3333
<ID>CyclomaticComplexMethod:WalletDashboardScreen.kt$@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) @Composable fun WalletDashboardScreen( state: WalletDashboardContract.UiState, onPrimaryDestinationChanged: (PrimalTopLevelDestination) -&gt; Unit, onDrawerDestinationClick: (DrawerScreenDestination) -&gt; Unit, onDrawerQrCodeClick: () -&gt; Unit, onWalletActivateClick: () -&gt; Unit, onProfileClick: (String) -&gt; Unit, onTransactionClick: (String) -&gt; Unit, onSendClick: () -&gt; Unit, onScanClick: () -&gt; Unit, onReceiveClick: () -&gt; Unit, eventPublisher: (UiEvent) -&gt; Unit, )</ID>
3434
<ID>CyclomaticComplexMethod:WalletTransactionsMediator.kt$WalletTransactionsMediator$override suspend fun load(loadType: LoadType, state: PagingState&lt;Int, WalletTransaction&gt;): MediatorResult</ID>
3535
<ID>DestructuringDeclarationWithTooManyEntries:PrimalDrawer.kt$val (avatarRef, usernameRef, iconRef, identifierRef, statsRef) = createRefs()</ID>
36-
<ID>LongMethod:ArticleDetailsScreen.kt$@OptIn(ExperimentalLayoutApi::class) @Composable private fun ArticleContentWithComments( state: ArticleDetailsContract.UiState, articleParts: List&lt;ArticlePartRender&gt;, listState: LazyListState = rememberLazyListState(), paddingValues: PaddingValues, onArticleCommentClick: (naddr: String) -&gt; Unit, onArticleHashtagClick: (hashtag: String) -&gt; Unit, onZapOptionsClick: () -&gt; Unit, noteCallbacks: NoteCallbacks, onGoToWallet: () -&gt; Unit, onPostAction: ((FeedPostAction) -&gt; Unit)? = null, onPostLongPressAction: ((FeedPostAction) -&gt; Unit)? = null, onFollowUnfollowClick: (() -&gt; Unit)? = null, onUiError: ((UiError) -&gt; Unit)? = null, )</ID>
36+
<ID>LongMethod:ArticleDetailsScreen.kt$@OptIn(ExperimentalLayoutApi::class) @Composable private fun ArticleContentWithComments( state: ArticleDetailsContract.UiState, articleParts: List&lt;ArticlePartRender&gt;, listState: LazyListState = rememberLazyListState(), showHighlights: Boolean, paddingValues: PaddingValues, onArticleCommentClick: (naddr: String) -&gt; Unit, onArticleHashtagClick: (hashtag: String) -&gt; Unit, onZapOptionsClick: () -&gt; Unit, noteCallbacks: NoteCallbacks, onGoToWallet: () -&gt; Unit, onPostAction: ((FeedPostAction) -&gt; Unit)? = null, onPostLongPressAction: ((FeedPostAction) -&gt; Unit)? = null, onFollowUnfollowClick: (() -&gt; Unit)? = null, onUiError: ((UiError) -&gt; Unit)? = null, )</ID>
3737
<ID>LongMethod:ArticleDetailsScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable private fun ArticleDetailsScreen( detailsState: ArticleDetailsContract.UiState, articleState: ArticleContract.UiState, detailsEventPublisher: (UiEvent) -&gt; Unit, articleEventPublisher: (ArticleContract.UiEvent) -&gt; Unit, onArticleHashtagClick: (hashtag: String) -&gt; Unit, noteCallbacks: NoteCallbacks, onGoToWallet: () -&gt; Unit, onClose: () -&gt; Unit, )</ID>
38-
<ID>LongMethod:ArticleDropdownMenu.kt$@ExperimentalMaterial3Api @Composable fun ArticleDropdownMenuIcon( modifier: Modifier, articleId: String, articleContent: String?, articleRawData: String?, authorId: String, isBookmarked: Boolean, enabled: Boolean = true, onBookmarkClick: (() -&gt; Unit)? = null, onMuteUserClick: (() -&gt; Unit)? = null, onReportContentClick: ((reportType: ReportType) -&gt; Unit)? = null, icon: @Composable () -&gt; Unit, )</ID>
38+
<ID>LongMethod:ArticleDropdownMenu.kt$@ExperimentalMaterial3Api @Composable fun ArticleDropdownMenuIcon( modifier: Modifier, articleId: String, articleContent: String?, articleRawData: String?, authorId: String, isBookmarked: Boolean, enabled: Boolean = true, showHighlights: Boolean? = null, onToggleHighlightsClick: (() -&gt; Unit)? = null, onBookmarkClick: (() -&gt; Unit)? = null, onMuteUserClick: (() -&gt; Unit)? = null, onReportContentClick: ((reportType: ReportType) -&gt; Unit)? = null, icon: @Composable () -&gt; Unit, )</ID>
3939
<ID>LongMethod:ArticleFeedList.kt$@ExperimentalMaterial3Api @ExperimentalFoundationApi @Composable private fun ArticleFeedLazyColumn( articleState: ArticleContract.UiState, pagingItems: LazyPagingItems&lt;FeedArticleUi&gt;, listState: LazyListState, showPaywall: Boolean, onArticleClick: (naddr: String) -&gt; Unit, onGetPremiumClick: () -&gt; Unit, articleEventPublisher: (ArticleContract.UiEvent) -&gt; Unit, modifier: Modifier = Modifier, noContentText: String = stringResource(id = R.string.article_feed_no_content), noContentVerticalArrangement: Arrangement.Vertical = Arrangement.Center, noContentPaddingValues: PaddingValues = PaddingValues(all = 0.dp), contentPadding: PaddingValues = PaddingValues(all = 0.dp), header: @Composable (LazyItemScope.() -&gt; Unit)? = null, stickyHeader: @Composable (LazyItemScope.() -&gt; Unit)? = null, )</ID>
40-
<ID>LongMethod:BecomeLegendAmountStage.kt$@ExperimentalMaterial3Api @Composable fun BecomeLegendAmountStage( modifier: Modifier, state: PremiumBecomeLegendContract.UiState, eventPublisher: (PremiumBecomeLegendContract.UiEvent) -&gt; Unit, onClose: () -&gt; Unit, onNext: () -&gt; Unit, )</ID>
4140
<ID>LongMethod:ChatScreen.kt$@Composable private fun ChatList( messages: LazyPagingItems&lt;ChatMessageUi&gt;, noteCallbacks: NoteCallbacks, modifier: Modifier = Modifier, state: LazyListState = rememberLazyListState(), contentPadding: PaddingValues = PaddingValues(0.dp), )</ID>
4241
<ID>LongMethod:ChatScreen.kt$@Composable private fun ChatMessageListItem( chatMessage: ChatMessageUi, previousMessage: ChatMessageUi? = null, nextMessage: ChatMessageUi? = null, onUrlClick: (String) -&gt; Unit, noteCallbacks: NoteCallbacks, )</ID>
4342
<ID>LongMethod:ContentDisplaySettingsScreen.kt$@Composable @ExperimentalMaterial3Api private fun ContentDisplaySettingsScreen( state: ContentDisplaySettingsContract.UiState, onClose: () -&gt; Unit, eventPublisher: (UiEvent) -&gt; Unit, )</ID>

app/src/main/kotlin/net/primal/android/articles/feed/ui/ArticleDropdownMenu.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ import net.primal.android.core.compose.icons.primaliconpack.ContextCopyNoteLink
2525
import net.primal.android.core.compose.icons.primaliconpack.ContextCopyNoteText
2626
import net.primal.android.core.compose.icons.primaliconpack.ContextCopyPublicKey
2727
import net.primal.android.core.compose.icons.primaliconpack.ContextCopyRawData
28+
import net.primal.android.core.compose.icons.primaliconpack.ContextHideHighlightsOutlined
2829
import net.primal.android.core.compose.icons.primaliconpack.ContextMuteUser
2930
import net.primal.android.core.compose.icons.primaliconpack.ContextRemoveBookmark
3031
import net.primal.android.core.compose.icons.primaliconpack.ContextReportUser
3132
import net.primal.android.core.compose.icons.primaliconpack.ContextShare
33+
import net.primal.android.core.compose.icons.primaliconpack.ContextShowHighlightsOutlined
3234
import net.primal.android.core.utils.copyText
3335
import net.primal.android.core.utils.resolvePrimalArticleLink
3436
import net.primal.android.core.utils.systemShareText
@@ -50,6 +52,8 @@ fun ArticleDropdownMenuIcon(
5052
authorId: String,
5153
isBookmarked: Boolean,
5254
enabled: Boolean = true,
55+
showHighlights: Boolean? = null,
56+
onToggleHighlightsClick: (() -> Unit)? = null,
5357
onBookmarkClick: (() -> Unit)? = null,
5458
onMuteUserClick: (() -> Unit)? = null,
5559
onReportContentClick: ((reportType: ReportType) -> Unit)? = null,
@@ -103,6 +107,24 @@ fun ArticleDropdownMenuIcon(
103107
menuVisible = false
104108
},
105109
)
110+
if (showHighlights != null) {
111+
DropdownPrimalMenuItem(
112+
trailingIconVector = if (showHighlights) {
113+
PrimalIcons.ContextHideHighlightsOutlined
114+
} else {
115+
PrimalIcons.ContextShowHighlightsOutlined
116+
},
117+
text = if (showHighlights) {
118+
stringResource(id = R.string.article_feed_context_hide_highglights)
119+
} else {
120+
stringResource(id = R.string.article_feed_context_show_highglights)
121+
},
122+
onClick = {
123+
onToggleHighlightsClick?.invoke()
124+
menuVisible = false
125+
},
126+
)
127+
}
106128
DropdownPrimalMenuItem(
107129
trailingIconVector = PrimalIcons.ContextCopyNoteLink,
108130
text = stringResource(id = R.string.article_feed_context_copy_article_link),

app/src/main/kotlin/net/primal/android/core/compose/icons/__PrimalIcons.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ import net.primal.android.core.compose.icons.primaliconpack.ContextCopyNoteLink
1919
import net.primal.android.core.compose.icons.primaliconpack.ContextCopyNoteText
2020
import net.primal.android.core.compose.icons.primaliconpack.ContextCopyPublicKey
2121
import net.primal.android.core.compose.icons.primaliconpack.ContextCopyRawData
22+
import net.primal.android.core.compose.icons.primaliconpack.ContextHideHighlightsOutlined
2223
import net.primal.android.core.compose.icons.primaliconpack.ContextMuteConversation
2324
import net.primal.android.core.compose.icons.primaliconpack.ContextMuteUser
2425
import net.primal.android.core.compose.icons.primaliconpack.ContextRemoveBookmark
2526
import net.primal.android.core.compose.icons.primaliconpack.ContextReportUser
2627
import net.primal.android.core.compose.icons.primaliconpack.ContextShare
28+
import net.primal.android.core.compose.icons.primaliconpack.ContextShowHighlightsOutlined
2729
import net.primal.android.core.compose.icons.primaliconpack.Copy
2830
import net.primal.android.core.compose.icons.primaliconpack.CopyAlt
2931
import net.primal.android.core.compose.icons.primaliconpack.DarkMode
@@ -64,6 +66,7 @@ import net.primal.android.core.compose.icons.primaliconpack.FeedZapsFilled
6466
import net.primal.android.core.compose.icons.primaliconpack.FontSize
6567
import net.primal.android.core.compose.icons.primaliconpack.GenericLinkIcon
6668
import net.primal.android.core.compose.icons.primaliconpack.Help
69+
import net.primal.android.core.compose.icons.primaliconpack.Highlight
6770
import net.primal.android.core.compose.icons.primaliconpack.Home
6871
import net.primal.android.core.compose.icons.primaliconpack.HomeFilled
6972
import net.primal.android.core.compose.icons.primaliconpack.ImportPhotoFromCamera
@@ -111,6 +114,7 @@ import net.primal.android.core.compose.icons.primaliconpack.PrimalPremium
111114
import net.primal.android.core.compose.icons.primaliconpack.QrCode
112115
import net.primal.android.core.compose.icons.primaliconpack.Quote
113116
import net.primal.android.core.compose.icons.primaliconpack.Read
117+
import net.primal.android.core.compose.icons.primaliconpack.RemoveHighlight
114118
import net.primal.android.core.compose.icons.primaliconpack.Report
115119
import net.primal.android.core.compose.icons.primaliconpack.Repost
116120
import net.primal.android.core.compose.icons.primaliconpack.Search
@@ -198,8 +202,12 @@ val PrimalIcons.PrimalIcons: ____KtList<ImageVector>
198202
Zap,
199203
Repost,
200204
Quote,
205+
Highlight,
206+
RemoveHighlight,
201207
ContextCopyNoteLink,
202208
ContextCopyNoteId,
209+
ContextShowHighlightsOutlined,
210+
ContextHideHighlightsOutlined,
203211
ContextCopyPublicKey,
204212
ContextReportUser,
205213
ContextCopyRawData,
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package net.primal.android.core.compose.icons.primaliconpack
2+
3+
import androidx.compose.ui.graphics.Color
4+
import androidx.compose.ui.graphics.PathFillType
5+
import androidx.compose.ui.graphics.SolidColor
6+
import androidx.compose.ui.graphics.vector.ImageVector
7+
import androidx.compose.ui.graphics.vector.path
8+
import androidx.compose.ui.unit.dp
9+
import net.primal.android.core.compose.icons.PrimalIcons
10+
import kotlin.Suppress
11+
12+
val PrimalIcons.ContextHideHighlightsOutlined: ImageVector
13+
get() {
14+
if (_ContextHideHighlightsOutlined != null) {
15+
return _ContextHideHighlightsOutlined!!
16+
}
17+
_ContextHideHighlightsOutlined = ImageVector.Builder(
18+
name = "ContextHideHighlightsOutlined",
19+
defaultWidth = 20.dp,
20+
defaultHeight = 20.dp,
21+
viewportWidth = 20f,
22+
viewportHeight = 20f
23+
).apply {
24+
path(fill = SolidColor(Color(0xFFFFFFFF))) {
25+
moveTo(0.251f, 1.443f)
26+
curveTo(-0.084f, 1.113f, -0.084f, 0.578f, 0.251f, 0.248f)
27+
curveTo(0.586f, -0.083f, 1.128f, -0.083f, 1.463f, 0.248f)
28+
lineTo(19.749f, 18.276f)
29+
curveTo(20.084f, 18.606f, 20.084f, 19.141f, 19.749f, 19.471f)
30+
curveTo(19.414f, 19.801f, 18.872f, 19.801f, 18.537f, 19.471f)
31+
lineTo(0.251f, 1.443f)
32+
close()
33+
}
34+
path(fill = SolidColor(Color(0xFFFFFFFF))) {
35+
moveTo(4.643f, 7.81f)
36+
lineTo(3.387f, 8.671f)
37+
curveTo(1.915f, 9.681f, 1.516f, 11.573f, 2.307f, 13.039f)
38+
curveTo(2.465f, 13.332f, 2.67f, 13.608f, 2.923f, 13.856f)
39+
lineTo(6.884f, 17.738f)
40+
curveTo(7.137f, 17.987f, 7.419f, 18.188f, 7.717f, 18.343f)
41+
curveTo(9.213f, 19.118f, 11.143f, 18.727f, 12.174f, 17.284f)
42+
lineTo(13.033f, 16.081f)
43+
lineTo(11.951f, 15.015f)
44+
lineTo(10.953f, 16.413f)
45+
curveTo(10.256f, 17.389f, 8.804f, 17.52f, 7.934f, 16.667f)
46+
lineTo(3.973f, 12.785f)
47+
curveTo(3.129f, 11.957f, 3.243f, 10.589f, 4.235f, 9.908f)
48+
lineTo(5.731f, 8.882f)
49+
lineTo(4.643f, 7.81f)
50+
close()
51+
}
52+
path(fill = SolidColor(Color(0xFFFFFFFF))) {
53+
moveTo(9.26f, 6.461f)
54+
lineTo(8.172f, 5.388f)
55+
lineTo(13.5f, 1.732f)
56+
curveTo(15.142f, 0.605f, 17.373f, 0.797f, 18.79f, 2.186f)
57+
curveTo(20.207f, 3.575f, 20.403f, 5.761f, 19.253f, 7.371f)
58+
lineTo(15.506f, 12.618f)
59+
lineTo(14.424f, 11.552f)
60+
lineTo(18.033f, 6.499f)
61+
curveTo(18.75f, 5.494f, 18.632f, 4.132f, 17.74f, 3.257f)
62+
curveTo(16.837f, 2.372f, 15.403f, 2.246f, 14.349f, 2.969f)
63+
lineTo(9.26f, 6.461f)
64+
close()
65+
}
66+
path(
67+
fill = SolidColor(Color(0xFFFFFFFF)),
68+
pathFillType = PathFillType.EvenOdd
69+
) {
70+
moveTo(5.242f, 18.668f)
71+
lineTo(5.72f, 18.199f)
72+
lineTo(2.453f, 14.997f)
73+
lineTo(0.341f, 17.067f)
74+
curveTo(-0.387f, 17.78f, 0.128f, 19f, 1.158f, 19f)
75+
lineTo(4.425f, 19f)
76+
curveTo(4.731f, 19f, 5.025f, 18.881f, 5.242f, 18.668f)
77+
close()
78+
}
79+
}.build()
80+
81+
return _ContextHideHighlightsOutlined!!
82+
}
83+
84+
@Suppress("ObjectPropertyName")
85+
private var _ContextHideHighlightsOutlined: ImageVector? = null

0 commit comments

Comments
 (0)