tagworks-sdk-v1-react 1.1.18 → 1.1.20

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.
@@ -100,6 +100,6 @@ dependencies {
100
100
  implementation "com.facebook.react:react-native:+"
101
101
  // implementation "com.facebook.react:react-android:0.71.0"
102
102
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
103
- implementation "com.obzen.tagworks:tagworks-v1-kotlin:1.1.25"
103
+ implementation "com.obzen.tagworks:tagworks-v1-kotlin:1.1.27"
104
104
  }
105
105
 
@@ -5,13 +5,13 @@ import com.facebook.react.bridge.Callback
5
5
  import com.facebook.react.bridge.ReactApplicationContext
6
6
  import com.facebook.react.bridge.ReactContextBaseJavaModule
7
7
  import com.facebook.react.bridge.ReactMethod
8
+ import com.obzen.tagworks.TagWorks
8
9
  import com.obzen.tagworks.data.DataBundle
9
10
  import com.obzen.tagworks.data.DimensionType
10
11
  import com.obzen.tagworks.util.Logger
11
12
  import org.json.JSONArray
12
13
  import org.json.JSONObject
13
14
 
14
-
15
15
  class DataBundleModule(context: ReactApplicationContext):ReactContextBaseJavaModule(context) {
16
16
 
17
17
  private var eventData= DataBundle()
@@ -28,6 +28,7 @@ class DataBundleModule(context: ReactApplicationContext):ReactContextBaseJavaMod
28
28
  super.initialize()
29
29
  eventData.dataBundle.clear()
30
30
  eventData.dimensions.clear()
31
+ eventData.dynamicDimensions.clear()
31
32
  }
32
33
 
33
34
  @ReactMethod
@@ -59,7 +60,11 @@ class DataBundleModule(context: ReactApplicationContext):ReactContextBaseJavaMod
59
60
  while (keys.hasNext()) {
60
61
  val key = keys.next()
61
62
  val value = general.getString(key)
62
- eventData.setDimension(key.toInt(),value)
63
+ if(TagWorks.getInstance().isUseDynamicParameter) {
64
+ eventData.setDynamicDimension(key,value)
65
+ } else {
66
+ eventData.setDimension(key.toInt(),value)
67
+ }
63
68
  }
64
69
  }
65
70
 
@@ -69,7 +74,11 @@ class DataBundleModule(context: ReactApplicationContext):ReactContextBaseJavaMod
69
74
  while (keys.hasNext()) {
70
75
  val key = keys.next()
71
76
  val value = fact.getString(key)
72
- eventData.setDimension(key.toInt(), value.toDouble())
77
+ if(TagWorks.getInstance().isUseDynamicParameter) {
78
+ eventData.setDynamicDimension(key,value.toDouble())
79
+ } else {
80
+ eventData.setDimension(key.toInt(),value.toDouble())
81
+ }
73
82
  }
74
83
  }
75
84
 
@@ -197,6 +206,52 @@ class DataBundleModule(context: ReactApplicationContext):ReactContextBaseJavaMod
197
206
  }
198
207
  }
199
208
 
209
+ @ReactMethod
210
+ fun getDynamicDimensions(callback: Callback){
211
+ try {
212
+
213
+ val generalDimensions = JSONObject()
214
+ val factDimensions = JSONObject()
215
+
216
+ eventData.dimensions.forEach { dimension ->
217
+ when (dimension.type) {
218
+ DimensionType.GENERAL_TYPE -> generalDimensions.put(dimension.index.toString(),dimension.value)
219
+ DimensionType.FACT_TYPE -> factDimensions.put(dimension.index.toString(),dimension.numValue)
220
+ }
221
+ }
222
+
223
+ eventData.dynamicDimensions.forEach { dimension ->
224
+ when(dimension.type) {
225
+ DimensionType.GENERAL_TYPE ->generalDimensions.put(dimension.key,dimension.value)
226
+ DimensionType.FACT_TYPE -> factDimensions.put(dimension.key,dimension.numValue)
227
+ }
228
+ }
229
+
230
+ val generalWrapper = JSONObject().apply {
231
+ put("General", generalDimensions)
232
+ }
233
+
234
+ val factWrapper = JSONObject().apply {
235
+ put("Fact", factDimensions)
236
+ }
237
+
238
+ val dimensionsArray = JSONArray().apply {
239
+ put(generalWrapper)
240
+ put(factWrapper)
241
+ }
242
+
243
+ val result = JSONObject().apply {
244
+ put("Dimensions", dimensionsArray)
245
+ }
246
+
247
+ val jsonString = result.toString(4)
248
+ callback.invoke(jsonString)
249
+ } catch (e: Exception) {
250
+ e.printStackTrace()
251
+ callback.invoke(null)
252
+ }
253
+ }
254
+
200
255
  @ReactMethod
