Gordon Child 1 месяц назад
Родитель
Сommit
620f190e26
1 измененных файлов с 11 добавлено и 18 удалено
  1. 11 18
      Trio/Sources/Views/SettingsSearchHighlight.swift

+ 11 - 18
Trio/Sources/Views/SettingsSearchHighlight.swift

@@ -1,6 +1,6 @@
 import SwiftUI
 
-@Observable final class SettingsSearchHighlight {
+@MainActor @Observable final class SettingsSearchHighlight {
     var highlightedSetting: String?
 }
 
@@ -16,21 +16,12 @@ private struct SettingsHighlightScrollModifier: ViewModifier {
     func body(content: Content) -> some View {
         ScrollViewReader { proxy in
             content
-                .onAppear {
-                    scrollToHighlight(proxy: proxy)
+                .task(id: searchHighlight.highlightedSetting) {
+                    guard let target = searchHighlight.highlightedSetting else { return }
+                    try? await Task.sleep(for: .milliseconds(500))
+                    guard !Task.isCancelled else { return }
+                    withAnimation { proxy.scrollTo(target, anchor: .center) }
                 }
-                .onChange(of: searchHighlight.highlightedSetting) { _, newValue in
-                    if newValue != nil {
-                        scrollToHighlight(proxy: proxy)
-                    }
-                }
-        }
-    }
-
-    private func scrollToHighlight(proxy: ScrollViewProxy) {
-        guard let target = searchHighlight.highlightedSetting else { return }
-        DispatchQueue.main.asyncAfter(deadline: .now().advanced(by: .milliseconds(500))) {
-            withAnimation { proxy.scrollTo(target, anchor: .center) }
         }
     }
 }
@@ -57,9 +48,11 @@ private struct SettingsSearchHighlightAnimationModifier: ViewModifier {
     }
 
     private func startHighlightAnimation() {
-        searchHighlight.highlightedSetting = nil
-        highlightOpacity = 0.6
-        DispatchQueue.main.asyncAfter(deadline: .now().advanced(by: .milliseconds(1000))) {
+        Task { @MainActor in
+            try? await Task.sleep(for: .milliseconds(500))
+            highlightOpacity = 0.6
+            try? await Task.sleep(for: .milliseconds(800))
+            searchHighlight.highlightedSetting = nil
             highlightOpacity = 0.0
         }
     }