From 7fc7bedf9e9eba155d469fccf44f1efbba25d2e9 Mon Sep 17 00:00:00 2001 From: Alex Faber Date: Sat, 4 Jul 2020 15:36:41 +0200 Subject: [PATCH] NEW: Add Folder functionality in SwiftUI --- Multiplatform/Shared/Add/AddFolderModel.swift | 51 +++++++ Multiplatform/Shared/Add/AddFolderView.swift | 127 ++++++++++++++++++ .../Shared/Sidebar/SidebarToolbar.swift | 5 +- NetNewsWire.xcodeproj/project.pbxproj | 12 ++ 4 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 Multiplatform/Shared/Add/AddFolderModel.swift create mode 100644 Multiplatform/Shared/Add/AddFolderView.swift diff --git a/Multiplatform/Shared/Add/AddFolderModel.swift b/Multiplatform/Shared/Add/AddFolderModel.swift new file mode 100644 index 000000000..57da82f7e --- /dev/null +++ b/Multiplatform/Shared/Add/AddFolderModel.swift @@ -0,0 +1,51 @@ +// +// AddFolderModel.swift +// NetNewsWire +// +// Created by Alex Faber on 04/07/2020. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import Foundation +import Account +import RSCore +import SwiftUI + + +class AddFolderModel: ObservableObject { + + @Published var shouldDismiss: Bool = false + @Published var folderName: String = "" + @Published var selectedAccountIndex: Int = 0 + @Published var accounts: [Account] = [] + + @Published var showError: Bool = false + @Published var showProgressIndicator: Bool = false + + init() { + for account in + AccountManager.shared.sortedActiveAccounts{ + accounts.append(account) + } + } + + func addFolder() { + let account = accounts[selectedAccountIndex] + + showProgressIndicator = true + + account.addFolder(folderName){ result in + self.showProgressIndicator = false + + switch result { + case .success(_): + self.shouldDismiss = true + + case .failure(let error): + print("Error") + print(error) + } + + } + } +} diff --git a/Multiplatform/Shared/Add/AddFolderView.swift b/Multiplatform/Shared/Add/AddFolderView.swift new file mode 100644 index 000000000..d53b18a29 --- /dev/null +++ b/Multiplatform/Shared/Add/AddFolderView.swift @@ -0,0 +1,127 @@ +// +// AddFolderView.swift +// NetNewsWire +// +// Created by Alex Faber on 04/07/2020. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import SwiftUI +import Account +import RSCore + +struct AddFolderView: View { + + @Environment(\.presentationMode) private var presentationMode + @ObservedObject private var viewModel = AddFolderModel() + + @ViewBuilder var body: some View { + #if os(iOS) + iosForm + .onReceive(viewModel.$shouldDismiss, perform: { + dismiss in + if dismiss == true { + presentationMode + .wrappedValue + .dismiss() + } + }) + #else + macForm + .onReceive(viewModel.$shouldDismiss, perform: { dismiss in + if dismiss == true { + presentationMode.wrappedValue.dismiss() + } + }) + #endif + } + #if os(iOS) + @ViewBuilder var iosForm: some View { + NavigationView { + Form { + Section { + TextField("Name", text: $viewModel.folderName) + } + Section { + accountPicker + } + } + .navigationTitle("Add Folder") + .navigationBarTitleDisplayMode(.inline) + .navigationBarItems( + leading:Button("Cancel", action: { + presentationMode.wrappedValue.dismiss() + } + ) + .help("Cancel Adding Folder"), + trailing:Button("Add", action: { + viewModel.addFolder() + } + ) + .disabled(viewModel.folderName.isEmpty) + .help("Save Adding Folder") + ) + + } + } + #endif + + #if os(macOS) + @ViewBuilder var macForm: some View { + Form { + HStack { + Spacer() + Image("FaviconTemplateImage") + .resizable() + .renderingMode(.template) + .frame(width: 30, height: 30) + .foregroundColor(.accentColor).font(.title) + Text("Add a Folder") + .font(.title) + Spacer() + } + TextField("Name", text: $viewModel.folderName) + .textFieldStyle(RoundedBorderTextFieldStyle()) + .help("The name of the folder you want to create") + accountPicker + .help("Pick the account you want to create a folder in.") + buttonStack + } + } + #endif + + var accountPicker: some View { + Picker("Account:", selection: $viewModel.selectedAccountIndex, content: { + ForEach(0..