react-native-daro 1.0.12-beta01 → 1.0.13

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.
Files changed (110) hide show
  1. package/android/build.gradle +1 -1
  2. package/android/src/main/java/com/darom/DaroMModule.kt +1 -1
  3. package/android/src/main/java/com/darom/impl/DaroMRewardedAdModuleImpl.kt +8 -2
  4. package/ios/DaroMAdBannerViewManager.swift +4 -0
  5. package/lib/commonjs/AppOpenAd.js +129 -70
  6. package/lib/commonjs/AppOpenAd.js.map +1 -1
  7. package/lib/commonjs/EventEmitter.js +39 -11
  8. package/lib/commonjs/EventEmitter.js.map +1 -1
  9. package/lib/commonjs/InterstitialAd.js +129 -70
  10. package/lib/commonjs/InterstitialAd.js.map +1 -1
  11. package/lib/commonjs/LightPopupAd.js +143 -80
  12. package/lib/commonjs/LightPopupAd.js.map +1 -1
  13. package/lib/commonjs/RewardedAd.js +138 -80
  14. package/lib/commonjs/RewardedAd.js.map +1 -1
  15. package/lib/commonjs/index.js +0 -1
  16. package/lib/commonjs/index.js.map +1 -1
  17. package/lib/commonjs/types/AdEvent.js +17 -0
  18. package/lib/commonjs/types/AdEvent.js.map +1 -1
  19. package/lib/module/AppOpenAd.js +129 -71
  20. package/lib/module/AppOpenAd.js.map +1 -1
  21. package/lib/module/EventEmitter.js +37 -10
  22. package/lib/module/EventEmitter.js.map +1 -1
  23. package/lib/module/InterstitialAd.js +130 -72
  24. package/lib/module/InterstitialAd.js.map +1 -1
  25. package/lib/module/LightPopupAd.js +145 -83
  26. package/lib/module/LightPopupAd.js.map +1 -1
  27. package/lib/module/RewardedAd.js +139 -82
  28. package/lib/module/RewardedAd.js.map +1 -1
  29. package/lib/module/index.js +0 -1
  30. package/lib/module/index.js.map +1 -1
  31. package/lib/module/types/AdEvent.js +18 -1
  32. package/lib/module/types/AdEvent.js.map +1 -1
  33. package/lib/typescript/commonjs/src/AppOpenAd.d.ts +47 -2
  34. package/lib/typescript/commonjs/src/AppOpenAd.d.ts.map +1 -1
  35. package/lib/typescript/commonjs/src/EventEmitter.d.ts +9 -1
  36. package/lib/typescript/commonjs/src/EventEmitter.d.ts.map +1 -1
  37. package/lib/typescript/commonjs/src/InterstitialAd.d.ts +47 -2
  38. package/lib/typescript/commonjs/src/InterstitialAd.d.ts.map +1 -1
  39. package/lib/typescript/commonjs/src/LightPopupAd.d.ts +51 -2
  40. package/lib/typescript/commonjs/src/LightPopupAd.d.ts.map +1 -1
  41. package/lib/typescript/commonjs/src/RewardedAd.d.ts +51 -2
  42. package/lib/typescript/commonjs/src/RewardedAd.d.ts.map +1 -1
  43. package/lib/typescript/commonjs/src/index.d.ts +1 -1
  44. package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
  45. package/lib/typescript/commonjs/src/types/AdEvent.d.ts +24 -0
  46. package/lib/typescript/commonjs/src/types/AdEvent.d.ts.map +1 -1
  47. package/lib/typescript/commonjs/src/types/LightPopupAd.d.ts +1 -5
  48. package/lib/typescript/commonjs/src/types/LightPopupAd.d.ts.map +1 -1
  49. package/lib/typescript/module/src/AppOpenAd.d.ts +47 -2
  50. package/lib/typescript/module/src/AppOpenAd.d.ts.map +1 -1
  51. package/lib/typescript/module/src/EventEmitter.d.ts +9 -1
  52. package/lib/typescript/module/src/EventEmitter.d.ts.map +1 -1
  53. package/lib/typescript/module/src/InterstitialAd.d.ts +47 -2
  54. package/lib/typescript/module/src/InterstitialAd.d.ts.map +1 -1
  55. package/lib/typescript/module/src/LightPopupAd.d.ts +51 -2
  56. package/lib/typescript/module/src/LightPopupAd.d.ts.map +1 -1
  57. package/lib/typescript/module/src/RewardedAd.d.ts +51 -2
  58. package/lib/typescript/module/src/RewardedAd.d.ts.map +1 -1
  59. package/lib/typescript/module/src/index.d.ts +1 -1
  60. package/lib/typescript/module/src/index.d.ts.map +1 -1
  61. package/lib/typescript/module/src/types/AdEvent.d.ts +24 -0
  62. package/lib/typescript/module/src/types/AdEvent.d.ts.map +1 -1
  63. package/lib/typescript/module/src/types/LightPopupAd.d.ts +1 -5
  64. package/lib/typescript/module/src/types/LightPopupAd.d.ts.map +1 -1
  65. package/package.json +6 -2
  66. package/react-native-daro-m.podspec +1 -1
  67. package/src/AppOpenAd.ts +172 -104
  68. package/src/EventEmitter.ts +60 -14
  69. package/src/InterstitialAd.ts +159 -103
  70. package/src/LightPopupAd.ts +183 -97
  71. package/src/RewardedAd.ts +181 -122
  72. package/src/index.tsx +19 -11
  73. package/src/types/AdEvent.ts +39 -2
  74. package/src/types/LightPopupAd.ts +2 -7
  75. package/lib/commonjs/types/AppOpenAd.js +0 -6
  76. package/lib/commonjs/types/AppOpenAd.js.map +0 -1
  77. package/lib/commonjs/types/FullScreenAd.js +0 -6
  78. package/lib/commonjs/types/FullScreenAd.js.map +0 -1
  79. package/lib/commonjs/types/InterstitialAd.js +0 -6
  80. package/lib/commonjs/types/InterstitialAd.js.map +0 -1
  81. package/lib/commonjs/types/RewardedAd.js +0 -6
  82. package/lib/commonjs/types/RewardedAd.js.map +0 -1
  83. package/lib/module/types/AppOpenAd.js +0 -4
  84. package/lib/module/types/AppOpenAd.js.map +0 -1
  85. package/lib/module/types/FullScreenAd.js +0 -4
  86. package/lib/module/types/FullScreenAd.js.map +0 -1
  87. package/lib/module/types/InterstitialAd.js +0 -4
  88. package/lib/module/types/InterstitialAd.js.map +0 -1
  89. package/lib/module/types/RewardedAd.js +0 -4
  90. package/lib/module/types/RewardedAd.js.map +0 -1
  91. package/lib/typescript/commonjs/src/types/AppOpenAd.d.ts +0 -3
  92. package/lib/typescript/commonjs/src/types/AppOpenAd.d.ts.map +0 -1
  93. package/lib/typescript/commonjs/src/types/FullScreenAd.d.ts +0 -21
  94. package/lib/typescript/commonjs/src/types/FullScreenAd.d.ts.map +0 -1
  95. package/lib/typescript/commonjs/src/types/InterstitialAd.d.ts +0 -3
  96. package/lib/typescript/commonjs/src/types/InterstitialAd.d.ts.map +0 -1
  97. package/lib/typescript/commonjs/src/types/RewardedAd.d.ts +0 -9
  98. package/lib/typescript/commonjs/src/types/RewardedAd.d.ts.map +0 -1
  99. package/lib/typescript/module/src/types/AppOpenAd.d.ts +0 -3
  100. package/lib/typescript/module/src/types/AppOpenAd.d.ts.map +0 -1
  101. package/lib/typescript/module/src/types/FullScreenAd.d.ts +0 -21
  102. package/lib/typescript/module/src/types/FullScreenAd.d.ts.map +0 -1
  103. package/lib/typescript/module/src/types/InterstitialAd.d.ts +0 -3
  104. package/lib/typescript/module/src/types/InterstitialAd.d.ts.map +0 -1
  105. package/lib/typescript/module/src/types/RewardedAd.d.ts +0 -9
  106. package/lib/typescript/module/src/types/RewardedAd.d.ts.map +0 -1
  107. package/src/types/AppOpenAd.ts +0 -3
  108. package/src/types/FullScreenAd.ts +0 -28
  109. package/src/types/InterstitialAd.ts +0 -3
  110. package/src/types/RewardedAd.ts +0 -15
