1 // Copyright 2015-present 650 Industries. All rights reserved. 2 3 @objc 4 public class DevMenuSelectionList: DevMenuScreenItem, DevMenuCallableProvider { 5 @objc 6 public class Item: NSObject, DevMenuDataSourceItem { 7 @objc 8 public class Tag : NSObject { 9 @objc 10 public var text: () -> String = { "" } 11 12 @objc 13 public var glyphName: () -> String? = { nil } 14 15 fileprivate func serialize() -> [String : Any] { 16 return [ 17 "text": text(), 18 "glyphName": glyphName() ?? NSNull(), 19 ] 20 } 21 } 22 23 @objc 24 public var onClickData: () -> [String : Any]? = { nil } 25 26 @objc 27 public var title: () -> String = { "" } 28 29 @objc 30 public var warning: () -> String? = { nil } 31 32 @objc 33 public var isChecked: () -> Bool = { false } 34 35 @objc 36 public var tags: () -> [Tag] = { [] } 37 38 public func serialize() -> [String : Any] { 39 return [ 40 "title": title(), 41 "warning": warning() ?? NSNull(), 42 "isChecked": isChecked(), 43 "tags": tags().map { $0.serialize() }, 44 "onClickData": onClickData() ?? NSNull() 45 ] 46 } 47 } 48 49 public static var ActionID = 1 50 private let callable: DevMenuExportedFunction 51 private var items: [Item] = [] 52 private let dataSourceId: String? 53 54 @objc 55 public func addItem(_ item: Item) { 56 items.append(item) 57 } 58 59 @objc 60 public convenience init() { 61 self.init(dataSourceId: nil) 62 } 63 64 @objc 65 public init(dataSourceId: String?) { 66 self.dataSourceId = dataSourceId 67 self.callable = DevMenuExportedFunction(withId: "expo-dev-menu.selection-list.#\(DevMenuSelectionList.ActionID)", withFunction: { _ in }) 68 DevMenuSelectionList.ActionID += 1 69 super.init(type: .SelectionList) 70 } 71 72 @objc 73 public override func serialize() -> [String : Any] { 74 var dict = super.serialize() 75 dict["items"] = items.map { $0.serialize() } 76 dict["dataSourceId"] = dataSourceId ?? NSNull() 77 dict["actionId"] = self.callable.id 78 return dict 79 } 80 81 @objc 82 public func addOnClick(hander: @escaping ([String: Any]?) -> Void) { 83 self.callable.function = hander 84 } 85 86 public func registerCallable() -> DevMenuExportedCallable? { 87 return self.callable 88 } 89 } 90