import SwiftUI struct FolderMenuView: View { let folderHierarchy: FolderHierarchy let showsTopLevelUncategorized: Bool let onSelectFolder: (UUID) -> Void let onCreateTopLevelUncategorized: (String) -> Void let isFolderDisabled: (UUID) -> Bool init( folderHierarchy: FolderHierarchy, showsTopLevelUncategorized: Bool = true, onSelectFolder: @escaping (UUID) -> Void, onCreateTopLevelUncategorized: @escaping (String) -> Void = { topLevelName in _ = topLevelName }, isFolderDisabled: @escaping (UUID) -> Bool = { _ in false } ) { self.folderHierarchy = folderHierarchy self.showsTopLevelUncategorized = showsTopLevelUncategorized self.onSelectFolder = onSelectFolder self.onCreateTopLevelUncategorized = onCreateTopLevelUncategorized self.isFolderDisabled = isFolderDisabled } var body: some View { ForEach(folderHierarchy.rootFolders, id: \.id) { folder in Button(action: { onSelectFolder(folder.id) }) { Text(folder.name) } .disabled(isFolderDisabled(folder.id)) } ForEach(folderHierarchy.sortedTopLevelNames, id: \.self) { topLevelName in Menu { if showsTopLevelUncategorized { let topLevelFolder = folderHierarchy.rootFolders.first { $0.name == topLevelName } if let topLevelFolder { Button(action: { onSelectFolder(topLevelFolder.id) }) { Text("Uncategorized") } .disabled(isFolderDisabled(topLevelFolder.id)) } else { Button(action: { onCreateTopLevelUncategorized(topLevelName) }) { Text("Uncategorized") } } Divider() } ForEach(folderHierarchy.folders(forTopLevelName: topLevelName), id: \.id) { folder in Button(action: { onSelectFolder(folder.id) }) { Text(folder.shortName) } .disabled(isFolderDisabled(folder.id)) } } label: { Text(topLevelName) } } } }