@@ -1,113 +1,169 @@
1
- import { NativeModules } from "react-native";
2
- import { addEventListener, removeEventListener } from "./EventEmitter";
3
- import type { AdDisplayFailedInfo, AdInfo, AdLoadFailedInfo } from "./types/AdInfo";
4
- import type { InterstitialAdType } from "./types/InterstitialAd";
1
+ import { NativeModules } from 'react-native';
2
+ import {
3
+ addEventListener,
4
+ removeEventListener,
5
+ AdEventEmitter,
6
+ } from './EventEmitter';
7
+ import type {
8
+ AdDisplayFailedInfo,
9
+ AdInfo,
10
+ AdLoadFailedInfo,
11
+ } from './types/AdInfo';
12
+ import { AdEventType, type AdEventPayloadMap } from './types/AdEvent';
5
13
 
6
14
  const { DaroMModule } = NativeModules;
7
15
 
8
16
  const {
9
- ON_INTERSTITIAL_LOADED_EVENT,
10
- ON_INTERSTITIAL_LOAD_FAILED_EVENT,
11
- ON_INTERSTITIAL_CLICKED_EVENT,
12
- ON_INTERSTITIAL_DISPLAYED_EVENT,
13
- ON_INTERSTITIAL_AD_FAILED_TO_DISPLAY_EVENT,
14
- ON_INTERSTITIAL_HIDDEN_EVENT,
15
- ON_INTERSTITIAL_AD_IMPRESSION_RECORDED,
17
+ ON_INTERSTITIAL_LOADED_EVENT,
18
+ ON_INTERSTITIAL_LOAD_FAILED_EVENT,
19
+ ON_INTERSTITIAL_CLICKED_EVENT,
20
+ ON_INTERSTITIAL_DISPLAYED_EVENT,
21
+ ON_INTERSTITIAL_AD_FAILED_TO_DISPLAY_EVENT,
22
+ ON_INTERSTITIAL_HIDDEN_EVENT,
23
+ ON_INTERSTITIAL_AD_IMPRESSION_RECORDED,
16
24
  } = DaroMModule.getConstants();
