Skip to content

Commit ab2592e

Browse files
committed
Share context menu logic between list and grid views
1 parent f1a3326 commit ab2592e

1 file changed

Lines changed: 42 additions & 53 deletions

File tree

Views/Components/TrackView.swift

Lines changed: 42 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,46 @@ struct TrackView: View {
3030
}
3131
}
3232

33+
// MARK: - Track Context Menu
34+
struct TrackContextMenuContent: View {
35+
let items: [ContextMenuItem]
36+
37+
var body: some View {
38+
ForEach(items, id: \.id) { item in
39+
contextMenuItem(item)
40+
}
41+
}
42+
43+
@ViewBuilder
44+
private func contextMenuItem(_ item: ContextMenuItem) -> some View {
45+
switch item {
46+
case .button(let title, let role, let action):
47+
Button(title, role: role, action: action)
48+
case .menu(let title, let items):
49+
Menu(title) {
50+
ForEach(items, id: \.id) { subItem in
51+
switch subItem {
52+
case .button(let subTitle, let subRole, let subAction):
53+
Button(subTitle, role: subRole, action: subAction)
54+
case .menu(let subMenuTitle, let subMenuItems):
55+
Menu(subMenuTitle) {
56+
ForEach(subMenuItems, id: \.id) { nestedItem in
57+
if case .button(let nestedTitle, let nestedRole, let nestedAction) = nestedItem {
58+
Button(nestedTitle, role: nestedRole, action: nestedAction)
59+
}
60+
}
61+
}
62+
case .divider:
63+
Divider()
64+
}
65+
}
66+
}
67+
case .divider:
68+
Divider()
69+
}
70+
}
71+
}
72+
3373
// MARK: - List View Implementation
3474
private struct TrackListView: View {
3575
let tracks: [Track]
@@ -66,45 +106,14 @@ private struct TrackListView: View {
66106
}
67107
)
68108
.contextMenu {
69-
ForEach(contextMenuItems(track), id: \.id) { item in
70-
contextMenuItem(item)
71-
}
109+
TrackContextMenuContent(items: contextMenuItems(track))
72110
}
73111
.id(track.id)
74112
}
75113
}
76114
.padding(5) // Small padding to prevent edge clipping
77115
}
78116
}
79-
80-
@ViewBuilder
81-
private func contextMenuItem(_ item: ContextMenuItem) -> some View {
82-
switch item {
83-
case .button(let title, let role, let action):
84-
Button(title, role: role, action: action)
85-
case .menu(let title, let items):
86-
Menu(title) {
87-
ForEach(items, id: \.id) { subItem in
88-
switch subItem {
89-
case .button(let subTitle, let subRole, let subAction):
90-
Button(subTitle, role: subRole, action: subAction)
91-
case .menu(let subMenuTitle, let subMenuItems):
92-
Menu(subMenuTitle) {
93-
ForEach(subMenuItems, id: \.id) { nestedItem in
94-
if case .button(let nestedTitle, let nestedRole, let nestedAction) = nestedItem {
95-
Button(nestedTitle, role: nestedRole, action: nestedAction)
96-
}
97-
}
98-
}
99-
case .divider:
100-
Divider()
101-
}
102-
}
103-
}
104-
case .divider:
105-
Divider()
106-
}
107-
}
108117
}
109118

110119
// MARK: - Track List Row
@@ -334,9 +343,7 @@ private struct TrackGridView: View {
334343
)
335344
.frame(width: itemWidth, height: itemHeight)
336345
.contextMenu {
337-
ForEach(contextMenuItems(track), id: \.id) { item in
338-
contextMenuItem(item)
339-
}
346+
TrackContextMenuContent(items: contextMenuItems(track))
340347
}
341348
}
342349
}
@@ -351,24 +358,6 @@ private struct TrackGridView: View {
351358
}
352359
}
353360
}
354-
355-
@ViewBuilder
356-
private func contextMenuItem(_ item: ContextMenuItem) -> some View {
357-
switch item {
358-
case .button(let title, let role, let action):
359-
Button(title, role: role, action: action)
360-
case .menu(let title, let items):
361-
Menu(title) {
362-
ForEach(items, id: \.id) { subItem in
363-
if case .button(let subTitle, let subRole, let subAction) = subItem {
364-
Button(subTitle, role: subRole, action: subAction)
365-
}
366-
}
367-
}
368-
case .divider:
369-
Divider()
370-
}
371-
}
372361
}
373362

374363
// MARK: - Track Grid Item

0 commit comments

Comments
 (0)