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