17
25
 
18
- const isAdReady = (adUnitId: string): Promise<boolean> => {
19
- return DaroMModule.isInterstitialReady(adUnitId);
20
- };
21
-
22
- const loadAd = (adUnitId: string): void => {
23
- DaroMModule.loadInterstitial(adUnitId);
24
- };
25
-
26
- const showAd = (adUnitId: string): void => {
26
+ const NATIVE_EVENT_BY_TYPE: Record<AdEventType, string> = {
27
+ [AdEventType.LOADED]: ON_INTERSTITIAL_LOADED_EVENT,
28
+ [AdEventType.LOAD_FAILED]: ON_INTERSTITIAL_LOAD_FAILED_EVENT,
29
+ [AdEventType.CLICKED]: ON_INTERSTITIAL_CLICKED_EVENT,
30
+ [AdEventType.DISPLAYED]: ON_INTERSTITIAL_DISPLAYED_EVENT,
31
+ [AdEventType.FAILED_TO_DISPLAY]: ON_INTERSTITIAL_AD_FAILED_TO_DISPLAY_EVENT,
32
+ [AdEventType.HIDDEN]: ON_INTERSTITIAL_HIDDEN_EVENT,
33
+ [AdEventType.IMPRESSION_RECORDED]: ON_INTERSTITIAL_AD_IMPRESSION_RECORDED,
34
+ };
35
+
36
+ export class InterstitialAd {
37
+ private readonly eventEmitter = new AdEventEmitter();
38
+
39
+ private constructor(private readonly adUnitId: string) {}
40
+
41
+ static createForAdRequest(adUnitId: string): InterstitialAd {
42
+ return new InterstitialAd(adUnitId);
43
+ }
44
+
45
+ isAdReady(): Promise<boolean> {
46
+ return DaroMModule.isInterstitialReady(this.adUnitId);
47
+ }
48
+
49
+ load(): void {
50
+ DaroMModule.loadInterstitial(this.adUnitId);
51
+ }
52
+
53
+ show(): void {
54
+ DaroMModule.showInterstitial(this.adUnitId);
55
+ }
56
+
57
+ addAdEventListener<T extends AdEventType>(
58
+ type: T,
59
+ listener: (info: AdEventPayloadMap[T]) => void
60
+ ): () => void {
61
+ const nativeEvent = NATIVE_EVENT_BY_TYPE[type];
62
+ const adUnitId = this.adUnitId;
63
+ return this.eventEmitter.addEventListener(nativeEvent, (payload: any) => {
64
+ if (payload?.adUnitId !== undefined && payload.adUnitId !== adUnitId) {
65
+ return;
66
+ }
67
+ listener(payload);
68
+ });
69
+ }
70
+
71
+ removeAllListeners(): void {
72
+ this.eventEmitter.removeAllListeners();
73
+ }
74
+
75
+ // ---- Deprecated static API (backward compatibility) ----
76
+
77
+ /** @deprecated `InterstitialAd.createForAdRequest(adUnitId)` 인스턴스의 `isAdReady()`를 사용하세요. */
78
+ static isAdReady(adUnitId: string): Promise<boolean> {
79
+ return DaroMModule.isInterstitialReady(adUnitId);
80
+ }
81
+
82
+ /** @deprecated `InterstitialAd.createForAdRequest(adUnitId)` 인스턴스의 `load()`를 사용하세요. */
83
+ static loadAd(adUnitId: string): void {
84
+ DaroMModule.loadInterstitial(adUnitId);
85
+ }
86
+
87
+ /** @deprecated `InterstitialAd.createForAdRequest(adUnitId)` 인스턴스의 `show()`를 사용하세요. */
88
+ static showAd(adUnitId: string): void {
27
89
  DaroMModule.showInterstitial(adUnitId);
28
- };
29
-
30
- const addAdLoadedEventListener = (listener: (adInfo: AdInfo) => void): void => {
31
- addEventListener(ON_INTERSTITIAL_LOADED_EVENT, listener);
32
- };
33
-
34
- const removeAdLoadedEventListener = (): void => {
35
- removeEventListener(ON_INTERSTITIAL_LOADED_EVENT);
36
- };
37
-
38
- const addAdLoadFailedEventListener = (listener: (errorInfo: AdLoadFailedInfo) => void): void => {
39
- addEventListener(ON_INTERSTITIAL_LOAD_FAILED_EVENT, listener);
40
- };
41
-
42
- const removeAdLoadFailedEventListener = (): void => {
43
- removeEventListener(ON_INTERSTITIAL_LOAD_FAILED_EVENT);
44
- };
45
-
46
- const addAdClickedEventListener = (listener: (adInfo: AdInfo) => void): void => {
47
- addEventListener(ON_INTERSTITIAL_CLICKED_EVENT, listener);
48
- };
49
-
50
- const removeAdClickedEventListener = (): void => {
51
- removeEventListener(ON_INTERSTITIAL_CLICKED_EVENT);
52
- };
53
-
54
- const addAdDisplayedEventListener = (listener: (adInfo: AdInfo) => void): void => {
55
- addEventListener(ON_INTERSTITIAL_DISPLAYED_EVENT, listener);
56
- };
57
-
58
- const removeAdDisplayedEventListener = (): void => {
59
- removeEventListener(ON_INTERSTITIAL_DISPLAYED_EVENT);
60
- };
61
-
62
- const addAdFailedToDisplayEventListener = (listener: (errorInfo: AdDisplayFailedInfo) => void): void => {
63
- addEventListener(ON_INTERSTITIAL_AD_FAILED_TO_DISPLAY_EVENT, listener);
64
- };
65
-
66
- const removeAdFailedToDisplayEventListener = (): void => {
67
- removeEventListener(ON_INTERSTITIAL_AD_FAILED_TO_DISPLAY_EVENT);
68
- };
69
-
70
- const addAdHiddenEventListener = (listener: (adInfo: AdInfo) => void): void => {
71
- addEventListener(ON_INTERSTITIAL_HIDDEN_EVENT, listener);
72
- };
73
-
74
- const removeAdHiddenEventListener = (): void => {
75
- removeEventListener(ON_INTERSTITIAL_HIDDEN_EVENT);
76
- };
77
-
78
- const addAdImpressionRecordedListener = (listener: (adInfo: AdInfo) => void): void => {
79
- addEventListener(ON_INTERSTITIAL_AD_IMPRESSION_RECORDED, listener);
80
- };
81
-
82
- const removeAdImpressionRecordedListener = (): void => {
83
- removeEventListener(ON_INTERSTITIAL_AD_IMPRESSION_RECORDED);
84
- };
85
-
86
- export const InterstitialAd: InterstitialAdType = {
87
- isAdReady,
88
- loadAd,
89
- showAd,
90
-
91
- addAdLoadedEventListener,
92
- removeAdLoadedEventListener,
93
-
94
- addAdLoadFailedEventListener,
95
- removeAdLoadFailedEventListener,
96
-
97
- addAdClickedEventListener,
98
- removeAdClickedEventListener,
99
-
100
- addAdDisplayedEventListener,
101
- removeAdDisplayedEventListener,
102
-
103
- addAdFailedToDisplayEventListener,
104
- removeAdFailedToDisplayEventListener,
105
-
106
- addAdHiddenEventListener,
107
- removeAdHiddenEventListener,
108
-
109
- addAdImpressionRecordedListener,
110
- removeAdImpressionRecordedListener,
90
+ }
91
+
92
+ /** @deprecated `addAdEventListener(AdEventType.LOADED, ...)`를 인스턴스에서 사용하세요. */
93
+ static addAdLoadedEventListener(listener: (adInfo: AdInfo) => void): void {
94
+ addEventListener(ON_INTERSTITIAL_LOADED_EVENT, listener);
95
+ }
96
+
97
+ /** @deprecated 인스턴스의 `addAdEventListener` disposer를 사용하세요. */
98
+ static removeAdLoadedEventListener(): void {
99
+ removeEventListener(ON_INTERSTITIAL_LOADED_EVENT);
100
+ }
101
+
102
+ /** @deprecated `addAdEventListener(AdEventType.LOAD_FAILED, ...)`를 인스턴스에서 사용하세요. */
103
+ static addAdLoadFailedEventListener(
104
+ listener: (errorInfo: AdLoadFailedInfo) => void
105
+ ): void {
106
+ addEventListener(ON_INTERSTITIAL_LOAD_FAILED_EVENT, listener);
107
+ }
108
+
109
+ /** @deprecated 인스턴스의 `addAdEventListener` disposer를 사용하세요. */
110
+ static removeAdLoadFailedEventListener(): void {
111
+ removeEventListener(ON_INTERSTITIAL_LOAD_FAILED_EVENT);
112
+ }
113
+
114
+ /** @deprecated `addAdEventListener(AdEventType.CLICKED, ...)`를 인스턴스에서 사용하세요. */
115
+ static addAdClickedEventListener(listener: (adInfo: AdInfo) => void): void {
116
+ addEventListener(ON_INTERSTITIAL_CLICKED_EVENT, listener);
117
+ }
118
+
119
+ /** @deprecated 인스턴스의 `addAdEventListener` disposer를 사용하세요. */
120
+ static removeAdClickedEventListener(): void {
121
+ removeEventListener(ON_INTERSTITIAL_CLICKED_EVENT);
122
+ }
123
+
124
+ /** @deprecated `addAdEventListener(AdEventType.DISPLAYED, ...)`를 인스턴스에서 사용하세요. */
125
+ static addAdDisplayedEventListener(listener: (adInfo: AdInfo) => void): void {
126
+ addEventListener(ON_INTERSTITIAL_DISPLAYED_EVENT, listener);
127
+ }
128
+
129
+ /** @deprecated 인스턴스의 `addAdEventListener` disposer를 사용하세요. */
130
+ static removeAdDisplayedEventListener(): void {
131
+ removeEventListener(ON_INTERSTITIAL_DISPLAYED_EVENT);
132
+ }
133
+
134
+ /** @deprecated `addAdEventListener(AdEventType.FAILED_TO_DISPLAY, ...)`를 인스턴스에서 사용하세요. */
135
+ static addAdFailedToDisplayEventListener(
136
+ listener: (errorInfo: AdDisplayFailedInfo) => void
137
+ ): void {
138
+ addEventListener(ON_INTERSTITIAL_AD_FAILED_TO_DISPLAY_EVENT, listener);
139
+ }
140
+
141
+ /** @deprecated 인스턴스의 `addAdEventListener` disposer를 사용하세요. */
142
+ static removeAdFailedToDisplayEventListener(): void {
143
+ removeEventListener(ON_INTERSTITIAL_AD_FAILED_TO_DISPLAY_EVENT);
144
+ }
145
+
146
+ /** @deprecated `addAdEventListener(AdEventType.HIDDEN, ...)`를 인스턴스에서 사용하세요. */
147
+ static addAdHiddenEventListener(listener: (adInfo: AdInfo) => void): void {
148
+ addEventListener(ON_INTERSTITIAL_HIDDEN_EVENT, listener);
149
+ }
150
+
151
+ /** @deprecated 인스턴스의 `addAdEventListener` disposer를 사용하세요. */
152
+ static removeAdHiddenEventListener(): void {
153
+ removeEventListener(ON_INTERSTITIAL_HIDDEN_EVENT);
154
+ }
155
+
156
+ /** @deprecated `addAdEventListener(AdEventType.IMPRESSION_RECORDED, ...)`를 인스턴스에서 사용하세요. */
157
+ static addAdImpressionRecordedListener(
158
+ listener: (adInfo: AdInfo) => void
159
+ ): void {
160
+ addEventListener(ON_INTERSTITIAL_AD_IMPRESSION_RECORDED, listener);
161
+ }
162
+
163
+ /** @deprecated 인스턴스의 `addAdEventListener` disposer를 사용하세요. */
164
+ static removeAdImpressionRecordedListener(): void {
165
+ removeEventListener(ON_INTERSTITIAL_AD_IMPRESSION_RECORDED);
166
+ }
111
167
  }
112
168
 
113
169
  export default InterstitialAd;
@@ -1,8 +1,17 @@
1
- import { NativeModules } from "react-native";
2
- import { addEventListener, removeEventListener } from "./EventEmitter";
3
- import type { AdDisplayFailedInfo, AdInfo, AdLoadFailedInfo } from "./types/AdInfo";
4
- import type { LightPopupAdConfiguration, LightPopupAdType } from "./types/LightPopupAd";
5
- import tinycolor from "tinycolor2";
1
+ import { NativeModules } from 'react-native';
2
+ import {
3
+ addEventListener,
4
+ removeEventListener,
5
+ AdEventEmitter,
6
+ } from './EventEmitter';
7
+ import type {
8
+ AdDisplayFailedInfo,
9
+ AdInfo,
10
+ AdLoadFailedInfo,
11
+ } from './types/AdInfo';
12
+ import type { LightPopupAdConfiguration } from './types/LightPopupAd';
13
+ import { AdEventType, type AdEventPayloadMap } from './types/AdEvent';
14
+ import tinycolor from 'tinycolor2';
6
15
 
7
16
  const { DaroMModule } = NativeModules;
8
17
 
@@ -16,25 +25,23 @@ const {
16
25
  ON_LIGHTPOPUP_AD_IMPRESSION_RECORDED,
17
26
  } = DaroMModule.getConstants();
18
27
 
19
- const isAdReady = (adUnitId: string): Promise<boolean> => {
20
- return DaroMModule.isLightPopupReady(adUnitId);
21
- };
22
-
23
- const loadAd = (adUnitId: string): void => {
24
- DaroMModule.loadLightPopup(adUnitId);
25
- };
26
-
27
- const showAd = (adUnitId: string): void => {
28
- DaroMModule.showLightPopup(adUnitId);
28
+ const NATIVE_EVENT_BY_TYPE: Record<AdEventType, string> = {
29
+ [AdEventType.LOADED]: ON_LIGHTPOPUP_LOADED_EVENT,
30
+ [AdEventType.LOAD_FAILED]: ON_LIGHTPOPUP_LOAD_FAILED_EVENT,
31
+ [AdEventType.CLICKED]: ON_LIGHTPOPUP_CLICKED_EVENT,
32
+ [AdEventType.DISPLAYED]: ON_LIGHTPOPUP_DISPLAYED_EVENT,
33
+ [AdEventType.FAILED_TO_DISPLAY]: ON_LIGHTPOPUP_AD_FAILED_TO_DISPLAY_EVENT,
34
+ [AdEventType.HIDDEN]: ON_LIGHTPOPUP_HIDDEN_EVENT,
35
+ [AdEventType.IMPRESSION_RECORDED]: ON_LIGHTPOPUP_AD_IMPRESSION_RECORDED,
29
36
  };
30
37
 
31
38
  function colorToHex(color: any): string | undefined {
32
- if (typeof color === "number") {
39
+ if (typeof color === 'number') {
33
40
  // react-native에서 number로 오는 경우 (ex: processColor)
34
41
  // #AARRGGBB로 변환
35
- return `#${color.toString(16).padStart(8, "0")}`.toUpperCase();
42
+ return `#${color.toString(16).padStart(8, '0')}`.toUpperCase();
36
43
  }
37
- if (typeof color === "string") {
44
+ if (typeof color === 'string') {
38
45
  const tc = tinycolor(color);
39
46
  if (tc.isValid()) {
40
47
  // alpha가 1이면 #RRGGBB, 아니면 #AARRGGBB
@@ -43,10 +50,9 @@ function colorToHex(color: any): string | undefined {
43
50
  if (alpha === 255) {
44
51
  return hex;
45
52
  } else {
46
- // #AARRGGBB
47
53
  return (
48
- "#" +
49
- alpha.toString(16).padStart(2, "0").toUpperCase() +
54
+ '#' +
55
+ alpha.toString(16).padStart(2, '0').toUpperCase() +
50
56
  tc.toHex().toUpperCase()
51
57
  );
52
58
  }
@@ -55,107 +61,187 @@ function colorToHex(color: any): string | undefined {
55
61
  return undefined;
56
62
  }
57
63
 
58
- const setLightPopupAdConfiguration = (adUnitId: string, configuration: LightPopupAdConfiguration): void => {
64
+ function normalizeConfiguration(
65
+ configuration: LightPopupAdConfiguration
66
+ ): LightPopupAdConfiguration {
59
67
  const config = { ...configuration };
60
68
 
61
- // color 관련 필드만 hex string으로 변환
62
- if (config.backgroundColor) config.backgroundColor = colorToHex(config.backgroundColor);
63
- if (config.cardViewBackgroundColor) config.cardViewBackgroundColor = colorToHex(config.cardViewBackgroundColor);
64
- if (config.adMarkLabelTextColor) config.adMarkLabelTextColor = colorToHex(config.adMarkLabelTextColor);
65
- if (config.adMarkLabelBackgroundColor) config.adMarkLabelBackgroundColor = colorToHex(config.adMarkLabelBackgroundColor);
69
+ if (config.backgroundColor)
70
+ config.backgroundColor = colorToHex(config.backgroundColor);
71
+ if (config.cardViewBackgroundColor)
72
+ config.cardViewBackgroundColor = colorToHex(config.cardViewBackgroundColor);
73
+ if (config.adMarkLabelTextColor)
74
+ config.adMarkLabelTextColor = colorToHex(config.adMarkLabelTextColor);
75
+ if (config.adMarkLabelBackgroundColor)
76
+ config.adMarkLabelBackgroundColor = colorToHex(
77
+ config.adMarkLabelBackgroundColor
78
+ );
66
79
  if (config.closeButtonText) config.closeButtonText = config.closeButtonText;
67
- if (config.closeButtonTextColor) config.closeButtonTextColor = colorToHex(config.closeButtonTextColor);
68
- if (config.titleTextColor) config.titleTextColor = colorToHex(config.titleTextColor);
69
- if (config.bodyTextColor) config.bodyTextColor = colorToHex(config.bodyTextColor);
70
- if (config.ctaButtonTextColor) config.ctaButtonTextColor = colorToHex(config.ctaButtonTextColor);
71
- if (config.ctaButtonBackgroundColor) config.ctaButtonBackgroundColor = colorToHex(config.ctaButtonBackgroundColor);
80
+ if (config.closeButtonTextColor)
81
+ config.closeButtonTextColor = colorToHex(config.closeButtonTextColor);
82
+ if (config.titleTextColor)
83
+ config.titleTextColor = colorToHex(config.titleTextColor);
84
+ if (config.bodyTextColor)
85
+ config.bodyTextColor = colorToHex(config.bodyTextColor);
86
+ if (config.ctaButtonTextColor)
87
+ config.ctaButtonTextColor = colorToHex(config.ctaButtonTextColor);
88
+ if (config.ctaButtonBackgroundColor)
89
+ config.ctaButtonBackgroundColor = colorToHex(
90
+ config.ctaButtonBackgroundColor
91
+ );
92
+
93
+ return config;
94
+ }
72
95
 
73
- DaroMModule.setLightPopupAdConfiguration(adUnitId, config);
74
- };
96
+ export class LightPopupAd {
97
+ private readonly eventEmitter = new AdEventEmitter();
75
98
 
76
- const addAdLoadedEventListener = (listener: (adInfo: AdInfo) => void): void => {
77
- addEventListener(ON_LIGHTPOPUP_LOADED_EVENT, listener);
78
- };
99
+ private constructor(private readonly adUnitId: string) {}
79
100
 
80
- const removeAdLoadedEventListener = (): void => {
81
- removeEventListener(ON_LIGHTPOPUP_LOADED_EVENT);
82
- };
101
+ static createForAdRequest(adUnitId: string): LightPopupAd {
102
+ return new LightPopupAd(adUnitId);
103
+ }
83
104
 
84
- const addAdLoadFailedEventListener = (listener: (errorInfo: AdLoadFailedInfo) => void): void => {
85
- addEventListener(ON_LIGHTPOPUP_LOAD_FAILED_EVENT, listener);
86
- };
105
+ isAdReady(): Promise<boolean> {
106
+ return DaroMModule.isLightPopupReady(this.adUnitId);
107
+ }
87
108
 
88
- const removeAdLoadFailedEventListener = (): void => {
89
- removeEventListener(ON_LIGHTPOPUP_LOAD_FAILED_EVENT);
90
- };
109
+ load(): void {
110
+ DaroMModule.loadLightPopup(this.adUnitId);
111
+ }
91
112
 
92
- const addAdClickedEventListener = (listener: (adInfo: AdInfo) => void): void => {
93
- addEventListener(ON_LIGHTPOPUP_CLICKED_EVENT, listener);
94
- };
113
+ show(): void {
114
+ DaroMModule.showLightPopup(this.adUnitId);
115
+ }
95
116
 
96
- const removeAdClickedEventListener = (): void => {
97
- removeEventListener(ON_LIGHTPOPUP_CLICKED_EVENT);
98
- };
117
+ setConfiguration(configuration: LightPopupAdConfiguration): void {
118
+ DaroMModule.setLightPopupAdConfiguration(
119
+ this.adUnitId,
120
+ normalizeConfiguration(configuration)
121
+ );
122
+ }
99
123
 
100
- const addAdDisplayedEventListener = (listener: (adInfo: AdInfo) => void): void => {
101
- addEventListener(ON_LIGHTPOPUP_DISPLAYED_EVENT, listener);
102
- };
124
+ addAdEventListener<T extends AdEventType>(
125
+ type: T,
126
+ listener: (info: AdEventPayloadMap[T]) => void
127
+ ): () => void {
128
+ const nativeEvent = NATIVE_EVENT_BY_TYPE[type];
129
+ const adUnitId = this.adUnitId;
130
+ return this.eventEmitter.addEventListener(nativeEvent, (payload: any) => {
131
+ if (payload?.adUnitId !== undefined && payload.adUnitId !== adUnitId) {
132
+ return;
133
+ }
134
+ listener(payload);
135
+ });
136
+ }
103
137
 
104
- const removeAdDisplayedEventListener = (): void => {
105
- removeEventListener(ON_LIGHTPOPUP_DISPLAYED_EVENT);
106
- };
138
+ removeAllListeners(): void {
139
+ this.eventEmitter.removeAllListeners();
140
+ }
107
141
 
108
- const addAdFailedToDisplayEventListener = (listener: (errorInfo: AdDisplayFailedInfo) => void): void => {
109
- addEventListener(ON_LIGHTPOPUP_AD_FAILED_TO_DISPLAY_EVENT, listener);
110
- };
142
+ // ---- Deprecated static API (backward compatibility) ----
111
143
 
112
- const removeAdFailedToDisplayEventListener = (): void => {
113
- removeEventListener(ON_LIGHTPOPUP_AD_FAILED_TO_DISPLAY_EVENT);
114
- };
144
+ /** @deprecated `LightPopupAd.createForAdRequest(adUnitId)` 인스턴스의 `isAdReady()`를 사용하세요. */
145
+ static isAdReady(adUnitId: string): Promise<boolean> {
146
+ return DaroMModule.isLightPopupReady(adUnitId);
147
+ }
115
148
 
116
- const addAdHiddenEventListener = (listener: (adInfo: AdInfo) => void): void => {
117
- addEventListener(ON_LIGHTPOPUP_HIDDEN_EVENT, listener);
118
- };
149
+ /** @deprecated `LightPopupAd.createForAdRequest(adUnitId)` 인스턴스의 `load()`를 사용하세요. */
150
+ static loadAd(adUnitId: string): void {
151
+ DaroMModule.loadLightPopup(adUnitId);
152
+ }
119
153
 
120
- const removeAdHiddenEventListener = (): void => {
121
- removeEventListener(ON_LIGHTPOPUP_HIDDEN_EVENT);
122
- };
154
+ /** @deprecated `LightPopupAd.createForAdRequest(adUnitId)` 인스턴스의 `show()`를 사용하세요. */
155
+ static showAd(adUnitId: string): void {
156
+ DaroMModule.showLightPopup(adUnitId);
157
+ }
123
158
 
124
- const addAdImpressionRecordedListener = (listener: (adInfo: AdInfo) => void): void => {
125
- addEventListener(ON_LIGHTPOPUP_AD_IMPRESSION_RECORDED, listener);
126
- };
159
+ /** @deprecated 인스턴스의 `setConfiguration()`을 사용하세요. */
160
+ static setLightPopupAdConfiguration(
161
+ adUnitId: string,
162
+ configuration: LightPopupAdConfiguration
163
+ ): void {
164
+ DaroMModule.setLightPopupAdConfiguration(
165
+ adUnitId,
166
+ normalizeConfiguration(configuration)
167
+ );
168
+ }
127
169
 
128
- const removeAdImpressionRecordedListener = (): void => {
129
- removeEventListener(ON_LIGHTPOPUP_AD_IMPRESSION_RECORDED);
130
- };
170
+ /** @deprecated `addAdEventListener(AdEventType.LOADED, ...)`를 인스턴스에서 사용하세요. */
171
+ static addAdLoadedEventListener(listener: (adInfo: AdInfo) => void): void {
172
+ addEventListener(ON_LIGHTPOPUP_LOADED_EVENT, listener);
173
+ }
174
+
175
+ /** @deprecated 인스턴스의 `addAdEventListener` disposer를 사용하세요. */
176
+ static removeAdLoadedEventListener(): void {
177
+ removeEventListener(ON_LIGHTPOPUP_LOADED_EVENT);
178
+ }
179
+
180
+ /** @deprecated `addAdEventListener(AdEventType.LOAD_FAILED, ...)`를 인스턴스에서 사용하세요. */
181
+ static addAdLoadFailedEventListener(
182
+ listener: (errorInfo: AdLoadFailedInfo) => void
183
+ ): void {
184
+ addEventListener(ON_LIGHTPOPUP_LOAD_FAILED_EVENT, listener);
185
+ }
186
+
187
+ /** @deprecated 인스턴스의 `addAdEventListener` disposer를 사용하세요. */
188
+ static removeAdLoadFailedEventListener(): void {
189
+ removeEventListener(ON_LIGHTPOPUP_LOAD_FAILED_EVENT);
190
+ }
131
191
 
132
- export const LightPopupAd: LightPopupAdType = {
133
- isAdReady,
134
- loadAd,
135
- showAd,
192
+ /** @deprecated `addAdEventListener(AdEventType.CLICKED, ...)`를 인스턴스에서 사용하세요. */
193
+ static addAdClickedEventListener(listener: (adInfo: AdInfo) => void): void {
194
+ addEventListener(ON_LIGHTPOPUP_CLICKED_EVENT, listener);
195
+ }
136
196
 
137
- addAdLoadedEventListener,
138
- removeAdLoadedEventListener,
197
+ /** @deprecated 인스턴스의 `addAdEventListener` disposer를 사용하세요. */
198
+ static removeAdClickedEventListener(): void {
199
+ removeEventListener(ON_LIGHTPOPUP_CLICKED_EVENT);
200
+ }
139
201
 
140
- addAdLoadFailedEventListener,
141
- removeAdLoadFailedEventListener,
202
+ /** @deprecated `addAdEventListener(AdEventType.DISPLAYED, ...)`를 인스턴스에서 사용하세요. */
203
+ static addAdDisplayedEventListener(listener: (adInfo: AdInfo) => void): void {
204
+ addEventListener(ON_LIGHTPOPUP_DISPLAYED_EVENT, listener);
205
+ }
142
206
 
143
- addAdClickedEventListener,
144
- removeAdClickedEventListener,
207
+ /** @deprecated 인스턴스의 `addAdEventListener` disposer를 사용하세요. */
208
+ static removeAdDisplayedEventListener(): void {
209
+ removeEventListener(ON_LIGHTPOPUP_DISPLAYED_EVENT);
210
+ }
145
211
 
146
- addAdDisplayedEventListener,
147
- removeAdDisplayedEventListener,
212
+ /** @deprecated `addAdEventListener(AdEventType.FAILED_TO_DISPLAY, ...)`를 인스턴스에서 사용하세요. */
213
+ static addAdFailedToDisplayEventListener(
214
+ listener: (errorInfo: AdDisplayFailedInfo) => void
215
+ ): void {
216
+ addEventListener(ON_LIGHTPOPUP_AD_FAILED_TO_DISPLAY_EVENT, listener);
217
+ }
148
218
 
149
- addAdFailedToDisplayEventListener,
150
- removeAdFailedToDisplayEventListener,
219
+ /** @deprecated 인스턴스의 `addAdEventListener` disposer를 사용하세요. */
220
+ static removeAdFailedToDisplayEventListener(): void {
221
+ removeEventListener(ON_LIGHTPOPUP_AD_FAILED_TO_DISPLAY_EVENT);
222
+ }
151
223
 
152
- addAdHiddenEventListener,
153
- removeAdHiddenEventListener,
224
+ /** @deprecated `addAdEventListener(AdEventType.HIDDEN, ...)`를 인스턴스에서 사용하세요. */
225
+ static addAdHiddenEventListener(listener: (adInfo: AdInfo) => void): void {
226
+ addEventListener(ON_LIGHTPOPUP_HIDDEN_EVENT, listener);
227
+ }
154
228
 
155
- addAdImpressionRecordedListener,
156
- removeAdImpressionRecordedListener,
229
+ /** @deprecated 인스턴스의 `addAdEventListener` disposer를 사용하세요. */
230
+ static removeAdHiddenEventListener(): void {
231
+ removeEventListener(ON_LIGHTPOPUP_HIDDEN_EVENT);
232
+ }
157
233
 
158
- setLightPopupAdConfiguration,
159
- };
234
+ /** @deprecated `addAdEventListener(AdEventType.IMPRESSION_RECORDED, ...)`를 인스턴스에서 사용하세요. */
235
+ static addAdImpressionRecordedListener(
236
+ listener: (adInfo: AdInfo) => void
237
+ ): void {
238
+ addEventListener(ON_LIGHTPOPUP_AD_IMPRESSION_RECORDED, listener);
239
+ }
240
+
241
+ /** @deprecated 인스턴스의 `addAdEventListener` disposer를 사용하세요. */
242
+ static removeAdImpressionRecordedListener(): void {
243
+ removeEventListener(ON_LIGHTPOPUP_AD_IMPRESSION_RECORDED);
244
+ }
245
+ }
160
246
 
161
- export default LightPopupAd;
247
+ export default LightPopupAd;