201
256
  fun getDimensionsOfArrayIndex(callback: Callback) {
202
257
  try {
@@ -0,0 +1,71 @@
1
+ package com.tagworkssdkv1
2
+
3
+ import android.util.Log
4
+ import android.widget.FrameLayout
5
+ import com.facebook.react.bridge.ReactContext
6
+ import com.facebook.react.uimanager.SimpleViewManager
7
+ import com.facebook.react.uimanager.ThemedReactContext
8
+ import com.facebook.react.uimanager.annotations.ReactProp
9
+ import com.obzen.tagworks.TagWorksPopup
10
+
11
+ class OnCmsBannerViewManager: SimpleViewManager<FrameLayout>() {
12
+ private var onCmsUrl: String = ""
13
+ private var custId: String? = ""
14
+ private var rcmdAreaCd: String = ""
15
+ private var defaultImage: String = ""
16
+
17
+ override fun createViewInstance(reactContext: ThemedReactContext): FrameLayout {
18
+ val frameLayout= FrameLayout(reactContext)
19
+
20
+ return frameLayout
21
+ }
22
+
23
+ @ReactProp(name = "onCmsUrl")
24
+ fun setOnCmsUrl(view: FrameLayout, url: String) {
25
+ onCmsUrl = url
26
+ attachBanner(view)
27
+ }
28
+
29
+ @ReactProp(name = "rcmd_area_cd")
30
+ fun setRcmdAreaCd(view: FrameLayout, areaCd: String) {
31
+ rcmdAreaCd = areaCd
32
+ attachBanner(view)
33
+ }
34
+
35
+ @ReactProp(name = "cust_id")
36
+ fun setCustId(view: FrameLayout, id: String?) {
37
+ custId = id
38
+ attachBanner(view)
39
+ }
40
+
41
+ @ReactProp(name = "defaultImage")
42
+ fun setDefaultImage(view: FrameLayout, image: String) {
43
+ defaultImage = image
44
+ attachBanner(view)
45
+ }
46
+
47
+ private fun attachBanner(container: FrameLayout) {
48
+ // 두 값이 모두 설정되지 않았으면 안 함
49
+ if (onCmsUrl.isEmpty() || rcmdAreaCd.isEmpty()) return
50
+ Log.d("TAG", "attachBanner: attachbanner")
51
+ val context = container.context
52
+ val activity = (context as? ReactContext)?.currentActivity
53
+
54
+ val resId = activity?.resources?.getIdentifier(defaultImage, "drawable", activity.packageName)
55
+
56
+ if (resId != null) {
57
+ TagWorksPopup.onCMSPopupBanner(
58
+ onCmsUrl = onCmsUrl,
59
+ cust_id = custId,
60
+ rcmd_area_cd = rcmdAreaCd,
61
+ context = context,
62
+ bannerView = container,
63
+ defaultImage = resId
64
+ )
65
+ }
66
+ }
67
+
68
+ override fun getName(): String {
69
+ return "OnCmsBannerView"
70
+ }
71
+ }
@@ -16,7 +16,6 @@ import com.obzen.tagworks.util.Logger.Companion.d
16
16
  import com.obzen.tagworks.util.WebAppInterface.Companion.MessageHandlerName
17
17
  import org.json.JSONArray
18
18
  import org.json.JSONObject
19
- import javax.security.auth.callback.Callback
20
19
 
21
20
  class TagWorksModule(reactContext: ReactApplicationContext):ReactContextBaseJavaModule(reactContext) {
22
21
 
@@ -200,6 +199,55 @@ class TagWorksModule(reactContext: ReactApplicationContext):ReactContextBaseJava
200
199
 
201
200
  }
202
201
 
202
+ @ReactMethod
203
+ fun getDynamicCommonDimensions(callback: Callback) {
204
+ try {
205
+ val cDimensions = TagWorks.getInstance().getCommonDimensions()
206
+ val cDynamicDimensions = TagWorks.getInstance().getDynamicCommonDimensions()
207
+
208
+ val generalDimensions = JSONObject()
209
+ val factDimensions = JSONObject()
210
+
211
+ cDimensions.forEach { dimension ->
212
+ when (dimension.type) {
213
+ DimensionType.GENERAL_TYPE -> generalDimensions.put(dimension.index.toString(),dimension.value)
214
+ DimensionType.FACT_TYPE -> factDimensions.put(dimension.index.toString(),dimension.numValue)
215
+ }
216
+ }
217
+
218
+ cDynamicDimensions.forEach { dimension ->
219
+ when (dimension.type) {
220
+ DimensionType.GENERAL_TYPE -> generalDimensions.put(dimension.key,dimension.value)
221
+ DimensionType.FACT_TYPE -> factDimensions.put(dimension.key,dimension.numValue)
222
+ }
223
+ }
224
+
225
+ val generalWrapper = JSONObject().apply {
226
+ put("General", generalDimensions)
227
+ }
228
+
229
+ val factWrapper = JSONObject().apply {
230
+ put("Fact", factDimensions)
231
+ }
232
+
233
+ val dimensionsArray = JSONArray().apply {
234
+ put(generalWrapper)
235
+ put(factWrapper)
236
+ }
237
+
238
+ val result = JSONObject().apply {
239
+ put("Dimensions", dimensionsArray)
240
+ }
241
+
242
+ val jsonString = result.toString(4)
243
+
244
+ callback.invoke(jsonString)
245
+ } catch (e: Exception) {
246
+ // 오류 처리
247
+ e.printStackTrace()
248
+ callback.invoke(null)
249
+ }
250
+ }
203
251
 
204
252
  @ReactMethod
205
253
  fun getCommonDimensionsOfArrayIndex(callback: Callback) {
@@ -0,0 +1,60 @@
1
+ package com.tagworkssdkv1
2
+
3
+ import android.util.Log
4
+ import android.view.ViewGroup
5
+ import com.facebook.react.bridge.Arguments
6
+ import com.facebook.react.bridge.Promise
7
+ import com.facebook.react.bridge.ReactApplicationContext
8
+ import com.facebook.react.bridge.ReactContextBaseJavaModule
9
+ import com.facebook.react.bridge.ReactMethod
10
+ import com.obzen.tagworks.TagWorksPopup
11
+
12
+ class TagWorksPopupModule(reactApplicationContext: ReactApplicationContext) :
13
+ ReactContextBaseJavaModule(reactApplicationContext) {
14
+ override fun getName(): String {
15
+ return "TagWorksPopupModule"
16
+
17
+ }
18
+
19
+
20
+ @ReactMethod
21
+ fun onCMSPopup(
22
+ onCmsUrl: String,
23
+ custId: String?,
24
+ rcmdAreaCd: String
25
+ ) {
26
+ val currentActivity = reactApplicationContext.currentActivity ?: return
27
+
28
+ TagWorksPopup.onCMSPopup(
29
+ onCmsUrl,
30
+ custId,
31
+ rcmdAreaCd,
32
+ currentActivity
33
+ )
34
+ }
35
+
36
+ // @ReactMethod
37
+ // fun onCMSPopupBanner(
38
+ // onCmsUrl: String,
39
+ // custId: String?,
40
+ // rcmdAreaCd: String,
41
+ // viewId: Int
42
+ // ) {
43
+ //
44
+ // val activity = reactApplicationContext.currentActivity ?: return
45
+ // val bannerView = currentActivity?.findViewById<ViewGroup>(viewId) ?: return
46
+ //
47
+ //
48
+ // TagWorksPopup.onCMSPopupBanner(
49
+ // onCmsUrl = onCmsUrl,
50
+ // cust_id = custId,
51
+ // rcmd_area_cd = rcmdAreaCd,
52
+ // bannerView = bannerView,
53
+ // context = activity,
54
+ // defaultImage = R.drawable.default_img // 기본 이미지 지정
55
+ // )
56
+ //
57
+ // }
58
+
59
+
60
+ }
@@ -4,17 +4,19 @@ import com.facebook.react.ReactPackage
4
4
  import com.facebook.react.bridge.NativeModule
5
5
  import com.facebook.react.bridge.ReactApplicationContext
6
6
  import com.facebook.react.uimanager.ViewManager
7
- import com.tagworks_sdk_react.DataBundleModule
8
- import com.tagworks_sdk_react.TagWorksModule
9
7
 
10
8
 
11
9
  class TagworksSdkV1Package : ReactPackage {
12
10
  override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
13
11
  // return listOf(TagworksSdkV1Module(reactContext))
14
- return listOf(TagworksSdkV1Module(reactContext), DataBundleModule(reactContext), TagWorksModule(reactContext), StandardEventModule(reactContext))
12
+ return listOf(TagworksSdkV1Module(reactContext),
13
+ TagWorksPopupModule(reactContext),
14
+ DataBundleModule(reactContext),
15
+ TagWorksModule(reactContext),
16
+ StandardEventModule(reactContext))
15
17
  }
16
18
 
17
19
  override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
18
- return emptyList()
20
+ return listOf(OnCmsBannerViewManager())
19
21
  }
20
22
  }
@@ -75,14 +75,24 @@ class DataBundleModule: NSObject, RCTBridgeModule {
75
75
  genericDimensions = dimension["General"] as! [String: String]
76
76
 
77
77
  for (key, value) in genericDimensions {
78
- self.eventDimensions.append(TagWorks_SDK_iOS.Dimension(index: Int(key)!, stringValue: value))
78
+ // if TagWorks_SDK_iOS.TagWorks.sharedInstance.isUseDynamicParameter == false {
79
+ if Int(key) != nil {
80
+ self.eventDimensions.append(TagWorks_SDK_iOS.Dimension(index: Int(key)!, stringValue: value))
81
+ } else {
82
+ self.eventDimensions.append(TagWorks_SDK_iOS.Dimension(key: key, value: value))
83
+ }
79
84
  }
80
85
  }
81
86
  if dimension["Fact"] != nil {
82
87
  factDimensions = dimension["Fact"] as! [String: Any]
83
88
 
84
89
  for (key, value) in factDimensions {
85
- self.eventDimensions.append(TagWorks_SDK_iOS.Dimension(index: Int(key)!, numValue: Double(value as! String) ?? 0.0))
90
+ // if TagWorks_SDK_iOS.TagWorks.sharedInstance.isUseDynamicParameter == false {
91
+ if Int(key) != nil {
92
+ self.eventDimensions.append(TagWorks_SDK_iOS.Dimension(index: Int(key)!, numValue: Double(value as! String) ?? 0.0))
93
+ } else {
94
+ self.eventDimensions.append(TagWorks_SDK_iOS.Dimension(key: key, numValue: Double(value as! String) ?? 0.0))
95
+ }
86
96
  }
87
97
  }
88
98
  }
