Skip to content

Commit a8cdb92

Browse files
committed
Extract some composables from TimelineTab to reduce its file size
1 parent 0909476 commit a8cdb92

File tree

6 files changed

+213
-154
lines changed

6 files changed

+213
-154
lines changed

app/src/main/java/com/readrops/app/timelime/TimelineScreenModel.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.readrops.app.home.TabScreenModel
1313
import com.readrops.app.repositories.ErrorResult
1414
import com.readrops.app.repositories.GetFoldersWithFeeds
1515
import com.readrops.app.sync.SyncWorker
16+
import com.readrops.app.timelime.components.TimelineItemSize
1617
import com.readrops.app.util.Preferences
1718
import com.readrops.app.util.extensions.clearSerializables
1819
import com.readrops.app.util.extensions.getSerializable

app/src/main/java/com/readrops/app/timelime/TimelineTab.kt

Lines changed: 24 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,23 @@ import androidx.activity.compose.rememberLauncherForActivityResult
88
import androidx.activity.result.contract.ActivityResultContracts
99
import androidx.compose.foundation.layout.Arrangement
1010
import androidx.compose.foundation.layout.Box
11-
import androidx.compose.foundation.layout.Column
1211
import androidx.compose.foundation.layout.PaddingValues
1312
import androidx.compose.foundation.layout.fillMaxSize
1413
import androidx.compose.foundation.layout.padding
1514
import androidx.compose.foundation.lazy.LazyColumn
1615
import androidx.compose.foundation.lazy.LazyListState
1716
import androidx.compose.foundation.lazy.rememberLazyListState
18-
import androidx.compose.material.icons.Icons
19-
import androidx.compose.material.icons.filled.Menu
2017
import androidx.compose.material3.DrawerValue
2118
import androidx.compose.material3.ExperimentalMaterial3Api
2219
import androidx.compose.material3.FloatingActionButton
2320
import androidx.compose.material3.Icon
24-
import androidx.compose.material3.IconButton
2521
import androidx.compose.material3.MaterialTheme
2622
import androidx.compose.material3.ModalNavigationDrawer
2723
import androidx.compose.material3.Scaffold
2824
import androidx.compose.material3.SnackbarDuration
2925
import androidx.compose.material3.SnackbarHost
3026
import androidx.compose.material3.SnackbarHostState
3127
import androidx.compose.material3.SnackbarResult
32-
import androidx.compose.material3.Text
33-
import androidx.compose.material3.TopAppBar
3428
import androidx.compose.material3.TopAppBarDefaults
3529
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
3630
import androidx.compose.material3.rememberDrawerState
@@ -46,7 +40,6 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll
4640
import androidx.compose.ui.platform.LocalContext
4741
import androidx.compose.ui.res.painterResource
4842
import androidx.compose.ui.res.stringResource
49-
import androidx.compose.ui.text.style.TextOverflow
5043
import androidx.compose.ui.unit.dp
5144
import androidx.lifecycle.compose.collectAsStateWithLifecycle
5245
import androidx.paging.compose.LazyPagingItems
@@ -61,14 +54,14 @@ import cafe.adriel.voyager.navigator.tab.TabOptions
6154
import com.readrops.app.MainActivity
6255
import com.readrops.app.R
6356
import com.readrops.app.item.ItemScreen
64-
import com.readrops.app.timelime.dialog.ErrorListDialog
65-
import com.readrops.app.timelime.dialog.FilterBottomSheet
66-
import com.readrops.app.timelime.dialog.OpenInParameterDialog
57+
import com.readrops.app.timelime.components.TimelineAppBar
58+
import com.readrops.app.timelime.components.TimelineItem
59+
import com.readrops.app.timelime.components.TimelineItemSize
60+
import com.readrops.app.timelime.dialog.TimelineDialogs
6761
import com.readrops.app.timelime.drawer.TimelineDrawer
6862
import com.readrops.app.util.components.CenteredProgressIndicator
6963
import com.readrops.app.util.components.Placeholder
7064
import com.readrops.app.util.components.RefreshScreen
71-
import com.readrops.app.util.components.dialog.TwoChoicesDialog
7265
import com.readrops.app.util.extensions.isError
7366
import com.readrops.app.util.extensions.isLoading
7467
import com.readrops.app.util.extensions.isNotEmpty
@@ -77,9 +70,6 @@ import com.readrops.app.util.extensions.openUrl
7770
import com.readrops.app.util.theme.spacing
7871
import com.readrops.db.entities.OpenIn
7972
import com.readrops.db.filters.MainFilter
80-
import com.readrops.db.filters.OrderField
81-
import com.readrops.db.filters.OrderType
82-
import com.readrops.db.filters.SubFilter
8373
import com.readrops.db.pojo.ItemWithFeed
8474
import kotlinx.coroutines.channels.Channel
8575
import kotlinx.coroutines.flow.filter
@@ -210,6 +200,20 @@ object TimelineTab : Tab {
210200
}
211201
}
212202

