summaryrefslogtreecommitdiff
path: root/Sora/Views/MainView.swift
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-04-01 13:59:52 +0000
committerFuwn <[email protected]>2026-04-01 13:59:52 +0000
commitddaa9cbfe0cc8d254d4901ad192918d91dd627d4 (patch)
treeb0d1cf6642ae97ce41ff570f2bcd4a06b359685e /Sora/Views/MainView.swift
parentFix iOS install recipe app path resolution (diff)
downloadsora-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.swift74
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,