Watch: snooze finished threads, name the files a file approval would edit, Settle on finished notifications, an instant launch from the saved feed, plain Loading states, and no more cancelled errors
Gateway / check (push) Successful in 9s
Gateway / image (push) Successful in 22s

Gateway: an approval push for a file change says which files it would edit
This commit is contained in:
gib committed 2026-11-02 14:45:34 -05:00
1 parent 4dc4e57dac
commit edc4b88990
35 files changed
+1162 -144

No files matched your search

+8 -16
View File
@@ -104,7 +104,7 @@ struct ProjectThreadsView: View {
rows = try await model.api.projectThreads(hostId: hostId, projectId: projectId).items
error = nil
} catch {
self.error = model.message(for: error)
if let message = model.message(for: error) { self.error = message }
}
}
}
@@ -166,7 +166,7 @@ struct SearchView: View {
response = try await model.api.search(query)
error = nil
} catch {
self.error = model.message(for: error)
if let message = model.message(for: error) { self.error = message }
}
}
}
@@ -276,8 +276,9 @@ struct ThreadLine<Trailing: View>: View {
}
}
/// The List each browse screen scrolls, with loading, an error and Try again. Loads on appear.
/// `header` shows above the rows even while they load.
/// The List each browse screen scrolls, with Loading, an error and Try again. Loads on appear.
/// `header` shows above the rows even while they load. Once rows show, a failed reload only adds a
/// dim line under them.
private struct BrowseList<Header: View, Rows: View>: View {
var scrolls: Bool
var error: String?
@@ -302,19 +303,10 @@ private struct BrowseList<Header: View, Rows: View>: View {
header
if loaded {
rows
} else if error == nil {
ProgressView()
.frame(maxWidth: .infinity)
.padding(.top, 20)
.feedRow()
}
if let error {
BrowseNote(text: error)
if !loaded {
Button("Try again") { Task { await reload() } }
.buttonStyle(PillButtonStyle(fill: Theme.control, foreground: .white))
.feedRow()
}
if !loaded || error != nil {
LoadStatus(loaded: loaded, error: error, retry: reload)
.feedRow()
}
}
}