diff --git a/MenuHelper.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/MenuHelper.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 3bb25b2..798ba16 100644 --- a/MenuHelper.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/MenuHelper.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -14,8 +14,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/sindresorhus/Settings.git", "state" : { - "revision" : "c677bea28d92684911f93530d0b5f4c40eea743b", - "version" : "3.0.5" + "revision" : "2f4f65eed252198be383aa0d9058bbaf8f740aa5", + "version" : "3.1.0" } }, { diff --git a/MenuHelper/Store/CoffieStoreView.swift b/MenuHelper/Store/CoffieStoreView.swift index b04a1fe..6cac2b3 100644 --- a/MenuHelper/Store/CoffieStoreView.swift +++ b/MenuHelper/Store/CoffieStoreView.swift @@ -9,7 +9,7 @@ import StoreKit import SwiftUI struct CoffieStoreView: View { - @EnvironmentObject var store: Store + @Environment(Store.self) var store let coffies: [Product] let onPurchase: (Product) -> Void @@ -51,6 +51,6 @@ struct CoffieStoreView_Previews: PreviewProvider { CoffieStoreView(coffies: []) { print($0.displayName + $0.displayPrice) } - .environmentObject(Store()) + .environment(Store()) } } diff --git a/MenuHelper/Store/CoffieView.swift b/MenuHelper/Store/CoffieView.swift index 5732cb3..3e55a20 100644 --- a/MenuHelper/Store/CoffieView.swift +++ b/MenuHelper/Store/CoffieView.swift @@ -10,7 +10,7 @@ import SwiftUI struct CoffieView: View { @Environment(\.colorScheme) var colorScheme - @EnvironmentObject var store: Store + @Environment(Store.self) var store @State private var errorTitle = "" @State private var isShowingError = false diff --git a/MenuHelper/Store/Store.swift b/MenuHelper/Store/Store.swift index 8fecc92..9622eda 100644 --- a/MenuHelper/Store/Store.swift +++ b/MenuHelper/Store/Store.swift @@ -15,9 +15,10 @@ enum StoreError: Error { case failedVerification } -class Store: ObservableObject { - @Published private(set) var coffies: [Product] = [] - @Published private(set) var purchased = false +@Observable +final class Store { + private(set) var coffies: [Product] = [] + private(set) var purchased = false var updateListenerTask: Task? private let storage = NSUbiquitousKeyValueStore.default diff --git a/MenuHelper/View/AppMenuItemView.swift b/MenuHelper/View/AppMenuItemView.swift index 1670635..5cc1256 100644 --- a/MenuHelper/View/AppMenuItemView.swift +++ b/MenuHelper/View/AppMenuItemView.swift @@ -8,7 +8,7 @@ import SwiftUI struct AppMenuItemView: View { - @EnvironmentObject var store: MenuItemStore + @Environment(MenuItemStore.self) var store @State private var editingItem = false var item: AppMenuItem @@ -29,7 +29,7 @@ struct AppMenuItemView: View { } .sheet(isPresented: $editingItem, onDismiss: nil) { AppMenuItemEditor(item: item, index: store.appItems.firstIndex(of: item)) - .environmentObject(store) + .environment(store) } } } @@ -37,6 +37,6 @@ struct AppMenuItemView: View { struct AppMenuItemView_Previews: PreviewProvider { static var previews: some View { AppMenuItemView(item: .xcode!) - .environmentObject(MenuItemStore()) + .environment(MenuItemStore()) } } diff --git a/MenuHelper/View/Editor/AppMenuItemEditor.swift b/MenuHelper/View/Editor/AppMenuItemEditor.swift index 8b06c3c..fc45157 100644 --- a/MenuHelper/View/Editor/AppMenuItemEditor.swift +++ b/MenuHelper/View/Editor/AppMenuItemEditor.swift @@ -9,7 +9,7 @@ import SwiftUI struct AppMenuItemEditor: View { @Environment(\.dismiss) private var dismiss - @EnvironmentObject var store: MenuItemStore + @Environment(MenuItemStore.self) private var store @State var item: AppMenuItem @State private var argumentString: String = "" @@ -98,6 +98,6 @@ struct AppMenuItemEditor: View { struct AppMenuItemEditor_Previews: PreviewProvider { static var previews: some View { AppMenuItemEditor(item: AppMenuItem(bundleIdentifier: "com.apple.dt.Xcode")!) - .environmentObject(MenuItemStore()) + .environment(MenuItemStore()) } } diff --git a/MenuHelper/View/SettingView/FolderSettingTab.swift b/MenuHelper/View/SettingView/FolderSettingTab.swift index 1be3175..b5be24e 100644 --- a/MenuHelper/View/SettingView/FolderSettingTab.swift +++ b/MenuHelper/View/SettingView/FolderSettingTab.swift @@ -10,7 +10,7 @@ import enum Settings.Settings import SwiftUI struct FolderSettingTab: View { - @ObservedObject var store: FolderItemStore + var store: FolderItemStore @State private var isExpanded = false var body: some View { @@ -25,6 +25,7 @@ struct FolderSettingTab: View { } } + @MainActor var openSection: Settings.Section { Settings.Section(bottomDivider: true, verticalAlignment: .top) { EmptyView() @@ -77,6 +78,7 @@ struct FolderSettingTab: View { } } + @MainActor var syncSection: Settings.Section { Settings.Section { EmptyView() diff --git a/MenuHelper/View/SettingView/GeneralSettingTab.swift b/MenuHelper/View/SettingView/GeneralSettingTab.swift index 0f6e4e6..c50df33 100644 --- a/MenuHelper/View/SettingView/GeneralSettingTab.swift +++ b/MenuHelper/View/SettingView/GeneralSettingTab.swift @@ -74,7 +74,7 @@ struct GeneralSettingTab: View { @AppStorage(Key.newFileExtension) private var newFileExtension = NewFileExtension.none - @ObservedObject var menuItemStore: MenuItemStore + var menuItemStore: MenuItemStore @State private var model = GeneralSettingTabState() diff --git a/MenuHelper/View/SettingView/MenuSettingTab.swift b/MenuHelper/View/SettingView/MenuSettingTab.swift index 41aafdc..73b9f8e 100644 --- a/MenuHelper/View/SettingView/MenuSettingTab.swift +++ b/MenuHelper/View/SettingView/MenuSettingTab.swift @@ -37,7 +37,7 @@ class MenuSettingTabState { } struct MenuSettingTab: View { - @ObservedObject var store: MenuItemStore + var store: MenuItemStore @State private var isDrogTargeted = false @State private var appMenuItemEdited = false @@ -50,6 +50,7 @@ struct MenuSettingTab: View { } } + @MainActor var appItemSection: Settings.Section { Settings.Section(bottomDivider: true, verticalAlignment: .top) { EmptyView() @@ -78,7 +79,7 @@ struct MenuSettingTab: View { } ForEach(store.appItems) { item in AppMenuItemView(item: item) - .environmentObject(store) + .environment(store) } .onDelete { store.deleteAppItems(offsets: $0) } .onMove { store.moveAppItems(from: $0, to: $1) } @@ -103,6 +104,7 @@ struct MenuSettingTab: View { } } + @MainActor var actionItemSection: Settings.Section { Settings.Section { EmptyView() diff --git a/MenuHelper/View/SettingView/SettingView.swift b/MenuHelper/View/SettingView/SettingView.swift index 1917d98..9c9e99a 100644 --- a/MenuHelper/View/SettingView/SettingView.swift +++ b/MenuHelper/View/SettingView/SettingView.swift @@ -8,8 +8,8 @@ import SwiftUI struct SettingView: View { - @StateObject var menuItemStore = MenuItemStore() - @StateObject var folderItemStore = FolderItemStore() + @State var menuItemStore = MenuItemStore() + @State var folderItemStore = FolderItemStore() var body: some View { TabView { diff --git a/MenuHelper/Windows/SupportWindow.swift b/MenuHelper/Windows/SupportWindow.swift index be9a034..a4f879e 100644 --- a/MenuHelper/Windows/SupportWindow.swift +++ b/MenuHelper/Windows/SupportWindow.swift @@ -9,11 +9,11 @@ import Foundation import SwiftUI struct SupportWindow: View { - @StateObject var store = Store() + @State var store = Store() var body: some View { CoffieStoreView(coffies: store.coffies) { _ in } - .environmentObject(store) + .environment(store) } } diff --git a/Shared/ViewModel/FolderItemStore.swift b/Shared/ViewModel/FolderItemStore.swift index 77b7041..7f04769 100644 --- a/Shared/ViewModel/FolderItemStore.swift +++ b/Shared/ViewModel/FolderItemStore.swift @@ -12,9 +12,10 @@ import SwiftUI private let logger = Logger(subsystem: subsystem, category: "folder_item_store") -class FolderItemStore: ObservableObject { - @Published private(set) var bookmarkItems: [BookmarkFolderItem] = [] - @Published private(set) var syncItems: [SyncFolderItem] = [] +@Observable +final class FolderItemStore: Sendable { + private(set) var bookmarkItems: [BookmarkFolderItem] = [] + private(set) var syncItems: [SyncFolderItem] = [] // MARK: - Init @@ -82,23 +83,28 @@ class FolderItemStore: ObservableObject { try? save() } - @MainActor func deleteAllBookmarkItems() { + func deleteAllBookmarkItems() { withAnimation { bookmarkItems.removeAll() } - try? save() + Task.detached { + try await self.save() + } } - @MainActor func deleteAllSyncItems() { + func deleteAllSyncItems() { withAnimation { syncItems.removeAll() } - try? save() + Task.detached { + try await self.save() + } } // MARK: - UserDefaults - @MainActor private func load() throws { + @MainActor + private func load() throws { if let bookmarkItemData = UserDefaults.group.data(forKey: "BOOKMARK_ITEMS"), let syncItemData = UserDefaults.group.data(forKey: "SYNC_ITEMS") { let decoder = PropertyListDecoder() @@ -115,6 +121,7 @@ class FolderItemStore: ObservableObject { } } + @MainActor private func save() throws { let encoder = PropertyListEncoder() let bookmarkItemData = try encoder.encode(OrderedSet(bookmarkItems)) diff --git a/Shared/ViewModel/MenuItemStore.swift b/Shared/ViewModel/MenuItemStore.swift index c13834e..cf51a31 100644 --- a/Shared/ViewModel/MenuItemStore.swift +++ b/Shared/ViewModel/MenuItemStore.swift @@ -8,9 +8,10 @@ import OrderedCollections import SwiftUI -@MainActor class MenuItemStore: ObservableObject { - @Published private(set) var appItems: [AppMenuItem] = [] - @Published private(set) var actionItems: [ActionMenuItem] = [] +@Observable +class MenuItemStore { + private(set) var appItems: [AppMenuItem] = [] + private(set) var actionItems: [ActionMenuItem] = [] // MARK: - Init