From 296478ff06ae4418dda0d7c84d8535c494b78711 Mon Sep 17 00:00:00 2001 From: Marco Gomiero Date: Tue, 7 May 2024 22:28:29 +0200 Subject: [PATCH] Add new feed from drawer --- .fleet/settings.json | 2 +- .../bywindowsize/CompactHomeView.android.kt | 1 + .../bywindowsize/ExpandedHomeView.android.kt | 1 + .../bywindowsize/MediumHomeView.android.kt | 1 + .../bywindowsize/CompactHomeView.desktop.kt | 1 + .../bywindowsize/ExpandedHomeView.desktop.kt | 1 + .../bywindowsize/MediumHomeView.desktop.kt | 1 + iosApp/Source/App/CompactView.swift | 9 ++- iosApp/Source/App/Drawer/SidebarDrawer.swift | 66 +++++++++++++++---- iosApp/Source/App/RegularView.swift | 9 +++ .../shared/ui/home/components/Drawer.kt | 49 +++++++++++--- 11 files changed, 117 insertions(+), 24 deletions(-) diff --git a/.fleet/settings.json b/.fleet/settings.json index ab1c96bd..3f68adf2 100644 --- a/.fleet/settings.json +++ b/.fleet/settings.json @@ -1,4 +1,4 @@ { - "backend.maxHeapSizeMb": 4553, + "backend.maxHeapSizeMb": 7967, "run.destination.stop.already.running": "Always" } \ No newline at end of file diff --git a/androidApp/src/main/kotlin/com/prof18/feedflow/android/home/bywindowsize/CompactHomeView.android.kt b/androidApp/src/main/kotlin/com/prof18/feedflow/android/home/bywindowsize/CompactHomeView.android.kt index b5de33a3..cd07b271 100644 --- a/androidApp/src/main/kotlin/com/prof18/feedflow/android/home/bywindowsize/CompactHomeView.android.kt +++ b/androidApp/src/main/kotlin/com/prof18/feedflow/android/home/bywindowsize/CompactHomeView.android.kt @@ -103,6 +103,7 @@ internal fun CompactHomeView( Drawer( navDrawerState = navDrawerState, currentFeedFilter = currentFeedFilter, + onAddFeedClicked = onAddFeedClick, onFeedFilterSelected = { feedFilter -> onFeedFilterSelected(feedFilter) scope.launch { diff --git a/androidApp/src/main/kotlin/com/prof18/feedflow/android/home/bywindowsize/ExpandedHomeView.android.kt b/androidApp/src/main/kotlin/com/prof18/feedflow/android/home/bywindowsize/ExpandedHomeView.android.kt index 7ffaee3f..1453e93c 100644 --- a/androidApp/src/main/kotlin/com/prof18/feedflow/android/home/bywindowsize/ExpandedHomeView.android.kt +++ b/androidApp/src/main/kotlin/com/prof18/feedflow/android/home/bywindowsize/ExpandedHomeView.android.kt @@ -70,6 +70,7 @@ internal fun ExpandedHomeView( .padding(paddingValues), navDrawerState = navDrawerState, currentFeedFilter = currentFeedFilter, + onAddFeedClicked = onAddFeedClick, onFeedFilterSelected = { feedFilter -> onFeedFilterSelected(feedFilter) scope.launch { diff --git a/androidApp/src/main/kotlin/com/prof18/feedflow/android/home/bywindowsize/MediumHomeView.android.kt b/androidApp/src/main/kotlin/com/prof18/feedflow/android/home/bywindowsize/MediumHomeView.android.kt index bd910d07..c465cb2c 100644 --- a/androidApp/src/main/kotlin/com/prof18/feedflow/android/home/bywindowsize/MediumHomeView.android.kt +++ b/androidApp/src/main/kotlin/com/prof18/feedflow/android/home/bywindowsize/MediumHomeView.android.kt @@ -79,6 +79,7 @@ internal fun MediumHomeView( .padding(paddingValues), navDrawerState = navDrawerState, currentFeedFilter = currentFeedFilter, + onAddFeedClicked = onAddFeedClick, onFeedFilterSelected = { feedFilter -> onFeedFilterSelected(feedFilter) scope.launch { diff --git a/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/desktop/home/bywindowsize/CompactHomeView.desktop.kt b/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/desktop/home/bywindowsize/CompactHomeView.desktop.kt index eeb7c222..1f1d9d6b 100644 --- a/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/desktop/home/bywindowsize/CompactHomeView.desktop.kt +++ b/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/desktop/home/bywindowsize/CompactHomeView.desktop.kt @@ -92,6 +92,7 @@ internal fun CompactView( Drawer( navDrawerState = navDrawerState, currentFeedFilter = currentFeedFilter, + onAddFeedClicked = onAddFeedClick, onFeedFilterSelected = { feedFilter -> onFeedFilterSelected(feedFilter) scope.launch { diff --git a/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/desktop/home/bywindowsize/ExpandedHomeView.desktop.kt b/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/desktop/home/bywindowsize/ExpandedHomeView.desktop.kt index bbe48133..df27d937 100644 --- a/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/desktop/home/bywindowsize/ExpandedHomeView.desktop.kt +++ b/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/desktop/home/bywindowsize/ExpandedHomeView.desktop.kt @@ -62,6 +62,7 @@ internal fun ExpandedView( .padding(paddingValues), navDrawerState = navDrawerState, currentFeedFilter = currentFeedFilter, + onAddFeedClicked = onAddFeedClick, onFeedFilterSelected = { feedFilter -> onFeedFilterSelected(feedFilter) scope.launch { diff --git a/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/desktop/home/bywindowsize/MediumHomeView.desktop.kt b/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/desktop/home/bywindowsize/MediumHomeView.desktop.kt index 2c244843..1e3ac99a 100644 --- a/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/desktop/home/bywindowsize/MediumHomeView.desktop.kt +++ b/desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/desktop/home/bywindowsize/MediumHomeView.desktop.kt @@ -69,6 +69,7 @@ internal fun MediumView( .padding(paddingValues), navDrawerState = navDrawerState, currentFeedFilter = currentFeedFilter, + onAddFeedClicked = onAddFeedClick, onFeedFilterSelected = { feedFilter -> onFeedFilterSelected(feedFilter) scope.launch { diff --git a/iosApp/Source/App/CompactView.swift b/iosApp/Source/App/CompactView.swift index bf3477c5..cd99755d 100644 --- a/iosApp/Source/App/CompactView.swift +++ b/iosApp/Source/App/CompactView.swift @@ -36,6 +36,8 @@ struct CompactView: View { @State private var browserToOpen: BrowserToPresent? + @State var showAddFeedSheet = false + let homeViewModel: HomeViewModel var body: some View { @@ -63,8 +65,13 @@ struct CompactView: View { }, onShowSettingsClick: { // On compact view it's handled by the home + }, + onAddFeedClick: { + showAddFeedSheet.toggle() } - ) + ).sheet(isPresented: $showAddFeedSheet) { + AddFeedScreen(showCloseButton: true) + } .navigationDestination(for: CompactViewRoute.self) { route in switch route { case .feed: diff --git a/iosApp/Source/App/Drawer/SidebarDrawer.swift b/iosApp/Source/App/Drawer/SidebarDrawer.swift index 498750f5..3a996ef9 100644 --- a/iosApp/Source/App/Drawer/SidebarDrawer.swift +++ b/iosApp/Source/App/Drawer/SidebarDrawer.swift @@ -13,6 +13,8 @@ import NukeUI @MainActor struct SidebarDrawer: View { + @EnvironmentObject var appState: AppState + @Binding var selectedDrawerItem: DrawerItem? let navDrawerState: NavDrawerState @@ -22,6 +24,7 @@ struct SidebarDrawer: View { let onForceRefreshClick: () -> Void let deleteAllFeeds: () -> Void let onShowSettingsClick: () -> Void + let onAddFeedClick: () -> Void var body: some View { List(selection: $selectedDrawerItem) { @@ -107,7 +110,8 @@ struct SidebarDrawer: View { } } } - }, header: { + }, + header: { Text(feedFlowStrings.drawerTitleCategories) } ) @@ -124,8 +128,9 @@ struct SidebarDrawer: View { makeFeedSourceDrawerItem(drawerItem: drawerFeedSource) } } - }, header: { - Text(feedFlowStrings.drawerTitleFeedSources) + }, + header: { + makeAddFeedButton(title: feedFlowStrings.drawerTitleFeedSources) } ) } @@ -149,18 +154,51 @@ struct SidebarDrawer: View { makeCategoryDropdown( drawerItems: navDrawerState.feedSourcesByCategory[categoryWrapper] ?? [], title: title - ) - .accessibilityIdentifier("\(TestingTag.shared.FEED_SOURCE_SELECTOR)_\(title)") - + ).accessibilityIdentifier("\(TestingTag.shared.FEED_SOURCE_SELECTOR)_\(title)") } }, header: { - Text(feedFlowStrings.drawerTitleFeedSources) + makeAddFeedButton(title: feedFlowStrings.drawerTitleFeedSources) } ) } } + @ViewBuilder + private func makeAddFeedButton(title: String) -> some View { + HStack { + Text(title) + Spacer() + Button( + action: { + onAddFeedClick() + }, + label: { + Image(systemName: "plus.app") + } + ) + } + .if(appState.sizeClass == .compact) { view in + view.listRowInsets( + EdgeInsets( + top: Spacing.small, + leading: Spacing.small, + bottom: Spacing.small, + trailing: Spacing.small + ) + ) + }.if(appState.sizeClass == .regular) { view in + view.listRowInsets( + EdgeInsets( + top: Spacing.small, + leading: Spacing.small, + bottom: Spacing.small, + trailing: -Spacing.xsmall + ) + ) + } + } + @ViewBuilder private func makeFeedSourceDrawerItem(drawerItem: DrawerItem.DrawerFeedSource) -> some View { HStack { @@ -193,8 +231,7 @@ struct SidebarDrawer: View { .contentShape(Rectangle()) .onTapGesture { self.selectedDrawerItem = drawerItem - self.onFeedFilterSelected( FeedFilter.Source(feedSource: drawerItem.feedSource ) - ) + self.onFeedFilterSelected(FeedFilter.Source(feedSource: drawerItem.feedSource)) } } @@ -268,10 +305,11 @@ struct SidebarDrawer: View { selectedDrawerItem: .constant(nil), navDrawerState: PreviewItemsKt.navDrawerState, onFeedFilterSelected: { _ in }, - onMarkAllReadClick: { }, - onDeleteOldFeedClick: { }, - onForceRefreshClick: { }, - deleteAllFeeds: { }, - onShowSettingsClick: { } + onMarkAllReadClick: {}, + onDeleteOldFeedClick: {}, + onForceRefreshClick: {}, + deleteAllFeeds: {}, + onShowSettingsClick: {}, + onAddFeedClick: {} ) } diff --git a/iosApp/Source/App/RegularView.swift b/iosApp/Source/App/RegularView.swift index 370502ab..4dbcf589 100644 --- a/iosApp/Source/App/RegularView.swift +++ b/iosApp/Source/App/RegularView.swift @@ -34,6 +34,8 @@ struct RegularView: View { @State var showSettings: Bool = false @State private var browserToOpen: BrowserToPresent? + @State var showAddFeedSheet = false + var drawerItems: [DrawerItem] = [] let homeViewModel: HomeViewModel @@ -62,6 +64,10 @@ struct RegularView: View { }, onShowSettingsClick: { showSettings.toggle() + }, + onAddFeedClick: { + // TODO: open the add + showAddFeedSheet.toggle() } ) .navigationBarTitleDisplayMode(.inline) @@ -105,6 +111,9 @@ struct RegularView: View { } } } + .sheet(isPresented: $showAddFeedSheet) { + AddFeedScreen(showCloseButton: true) + } .navigationSplitViewStyle(.balanced) .task { do { diff --git a/sharedUI/src/commonMain/kotlin/com/prof18/feedflow/shared/ui/home/components/Drawer.kt b/sharedUI/src/commonMain/kotlin/com/prof18/feedflow/shared/ui/home/components/Drawer.kt index 98e80ed3..9dc43086 100644 --- a/sharedUI/src/commonMain/kotlin/com/prof18/feedflow/shared/ui/home/components/Drawer.kt +++ b/sharedUI/src/commonMain/kotlin/com/prof18/feedflow/shared/ui/home/components/Drawer.kt @@ -16,13 +16,15 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.Feed +import androidx.compose.material.icons.automirrored.filled.Label +import androidx.compose.material.icons.automirrored.filled.PlaylistAddCheck import androidx.compose.material.icons.automirrored.rounded.KeyboardArrowRight +import androidx.compose.material.icons.filled.AddCircleOutline import androidx.compose.material.icons.filled.Bookmarks import androidx.compose.material.icons.filled.Category -import androidx.compose.material.icons.filled.Feed -import androidx.compose.material.icons.filled.Label -import androidx.compose.material.icons.filled.PlaylistAddCheck -import androidx.compose.material3.Divider +import androidx.compose.material.icons.outlined.AddCircleOutline +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.NavigationDrawerItem @@ -57,6 +59,7 @@ fun Drawer( navDrawerState: NavDrawerState, currentFeedFilter: FeedFilter, onFeedFilterSelected: (FeedFilter) -> Unit, + onAddFeedClicked: () -> Unit, modifier: Modifier = Modifier, ) { LazyColumn( @@ -87,6 +90,12 @@ fun Drawer( ) } + item { + DrawerAddItem( + onAddFeedClicked = onAddFeedClicked, + ) + } + if (navDrawerState.categories.isNotEmpty()) { item { DrawerDivider() @@ -117,7 +126,7 @@ fun Drawer( @Composable private fun DrawerDivider() { - Divider( + HorizontalDivider( modifier = Modifier .padding(vertical = Spacing.regular), thickness = 0.2.dp, @@ -139,7 +148,7 @@ private fun DrawerTimelineItem( }, icon = { Icon( - imageVector = Icons.Default.Feed, + imageVector = Icons.AutoMirrored.Filled.Feed, contentDescription = null, ) }, @@ -164,7 +173,7 @@ private fun DrawerReadItem( }, icon = { Icon( - imageVector = Icons.Default.PlaylistAddCheck, + imageVector = Icons.AutoMirrored.Filled.PlaylistAddCheck, contentDescription = null, ) }, @@ -200,6 +209,30 @@ private fun DrawerBookmarksItem( ) } +@Composable +private fun DrawerAddItem( + onAddFeedClicked: () -> Unit, +) { + NavigationDrawerItem( + selected = false, + label = { + Text( + text = "Add Feed", + ) + }, + icon = { + Icon( + imageVector = Icons.Default.AddCircleOutline, + contentDescription = null, + ) + }, + colors = NavigationDrawerItemDefaults.colors(unselectedContainerColor = Color.Transparent), + onClick = { + onAddFeedClicked() + }, + ) +} + @Composable private fun DrawerCategoriesSection( navDrawerState: NavDrawerState, @@ -241,7 +274,7 @@ private fun DrawerCategoryItem( }, icon = { Icon( - imageVector = Icons.Default.Label, + imageVector = Icons.AutoMirrored.Filled.Label, contentDescription = null, ) },