Merge pull request #221 from omnivore-app/feature/grid-toggle

iPad grid/list toggle
This commit is contained in:
Satindar Dhillon
2022-03-11 10:21:07 -08:00
committed by GitHub
2 changed files with 42 additions and 26 deletions

View File

@ -8,8 +8,8 @@ import Views
#if os(iOS)
struct HomeFeedContainerView: View {
let isCompact: Bool
@EnvironmentObject var dataService: DataService
@State private var prefersListLayout = UIDevice.isIPhone
@State private var searchQuery = ""
@State private var snoozePresented = false
@State private var itemToSnooze: FeedItem?
@ -20,7 +20,7 @@ import Views
Group {
if #available(iOS 15.0, *) {
HomeFeedView(
isCompact: isCompact,
prefersListLayout: $prefersListLayout,
searchQuery: $searchQuery,
selectedLinkItem: $selectedLinkItem,
snoozePresented: $snoozePresented,
@ -51,7 +51,7 @@ import Views
}
} else {
HomeFeedView(
isCompact: isCompact,
prefersListLayout: $prefersListLayout,
searchQuery: $searchQuery,
selectedLinkItem: $selectedLinkItem,
snoozePresented: $snoozePresented,
@ -102,7 +102,7 @@ import Views
struct HomeFeedView: View {
@EnvironmentObject var dataService: DataService
let isCompact: Bool
@Binding var prefersListLayout: Bool
@Binding var searchQuery: String
@Binding var selectedLinkItem: FeedItem?
@Binding var snoozePresented: Bool
@ -111,8 +111,9 @@ import Views
@ObservedObject var viewModel: HomeFeedViewModel
var body: some View {
if isCompact {
if prefersListLayout {
HomeFeedListView(
prefersListLayout: $prefersListLayout,
searchQuery: $searchQuery,
selectedLinkItem: $selectedLinkItem,
snoozePresented: $snoozePresented,
@ -130,19 +131,13 @@ import Views
.toolbar {
ToolbarItem {
if #available(iOS 15.0, *) {
Button(
action: {
viewModel.loadItems(dataService: dataService, searchQuery: searchQuery, isRefresh: true)
},
label: { Label("Refresh Feed", systemImage: "arrow.clockwise") }
)
.disabled(viewModel.isLoading)
.opacity(viewModel.isLoading ? 0 : 1)
.overlay {
if viewModel.isLoading {
ProgressView()
Button("", action: {})
.disabled(true)
.overlay {
if viewModel.isLoading {
ProgressView()
}
}
}
} else {
Button(
action: {
@ -152,6 +147,16 @@ import Views
)
}
}
ToolbarItem {
if UIDevice.isIPad {
Button(
action: { prefersListLayout.toggle() },
label: {
Label("Toggle Feed Layout", systemImage: prefersListLayout ? "square.grid.2x2" : "list.bullet")
}
)
}
}
}
}
}
@ -159,6 +164,7 @@ import Views
struct HomeFeedListView: View {
@EnvironmentObject var dataService: DataService
@Binding var prefersListLayout: Bool
@Binding var searchQuery: String
@Binding var selectedLinkItem: FeedItem?
@Binding var snoozePresented: Bool
@ -270,6 +276,18 @@ import Views
}
}
.listStyle(PlainListStyle())
.toolbar {
ToolbarItem {
if UIDevice.isIPad {
Button(
action: { prefersListLayout.toggle() },
label: {
Label("Toggle Feed Layout", systemImage: prefersListLayout ? "square.grid.2x2" : "list.bullet")
}
)
}
}
}
.onAppear {
viewModel.sendProgressUpdates = false
}
@ -289,8 +307,6 @@ import Views
@ObservedObject var viewModel: HomeFeedViewModel
private let columns = Array(repeating: GridItem(.flexible(), spacing: 20), count: 2)
func contextMenuActionHandler(item: FeedItem, action: GridCardAction) {
switch action {
case .toggleArchiveStatus:
@ -303,7 +319,7 @@ import Views
var body: some View {
ScrollView {
LazyVGrid(columns: columns, spacing: 20) {
LazyVGrid(columns: [GridItem(.adaptive(minimum: 325), spacing: 24)], spacing: 24) {
ForEach(viewModel.items, id: \.renderID) { item in
let link = GridCardNavigationLink(
item: item,
@ -341,8 +357,10 @@ import Views
}
)
.onPreferenceChange(ScrollViewOffsetPreferenceKey.self) { offset in
if !viewModel.isLoading, offset > 240 {
viewModel.loadItems(dataService: dataService, searchQuery: searchQuery, isRefresh: true)
DispatchQueue.main.async {
if !viewModel.isLoading, offset > 240 {
viewModel.loadItems(dataService: dataService, searchQuery: searchQuery, isRefresh: true)
}
}
}

View File

@ -7,7 +7,7 @@ struct HomeView: View {
#if os(iOS)
if UIDevice.isIPhone {
NavigationView {
HomeFeedContainerView(isCompact: true, viewModel: viewModel)
HomeFeedContainerView(viewModel: viewModel)
.toolbar {
ToolbarItem {
NavigationLink(
@ -24,9 +24,7 @@ struct HomeView: View {
}
.accentColor(.appGrayTextContrast)
} else {
GeometryReader { _ in
HomeFeedContainerView(isCompact: UIDevice.isIPhone, viewModel: viewModel)
}
HomeFeedContainerView(viewModel: viewModel)
}
#elseif os(macOS)
HomeFeedView(viewModel: viewModel)