@capillarytech/creatives-library 8.0.313 → 8.0.315

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@capillarytech/creatives-library",
3
3
  "author": "meharaj",
4
- "version": "8.0.313",
4
+ "version": "8.0.315",
5
5
  "description": "Capillary creatives ui",
6
6
  "main": "./index.js",
7
7
  "module": "./index.es.js",
@@ -68,6 +68,7 @@ import { HTML_EDITOR_VARIANTS } from "../../v2Components/HtmlEditor/constants";
68
68
  import { INAPP_EDITOR_TYPES } from "../InAppWrapper/constants";
69
69
  import InappAdvanced from "../InappAdvance/index";
70
70
  import CapDeviceContent from "../../v2Components/CapDeviceContent";
71
+ import capDeviceContentMessages from "../../v2Components/CapDeviceContent/messages";
71
72
  import { ErrorInfoNote } from "../../v2Components/ErrorInfoNote";
72
73
 
73
74
  let editContent = {};
@@ -1218,6 +1219,47 @@ export const InApp = (props) => {
1218
1219
  // ── Old-flow helpers (used by CapDeviceContent when flag is disabled) ──────
1219
1220
  const isAiContentBotDisabled = currentOrgDetails?.accessibleFeatures?.includes(AI_CONTENT_BOT_DISABLED);
1220
1221
 
1222
+ /**
1223
+ * Clears stored API/liquid errors for a specific device (and GENERIC) so
1224
+ * hasAnyErrors() goes false and Done can be re-clicked after editing.
1225
+ * Does NOT clear errors that belong only to the *other* device.
1226
+ */
1227
+ const clearDeviceErrors = useCallback((platform) => {
1228
+ const key = platform === IOS ? IOS_CAPITAL : ANDROID;
1229
+ setErrorMessage((prev) => ({
1230
+ STANDARD_ERROR_MSG: {
1231
+ ...prev.STANDARD_ERROR_MSG,
1232
+ [key]: [],
1233
+ GENERIC: [],
1234
+ },
1235
+ LIQUID_ERROR_MSG: {
1236
+ ...prev.LIQUID_ERROR_MSG,
1237
+ [key]: [],
1238
+ GENERIC: [],
1239
+ },
1240
+ }));
1241
+ }, [IOS_CAPITAL, ANDROID]);
1242
+
1243
+ const setTitleAndroidWithClear = useCallback((value) => {
1244
+ clearDeviceErrors(ANDROID);
1245
+ setTitleAndroid(value);
1246
+ }, [clearDeviceErrors]);
1247
+
1248
+ const setTitleIosWithClear = useCallback((value) => {
1249
+ clearDeviceErrors(IOS);
1250
+ setTitleIos(value);
1251
+ }, [clearDeviceErrors]);
1252
+
1253
+ const setTemplateMessageAndroidWithClear = useCallback((value) => {
1254
+ clearDeviceErrors(ANDROID);
1255
+ setTemplateMessageAndroid(value);
1256
+ }, [clearDeviceErrors]);
1257
+
1258
+ const setTemplateMessageIosWithClear = useCallback((value) => {
1259
+ clearDeviceErrors(IOS);
1260
+ setTemplateMessageIos(value);
1261
+ }, [clearDeviceErrors]);
1262
+
1221
1263
  const templateDescErrorHandler = (value) => {
1222
1264
  const { unsupportedTags, isBraceError } = validateTags({
1223
1265
  content: value,
@@ -1231,19 +1273,34 @@ export const InApp = (props) => {
1231
1273
  return formatMessage(globalMessages.unsupportedTagsValidationError, { unsupportedTags });
1232
1274
  }
1233
1275
  if (isBraceError) {
1234
- return formatMessage(globalMessages.braceValidationError);
1276
+ return formatMessage(globalMessages.unbalanacedCurlyBraces);
1235
1277
  }
1236
1278
  return '';
1237
1279
  };
1238
1280
 
1281
+ /** Same rules as CapDeviceContent onTitleChange / onTemplateMessageChange */
1282
+ const computeInAppTemplateFieldError = (value) => {
1283
+ let error = templateDescErrorHandler(value);
1284
+ if (value === '') {
1285
+ error = formatMessage(capDeviceContentMessages.emptyTemplateMessageErrorMessage);
1286
+ }
1287
+ return error;
1288
+ };
1289
+
1239
1290
  const onCopyTitleAndContent = () => {
1240
1291
  if (panes === ANDROID) {
1292
+ clearDeviceErrors(ANDROID);
1241
1293
  setTitleAndroid(titleIos);
1242
1294
  setTemplateMessageAndroid(templateMessageIos);
1295
+ setTemplateTitleErrorAndroid(computeInAppTemplateFieldError(titleIos));
1296
+ setTemplateMessageErrorAndroid(computeInAppTemplateFieldError(templateMessageIos));
1243
1297
  setInAppImageSrcAndroid(inAppImageSrcIos);
1244
1298
  } else {
1299
+ clearDeviceErrors(IOS);
1245
1300
  setTitleIos(titleAndroid);
1246
1301
  setTemplateMessageIos(templateMessageAndroid);
1302
+ setTemplateTitleErrorIos(computeInAppTemplateFieldError(titleAndroid));
1303
+ setTemplateMessageErrorIos(computeInAppTemplateFieldError(templateMessageAndroid));
1247
1304
  setInAppImageSrcIos(inAppImageSrcAndroid);
1248
1305
  }
1249
1306
  };
@@ -1251,12 +1308,21 @@ export const InApp = (props) => {
1251
1308
  const onTagSelect = (value, index) => {
1252
1309
  const tag = `{{${value}}}`;
1253
1310
  if (panes === ANDROID) {
1254
- if (index === 0) setTitleAndroid((prev) => prev + tag);
1255
- else setTemplateMessageAndroid((prev) => prev + tag);
1256
- } else if (index === 0) {
1257
- setTitleIos((prev) => prev + tag);
1311
+ clearDeviceErrors(ANDROID);
1312
+ const nextTitle = index === 0 ? titleAndroid + tag : titleAndroid;
1313
+ const nextMessage = index === 0 ? templateMessageAndroid : templateMessageAndroid + tag;
1314
+ if (index === 0) setTitleAndroid(nextTitle);
1315
+ else setTemplateMessageAndroid(nextMessage);
1316
+ setTemplateTitleErrorAndroid(computeInAppTemplateFieldError(nextTitle));
1317
+ setTemplateMessageErrorAndroid(computeInAppTemplateFieldError(nextMessage));
1258
1318
  } else {
1259
- setTemplateMessageIos((prev) => prev + tag);
1319
+ clearDeviceErrors(IOS);
1320
+ const nextTitle = index === 0 ? titleIos + tag : titleIos;
1321
+ const nextMessage = index === 0 ? templateMessageIos : templateMessageIos + tag;
1322
+ if (index === 0) setTitleIos(nextTitle);
1323
+ else setTemplateMessageIos(nextMessage);
1324
+ setTemplateTitleErrorIos(computeInAppTemplateFieldError(nextTitle));
1325
+ setTemplateMessageErrorIos(computeInAppTemplateFieldError(nextMessage));
1260
1326
  }
1261
1327
  };
1262
1328
 
@@ -1283,10 +1349,10 @@ export const InApp = (props) => {
1283
1349
  templateMediaType={templateMediaType}
1284
1350
  setTemplateMediaType={setTemplateMediaType}
1285
1351
  title={titleAndroid}
1286
- setTitle={setTitleAndroid}
1352
+ setTitle={setTitleAndroidWithClear}
1287
1353
  templateMessageError={templateMessageErrorAndroid}
1288
1354
  templateMessage={templateMessageAndroid}
1289
- setTemplateMessage={setTemplateMessageAndroid}
1355
+ setTemplateMessage={setTemplateMessageAndroidWithClear}
1290
1356
  setTemplateMessageError={setTemplateMessageErrorAndroid}
1291
1357
  addActionLink={addActionLinkAndroid}
1292
1358
  setAddActionLink={setAddActionLinkAndroid}
@@ -1328,10 +1394,10 @@ export const InApp = (props) => {
1328
1394
  templateMediaType={templateMediaType}
1329
1395
  setTemplateMediaType={setTemplateMediaType}
1330
1396
  title={titleIos}
1331
- setTitle={setTitleIos}
1397
+ setTitle={setTitleIosWithClear}
1332
1398
  templateMessageError={templateMessageErrorIos}
1333
1399
  templateMessage={templateMessageIos}
1334
- setTemplateMessage={setTemplateMessageIos}
1400
+ setTemplateMessage={setTemplateMessageIosWithClear}
1335
1401
  setTemplateMessageError={setTemplateMessageErrorIos}
1336
1402
  addActionLink={addActionLinkIos}
1337
1403
  setAddActionLink={setAddActionLinkIos}