react-native-moengage-cards 1.0.0
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.
- package/README.md +10 -0
- package/ReactNativeMoEngageCards.podspec +25 -0
- package/android/.editorconfig +8 -0
- package/android/build.gradle +58 -0
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +18 -0
- package/android/gradle.properties +14 -0
- package/android/gradlew +234 -0
- package/android/gradlew.bat +89 -0
- package/android/src/main/AndroidManifest.xml +16 -0
- package/android/src/main/java/com/moengage/react/cards/Constants.kt +12 -0
- package/android/src/main/java/com/moengage/react/cards/EventEmitterImpl.kt +62 -0
- package/android/src/main/java/com/moengage/react/cards/MoEngageCardsBridge.kt +228 -0
- package/android/src/main/java/com/moengage/react/cards/MoEngageCardsPackage.kt +35 -0
- package/android/src/main/java/com/moengage/react/cards/PayloadGenerator.kt +26 -0
- package/ios/Cards.xcodeproj/project.pbxproj +302 -0
- package/ios/Cards.xcworkspace/contents.xcworkspacedata +7 -0
- package/ios/Cards.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/ios/MoEngageCardsBridge.h +9 -0
- package/ios/MoEngageCardsBridge.m +149 -0
- package/ios/MoEngageCardsReactConstants.h +14 -0
- package/ios/MoEngageCardsReactConstants.m +15 -0
- package/ios/MoEngageCardsReactUtil.h +15 -0
- package/ios/MoEngageCardsReactUtil.m +44 -0
- package/package.json +42 -0
- package/src/ReactMoEngageCards.ts +212 -0
- package/src/index.ts +58 -0
- package/src/internal/Constants.ts +86 -0
- package/src/internal/MoEngageCardHandler.ts +265 -0
- package/src/internal/MoEngageCardsCache.ts +31 -0
- package/src/internal/utils/JsonToModelMapper.ts +267 -0
- package/src/internal/utils/ModelToJsonMapper.ts +250 -0
- package/src/internal/utils/PayloadBuilder.ts +68 -0
- package/src/internal/utils/PayloadParser.ts +53 -0
- package/src/internal/utils/PlatformPayloadBuilder.ts +81 -0
- package/src/internal/utils/Util.ts +16 -0
- package/src/model/CampaignState.ts +54 -0
- package/src/model/Card.ts +51 -0
- package/src/model/CardInfo.ts +36 -0
- package/src/model/CardsData.ts +29 -0
- package/src/model/Container.ts +59 -0
- package/src/model/DisplayControl.ts +70 -0
- package/src/model/MetaData.ts +90 -0
- package/src/model/ShowTime.ts +27 -0
- package/src/model/SyncData.ts +30 -0
- package/src/model/Template.ts +37 -0
- package/src/model/Widget.ts +59 -0
- package/src/model/action/Action.ts +22 -0
- package/src/model/action/NavigationAction.ts +39 -0
- package/src/model/enums/ActionType.ts +16 -0
- package/src/model/enums/NavigationType.ts +28 -0
- package/src/model/enums/SyncType.ts +28 -0
- package/src/model/enums/TemplateType.ts +22 -0
- package/src/model/enums/WidgetType.ts +28 -0
- package/src/model/styles/ButtonStyle.ts +23 -0
- package/src/model/styles/ContainerStyle.ts +20 -0
- package/src/model/styles/ImageStyle.ts +16 -0
- package/src/model/styles/TextStyle.ts +19 -0
- package/src/model/styles/WidgetStyle.ts +19 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { NativeEventEmitter, Platform } from "react-native";
|
|
2
|
+
import PlatformPayloadBuilder from "./utils/PlatformPayloadBuilder";
|
|
3
|
+
import SyncCompleteData from "../model/SyncData";
|
|
4
|
+
import MoEngageCardsCache from "./MoEngageCardsCache";
|
|
5
|
+
import SyncType from "../model/enums/SyncType";
|
|
6
|
+
import {
|
|
7
|
+
getAllCategoryStatusFromPayload,
|
|
8
|
+
getCardInfoFromPayload,
|
|
9
|
+
getCardsCategoriesFromPayload,
|
|
10
|
+
getCardsDataFromPayload,
|
|
11
|
+
getCardsDataFromPayloadWithDefaultCategory,
|
|
12
|
+
getNewCardCountFromPayload,
|
|
13
|
+
getUnclickedCountFromPayload
|
|
14
|
+
} from "./utils/PayloadParser";
|
|
15
|
+
import CardInfo from "../model/CardInfo";
|
|
16
|
+
import Card from "../model/Card";
|
|
17
|
+
import CardsData from "../model/CardsData";
|
|
18
|
+
import {
|
|
19
|
+
MODULE_TAG,
|
|
20
|
+
keyData,
|
|
21
|
+
keyPayload,
|
|
22
|
+
keySyncCompleteData,
|
|
23
|
+
argumentAppOpenSync,
|
|
24
|
+
argumentInboxOpenSync,
|
|
25
|
+
argumentPullToRefreshSync
|
|
26
|
+
} from "./Constants";
|
|
27
|
+
import { MoEngageLogger } from "react-native-moengage";
|
|
28
|
+
import { syncDataFromJson } from "./utils/JsonToModelMapper";
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
const MoEngageCardsBridge = require("react-native").NativeModules.MoEngageCardsBridge;
|
|
32
|
+
|
|
33
|
+
let MoEngageEventEmitter: { addListener: (arg0: any, arg1: (data: any) => void) => void; };
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Helper class to connect the Public Card APIs to Platform specific bridge
|
|
37
|
+
*
|
|
38
|
+
* @since 1.0.0
|
|
39
|
+
* @author Abhishek Kumar
|
|
40
|
+
*/
|
|
41
|
+
class MoEngageCardHandler {
|
|
42
|
+
|
|
43
|
+
private TAG = `${MODULE_TAG}MoEngageCardHandler`;
|
|
44
|
+
|
|
45
|
+
private appId: string;
|
|
46
|
+
private platformPayloadBuilder: PlatformPayloadBuilder;
|
|
47
|
+
|
|
48
|
+
constructor(appId: string) {
|
|
49
|
+
this.appId = appId;
|
|
50
|
+
this.platformPayloadBuilder = new PlatformPayloadBuilder(Platform.OS, this.appId);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
initialize(): void {
|
|
54
|
+
try {
|
|
55
|
+
if (MoEngageCardsBridge && MoEngageEventEmitter === undefined) {
|
|
56
|
+
MoEngageEventEmitter = new NativeEventEmitter(MoEngageCardsBridge);
|
|
57
|
+
this.addBridgeEventListener();
|
|
58
|
+
MoEngageLogger.debug(`${this.TAG} Card Bridge Listener Added`);
|
|
59
|
+
}
|
|
60
|
+
MoEngageCardsBridge.initialize(this.platformPayloadBuilder.getAccountMetaPayload());
|
|
61
|
+
MoEngageLogger.debug(`${this.TAG} Card Module Initialised with appId: `, this.appId);
|
|
62
|
+
} catch (error) {
|
|
63
|
+
MoEngageLogger.error(`${this.TAG} Error while initialising the Cards Plugin: `, error);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
refreshCards(onSyncComplete: (data: SyncCompleteData | null) => void): void {
|
|
68
|
+
try {
|
|
69
|
+
MoEngageCardsCache.cacheEventListenerCallback(SyncType.PULL_TO_REFRESH, onSyncComplete);
|
|
70
|
+
MoEngageCardsBridge.refreshCards(this.platformPayloadBuilder.getAccountMetaPayload());
|
|
71
|
+
MoEngageLogger.verbose(`${this.TAG} Executed - refreshCards() `);
|
|
72
|
+
} catch (error) {
|
|
73
|
+
MoEngageLogger.error(`${this.TAG} refreshCards() `, error);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
onCardSectionLoaded(onSyncComplete: (data: SyncCompleteData | null) => void): void {
|
|
78
|
+
try {
|
|
79
|
+
MoEngageCardsCache.cacheEventListenerCallback(SyncType.INBOX_OPEN, onSyncComplete);
|
|
80
|
+
MoEngageCardsBridge.onCardSectionLoaded(this.platformPayloadBuilder.getAccountMetaPayload());
|
|
81
|
+
MoEngageLogger.verbose(`${this.TAG} Executed - onCardSectionLoaded() `);
|
|
82
|
+
} catch (error) {
|
|
83
|
+
MoEngageLogger.error(`${this.TAG} onCardSectionLoaded() `, error);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
onCardSectionUnLoaded(): void {
|
|
88
|
+
try {
|
|
89
|
+
MoEngageCardsCache.removeCacheForEvent(SyncType.INBOX_OPEN);
|
|
90
|
+
MoEngageCardsBridge.onCardSectionUnLoaded(this.platformPayloadBuilder.getAccountMetaPayload());
|
|
91
|
+
MoEngageLogger.verbose(`${this.TAG} Executed - onCardSectionUnLoaded() `);
|
|
92
|
+
} catch (error) {
|
|
93
|
+
MoEngageLogger.error(`${this.TAG} onCardSectionUnLoaded() `, error);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async getCardsCategories(): Promise<Array<string>> {
|
|
98
|
+
try {
|
|
99
|
+
const categoriesPayload = await MoEngageCardsBridge.getCardsCategories(
|
|
100
|
+
this.platformPayloadBuilder.getAccountMetaPayload()
|
|
101
|
+
);
|
|
102
|
+
const cardCategories = getCardsCategoriesFromPayload(categoriesPayload);
|
|
103
|
+
MoEngageLogger.verbose(`${this.TAG} Executed - getCardsCategories() `, cardCategories);
|
|
104
|
+
return cardCategories ?? [];
|
|
105
|
+
} catch (error) {
|
|
106
|
+
MoEngageLogger.error(`${this.TAG} getCardsCategories() `, error);
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async getCardsInfo(): Promise<CardInfo> {
|
|
112
|
+
try {
|
|
113
|
+
const cardInfoPayload = await MoEngageCardsBridge.getCardsInfo(
|
|
114
|
+
this.platformPayloadBuilder.getAccountMetaPayload()
|
|
115
|
+
);
|
|
116
|
+
const cardInfo = getCardInfoFromPayload(cardInfoPayload);
|
|
117
|
+
MoEngageLogger.verbose(`${this.TAG} Executed - getCardsInfo() `, cardInfo);
|
|
118
|
+
return cardInfo;
|
|
119
|
+
} catch (error) {
|
|
120
|
+
MoEngageLogger.error(`${this.TAG} getCardsInfo() `, error);
|
|
121
|
+
return new CardInfo(false, [], []);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
cardClicked(card: Card, widgetId: number): void {
|
|
126
|
+
try {
|
|
127
|
+
MoEngageCardsBridge.cardClicked(this.platformPayloadBuilder.getCardClickedPayload(card, widgetId));
|
|
128
|
+
MoEngageLogger.verbose(`${this.TAG} Executed - cardClicked() for widgetId`, widgetId);
|
|
129
|
+
} catch (error) {
|
|
130
|
+
MoEngageLogger.error(`${this.TAG} cardClicked() `, error);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
cardDelivered(): void {
|
|
135
|
+
try {
|
|
136
|
+
MoEngageCardsBridge.cardDelivered(this.platformPayloadBuilder.getAccountMetaPayload());
|
|
137
|
+
MoEngageLogger.verbose(`${this.TAG} Executed - cardDelivered() `);
|
|
138
|
+
} catch (error) {
|
|
139
|
+
MoEngageLogger.error(`${this.TAG} cardDelivered() `, error);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
cardShown(card: Card) {
|
|
144
|
+
try {
|
|
145
|
+
MoEngageCardsBridge.cardShown(this.platformPayloadBuilder.getCardShowPayload(card));
|
|
146
|
+
MoEngageLogger.verbose(`${this.TAG} Executed - cardShown() `);
|
|
147
|
+
} catch (error) {
|
|
148
|
+
MoEngageLogger.error(`${this.TAG} cardShown() `, error);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
async getCardsForCategory(category: string): Promise<CardsData> {
|
|
153
|
+
try {
|
|
154
|
+
const cardsDataPayload = await MoEngageCardsBridge.getCardsForCategory(
|
|
155
|
+
this.platformPayloadBuilder.getCardsForCategoriesPayload(category)
|
|
156
|
+
);
|
|
157
|
+
const cardsData = getCardsDataFromPayload(cardsDataPayload);
|
|
158
|
+
MoEngageLogger.verbose(`${this.TAG} Executed - getCardsForCategory() `, cardsData);
|
|
159
|
+
return cardsData;
|
|
160
|
+
} catch (error) {
|
|
161
|
+
MoEngageLogger.error(`${this.TAG} getCardsForCategory() `, error);
|
|
162
|
+
return new CardsData(category, []);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
async fetchCards(): Promise<CardsData> {
|
|
167
|
+
try {
|
|
168
|
+
const cardsDataPayload = await MoEngageCardsBridge.fetchCards(
|
|
169
|
+
this.platformPayloadBuilder.getAccountMetaPayload()
|
|
170
|
+
);
|
|
171
|
+
const cardsData = getCardsDataFromPayloadWithDefaultCategory(cardsDataPayload);
|
|
172
|
+
MoEngageLogger.verbose(`${this.TAG} Executed - fetchCards() `, cardsData);
|
|
173
|
+
return cardsData;
|
|
174
|
+
} catch (error) {
|
|
175
|
+
MoEngageLogger.error(`${this.TAG} fetchCards() `, error);
|
|
176
|
+
return new CardsData("", []);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
deleteCards(cards: Array<Card>) {
|
|
181
|
+
try {
|
|
182
|
+
MoEngageCardsBridge.deleteCards(this.platformPayloadBuilder.getDeleteCardsPayload(cards));
|
|
183
|
+
MoEngageLogger.verbose(`${this.TAG} Executed - deleteCards() `);
|
|
184
|
+
} catch (error) {
|
|
185
|
+
MoEngageLogger.error(`${this.TAG} deleteCards() `, error);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
async isAllCategoryEnabled(): Promise<boolean> {
|
|
190
|
+
try {
|
|
191
|
+
const categoryStatusPayload = await MoEngageCardsBridge.isAllCategoryEnabled(
|
|
192
|
+
this.platformPayloadBuilder.getAccountMetaPayload()
|
|
193
|
+
);
|
|
194
|
+
const isAllCategoryEnabled = getAllCategoryStatusFromPayload(categoryStatusPayload);
|
|
195
|
+
MoEngageLogger.verbose(`${this.TAG} Executed - isAllCategoryEnabled() `, isAllCategoryEnabled);
|
|
196
|
+
return isAllCategoryEnabled ?? false;
|
|
197
|
+
} catch (error) {
|
|
198
|
+
MoEngageLogger.error(`${this.TAG} isAllCategoryEnabled() `, error);
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
async getNewCardsCount(): Promise<number> {
|
|
204
|
+
try {
|
|
205
|
+
const newCardsCountPayload = await MoEngageCardsBridge.getNewCardsCount(
|
|
206
|
+
this.platformPayloadBuilder.getAccountMetaPayload()
|
|
207
|
+
);
|
|
208
|
+
const newCardCount = getNewCardCountFromPayload(newCardsCountPayload);
|
|
209
|
+
MoEngageLogger.verbose(`${this.TAG} Executed - getNewCardsCount() `, newCardCount);
|
|
210
|
+
return newCardCount ?? 0;
|
|
211
|
+
} catch (error) {
|
|
212
|
+
MoEngageLogger.error(`${this.TAG} getNewCardsCount() `, error);
|
|
213
|
+
return 0;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
async getUnClickedCardsCount(): Promise<number> {
|
|
218
|
+
try {
|
|
219
|
+
const unClickedCardsCountPayload = await MoEngageCardsBridge.getUnClickedCardsCount(
|
|
220
|
+
this.platformPayloadBuilder.getAccountMetaPayload()
|
|
221
|
+
);
|
|
222
|
+
const unclickedCount = getUnclickedCountFromPayload(unClickedCardsCountPayload);
|
|
223
|
+
MoEngageLogger.verbose(`${this.TAG} Executed - getUnClickedCardsCount() `, unclickedCount);
|
|
224
|
+
return unclickedCount;
|
|
225
|
+
} catch (error) {
|
|
226
|
+
MoEngageLogger.error(`${this.TAG} getUnClickedCardsCount() `, error);
|
|
227
|
+
return 0;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
private addBridgeEventListener(): void {
|
|
232
|
+
MoEngageEventEmitter.addListener(
|
|
233
|
+
argumentAppOpenSync,
|
|
234
|
+
(data) => this.handleCallbackForSyncEvent(SyncType.APP_OPEN, data)
|
|
235
|
+
);
|
|
236
|
+
|
|
237
|
+
MoEngageEventEmitter.addListener(
|
|
238
|
+
argumentPullToRefreshSync,
|
|
239
|
+
(data) => this.handleCallbackForSyncEvent(SyncType.PULL_TO_REFRESH, data)
|
|
240
|
+
);
|
|
241
|
+
|
|
242
|
+
MoEngageEventEmitter.addListener(
|
|
243
|
+
argumentInboxOpenSync,
|
|
244
|
+
(data) => this.handleCallbackForSyncEvent(SyncType.INBOX_OPEN, data)
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
private handleCallbackForSyncEvent(syncType: SyncType, data: { [k: string]: any }): void {
|
|
249
|
+
try {
|
|
250
|
+
const payload = data[keyPayload];
|
|
251
|
+
const dataJson = JSON.parse(payload)[keyData];
|
|
252
|
+
MoEngageLogger.verbose(`${this.TAG} handleCallbackForSyncEvent() `, dataJson);
|
|
253
|
+
if (dataJson !== undefined) {
|
|
254
|
+
const syncJson = dataJson[keySyncCompleteData];
|
|
255
|
+
const syncCompleteData = syncJson !== undefined && syncJson != null ? syncDataFromJson(syncJson) : null;
|
|
256
|
+
MoEngageLogger.debug(`${this.TAG} handleCallbackForSyncEvent(): Will try to emit callback for syncType = `, syncType);
|
|
257
|
+
MoEngageCardsCache.getCallbackForCachedEvent(syncType)?.(syncCompleteData);
|
|
258
|
+
}
|
|
259
|
+
} catch (error) {
|
|
260
|
+
MoEngageLogger.error(`handleCallbackForSyncEvent() SyncType: ${syncType} `, error);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export default MoEngageCardHandler;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import SyncCompleteData from "../model/SyncData";
|
|
2
|
+
import SyncType from "../model/enums/SyncType";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Global Cache to store the cache for Cards Plugin
|
|
6
|
+
*
|
|
7
|
+
* @since 1.0.0
|
|
8
|
+
* @author Abhishek Kumar
|
|
9
|
+
*/
|
|
10
|
+
namespace MoEngageCardsCache {
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Sync Event Listener Cache
|
|
14
|
+
* @since 1.0.0
|
|
15
|
+
*/
|
|
16
|
+
let eventListenerCache: Map<SyncType, (data: SyncCompleteData | null) => void> = new Map();
|
|
17
|
+
|
|
18
|
+
export function cacheEventListenerCallback(syncType: SyncType, onTrigger: (data: SyncCompleteData | null) => void): void {
|
|
19
|
+
eventListenerCache.set(syncType, onTrigger);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function getCallbackForCachedEvent(syncType: SyncType): ((data: SyncCompleteData | null) => void) | undefined {
|
|
23
|
+
return eventListenerCache.get(syncType);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function removeCacheForEvent(syncType: SyncType): void {
|
|
27
|
+
eventListenerCache.delete(syncType);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export default MoEngageCardsCache;
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file contains the function to get the model from json
|
|
3
|
+
* @author Abhishek Kumar
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import CampaignState from "../../model/CampaignState";
|
|
8
|
+
import Card from "../../model/Card";
|
|
9
|
+
import CardInfo from "../../model/CardInfo";
|
|
10
|
+
import CardsData from "../../model/CardsData";
|
|
11
|
+
import Container from "../../model/Container";
|
|
12
|
+
import DisplayControl from "../../model/DisplayControl";
|
|
13
|
+
import MetaData from "../../model/MetaData";
|
|
14
|
+
import ShowTime from "../../model/ShowTime";
|
|
15
|
+
import SyncCompleteData from "../../model/SyncData";
|
|
16
|
+
import Template from "../../model/Template";
|
|
17
|
+
import Widget from "../../model/Widget";
|
|
18
|
+
import Action from "../../model/action/Action";
|
|
19
|
+
import NavigationAction from "../../model/action/NavigationAction";
|
|
20
|
+
import ActionType from "../../model/enums/ActionType";
|
|
21
|
+
import NavigationType from "../../model/enums/NavigationType";
|
|
22
|
+
import SyncType from "../../model/enums/SyncType";
|
|
23
|
+
import TemplateType from "../../model/enums/TemplateType";
|
|
24
|
+
import WidgetType from "../../model/enums/WidgetType";
|
|
25
|
+
import ButtonStyle from "../../model/styles/ButtonStyle";
|
|
26
|
+
import ContainerStyle from "../../model/styles/ContainerStyle";
|
|
27
|
+
import ImageStyle from "../../model/styles/ImageStyle";
|
|
28
|
+
import TextStyle from "../../model/styles/TextStyle";
|
|
29
|
+
import WidgetStyle from "../../model/styles/WidgetStyle";
|
|
30
|
+
import {
|
|
31
|
+
defaultContainerBgColor,
|
|
32
|
+
defaultFontSize,
|
|
33
|
+
defaultTextBgColor,
|
|
34
|
+
keyActionType,
|
|
35
|
+
keyActionValue,
|
|
36
|
+
keyActions,
|
|
37
|
+
keyAdditionalMetaData,
|
|
38
|
+
keyBackgroundColor,
|
|
39
|
+
keyCampaignPayload,
|
|
40
|
+
keyCampaignState,
|
|
41
|
+
keyCardId,
|
|
42
|
+
keyCards,
|
|
43
|
+
keyCategories,
|
|
44
|
+
keyCategory,
|
|
45
|
+
keyContainerId,
|
|
46
|
+
keyContainerStyle,
|
|
47
|
+
keyContainerType,
|
|
48
|
+
keyContainers,
|
|
49
|
+
keyCreatedAt,
|
|
50
|
+
keyDeletionTime,
|
|
51
|
+
keyDisplayControl,
|
|
52
|
+
keyEndTime,
|
|
53
|
+
keyExpireAfterDelivered,
|
|
54
|
+
keyExpireAfterSeen,
|
|
55
|
+
keyExpireAt,
|
|
56
|
+
keyFirstReceived,
|
|
57
|
+
keyFirstSeen,
|
|
58
|
+
keyFontSize,
|
|
59
|
+
keyHasUpdates,
|
|
60
|
+
keyId,
|
|
61
|
+
keyIsClicked,
|
|
62
|
+
keyIsNewCard,
|
|
63
|
+
keyIsPinned,
|
|
64
|
+
keyKVPairs,
|
|
65
|
+
keyLocalShowCount,
|
|
66
|
+
keyMaxCount,
|
|
67
|
+
keyMetaData,
|
|
68
|
+
keyNavigationType,
|
|
69
|
+
keyShouldShowAllTab,
|
|
70
|
+
keyShowTime,
|
|
71
|
+
keyStartTime,
|
|
72
|
+
keySyncType,
|
|
73
|
+
keyTemplateData,
|
|
74
|
+
keyTemplateType,
|
|
75
|
+
keyTotalShowCount,
|
|
76
|
+
keyUpdatedAt,
|
|
77
|
+
keyWidgetContent,
|
|
78
|
+
keyWidgetId,
|
|
79
|
+
keyWidgetStyle,
|
|
80
|
+
keyWidgetType,
|
|
81
|
+
keyWidgets
|
|
82
|
+
} from "../Constants";
|
|
83
|
+
import { assertUnsupportedError, getEnumByName } from "../utils/Util";
|
|
84
|
+
|
|
85
|
+
export function actionFromJson(json: { [k: string]: any }): Action {
|
|
86
|
+
const navigationType: ActionType = getEnumByName(ActionType, json[keyActionType] ?? "");
|
|
87
|
+
switch (navigationType) {
|
|
88
|
+
case ActionType.NAVIGATE:
|
|
89
|
+
return navigationActionFromJson(json);
|
|
90
|
+
default:
|
|
91
|
+
assertUnsupportedError("Action Type Not Supported");
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function navigationActionFromJson(json: { [k: string]: any }): NavigationAction {
|
|
96
|
+
return new NavigationAction(
|
|
97
|
+
ActionType.NAVIGATE,
|
|
98
|
+
getEnumByName<NavigationType>(NavigationType, json[keyNavigationType]),
|
|
99
|
+
json[keyActionValue],
|
|
100
|
+
json[keyKVPairs]
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function widgetStyleFromJson(json: { [k: string]: any }, widgetType: WidgetType): WidgetStyle | undefined {
|
|
105
|
+
switch (widgetType) {
|
|
106
|
+
case WidgetType.TEXT:
|
|
107
|
+
return textStyleFromJson(json);
|
|
108
|
+
case WidgetType.BUTTON:
|
|
109
|
+
return buttonStyleFromJson(json);
|
|
110
|
+
case WidgetType.IMAGE:
|
|
111
|
+
return imageStyleFromJson(json);
|
|
112
|
+
default:
|
|
113
|
+
assertUnsupportedError("Widget Type Not Supported");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function buttonStyleFromJson(json: { [k: string]: any }): ButtonStyle | undefined {
|
|
118
|
+
if (json === undefined || json === null) return undefined;
|
|
119
|
+
return new ButtonStyle(
|
|
120
|
+
json[keyBackgroundColor] ?? defaultTextBgColor,
|
|
121
|
+
json[keyFontSize] ?? defaultFontSize
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function containerStyleFromJson(json: { [k: string]: any }): ContainerStyle | undefined {
|
|
126
|
+
if (json === undefined || json === null) return undefined;
|
|
127
|
+
return new ContainerStyle(
|
|
128
|
+
json[keyBackgroundColor] ?? defaultContainerBgColor
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function imageStyleFromJson(json: { [k: string]: any }): ImageStyle | undefined {
|
|
133
|
+
if (json === undefined || json === null) return undefined;
|
|
134
|
+
return new ImageStyle(
|
|
135
|
+
json[keyBackgroundColor] ?? defaultTextBgColor
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function textStyleFromJson(json: { [k: string]: any }): TextStyle | undefined {
|
|
140
|
+
if (json === undefined || json === null) return undefined;
|
|
141
|
+
return new TextStyle(
|
|
142
|
+
json[keyBackgroundColor] ?? defaultTextBgColor,
|
|
143
|
+
json[keyFontSize] ?? defaultFontSize
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export function campaignStateFromJson(json: { [k: string]: any }): CampaignState {
|
|
148
|
+
return new CampaignState(
|
|
149
|
+
json[keyLocalShowCount] ?? 0,
|
|
150
|
+
json[keyIsClicked] ?? false,
|
|
151
|
+
json[keyFirstReceived] ?? -1,
|
|
152
|
+
json[keyFirstSeen] ?? -1,
|
|
153
|
+
json[keyTotalShowCount] ?? 0
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export function cardFromJson(json: { [k: string]: any }): Card {
|
|
158
|
+
return new Card(
|
|
159
|
+
json[keyId] ?? -1,
|
|
160
|
+
json[keyCardId],
|
|
161
|
+
json[keyCategory] ?? "",
|
|
162
|
+
templateFromJson(json[keyTemplateData]),
|
|
163
|
+
metaDataFromJson(json[keyMetaData])
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export function cardInfoFromJson(json: { [k: string]: any }): CardInfo {
|
|
168
|
+
return new CardInfo(
|
|
169
|
+
json[keyShouldShowAllTab] ?? false,
|
|
170
|
+
json[keyCategories] ?? [],
|
|
171
|
+
Array.from((json[keyCards] ?? []) as Iterable<{ [k: string]: any }>)
|
|
172
|
+
.map((cardJson) => {
|
|
173
|
+
return cardFromJson(cardJson);
|
|
174
|
+
})
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export function cardsDataFromJson(json: { [k: string]: any }): CardsData {
|
|
179
|
+
return new CardsData(
|
|
180
|
+
json[keyCategory],
|
|
181
|
+
Array.from((json[keyCards] ?? []) as Iterable<{ [k: string]: any }>)
|
|
182
|
+
.map((cardObject) => {
|
|
183
|
+
return cardFromJson(cardObject);
|
|
184
|
+
})
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export function containerFromJson(json: { [k: string]: any }): Container {
|
|
189
|
+
return new Container(
|
|
190
|
+
json[keyContainerId],
|
|
191
|
+
getEnumByName<TemplateType>(TemplateType, json[keyContainerType]),
|
|
192
|
+
containerStyleFromJson(json[keyContainerStyle]),
|
|
193
|
+
Array.from((json[keyWidgets] ?? []) as Array<{ [k: string]: any }>)
|
|
194
|
+
.map((widget) => {
|
|
195
|
+
return widgetFromJson(widget);
|
|
196
|
+
}),
|
|
197
|
+
Array.from((json[keyActions] ?? []) as Array<{ [k: string]: any }>)
|
|
198
|
+
.map((action) => {
|
|
199
|
+
return actionFromJson(action);
|
|
200
|
+
})
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export function displayControlFromJson(json: { [k: string]: any }): DisplayControl {
|
|
205
|
+
return new DisplayControl(
|
|
206
|
+
json[keyExpireAt] ?? -1,
|
|
207
|
+
json[keyExpireAfterSeen] ?? -1,
|
|
208
|
+
json[keyExpireAfterDelivered] ?? -1,
|
|
209
|
+
json[keyMaxCount] ?? 0,
|
|
210
|
+
json[keyIsPinned] ?? false,
|
|
211
|
+
showTimeFromJson(json[keyShowTime] ?? {})
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export function metaDataFromJson(json: { [k: string]: any }): MetaData {
|
|
216
|
+
const displayControl = displayControlFromJson(json[keyDisplayControl] ?? {});
|
|
217
|
+
return new MetaData(
|
|
218
|
+
displayControl.isPinned,
|
|
219
|
+
json[keyIsNewCard] ?? false,
|
|
220
|
+
campaignStateFromJson(json[keyCampaignState] ?? {}),
|
|
221
|
+
json[keyDeletionTime],
|
|
222
|
+
displayControl,
|
|
223
|
+
json[keyAdditionalMetaData] ?? {},
|
|
224
|
+
json[keyCreatedAt] ?? -1,
|
|
225
|
+
json[keyUpdatedAt] ?? -1,
|
|
226
|
+
json[keyCampaignPayload] ?? {},
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export function showTimeFromJson(json: { [k: string]: any }): ShowTime {
|
|
231
|
+
return new ShowTime(
|
|
232
|
+
json[keyStartTime],
|
|
233
|
+
json[keyEndTime]
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export function syncDataFromJson(json: { [k: string]: any }): SyncCompleteData {
|
|
238
|
+
return new SyncCompleteData(
|
|
239
|
+
json[keyHasUpdates] ?? false,
|
|
240
|
+
getEnumByName<SyncType>(SyncType, json[keySyncType])
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export function templateFromJson(json: { [k: string]: any }): Template {
|
|
245
|
+
return new Template(
|
|
246
|
+
getEnumByName<TemplateType>(TemplateType, json[keyTemplateType]),
|
|
247
|
+
Array.from((json[keyContainers] ?? []) as Array<{ [k: string]: any }>)
|
|
248
|
+
.map((container) => {
|
|
249
|
+
return containerFromJson(container);
|
|
250
|
+
}),
|
|
251
|
+
json[keyKVPairs]
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export function widgetFromJson(json: { [k: string]: any }): Widget {
|
|
256
|
+
const widgetType = getEnumByName<WidgetType>(WidgetType, json[keyWidgetType]);
|
|
257
|
+
return new Widget(
|
|
258
|
+
json[keyWidgetId],
|
|
259
|
+
widgetType,
|
|
260
|
+
json[keyWidgetContent],
|
|
261
|
+
widgetStyleFromJson(json[keyWidgetStyle], widgetType),
|
|
262
|
+
Array.from((json[keyActions] ?? []) as Iterable<{ [k: string]: any }>)
|
|
263
|
+
.map((action) => {
|
|
264
|
+
return actionFromJson(action);
|
|
265
|
+
})
|
|
266
|
+
);
|
|
267
|
+
}
|