@@ -8,29 +8,23 @@ import androidx.activity.compose.rememberLauncherForActivityResult
88import androidx.activity.result.contract.ActivityResultContracts
99import androidx.compose.foundation.layout.Arrangement
1010import androidx.compose.foundation.layout.Box
11- import androidx.compose.foundation.layout.Column
1211import androidx.compose.foundation.layout.PaddingValues
1312import androidx.compose.foundation.layout.fillMaxSize
1413import androidx.compose.foundation.layout.padding
1514import androidx.compose.foundation.lazy.LazyColumn
1615import androidx.compose.foundation.lazy.LazyListState
1716import androidx.compose.foundation.lazy.rememberLazyListState
18- import androidx.compose.material.icons.Icons
19- import androidx.compose.material.icons.filled.Menu
2017import androidx.compose.material3.DrawerValue
2118import androidx.compose.material3.ExperimentalMaterial3Api
2219import androidx.compose.material3.FloatingActionButton
2320import androidx.compose.material3.Icon
24- import androidx.compose.material3.IconButton
2521import androidx.compose.material3.MaterialTheme
2622import androidx.compose.material3.ModalNavigationDrawer
2723import androidx.compose.material3.Scaffold
2824import androidx.compose.material3.SnackbarDuration
2925import androidx.compose.material3.SnackbarHost
3026import androidx.compose.material3.SnackbarHostState
3127import androidx.compose.material3.SnackbarResult
32- import androidx.compose.material3.Text
33- import androidx.compose.material3.TopAppBar
3428import androidx.compose.material3.TopAppBarDefaults
3529import androidx.compose.material3.pulltorefresh.PullToRefreshBox
3630import androidx.compose.material3.rememberDrawerState
@@ -46,7 +40,6 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll
4640import androidx.compose.ui.platform.LocalContext
4741import androidx.compose.ui.res.painterResource
4842import androidx.compose.ui.res.stringResource
49- import androidx.compose.ui.text.style.TextOverflow
5043import androidx.compose.ui.unit.dp
5144import androidx.lifecycle.compose.collectAsStateWithLifecycle
5245import androidx.paging.compose.LazyPagingItems
@@ -61,14 +54,14 @@ import cafe.adriel.voyager.navigator.tab.TabOptions
6154import com.readrops.app.MainActivity
6255import com.readrops.app.R
6356import 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
6761import com.readrops.app.timelime.drawer.TimelineDrawer
6862import com.readrops.app.util.components.CenteredProgressIndicator
6963import com.readrops.app.util.components.Placeholder
7064import com.readrops.app.util.components.RefreshScreen
71- import com.readrops.app.util.components.dialog.TwoChoicesDialog
7265import com.readrops.app.util.extensions.isError
7366import com.readrops.app.util.extensions.isLoading
7467import com.readrops.app.util.extensions.isNotEmpty
@@ -77,9 +70,6 @@ import com.readrops.app.util.extensions.openUrl
7770import com.readrops.app.util.theme.spacing
7871import com.readrops.db.entities.OpenIn
7972import 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
8373import com.readrops.db.pojo.ItemWithFeed
8474import kotlinx.coroutines.channels.Channel
8575import 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
0 commit comments