@applicaster/quick-brick-native-apple 6.9.3-alpha.1 → 6.9.3-patch.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "QuickBrickApple",
3
- "version": "6.9.3-alpha.1",
3
+ "version": "6.9.3-patch.1",
4
4
  "platforms": {
5
5
  "ios": "14.0",
6
6
  "tvos": "14.0"
@@ -16,7 +16,7 @@
16
16
  "authors": "Applicaster LTD.",
17
17
  "source": {
18
18
  "git": "https://github.com/applicaster/Zapp-Frameworks.git",
19
- "tag": "@@applicaster/quick-brick-native-apple/6.9.3-alpha.1"
19
+ "tag": "@@applicaster/quick-brick-native-apple/6.9.3-patch.1"
20
20
  },
21
21
  "requires_arc": true,
22
22
  "source_files": "universal/**/*.{m,swift}",
@@ -17,7 +17,7 @@ open class EventEmitter {
17
17
  qos: .default,
18
18
  attributes: .concurrent)
19
19
 
20
- private var _emitter: ReactAnalyticsAgentPluginEventEmitter?
20
+ private weak var _emitter: ReactAnalyticsAgentPluginEventEmitter?
21
21
 
22
22
  private init() {}
23
23
 
@@ -36,7 +36,9 @@ open class EventEmitter {
36
36
 
37
37
  public func sendEvent(withName name: String,
38
38
  body: [String: Any]) {
39
- queue.sync { [unowned self] in
39
+ queue.async { [weak self] in
40
+ guard let self else { return }
41
+
40
42
  _emitter?.sendEvent(withName: name,
41
43
  body: body)
42
44
  }
@@ -47,13 +49,15 @@ open class EventEmitter {
47
49
 
48
50
  extension EventEmitter {
49
51
  func addSupportedEvent(event: String) {
50
- queue.async(flags: .barrier) { [unowned self] in
52
+ queue.async(flags: .barrier) { [weak self] in
53
+ guard let self else { return }
51
54
  allEvents.insert(event)
52
55
  }
53
56
  }
54
57
 
55
58
  func removeSupportedEvent(event: String) {
56
- queue.async(flags: .barrier) { [unowned self] in
59
+ queue.async(flags: .barrier) { [weak self] in
60
+ guard let self else { return }
57
61
  allEvents.remove(event)
58
62
  }
59
63
  }
@@ -21,6 +21,11 @@ open class ReactAnalyticsAgentPluginEventEmitter: RCTEventEmitter {
21
21
  EventEmitter.shared.emitter = self
22
22
  }
23
23
 
24
+ override open func invalidate() {
25
+ super.invalidate()
26
+ EventEmitter.shared.emitter = nil
27
+ }
28
+
24
29
  @objc override public static func requiresMainQueueSetup() -> Bool {
25
30
  true
26
31
  }
@@ -18,6 +18,7 @@ public let suspendApp = "suspend"
18
18
  /// React Native Manager class for Quick Brick
19
19
  open class ReactNativeManager: NSObject, UserInterfaceLayerProtocol, UserInterfaceLayerDelegate {
20
20
  lazy var logger = Logger.getLogger(for: ReactNativeManagerLogs.subsystem)
21
+ private lazy var throttler = Throttler(timeInterval: 2)
21
22
 
22
23
  static var applicationData: [String: Any] = [:]
23
24
 
@@ -67,8 +68,14 @@ open class ReactNativeManager: NSObject, UserInterfaceLayerProtocol, UserInterfa
67
68
 
68
69
  // MARK: UserInterfaceLayerDelegate
69
70
 
70
- public var applicationDelegate: UIApplicationDelegate?
71
- public var userNotificationCenterDelegate: UNUserNotificationCenterDelegate?
71
+ public weak var applicationDelegate: UIApplicationDelegate?
72
+ public weak var userNotificationCenterDelegate: UNUserNotificationCenterDelegate?
73
+
74
+ deinit {
75
+ if let reactBridge = reactRootView?.bridge {
76
+ reactBridge.invalidate()
77
+ }
78
+ }
72
79
 
73
80
  // MARK: UserInterfaceLayerProtocol
74
81
 
@@ -131,9 +138,8 @@ open class ReactNativeManager: NSObject, UserInterfaceLayerProtocol, UserInterfa
131
138
  moduleName: kQBModuleName,
132
139
  initialProperties: nil
133
140
  )
141
+ self.reactRootView?.backgroundColor = UIColor.clear
134
142
  }
135
-
136
- reactRootView?.backgroundColor = UIColor.clear
137
143
  }
138
144
 
139
145
  public func reactNativeViewController() -> UIViewController {
@@ -220,11 +226,18 @@ extension ReactNativeManager: QuickBrickManagerDelegate {
220
226
  UIApplication.shared.isIdleTimerDisabled = disabled
221
227
  }
222
228
 
229
+ private func forceAppReloadForEventWithThrottler(event: EventsBus.Event) {
230
+ throttler.throttle { [weak self] in
231
+ EventsBus.post(event)
232
+ self?.logger?.debugLog(message: "forceAppReloadForEventWithThrottler: App reloaded with event: \(event.type.description)")
233
+ }
234
+ }
235
+
223
236
  public func forceAppReload() {
224
- EventsBus.post(EventsBus.Event(type: EventsBusType(.forceAppReload)))
237
+ forceAppReloadForEventWithThrottler(event: EventsBus.Event(type: EventsBusType(.forceAppReload)))
225
238
  }
226
239
 
227
240
  public func forceAppReloadLanguageSwitch() {
228
- EventsBus.post(EventsBus.Event(type: EventsBusType(.forceAppReloadLanguageSwitch)))
241
+ forceAppReloadForEventWithThrottler(event: EventsBus.Event(type: EventsBusType(.forceAppReloadLanguageSwitch)))
229
242
  }
230
243
  }
@@ -0,0 +1,34 @@
1
+ //
2
+ // Throttler.swift
3
+ // Pods
4
+ //
5
+ // Created by Anton Kononenko on 10/30/24.
6
+ //
7
+
8
+ class Throttler {
9
+ private let queue: DispatchQueue
10
+ private let interval: TimeInterval
11
+ private var lastExecution: Date?
12
+
13
+ init(timeInterval: TimeInterval, queue: DispatchQueue = .main) {
14
+ interval = timeInterval
15
+ self.queue = queue
16
+ }
17
+
18
+ func throttle(action: @escaping () -> Void) {
19
+ queue.async { [weak self] in
20
+ guard let self else { return }
21
+ let now = Date()
22
+ if let last = lastExecution {
23
+ let elapsed = now.timeIntervalSince(last)
24
+ if elapsed >= interval {
25
+ lastExecution = now
26
+ action()
27
+ }
28
+ } else {
29
+ lastExecution = now
30
+ action()
31
+ }
32
+ }
33
+ }
34
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/quick-brick-native-apple",
3
- "version": "6.9.3-alpha.1",
3
+ "version": "6.9.3-patch.1",
4
4
  "description": "iOS and tvOS native code for QuickBrick applications. This package is used to provide native logic for QuickBrick",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1"