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