summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Sora/Views/FavoritesView.swift9
-rw-r--r--Sora/Views/Generic/GenericListView.swift9
-rw-r--r--SoraTests/ViewDerivedDataTests.swift36
3 files changed, 48 insertions, 6 deletions
diff --git a/Sora/Views/FavoritesView.swift b/Sora/Views/FavoritesView.swift
index 1217441..1ca41d0 100644
--- a/Sora/Views/FavoritesView.swift
+++ b/Sora/Views/FavoritesView.swift
@@ -636,9 +636,12 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length
}
}
- Button {
- settings.removeFavorite(withID: favorite.id)
- } label: {
+ Button(
+ role: .destructive,
+ action: {
+ settings.removeFavorite(withID: favorite.id)
+ }
+ ) {
Label("Delete", systemImage: "trash")
}
}
diff --git a/Sora/Views/Generic/GenericListView.swift b/Sora/Views/Generic/GenericListView.swift
index ac65da3..476bbc1 100644
--- a/Sora/Views/Generic/GenericListView.swift
+++ b/Sora/Views/Generic/GenericListView.swift
@@ -554,9 +554,12 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View {
}
}
- Button {
- removeActionUUID(item.id)
- } label: {
+ Button(
+ role: .destructive,
+ action: {
+ removeActionUUID(item.id)
+ }
+ ) {
Label("Delete", systemImage: "trash")
}
}
diff --git a/SoraTests/ViewDerivedDataTests.swift b/SoraTests/ViewDerivedDataTests.swift
index 3a1d8df..32e9276 100644
--- a/SoraTests/ViewDerivedDataTests.swift
+++ b/SoraTests/ViewDerivedDataTests.swift
@@ -361,6 +361,42 @@ final class ViewDerivedDataTests: XCTestCase { // swiftlint:disable:this type_b
)
}
+ func testFavoritesDeleteActionUsesDestructiveRole() throws {
+ let source = try loadSource(at: "Sora/Views/FavoritesView.swift")
+ let functionSource = try extractFunction(
+ named: "private func favoriteGridContent(",
+ from: source
+ )
+ let destructiveDeleteActionCount = tokenCount(
+ matching:
+ #"role:\s*\.destructive[\s\S]*Label\(\s*"Delete"\s*,\s*systemImage:\s*"trash"\s*\)"#,
+ in: functionSource
+ )
+
+ // swiftlint:disable:next prefer_nimble
+ XCTAssertGreaterThan(
+ destructiveDeleteActionCount,
+ 0,
+ "Favorite context menu delete action should be explicitly destructive."
+ )
+ }
+
+ func testGenericListDeleteActionUsesDestructiveRole() throws {
+ let source = try loadSource(at: "Sora/Views/Generic/GenericListView.swift")
+ let destructiveDeleteActionCount = tokenCount(
+ matching:
+ #"role:\s*\.destructive[\s\S]*Label\(\s*"Delete"\s*,\s*systemImage:\s*"trash"\s*\)"#,
+ in: source
+ )
+
+ // swiftlint:disable:next prefer_nimble
+ XCTAssertGreaterThan(
+ destructiveDeleteActionCount,
+ 0,
+ "Generic list context menu delete action should be explicitly destructive."
+ )
+ }
+
func testListViewsAvoidComparatorRandomShuffleSorting() throws {
let listViewSource = try loadSource(at: "Sora/Views/Generic/GenericListView.swift")
let favoritesViewSource = try loadSource(at: "Sora/Views/FavoritesView.swift")