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