Skip to content

Commit ae9b102

Browse files
committed
IOS-7128. Context Menu - the context menu is not updated when selecting a different sorting or switching from thumbnail to list view or vice versa
1 parent f4a58ce commit ae9b102

File tree

2 files changed

+82
-1
lines changed

2 files changed

+82
-1
lines changed

Modules/MEGAUIKit/Sources/MEGAUIKit/Extensions/UIMenu+Matchable.swift

+29-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ extension UIMenu {
1616
let oldMenuActionTitles = lhs.decomposeMenuIntoActionTitles()
1717
let updatedMenuActionTitle = rhs.decomposeMenuIntoActionTitles()
1818

19-
return oldMenuActionTitles.elementsEqual(updatedMenuActionTitle)
19+
let oldMenuActions = lhs.decomposeMenuIntoActions()
20+
let updatedMenuActions = rhs.decomposeMenuIntoActions()
21+
22+
return oldMenuActionTitles.elementsEqual(updatedMenuActionTitle) && matchActionStates(lhs: oldMenuActions, rhs: updatedMenuActions)
2023
}
2124

2225
private func decomposeMenuIntoActionTitles() -> [String] {
@@ -29,4 +32,29 @@ extension UIMenu {
2932
return nil
3033
}.reduce([], +)
3134
}
35+
36+
private func decomposeMenuIntoActions() -> [UIAction] {
37+
children.compactMap {
38+
if let action = $0 as? UIAction {
39+
return [action]
40+
} else if let menu = $0 as? UIMenu {
41+
return menu.decomposeMenuIntoActions()
42+
}
43+
return nil
44+
}.reduce([], +)
45+
}
46+
47+
private static func matchActionStates(lhs: [UIAction]?, rhs: [UIAction]?) -> Bool {
48+
guard let lhs, let rhs, lhs.count == rhs.count else { return false }
49+
50+
let actions1 = lhs.map { ($0, $0.state) }
51+
let actions2 = rhs.map { ($0, $0.state) }
52+
53+
for (index, action) in actions1.enumerated() {
54+
if action != actions2[index] {
55+
return false
56+
}
57+
}
58+
return true
59+
}
3260
}

Modules/MEGAUIKit/Tests/MEGAUIKitTests/UIMenuTests.swift

+53
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,57 @@ final class UIMenuTests: XCTestCase {
8181

8282
XCTAssertFalse(UIMenu.match(lhs: oldMenu, rhs: updatedMenu))
8383
}
84+
85+
func testDoMenuActionMatch_whenMenusHaveSameActionsAndActionStates_returnsTrue() {
86+
let action1_ON = UIAction(title: "Action 1", state: .on, handler: {_ in})
87+
let action2_OFF = UIAction(title: "Action 2", state: .off, handler: {_ in})
88+
89+
let oldMenu = UIMenu(title: "Test Menu", children: [action1_ON, action2_OFF])
90+
let updatedMenu = UIMenu(title: "Test Menu", children: [action1_ON, action2_OFF])
91+
92+
XCTAssertTrue(UIMenu.match(lhs: oldMenu, rhs: updatedMenu))
93+
}
94+
95+
func testDoMenuActionMatch_whenMenusAreDifferentButHaveSameActionsAndActionStates_returnsFalse() {
96+
let action1_ON = UIAction(title: "Action 1", state: .on, handler: {_ in})
97+
let action2_OFF = UIAction(title: "Action 2", state: .off, handler: {_ in})
98+
99+
let oldMenu = UIMenu(title: "Old Menu", children: [action1_ON, action2_OFF])
100+
let updatedMenu = UIMenu(title: "Updated Menu", children: [action1_ON, action2_OFF])
101+
102+
XCTAssertTrue(UIMenu.match(lhs: oldMenu, rhs: updatedMenu))
103+
}
104+
105+
func testDoMenuActionMatch_whenMenusAreDifferentAndHaveSameActionsButDifferentActionStates_returnsFalse() {
106+
let action1_ON = UIAction(title: "Action 1", state: .on, handler: {_ in})
107+
let action1_OFF = UIAction(title: "Action 1", state: .off, handler: {_ in})
108+
let action2_ON = UIAction(title: "Action 2", state: .on, handler: {_ in})
109+
let action2_OFF = UIAction(title: "Action 2", state: .off, handler: {_ in})
110+
111+
let oldMenu = UIMenu(title: "Old Menu", children: [action1_ON, action2_OFF])
112+
let updatedMenu = UIMenu(title: "Updated Menu", children: [action1_OFF, action2_ON])
113+
114+
XCTAssertFalse(UIMenu.match(lhs: oldMenu, rhs: updatedMenu))
115+
}
116+
117+
func testMatch_sameActionStates_returnsFalse() {
118+
let action1_ON = UIAction(title: "Action 1", state: .on, handler: {_ in})
119+
let menu1 = UIMenu(title: "Updated Menu", options: [], children: [action1_ON])
120+
let menu2 = UIMenu(title: "Updated Menu", options: [], children: [action1_ON])
121+
122+
let result = UIMenu.match(lhs: menu1, rhs: menu2)
123+
124+
XCTAssertTrue(result)
125+
}
126+
127+
func testMatch_differentActionStates_returnsFalse() {
128+
let action1_ON = UIAction(title: "Action 1", state: .on, handler: {_ in})
129+
let menu1 = UIMenu(title: "Updated Menu", options: [], children: [action1_ON])
130+
let action1_OFF = UIAction(title: "Action 1", state: .off, handler: {_ in})
131+
let menu2 = UIMenu(title: "Updated Menu", options: [], children: [action1_OFF])
132+
133+
let result = UIMenu.match(lhs: menu1, rhs: menu2)
134+
135+
XCTAssertFalse(result)
136+
}
84137
}

0 commit comments

Comments
 (0)