WIP - Complete App refactoring
This commit is contained in:
@@ -8,36 +8,34 @@
|
||||
import Foundation
|
||||
import SwiftUI
|
||||
|
||||
|
||||
/*
|
||||
struct GroceryListTabView: View {
|
||||
@EnvironmentObject var groceryList: GroceryList
|
||||
@Environment(CookbookState.self) var cookbookState
|
||||
|
||||
var body: some View {
|
||||
NavigationStack {
|
||||
if groceryList.groceryDict.isEmpty {
|
||||
if cookbookState.groceryList.groceryDict.isEmpty {
|
||||
EmptyGroceryListView()
|
||||
} else {
|
||||
List {
|
||||
ForEach(groceryList.groceryDict.keys.sorted(), id: \.self) { key in
|
||||
ForEach(cookbookState.groceryList.groceryDict.keys.sorted(), id: \.self) { key in
|
||||
Section {
|
||||
ForEach(groceryList.groceryDict[key]!.items) { item in
|
||||
ForEach(cookbookState.groceryList.groceryDict[key]!.items) { item in
|
||||
GroceryListItemView(item: item, toggleAction: {
|
||||
groceryList.toggleItemChecked(item)
|
||||
groceryList.objectWillChange.send()
|
||||
cookbookState.groceryList.toggleItemChecked(item)
|
||||
}, deleteAction: {
|
||||
groceryList.deleteItem(item.name, fromRecipe: key)
|
||||
withAnimation {
|
||||
groceryList.objectWillChange.send()
|
||||
cookbookState.groceryList.deleteItem(item.name, fromRecipe: key)
|
||||
}
|
||||
})
|
||||
}
|
||||
} header: {
|
||||
HStack {
|
||||
Text(groceryList.groceryDict[key]!.name)
|
||||
Text(cookbookState.groceryList.groceryDict[key]!.name)
|
||||
.foregroundStyle(Color.nextcloudBlue)
|
||||
Spacer()
|
||||
Button {
|
||||
groceryList.deleteGroceryRecipe(key)
|
||||
cookbookState.groceryList.deleteGroceryRecipe(key)
|
||||
} label: {
|
||||
Image(systemName: "trash")
|
||||
.foregroundStyle(Color.nextcloudBlue)
|
||||
@@ -51,7 +49,7 @@ struct GroceryListTabView: View {
|
||||
.navigationTitle("Grocery List")
|
||||
.toolbar {
|
||||
Button {
|
||||
groceryList.deleteAll()
|
||||
cookbookState.groceryList.deleteAll()
|
||||
} label: {
|
||||
Text("Delete")
|
||||
.foregroundStyle(Color.nextcloudBlue)
|
||||
@@ -143,25 +141,22 @@ class GroceryRecipeItem: Identifiable, Codable {
|
||||
|
||||
|
||||
|
||||
@MainActor class GroceryList: ObservableObject {
|
||||
@Observable class GroceryList {
|
||||
let dataStore: DataStore = DataStore()
|
||||
@Published var groceryDict: [String: GroceryRecipe] = [:]
|
||||
@Published var sortBySimilarity: Bool = false
|
||||
var groceryDict: [String: GroceryRecipe] = [:]
|
||||
var sortBySimilarity: Bool = false
|
||||
|
||||
|
||||
func addItem(_ itemName: String, toRecipe recipeId: String, recipeName: String? = nil, saveGroceryDict: Bool = true) {
|
||||
print("Adding item of recipe \(String(describing: recipeName))")
|
||||
DispatchQueue.main.async {
|
||||
if self.groceryDict[recipeId] != nil {
|
||||
self.groceryDict[recipeId]?.items.append(GroceryRecipeItem(itemName))
|
||||
} else {
|
||||
let newRecipe = GroceryRecipe(name: recipeName ?? "-", items: [GroceryRecipeItem(itemName)])
|
||||
self.groceryDict[recipeId] = newRecipe
|
||||
}
|
||||
if saveGroceryDict {
|
||||
self.save()
|
||||
self.objectWillChange.send()
|
||||
}
|
||||
if self.groceryDict[recipeId] != nil {
|
||||
self.groceryDict[recipeId]?.items.append(GroceryRecipeItem(itemName))
|
||||
} else {
|
||||
let newRecipe = GroceryRecipe(name: recipeName ?? "-", items: [GroceryRecipeItem(itemName)])
|
||||
self.groceryDict[recipeId] = newRecipe
|
||||
}
|
||||
if saveGroceryDict {
|
||||
self.save()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -170,7 +165,6 @@ class GroceryRecipeItem: Identifiable, Codable {
|
||||
addItem(item, toRecipe: recipeId, recipeName: recipeName, saveGroceryDict: false)
|
||||
}
|
||||
save()
|
||||
objectWillChange.send()
|
||||
}
|
||||
|
||||
func deleteItem(_ itemName: String, fromRecipe recipeId: String) {
|
||||
@@ -182,14 +176,12 @@ class GroceryRecipeItem: Identifiable, Codable {
|
||||
groceryDict.removeValue(forKey: recipeId)
|
||||
}
|
||||
save()
|
||||
objectWillChange.send()
|
||||
}
|
||||
|
||||
func deleteGroceryRecipe(_ recipeId: String) {
|
||||
print("Deleting grocery recipe with id \(recipeId)")
|
||||
groceryDict.removeValue(forKey: recipeId)
|
||||
save()
|
||||
objectWillChange.send()
|
||||
}
|
||||
|
||||
func deleteAll() {
|
||||
@@ -234,4 +226,4 @@ class GroceryRecipeItem: Identifiable, Codable {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
*/
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
import Foundation
|
||||
import SwiftUI
|
||||
|
||||
|
||||
/*
|
||||
struct RecipeTabView: View {
|
||||
@EnvironmentObject var appState: AppState
|
||||
@EnvironmentObject var groceryList: GroceryList
|
||||
@@ -179,3 +179,5 @@ fileprivate struct RecipeTabViewToolBar: ToolbarContent {
|
||||
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
import Foundation
|
||||
import SwiftUI
|
||||
|
||||
/*
|
||||
struct SearchTabView: View {
|
||||
@EnvironmentObject var viewModel: SearchTabView.ViewModel
|
||||
@EnvironmentObject var appState: AppState
|
||||
@@ -30,7 +30,7 @@ struct SearchTabView: View {
|
||||
.listRowSeparatorTint(.clear)
|
||||
}
|
||||
.listStyle(.plain)
|
||||
.navigationDestination(for: Recipe.self) { recipe in
|
||||
.navigationDestination(for: CookbookApiRecipeV1.self) { recipe in
|
||||
RecipeView(viewModel: RecipeView.ViewModel(recipe: recipe))
|
||||
}
|
||||
.searchable(text: $viewModel.searchText, prompt: "Search recipes/keywords")
|
||||
@@ -48,7 +48,7 @@ struct SearchTabView: View {
|
||||
}
|
||||
|
||||
class ViewModel: ObservableObject {
|
||||
@Published var allRecipes: [Recipe] = []
|
||||
@Published var allRecipes: [CookbookApiRecipeV1] = []
|
||||
@Published var searchText: String = ""
|
||||
@Published var searchMode: SearchMode = .name
|
||||
|
||||
@@ -58,7 +58,7 @@ struct SearchTabView: View {
|
||||
case name = "Name & Keywords", ingredient = "Ingredients"
|
||||
}
|
||||
|
||||
func recipesFiltered() -> [Recipe] {
|
||||
func recipesFiltered() -> [CookbookApiRecipeV1] {
|
||||
if searchMode == .name {
|
||||
guard searchText != "" else { return allRecipes }
|
||||
return allRecipes.filter { recipe in
|
||||
@@ -72,3 +72,4 @@ struct SearchTabView: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user