203+
TimelineDialogs(
204+
state = state,
205+
screenModel = screenModel,
206+
onOpenItem = { itemWithFeed, openIn ->
207+
openItem(
208+
itemWithFeed = itemWithFeed,
209+
openIn = openIn,
210+
preferences = preferences,
211+
navigator = navigator,
212+
context = context
213+
)
214+
}
215+
)
216+
213217
ModalNavigationDrawer(
214218
drawerState = drawerState,
215219
drawerContent = {
@@ -229,63 +233,12 @@ object TimelineTab : Tab {
229233
) {
230234
Scaffold(
231235
topBar = {
232-
TopAppBar(
233-
title = {
234-
Column {
235-
Text(
236-
text = when (state.filters.mainFilter) {
237-
MainFilter.STARS -> stringResource(R.string.favorites)
238-
MainFilter.ALL -> stringResource(R.string.articles)
239-
MainFilter.NEW -> stringResource(R.string.new_articles)
240-
},
241-
maxLines = 1,
242-
overflow = TextOverflow.Ellipsis
243-
)
244-
245-
if (state.showSubtitle) {
246-
Text(
247-
text = when (state.filters.subFilter) {
248-
SubFilter.FEED -> state.filterFeedName
249-
SubFilter.FOLDER -> state.filterFolderName
250-
else -> ""
251-
},
252-
style = MaterialTheme.typography.labelLarge,
253-
maxLines = 1,
254-
overflow = TextOverflow.Ellipsis
255-
)
256-
}
257-
}
258-
},
259-
navigationIcon = {
260-
IconButton(
261-
onClick = { screenModel.openDrawer() }
262-
) {
263-
Icon(
264-
imageVector = Icons.Default.Menu,
265-
contentDescription = null
266-
)
267-
}
268-
},
269-
actions = {
270-
IconButton(
271-
onClick = { screenModel.openDialog(DialogState.FilterSheet) }
272-
) {
273-
Icon(
274-
painter = painterResource(id = R.drawable.ic_filter_list),
275-
contentDescription = null
276-
)
277-
}
278-
279-
IconButton(
280-
onClick = { screenModel.refreshTimeline() }
281-
) {
282-
Icon(
283-
painter = painterResource(id = R.drawable.ic_sync),
284-
contentDescription = null
285-
)
286-
}
287-
},
288-
scrollBehavior = topAppBarScrollBehavior
236+
TimelineAppBar(
237+
state = state,
238+
topAppBarScrollBehavior = topAppBarScrollBehavior,
239+
onOpenDrawer = { screenModel.openDrawer() },
240+
onOpenFilterSheet = { screenModel.openDialog(DialogState.FilterSheet) },
241+
onRefreshTimeline = { screenModel.refreshTimeline() }
289242
)
290243
},
291244
snackbarHost = { SnackbarHost(snackbarHostState) },
@@ -411,87 +364,6 @@ object TimelineTab : Tab {
411364
}
412365
}
413366
}
414-
415-
when (val dialog = state.dialog) {
416-
is DialogState.ConfirmDialog -> {
417-
TwoChoicesDialog(
418-
title = stringResource(R.string.mark_all_articles_read),
419-
text = stringResource(R.string.mark_all_articles_read_question),
420-
icon = painterResource(id = R.drawable.ic_rss_feed_grey),
421-
confirmText = stringResource(id = R.string.validate),
422-
dismissText = stringResource(id = R.string.cancel),
423-
onDismiss = { screenModel.closeDialog() },
424-
onConfirm = {
425-
screenModel.closeDialog()
426-
screenModel.setAllItemsRead()
427-
}
428-
)
429-
}
430-
431-
is DialogState.FilterSheet -> {
432-
FilterBottomSheet(
433-
filters = state.filters,
434-
onSetShowReadItems = {
435-
screenModel.setShowReadItemsState(!state.filters.showReadItems)
436-
},
437-
onSetOrderField = {
438-
screenModel.setOrderFieldState(
439-
if (state.filters.orderField == OrderField.ID) {
440-
OrderField.DATE
441-
} else {
442-
OrderField.ID
443-
}
444-
)
445-
},
446-
onSetOrderType = {
447-
screenModel.setOrderTypeState(
448-
if (state.filters.orderType == OrderType.DESC) {
449-
OrderType.ASC
450-
} else {
451-
OrderType.DESC
452-
}
453-
)
454-
},
455-
onDismiss = { screenModel.closeDialog() }
456-
)
457-
}
458-
459-
is DialogState.ErrorList -> {
460-
ErrorListDialog(
461-
errorResult = dialog.errorResult,
462-
onDismiss = { screenModel.closeDialog(dialog) }
463-
)
464-
}
465-
466-
is DialogState.OpenIn -> {
467-
val itemWithFeed = dialog.itemWithFeed
468-
469-
OpenInParameterDialog(
470-
openIn = itemWithFeed.openIn!!,
471-
onValidate = { openIn, openInAsk ->
472-
screenModel.updateOpenInParameter(
473-
feedId = itemWithFeed.feedId,
474-
openIn = openIn,
475-
openInAsk = openInAsk
476-
)
477-
478-
screenModel.closeDialog(dialog)
479-
480-
openItem(
481-
itemWithFeed = itemWithFeed,
482-
openIn = openIn,
483-
preferences = preferences,
484-
navigator = navigator,
485-
context = context
486-
)
487-
screenModel.setItemRead(itemWithFeed.item)
488-
},
489-
onDismiss = { screenModel.closeDialog(dialog) }
490-
)
491-
}
492-
493-
else -> {}
494-
}
495367
}
496368
}
497369

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.readrops.app.timelime.components
2+
3+
import androidx.compose.foundation.layout.Column
4+
import androidx.compose.material.icons.Icons
5+
import androidx.compose.material.icons.filled.Menu
6+
import androidx.compose.material3.ExperimentalMaterial3Api
7+
import androidx.compose.material3.Icon
8+
import androidx.compose.material3.IconButton
9+
import androidx.compose.material3.MaterialTheme
10+
import androidx.compose.material3.Text
11+
import androidx.compose.material3.TopAppBar
12+
import androidx.compose.material3.TopAppBarScrollBehavior
13+
import androidx.compose.runtime.Composable
14+
import androidx.compose.ui.res.painterResource
15+
import androidx.compose.ui.res.stringResource
16+
import androidx.compose.ui.text.style.TextOverflow
17+
import com.readrops.app.R
18+
import com.readrops.app.timelime.TimelineState
19+
import com.readrops.db.filters.MainFilter
20+
import com.readrops.db.filters.SubFilter
21+
22+
@OptIn(ExperimentalMaterial3Api::class)
23+
@Composable
24+
fun TimelineAppBar(
25+
state: TimelineState,
26+
topAppBarScrollBehavior: TopAppBarScrollBehavior,
27+
onOpenDrawer: () -> Unit,
28+
onOpenFilterSheet: () -> Unit,
29+
onRefreshTimeline: () -> Unit,
30+
) {
31+
TopAppBar(
32+
title = {
33+
Column {
34+
Text(
35+
text = when (state.filters.mainFilter) {
36+
MainFilter.STARS -> stringResource(R.string.favorites)
37+
MainFilter.ALL -> stringResource(R.string.articles)
38+
MainFilter.NEW -> stringResource(R.string.new_articles)
39+
},
40+
maxLines = 1,
41+
overflow = TextOverflow.Ellipsis
42+
)
43+
44+
if (state.showSubtitle) {
45+
Text(
46+
text = when (state.filters.subFilter) {
47+
SubFilter.FEED -> state.filterFeedName
48+
SubFilter.FOLDER -> state.filterFolderName
49+
else -> ""
50+
},
51+
style = MaterialTheme.typography.labelLarge,
52+
maxLines = 1,
53+
overflow = TextOverflow.Ellipsis
54+
)
55+
}
56+
}
57+
},
58+
navigationIcon = {
59+
IconButton(
60+
onClick = onOpenDrawer
61+
) {
62+
Icon(
63+
imageVector = Icons.Default.Menu,
64+
contentDescription = null
65+
)
66+
}
67+
},
68+
actions = {
69+
IconButton(
70+
onClick = onOpenFilterSheet
71+
) {
72+
Icon(
73+
painter = painterResource(id = R.drawable.ic_filter_list),
74+
contentDescription = null
75+
)
76+
}
77+
78+
IconButton(
79+
onClick = onRefreshTimeline
80+
) {
81+
Icon(
82+
painter = painterResource(id = R.drawable.ic_sync),
83+
contentDescription = null
84+
)
85+
}
86+
},
87+
scrollBehavior = topAppBarScrollBehavior
88+
)
89+
90+
}

app/src/main/java/com/readrops/app/timelime/TimelineItem.kt renamed to app/src/main/java/com/readrops/app/timelime/components/TimelineItem.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.readrops.app.timelime
1+
package com.readrops.app.timelime.components
22

33
import androidx.compose.animation.animateColorAsState
44
import androidx.compose.foundation.background

app/src/main/java/com/readrops/app/timelime/TimelineItemParts.kt renamed to app/src/main/java/com/readrops/app/timelime/components/TimelineItemParts.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.readrops.app.timelime
1+
package com.readrops.app.timelime.components
22

33
import androidx.compose.foundation.layout.Arrangement
44
import androidx.compose.foundation.layout.Column

0 commit comments

Comments
 (0)