@@ -101,13 +111,7 @@ class DataBundleModule: NSObject, RCTBridgeModule {
101
111
 
102
112
  var generalDimensions: [String: String] = [:]
103
113
  var factDimensions: [String: Any] = [:]
104
- // for dimension in self.eventDimensions {
105
- // if dimension.type == Dimension.generalType {
106
- // generalDimensions[String(dimension.index)] = dimension.value
107
- // } else if dimension.type == Dimension.factType {
108
- // factDimensions[String(dimension.index)] = String(dimension.numValue)
109
- // }
110
- // }
114
+
111
115
  for dimension in self.eventDimensions {
112
116
  if dimension.type == Dimension.generalType {
113
117
  if dimension.index == -1 {
@@ -117,9 +121,9 @@ class DataBundleModule: NSObject, RCTBridgeModule {
117
121
  }
118
122
  } else if dimension.type == Dimension.factType {
119
123
  if dimension.index == -1 {
120
- factDimensions[dimension.key] = String(dimension.numValue)
124
+ factDimensions[dimension.key] = dimension.numValue
121
125
  } else {
122
- factDimensions[String(dimension.index)] = String(dimension.numValue)
126
+ factDimensions[String(dimension.index)] = dimension.numValue
123
127
  }
124
128
  }
125
129
  }
@@ -180,21 +184,21 @@ class DataBundleModule: NSObject, RCTBridgeModule {
180
184
  var generalDimensions: [String: String] = [:]
181
185
  var factDimensions: [String: Any] = [:]
182
186
 
183
- for dimension in self.eventDimensions {
184
- if dimension.type == Dimension.generalType {
185
- if dimension.index == -1 {
186
- generalDimensions[dimension.key] = dimension.value
187
- } else {
188
- generalDimensions[String(dimension.index)] = dimension.value
189
- }
190
- } else if dimension.type == Dimension.factType {
191
- if dimension.index == -1 {
192
- factDimensions[dimension.key] = String(dimension.numValue)
193
- } else {
194
- factDimensions[String(dimension.index)] = String(dimension.numValue)
195
- }
196
- }
197
- }
187
+ for dimension in self.eventDimensions {
188
+ if dimension.type == Dimension.generalType {
189
+ if dimension.index == -1 {
190
+ generalDimensions[dimension.key] = dimension.value
191
+ } else {
192
+ generalDimensions[String(dimension.index)] = dimension.value
193
+ }
194
+ } else if dimension.type == Dimension.factType {
195
+ if dimension.index == -1 {
196
+ factDimensions[dimension.key] = String(dimension.numValue)
197
+ } else {
198
+ factDimensions[String(dimension.index)] = String(dimension.numValue)
199
+ }
200
+ }
201
+ }
198
202
  let gDimension = ["General": generalDimensions]
199
203
  let fDimension = ["Fact": factDimensions]
200
204
  dictDimensions["Dimensions"] = [gDimension, fDimension]
@@ -358,24 +362,6 @@ class DataBundleModule: NSObject, RCTBridgeModule {
358
362
  callback([])
359
363
  }
360
364
  }
361
-
362
- // @objc func getDynamicDimensionWithString(_ key: String, callback: @escaping RCTResponseSenderBlock) {
363
- // let dimension: TagWorks_SDK_iOS.Dimension? = self.eventDimensions.filter {$0.key == key && $0.type == Dimension.generalType}.first
364
- // if let dimension {
365
- // callback([dimension.value])
366
- // } else {
367
- // callback([])
368
- // }
369
- // }
370
- //
371
- // @objc func getDynamicDimensionWithDouble(_ key: String, callback: @escaping RCTResponseSenderBlock) {
372
- // let dimension: TagWorks_SDK_iOS.Dimension? = self.eventDimensions.filter {$0.key == key && $0.type == Dimension.factType}.first
373
- // if let dimension {
374
- // callback([dimension.numValue])
375
- // } else {
376
- // callback([])
377
- // }
378
- // }
379
365
 
380
366
  // Dimension 삭제
381
367
  @objc func removeDimensionInGeneralType(_ index: Int) {
@@ -409,28 +395,28 @@ class DataBundleModule: NSObject, RCTBridgeModule {
409
395
 
410
396
 
411
397
  /// 이벤트에 필요한 파라미터 항목들이 비어 있는지 체크
412
- @objc public func isParameterEmpty() -> Bool {
398
+ @objc public func isParameterEmpty(_ callback: @escaping RCTResponseSenderBlock) {
413
399
  if dataDictionary.isEmpty {
414
- return true
400
+ callback([true])
415
401
  }
416
- return false
402
+ callback([false])
417
403
  }
418
404
 
419
405
  /// 이벤트에 필요한 Dimension 항목들이 비어 있는지 체크
420
- @objc public func isDimensionEmpty() -> Bool {
406
+ @objc public func isDimensionEmpty(_ callback: @escaping RCTResponseSenderBlock) {
421
407
  if eventDimensions.isEmpty {
422
- return true
408
+ callback([true])
423
409
  }
424
- return false
410
+ callback([false])
425
411
  }
426
412
 
427
413
  /// 이벤트에 필요한 파라미터 항목들의 갯수를 리턴
428
- @objc public func parameterCount() -> Int {
429
- return dataDictionary.count
414
+ @objc public func parameterCount(_ callback: @escaping RCTResponseSenderBlock) {
415
+ callback([dataDictionary.count])
430
416
  }
431
417
 
432
418
  /// 이벤트에 필요한 Dimension 항목들의 갯수를 리턴
433
- @objc public func dimensionCount() -> Int {
434
- return eventDimensions.count
419
+ @objc public func dimensionCount(_ callback: @escaping RCTResponseSenderBlock) {
420
+ callback([eventDimensions.count])
435
421
  }
436
422
  }
@@ -41,4 +41,9 @@ RCT_EXTERN_METHOD(removeDynamicDimension:(NSString *)key)
41
41
  RCT_EXTERN_METHOD(removeDynamicDimensionWithArrayIndex:(int)index)
42
42
  RCT_EXTERN_METHOD(removeAllDynamicDimension)
43
43
 
44
+ RCT_EXTERN_METHOD(isParameterEmpty:(RCTResponseSenderBlock) callback)
45
+ RCT_EXTERN_METHOD(isDimensionEmpty:(RCTResponseSenderBlock) callback)
46
+ RCT_EXTERN_METHOD(parameterCount:(RCTResponseSenderBlock) callback)
47
+ RCT_EXTERN_METHOD(dimensionCount:(RCTResponseSenderBlock) callback)
48
+
44
49
  @end
@@ -0,0 +1,20 @@
1
+ //
2
+ // OnCMSBannerViewManagerBridge.m
3
+ // tagworks-sdk-v1-react
4
+ //
5
+ // Created by obzen on 4/18/25.
6
+ //
7
+
8
+ #import <Foundation/Foundation.h>
9
+ #import <React/RCTViewManager.h>
10
+
11
+ @interface RCT_EXTERN_MODULE(OnCmsBannerViewManager, RCTViewManager)
12
+
13
+ RCT_EXPORT_VIEW_PROPERTY(onCmsUrl, NSString)
14
+ RCT_EXPORT_VIEW_PROPERTY(rcmd_area_cd, NSString)
15
+ RCT_EXPORT_VIEW_PROPERTY(cust_id, NSString)
16
+ RCT_EXPORT_VIEW_PROPERTY(defaultImage, NSString)
17
+
18
+ //RCT_EXTERN_METHOD(setOnCmsBannerParam:(NSNumber *) reactTag url:(NSString *)url custId:(NSString *)custId areaCd:(NSString *)areaCd defaultImage:(NSString *)defaultImage)
19
+
20
+ @end
@@ -0,0 +1,133 @@
1
+ //
2
+ // OnCmsBannerViewManager.swift
3
+ // tagworks-sdk-v1-react
4
+ //
5
+ // Created by obzen on 4/17/25.
6
+ //
7
+
8
+ import Foundation
9
+ import TagWorks_SDK_iOS
10
+
11
+ @objc(OnCmsBannerViewManager)
12
+ class OnCmsBannerViewManager: RCTViewManager {
13
+
14
+ override static func requiresMainQueueSetup() -> Bool {
15
+ return true
16
+ }
17
+
18
+ override func view() -> UIView! {
19
+ return OnCmsBannerView()
20
+ }
21
+
22
+ // @objc func setOnCmsBannerParam(_ reactTag: NSNumber, url: String, custId: String, areaCd: String, defaultImage: String) {
23
+ // DispatchQueue.main.async {
24
+ // guard let view = self.bridge.uiManager.view(forReactTag: reactTag) as? OnCmsBannerView else {
25
+ // return
26
+ // }
27
+ //
28
+ // view.onCMSPopupBanner(onCmsUrl: url, custId: custId, rcmdAreaCd: areaCd, defaultImage: defaultImage)
29
+ // }
30
+ // }
31
+ }
32
+
33
+
34
+ class OnCmsBannerView: UIView {
35
+
36
+ private var onCmsUrlProp: String = ""
37
+ private var custIdProp: String?
38
+ private var rcmdAreaCdProp: String = ""
39
+ private var defaultImageProp: String = ""
40
+
41
+ private var shouldAttachBanner = false
42
+
43
+ override init(frame: CGRect) {
44
+ super.init(frame: frame)
45
+ self.backgroundColor = .clear
46
+ }
47
+
48
+ required init?(coder: NSCoder) {
49
+ fatalError("init(coder:) has not been implemented")
50
+ }
51
+
52
+ override func layoutSubviews() {
53
+ super.layoutSubviews()
54
+ print("layout Size : \(self.frame.size)")
55
+
56
+ if shouldAttachBanner && self.frame.size != .zero {
57
+ attachBanner()
58
+ shouldAttachBanner = false // 한 번만 실행되도록
59
+ }
60
+ }
61
+
62
+ private var isReady: Bool {
63
+ // return !onCmsUrlProp.isEmpty && !rcmdAreaCdProp.isEmpty && !custIdProp.isEmpty
64
+ return !onCmsUrlProp.isEmpty && !rcmdAreaCdProp.isEmpty
65
+ }
66
+
67
+ @objc var onCmsUrl: NSString = "" {
68
+ didSet {
69
+ onCmsUrlProp = onCmsUrl as String
70
+ checkAndAttach()
71
+ }
72
+ }
73
+
74
+ @objc var rcmd_area_cd: String = "" {
75
+ didSet {
76
+ rcmdAreaCdProp = rcmd_area_cd
77
+ checkAndAttach()
78
+ }
79
+ }
80
+
81
+ @objc var cust_id: String = "" {
82
+ didSet {
83
+ custIdProp = cust_id
84
+ checkAndAttach()
85
+ }
86
+ }
87
+
88
+ @objc var defaultImage: String = "" {
89
+ didSet {
90
+ defaultImageProp = defaultImage
91
+ checkAndAttach()
92
+ }
93
+ }
94
+
95
+ private func checkAndAttach() {
96
+ if isReady {
97
+ // attachBanner()
98
+ shouldAttachBanner = true
99
+ setNeedsLayout() // layoutSubviews 호출 유도
100
+ }
101
+ }
102
+
103
+ private func attachBanner() {
104
+ guard !onCmsUrlProp.isEmpty, !rcmdAreaCdProp.isEmpty else {
105
+ return
106
+ }
107
+
108
+ // TagWorks SDK가 제공하는 iOS 메서드 사용
109
+ TagWorksPopup.sharedInstance.onCMSPopupBanner(onCmsUrl: onCmsUrlProp,
110
+ cust_id: custIdProp ?? "",
111
+ rcmd_area_cd: rcmdAreaCdProp,
112
+ bannerView: self,
113
+ defaultPngImageName: defaultImageProp)
114
+ }
115
+
116
+
117
+
118
+
119
+ // public func onCMSPopupBanner(onCmsUrl: String, custId: String, rcmdAreaCd: String, defaultImage: String) {
120
+ // guard !onCmsUrl.isEmpty, !rcmdAreaCd.isEmpty, !custId.isEmpty else {
121
+ // return
122
+ // }
123
+ //
124
+ // // TagWorks SDK가 제공하는 iOS 메서드 사용
125
+ // TagWorksPopup.sharedInstance.onCMSPopupBanner(onCmsUrl: onCmsUrl,
126
+ // cust_id: custId,
127
+ // rcmd_area_cd: rcmdAreaCd,
128
+ // bannerView: self,
129
+ // defaultPngImageName: defaultImage)
130
+ // }
131
+
132
+
133
+ }
@@ -30,15 +30,14 @@ class TagWorksModule: NSObject, RCTBridgeModule {
30
30
  "EVENT_TYPE_USER_EVENT": "EVENT_TYPE_USER_EVENT",
31
31
  ]
32
32
  }
33
-
33
+ // userAgent: String? = nil,
34
34
  // MARK: SDK 초기화
35
35
  @objc func initializeTagWorks(_ siteId: String,
36
36
  baseUrl: String,
37
37
  isUseIntervals: Bool,
38
- dispatchInterval: TimeInterval,
38
+ dispatchInterval: TimeInterval = 5.0,
39
39
  sessionTimeOut: TimeInterval = 5.0,
40
40
  isManualDispatch: Bool = false,
41
- // userAgent: String? = nil,
42
41
  appVersion: String? = nil,
43
42
  appName: String? = nil,
44
43
  isUseDynamicParameter: Bool = false) {
@@ -294,24 +293,6 @@ class TagWorksModule: NSObject, RCTBridgeModule {
294
293
  callback([])
295
294
  }
296
295
  }
297
-
298
- // @objc func getDynamicCommonDimensionWithString(_ key: String, callback: @escaping RCTResponseSenderBlock) {
299
- // let dimension = TagWorks.sharedInstance.getDynamicCommonDimension(key: key)
300
- // if let dimension {
301
- // callback([dimension.value])
302
- // } else {
303
- // callback([])
304
- // }
305
- // }
306
- //
307
- // @objc func getDynamicCommonDimensionWithDouble(_ key: String, callback: @escaping RCTResponseSenderBlock) {
308
- // let dimension = TagWorks.sharedInstance.getDynamicCommonDimension(key: key)
309
- // if let dimension {
310
- // callback([dimension.numValue])
311
- // } else {
312
- // callback([])
313
- // }
314
- // }
315
296
 
316
297
  // Dimension 삭제
317
298
  @objc func removeCommonDimensionInGeneralType(_ index: Int) {
@@ -392,12 +373,12 @@ class TagWorksModule: NSObject, RCTBridgeModule {
392
373
 
393
374
  for (key, value) in factDimensions {
394
375
  if TagWorks.sharedInstance.isUseDynamicParameter {
395
- eventDimensions.append(TagWorks_SDK_iOS.Dimension(key: key, numValue: Double(value as! String) ?? 0.0))
376
+ eventDimensions.append(TagWorks_SDK_iOS.Dimension(key: key, numValue: value as! Double))
396
377
  } else {
397
378
  if Int(key) != nil {
398
- eventDimensions.append(TagWorks_SDK_iOS.Dimension(index: Int(key)!, numValue: Double(value as! String) ?? 0.0))
379
+ eventDimensions.append(TagWorks_SDK_iOS.Dimension(index: Int(key)!, numValue: value as! Double))
399
380
  } else {
400
- eventDimensions.append(TagWorks_SDK_iOS.Dimension(key: key, numValue: Double(value as! String) ?? 0.0))
381
+ eventDimensions.append(TagWorks_SDK_iOS.Dimension(key: key, numValue: value as! Double))
401
382
  }
402
383
  }
403
384
  }
@@ -0,0 +1,41 @@
1
+ //
2
+ // TagWorksPopupModule.swift
3
+ // tagworks-sdk-v1-react
4
+ //
5
+ // Created by obzen on 4/17/25.
6
+ //
7
+
8
+ import Foundation
9
+ import React
10
+ import TagWorks_SDK_iOS
11
+
12
+ @objc(TagWorksPopupModule)
13
+ class TagWorksPopupModule: NSObject, RCTBridgeModule {
14
+
15
+ static func moduleName() -> String {
16
+ return "TagWorksPopupModule"
17
+ }
18
+
19
+ // 네이티브 모듈에서 사용할 상수값을 반환하는 함수
20
+ @objc static func requiresMainQueueSetup() -> Bool {
21
+ return true
22
+ }
23
+
24
+ @objc public func onCMSPopup(_ onCmsUrl: String, custId: String, rcmdAreaCd: String) {
25
+ DispatchQueue.main.async {
26
+ guard var currentViewController = UIApplication.shared.delegate?.window??.rootViewController else {
27
+ return
28
+ }
29
+
30
+ while let presented = currentViewController.presentedViewController {
31
+ currentViewController = presented
32
+ }
33
+
34
+
35
+ TagWorksPopup.sharedInstance.onCMSPopup(onCmsUrl: onCmsUrl,
36
+ cust_id: custId,
37
+ rcmd_area_cd: rcmdAreaCd,
38
+ owner: currentViewController)
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,15 @@
1
+ //
2
+ // TagWorksPopupModuleBridge.m
3
+ // tagworks-sdk-v1-react
4
+ //
5
+ // Created by obzen on 4/17/25.
6
+ //
7
+
8
+ #import <Foundation/Foundation.h>
9
+ #import <React/RCTBridgeModule.h>
10
+
11
+ @interface RCT_EXTERN_MODULE(TagWorksPopupModule, NSObject)
12
+
13
+ RCT_EXTERN_METHOD(onCMSPopup:(NSString *)onCmsUrl custId:(NSString *)custId rcmdAreaCd:(NSString *)rcmdAreaCd);
14
+
15
+ @end
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.TagWorksModule = exports.StandardEventModule = exports.DataBundleModule = void 0;
6
+ exports.TagWorksPopupModule = exports.TagWorksModule = exports.StandardEventModule = exports.OnCmsBannerView = exports.DataBundleModule = void 0;
7
7
  var _reactNative = require("react-native");
8
8
  // import { NativeModules, Platform } from 'react-native';
9
9
 
@@ -27,12 +27,14 @@ var _reactNative = require("react-native");
27
27
  // export function multiply(a: number, b: number): Promise<number> {
28
28
  // return TagworksSdkV1.multiply(a, b);
29
29
  // }
30
-
30
+ const OnCmsBannerView = exports.OnCmsBannerView = (0, _reactNative.requireNativeComponent)('OnCmsBannerView');
31
31
  const {
32
32
  TagWorksModule,
33
33
  DataBundleModule,
34
- StandardEventModule
34
+ StandardEventModule,
35
+ TagWorksPopupModule
35
36
  } = _reactNative.NativeModules;
37
+ exports.TagWorksPopupModule = TagWorksPopupModule;
36
38
  exports.StandardEventModule = StandardEventModule;
37
39
  exports.DataBundleModule = DataBundleModule;
38
40
  exports.TagWorksModule = TagWorksModule;
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","TagWorksModule","DataBundleModule","StandardEventModule","NativeModules","exports"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AADA;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAM;EAAEC,cAAc;EAAEC,gBAAgB;EAAEC;AAAoB,CAAC,GAAGC,0BAAa;AAACC,OAAA,CAAAF,mBAAA,GAAAA,mBAAA;AAAAE,OAAA,CAAAH,gBAAA,GAAAA,gBAAA;AAAAG,OAAA,CAAAJ,cAAA,GAAAA,cAAA","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","OnCmsBannerView","exports","requireNativeComponent","TagWorksModule","DataBundleModule","StandardEventModule","TagWorksPopupModule","NativeModules"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AADA;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,eAAe,GAAAC,OAAA,CAAAD,eAAA,GAAG,IAAAE,mCAAsB,EAAC,iBAAiB,CAAC;AAEjE,MAAM;EAAEC,cAAc;EAAEC,gBAAgB;EAAEC,mBAAmB;EAAEC;AAAoB,CAAC,GAAGC,0BAAa;AAACN,OAAA,CAAAK,mBAAA,GAAAA,mBAAA;AAAAL,OAAA,CAAAI,mBAAA,GAAAA,mBAAA;AAAAJ,OAAA,CAAAG,gBAAA,GAAAA,gBAAA;AAAAH,OAAA,CAAAE,cAAA,GAAAA,cAAA","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  // import { NativeModules, Platform } from 'react-native';
4
- import { NativeModules } from 'react-native';
4
+ import { NativeModules, requireNativeComponent } from 'react-native';
5
5
 
6
6
  // const LINKING_ERROR =
7
7
  // `The package 'tagworks-sdk-v1' doesn't seem to be linked. Make sure: \n\n` +
@@ -23,11 +23,12 @@ import { NativeModules } from 'react-native';
23
23
  // export function multiply(a: number, b: number): Promise<number> {
24
24
  // return TagworksSdkV1.multiply(a, b);
25
25
  // }
26
-
26
+ const OnCmsBannerView = requireNativeComponent('OnCmsBannerView');
27
27
  const {
28
28
  TagWorksModule,
29
29
  DataBundleModule,
30
- StandardEventModule
30
+ StandardEventModule,
31
+ TagWorksPopupModule
31
32
  } = NativeModules;
32
- export { TagWorksModule, DataBundleModule, StandardEventModule };
33
+ export { TagWorksModule, DataBundleModule, StandardEventModule, TagWorksPopupModule, OnCmsBannerView };
33
34
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","TagWorksModule","DataBundleModule","StandardEventModule"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;AACA,SAASA,aAAa,QAAQ,cAAc;;AAE5C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAM;EAAEC,cAAc;EAAEC,gBAAgB;EAAEC;AAAoB,CAAC,GAAGH,aAAa;AAC/E,SAASC,cAAc,EAAEC,gBAAgB,EAAEC,mBAAmB","ignoreList":[]}
1
+ {"version":3,"names":["NativeModules","requireNativeComponent","OnCmsBannerView","TagWorksModule","DataBundleModule","StandardEventModule","TagWorksPopupModule"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;AACA,SAASA,aAAa,EAAEC,sBAAsB,QAAQ,cAAc;;AAEpE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,eAAe,GAAGD,sBAAsB,CAAC,iBAAiB,CAAC;AAEjE,MAAM;EAAEE,cAAc;EAAEC,gBAAgB;EAAEC,mBAAmB;EAAEC;AAAoB,CAAC,GAAGN,aAAa;AACpG,SAASG,cAAc,EAAEC,gBAAgB,EAAEC,mBAAmB,EAAEC,mBAAmB,EAAEJ,eAAe","ignoreList":[]}
@@ -1,3 +1,4 @@
1
- declare const TagWorksModule: any, DataBundleModule: any, StandardEventModule: any;
2
- export { TagWorksModule, DataBundleModule, StandardEventModule };
1
+ declare const OnCmsBannerView: import("react-native").HostComponent<unknown>;
2
+ declare const TagWorksModule: any, DataBundleModule: any, StandardEventModule: any, TagWorksPopupModule: any;
3
+ export { TagWorksModule, DataBundleModule, StandardEventModule, TagWorksPopupModule, OnCmsBannerView };
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AAwBA,QAAA,MAAQ,cAAc,OAAE,gBAAgB,OAAE,mBAAmB,KAAkB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AAuBA,QAAA,MAAM,eAAe,+CAA4C,CAAC;AAElE,QAAA,MAAQ,cAAc,OAAE,gBAAgB,OAAE,mBAAmB,OAAE,mBAAmB,KAAkB,CAAC;AACrG,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC"}
@@ -1,3 +1,4 @@
1
- declare const TagWorksModule: any, DataBundleModule: any, StandardEventModule: any;
2
- export { TagWorksModule, DataBundleModule, StandardEventModule };
1
+ declare const OnCmsBannerView: import("react-native").HostComponent<unknown>;
2
+ declare const TagWorksModule: any, DataBundleModule: any, StandardEventModule: any, TagWorksPopupModule: any;
3
+ export { TagWorksModule, DataBundleModule, StandardEventModule, TagWorksPopupModule, OnCmsBannerView };
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AAwBA,QAAA,MAAQ,cAAc,OAAE,gBAAgB,OAAE,mBAAmB,KAAkB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AAuBA,QAAA,MAAM,eAAe,+CAA4C,CAAC;AAElE,QAAA,MAAQ,cAAc,OAAE,gBAAgB,OAAE,mBAAmB,OAAE,mBAAmB,KAAkB,CAAC;AACrG,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tagworks-sdk-v1-react",
3
- "version": "1.1.18",
3
+ "version": "1.1.20",
4
4
  "description": "TagWorks SDK React Native Library",
5
5
  "source": "./src/index.tsx",
6
6
  "main": "./lib/commonjs/index.js",
@@ -75,8 +75,8 @@
75
75
  "eslint-plugin-prettier": "^5.0.1",
76
76
  "jest": "^29.7.0",
77
77
  "prettier": "^3.0.3",
78
- "react": "18.3.1",
79
- "react-native": "0.76.5",
78
+ "react": "^18.3.1",
79
+ "react-native": "^0.76.5",
80
80
  "react-native-builder-bob": "^0.35.2",
81
81
  "release-it": "^17.10.0",
82
82
  "turbo": "^1.10.7",
@@ -167,5 +167,8 @@
167
167
  "type": "module-legacy",
168
168
  "languages": "kotlin-swift",
169
169
  "version": "0.45.0"
170
+ },
171
+ "dependencies": {
172
+ "react-dom": "^19.1.0"
170
173
  }
171
174
  }
package/src/index.tsx CHANGED
@@ -1,5 +1,5 @@
1
1
  // import { NativeModules, Platform } from 'react-native';
2
- import { NativeModules } from 'react-native';
2
+ import { NativeModules, requireNativeComponent } from 'react-native';
3
3
 
4
4
  // const LINKING_ERROR =
5
5
  // `The package 'tagworks-sdk-v1' doesn't seem to be linked. Make sure: \n\n` +
@@ -21,6 +21,7 @@ import { NativeModules } from 'react-native';
21
21
  // export function multiply(a: number, b: number): Promise<number> {
22
22
  // return TagworksSdkV1.multiply(a, b);
23
23
  // }
24
+ const OnCmsBannerView = requireNativeComponent('OnCmsBannerView');
24
25
 
25
- const { TagWorksModule, DataBundleModule, StandardEventModule } = NativeModules;
26
- export { TagWorksModule, DataBundleModule, StandardEventModule };
26
+ const { TagWorksModule, DataBundleModule, StandardEventModule, TagWorksPopupModule } = NativeModules;
27
+ export { TagWorksModule, DataBundleModule, StandardEventModule, TagWorksPopupModule, OnCmsBannerView };
@@ -15,8 +15,8 @@ Pod::Spec.new do |s|
15
15
  s.source = { :git => "http://192.168.20.44:8443/etc/mobile/sdk/tagworks-sdk-v1-react.git", :tag => "#{s.version}" }
16
16
 
17
17
  s.source_files = "ios/**/*.{h,m,mm,swift}"
18
- s.dependency "TagWorks-SDK-iOS", '~> 1.1.24'
19
- # s.dependency "TagWorks-SDK-iOS"
18
+ s.dependency "TagWorks-SDK-iOS", '~> 1.1.25'
19
+ # s.dependency = { "TagWorks-SDK-iOS", :git => "https://github.com/obzen-rnd/tagworks-sdk-v1-ios-release.git", :tag => "1.1.25" }
20
20
 
21
21
  # Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0.
22
22
  # See https://github.com/facebook/react-native/blob/febf6b7f33fdb4904669f99d795eba4c0f95d7bf/scripts/cocoapods/new_architecture.rb#L79.