diff options
| author | Fuwn <[email protected]> | 2026-04-01 13:59:52 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-04-01 13:59:52 +0000 |
| commit | ddaa9cbfe0cc8d254d4901ad192918d91dd627d4 (patch) | |
| tree | b0d1cf6642ae97ce41ff570f2bcd4a06b359685e /Sora/Views/MainView.swift | |
| parent | Fix iOS install recipe app path resolution (diff) | |
| download | sora-testing-ddaa9cbfe0cc8d254d4901ad192918d91dd627d4.tar.xz sora-testing-ddaa9cbfe0cc8d254d4901ad192918d91dd627d4.zip | |
Migrate settings manager to Swift Observation
Diffstat (limited to 'Sora/Views/MainView.swift')
| -rw-r--r-- | Sora/Views/MainView.swift | 74 |
1 files changed, 45 insertions, 29 deletions
diff --git a/Sora/Views/MainView.swift b/Sora/Views/MainView.swift index 06e067b..834b192 100644 --- a/Sora/Views/MainView.swift +++ b/Sora/Views/MainView.swift @@ -1,6 +1,14 @@ import SwiftUI struct MainView: View { + private struct ManagerConfiguration: Equatable { + let provider: BooruProvider + let credentials: BooruProviderCredentials? + let sendUserAgent: Bool + let customUserAgent: String + let showHeldMoebooruPosts: Bool + } + private enum MainSidebarSection: Int, CaseIterable, Hashable { case posts = 0 case bookmarks = 1 @@ -33,28 +41,34 @@ struct MainView: View { } } - @EnvironmentObject var settings: SettingsManager + @Environment(SettingsManager.self) + private var settings @State private var selectedTab: Int = 0 @State private var selectedSidebarSection: MainSidebarSection? = .posts @State private var manager = BooruManager(.yandere) + private var managerConfiguration: ManagerConfiguration { + ManagerConfiguration( + provider: settings.preferredBooru, + credentials: settings.providerCredentials + .first { $0.provider == settings.preferredBooru }, + sendUserAgent: settings.sendBooruUserAgent, + customUserAgent: settings.customBooruUserAgent, + showHeldMoebooruPosts: settings.showHeldMoebooruPosts + ) + } + var body: some View { platformSpecificContent - .environmentObject(settings) + .environment(settings) .environmentObject(manager) - .onChange(of: settings.preferredBooru) { _, newState in - updateManager(newState) + .onChange(of: managerConfiguration) { _, newConfiguration in + updateManager(using: newConfiguration) } .onChange(of: manager.historyIndex) { _, _ in - if manager.isNavigatingHistory { - manager.selectedPost = nil - } + handleHistoryIndexChange() } .onAppear(perform: initializeManager) - .onChange(of: settings.providerCredentials) { updateManager(settings.preferredBooru) } - .onChange(of: settings.showHeldMoebooruPosts) { updateManager(settings.preferredBooru) } - .onChange(of: settings.sendBooruUserAgent) { updateManager(settings.preferredBooru) } - .onChange(of: settings.customBooruUserAgent) { updateManager(settings.preferredBooru) } #if os(macOS) .onChange(of: selectedSidebarSection) { _, newValue in guard let newValue else { return } @@ -159,17 +173,26 @@ struct MainView: View { #endif } - private func updateManager(_ provider: BooruProvider) { - let previousSearchText = manager.searchText + private func handleHistoryIndexChange() { + if manager.isNavigatingHistory { + manager.selectedPost = nil + } + } - manager = BooruManager( - provider, - credentials: settings.providerCredentials - .first { $0.provider == settings.preferredBooru }, - sendUserAgent: settings.sendBooruUserAgent, - customUserAgent: settings.customBooruUserAgent, - showHeldMoebooruPosts: settings.showHeldMoebooruPosts + private func makeManager(from configuration: ManagerConfiguration) -> BooruManager { + BooruManager( + configuration.provider, + credentials: configuration.credentials, + sendUserAgent: configuration.sendUserAgent, + customUserAgent: configuration.customUserAgent, + showHeldMoebooruPosts: configuration.showHeldMoebooruPosts ) + } + + private func updateManager(using configuration: ManagerConfiguration) { + let previousSearchText = manager.searchText + + manager = makeManager(from: configuration) manager.searchText = previousSearchText Task(priority: .userInitiated) { @@ -182,14 +205,7 @@ struct MainView: View { } private func initializeManager() { - manager = BooruManager( - settings.preferredBooru, - credentials: settings.providerCredentials - .first { $0.provider == settings.preferredBooru }, - sendUserAgent: settings.sendBooruUserAgent, - customUserAgent: settings.customBooruUserAgent, - showHeldMoebooruPosts: settings.showHeldMoebooruPosts - ) + manager = makeManager(from: managerConfiguration) Task(priority: .userInitiated) { if manager.posts.isEmpty { @@ -207,7 +223,7 @@ struct MainView: View { #endif MainView() - .environmentObject(SettingsManager()) + .environment(SettingsManager()) #if os(macOS) .frame( width: screenSize.width / widthCoefficient, |