@saasquatch/squatch-js 2.8.2-1 → 2.8.2-2

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/dist/squatch.js CHANGED
@@ -704,6 +704,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
704
704
  const raw = params;
705
705
  const clean = validatePasswordlessConfig(raw);
706
706
  const { widgetType, engagementMedium = "POPUP", jwt, user } = clean;
707
+ console.log({ params });
707
708
  const tenantAlias = encodeURIComponent(this.tenantAlias);
708
709
  const accountId = (user == null ? void 0 : user.accountId) ? encodeURIComponent(user.accountId) : null;
709
710
  const userId = (user == null ? void 0 : user.id) ? encodeURIComponent(user.id) : null;
@@ -1109,6 +1110,351 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1109
1110
  setTimeout(resolve, duration);
1110
1111
  });
1111
1112
  }
1113
+ const getSkeleton = ({
1114
+ height = "500px",
1115
+ skeletonBackgroundColor = "#e0e0e0",
1116
+ skeletonShimmerColor = "#f5f5f5",
1117
+ borderColor = "#ccc"
1118
+ }) => {
1119
+ return `
1120
+ <style>
1121
+ * {
1122
+ box-sizing: border-box;
1123
+ padding: 0;
1124
+ margin: 0;
1125
+ }
1126
+
1127
+ .widget-container {
1128
+ background: white;
1129
+ width: 100%;
1130
+ max-width: 900px;
1131
+ padding: 40px;
1132
+ border-radius: 12px;
1133
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
1134
+ box-sizing: border-box;
1135
+ }
1136
+
1137
+ @keyframes shimmer {
1138
+ 0% {
1139
+ background-position: -100% 0;
1140
+ }
1141
+ 100% {
1142
+ background-position: 100% 0;
1143
+ }
1144
+ }
1145
+
1146
+ .skeleton {
1147
+ background: ${skeletonBackgroundColor};
1148
+ background: linear-gradient(
1149
+ 90deg,
1150
+ ${skeletonBackgroundColor} 25%,
1151
+ ${skeletonShimmerColor} 50%,
1152
+ ${skeletonBackgroundColor} 75%
1153
+ );
1154
+ background-size: 200% 100%;
1155
+ animation: shimmer 1.5s infinite linear;
1156
+ border-radius: 6px;
1157
+ margin-bottom: 12px;
1158
+ }
1159
+
1160
+ .sk-title-lg {
1161
+ height: 36px;
1162
+ width: 50%;
1163
+ margin-bottom: 16px;
1164
+ }
1165
+ .sk-title-md {
1166
+ height: 28px;
1167
+ width: 30%;
1168
+ margin-bottom: 20px;
1169
+ margin-top: 40px;
1170
+ }
1171
+ .sk-text {
1172
+ height: 16px;
1173
+ width: 80%;
1174
+ margin-bottom: 8px;
1175
+ }
1176
+ .sk-text-short {
1177
+ width: 40%;
1178
+ }
1179
+ .sk-label {
1180
+ height: 14px;
1181
+ width: 25%;
1182
+ margin-bottom: 10px;
1183
+ }
1184
+
1185
+ .hero-section {
1186
+ display: flex;
1187
+ gap: 40px;
1188
+ margin-bottom: 40px;
1189
+ border-bottom: 1px solid ${borderColor};
1190
+ padding-bottom: 40px;
1191
+ flex-direction: row;
1192
+ }
1193
+ .hero-content {
1194
+ flex: 1;
1195
+ display: flex;
1196
+ flex-direction: column;
1197
+ justify-content: center;
1198
+ }
1199
+ .hero-image {
1200
+ flex: 1;
1201
+ height: 300px;
1202
+ border-radius: 12px;
1203
+ }
1204
+
1205
+ .share-section {
1206
+ margin-bottom: 40px;
1207
+ }
1208
+ .sk-input {
1209
+ height: 50px;
1210
+ width: 100%;
1211
+ border-radius: 8px;
1212
+ margin-bottom: 16px;
1213
+ }
1214
+ .social-buttons {
1215
+ display: flex;
1216
+ gap: 12px;
1217
+ }
1218
+ .sk-btn-social {
1219
+ flex: 1;
1220
+ height: 50px;
1221
+ border-radius: 8px;
1222
+ }
1223
+
1224
+ .stats-section {
1225
+ display: flex;
1226
+ gap: 24px;
1227
+ margin-bottom: 40px;
1228
+ padding: 30px 0;
1229
+ border-top: 1px solid ${borderColor};
1230
+ border-bottom: 1px solid ${borderColor};
1231
+ }
1232
+ .stat-card {
1233
+ flex: 1;
1234
+ display: flex;
1235
+ flex-direction: column;
1236
+ align-items: center;
1237
+ }
1238
+ .stat-divider {
1239
+ padding-left: 24px;
1240
+ }
1241
+
1242
+ .sk-stat-num {
1243
+ height: 48px;
1244
+ width: 120px;
1245
+ margin-bottom: 8px;
1246
+ }
1247
+ .sk-stat-label {
1248
+ height: 18px;
1249
+ width: 80px;
1250
+ }
1251
+
1252
+ .table-header {
1253
+ display: flex;
1254
+ gap: 16px;
1255
+ margin-bottom: 16px;
1256
+ }
1257
+ .sk-th {
1258
+ height: 16px;
1259
+ }
1260
+ .table-row {
1261
+ display: flex;
1262
+ align-items: center;
1263
+ gap: 16px;
1264
+ padding: 16px 0;
1265
+ border-bottom: 1px solid ${borderColor};
1266
+ }
1267
+
1268
+ .col-user {
1269
+ flex: 2;
1270
+ }
1271
+ .col-status {
1272
+ flex: 1;
1273
+ }
1274
+ .col-reward {
1275
+ flex: 2;
1276
+ }
1277
+ .col-date {
1278
+ flex: 1;
1279
+ }
1280
+
1281
+ .sk-badge {
1282
+ height: 28px;
1283
+ width: 90px;
1284
+ border-radius: 14px;
1285
+ }
1286
+ .sk-reward-block {
1287
+ height: 36px;
1288
+ width: 100%;
1289
+ border-radius: 6px;
1290
+ }
1291
+
1292
+ .pagination {
1293
+ display: flex;
1294
+ justify-content: flex-end;
1295
+ gap: 8px;
1296
+ margin-top: 24px;
1297
+ }
1298
+ .sk-btn-page {
1299
+ height: 36px;
1300
+ width: 64px;
1301
+ border-radius: 6px;
1302
+ margin-bottom: 0;
1303
+ }
1304
+
1305
+ @media (max-width: 768px) {
1306
+ body {
1307
+ padding: 20px;
1308
+ }
1309
+ .widget-container {
1310
+ padding: 24px;
1311
+ }
1312
+
1313
+ .hero-section {
1314
+ flex-direction: column-reverse;
1315
+ gap: 24px;
1316
+ }
1317
+ .hero-image {
1318
+ height: 220px;
1319
+ width: 100%;
1320
+ }
1321
+ .sk-title-lg {
1322
+ width: 80%;
1323
+ }
1324
+
1325
+ .col-date {
1326
+ display: none;
1327
+ }
1328
+ }
1329
+
1330
+ @media (max-width: 480px) {
1331
+ body {
1332
+ padding: 10px;
1333
+ }
1334
+ .widget-container {
1335
+ padding: 16px;
1336
+ }
1337
+
1338
+ .sk-stat-num {
1339
+ width: 80px;
1340
+ height: 40px;
1341
+ }
1342
+
1343
+ .col-reward {
1344
+ display: none;
1345
+ }
1346
+
1347
+ .col-user {
1348
+ flex: 3;
1349
+ }
1350
+ .col-status {
1351
+ flex: 2;
1352
+ display: flex;
1353
+ justify-content: flex-end;
1354
+ }
1355
+ }
1356
+ </style>
1357
+
1358
+ <div class="widget-container">
1359
+ <div class="hero-section">
1360
+ <div class="hero-content">
1361
+ <div class="skeleton sk-title-lg"></div>
1362
+ <div class="skeleton sk-text"></div>
1363
+ <div class="skeleton sk-text sk-text-short"></div>
1364
+ </div>
1365
+ <div class="skeleton hero-image"></div>
1366
+ </div>
1367
+
1368
+ <div class="share-section">
1369
+ <div class="skeleton sk-label"></div>
1370
+ <div class="skeleton sk-input"></div>
1371
+ <div class="social-buttons">
1372
+ <div class="skeleton sk-btn-social"></div>
1373
+ <div class="skeleton sk-btn-social"></div>
1374
+ <div class="skeleton sk-btn-social"></div>
1375
+ <div class="skeleton sk-btn-social"></div>
1376
+ </div>
1377
+ </div>
1378
+
1379
+ <div
1380
+ class="skeleton sk-title-md"
1381
+ style="margin-top: 0; width: 30%; margin-left: auto; margin-right: auto"
1382
+ ></div>
1383
+ <div
1384
+ class="skeleton sk-text"
1385
+ style="width: 60%; margin-left: auto; margin-right: auto"
1386
+ ></div>
1387
+
1388
+ <div class="stats-section">
1389
+ <div class="stat-card">
1390
+ <div class="skeleton sk-stat-num"></div>
1391
+ <div class="skeleton sk-stat-label"></div>
1392
+ </div>
1393
+ <div class="stat-card stat-divider">
1394
+ <div class="skeleton sk-stat-num"></div>
1395
+ <div class="skeleton sk-stat-label"></div>
1396
+ </div>
1397
+ </div>
1398
+
1399
+ <div class="skeleton sk-title-md"></div>
1400
+
1401
+ <div class="table-header">
1402
+ <div class="skeleton sk-th col-user"></div>
1403
+ <div class="skeleton sk-th col-status"></div>
1404
+ <div class="skeleton sk-th col-reward"></div>
1405
+ <div class="skeleton sk-th col-date"></div>
1406
+ </div>
1407
+
1408
+ <div class="table-row">
1409
+ <div class="col-user">
1410
+ <div class="skeleton sk-text" style="width: 70%; margin: 0"></div>
1411
+ </div>
1412
+ <div class="col-status">
1413
+ <div class="skeleton sk-badge" style="margin: 0"></div>
1414
+ </div>
1415
+ <div class="col-reward">
1416
+ <div class="skeleton sk-reward-block" style="margin: 0"></div>
1417
+ </div>
1418
+ <div class="col-date">
1419
+ <div class="skeleton sk-text" style="width: 80%; margin: 0"></div>
1420
+ </div>
1421
+ </div>
1422
+ <div class="table-row">
1423
+ <div class="col-user">
1424
+ <div class="skeleton sk-text" style="width: 60%; margin: 0"></div>
1425
+ </div>
1426
+ <div class="col-status">
1427
+ <div class="skeleton sk-badge" style="margin: 0"></div>
1428
+ </div>
1429
+ <div class="col-reward">
1430
+ <div class="skeleton sk-reward-block" style="margin: 0"></div>
1431
+ </div>
1432
+ <div class="col-date">
1433
+ <div class="skeleton sk-text" style="width: 80%; margin: 0"></div>
1434
+ </div>
1435
+ </div>
1436
+ <div class="table-row">
1437
+ <div class="col-user">
1438
+ <div class="skeleton sk-text" style="width: 75%; margin: 0"></div>
1439
+ </div>
1440
+ <div class="col-status">
1441
+ <div class="skeleton sk-badge" style="margin: 0"></div>
1442
+ </div>
1443
+ <div class="col-reward">
1444
+ <div class="skeleton sk-reward-block" style="margin: 0"></div>
1445
+ </div>
1446
+ <div class="col-date">
1447
+ <div class="skeleton sk-text" style="width: 80%; margin: 0"></div>
1448
+ </div>
1449
+ </div>
1450
+
1451
+ <div class="pagination">
1452
+ <div class="skeleton sk-btn-page"></div>
1453
+ <div class="skeleton sk-btn-page"></div>
1454
+ </div>
1455
+ </div>
1456
+ `;
1457
+ };
1112
1458
  const _log$7 = browserExports.debug("squatch-js:EMBEDwidget");
1113
1459
  class EmbedWidget extends Widget {
1114
1460
  constructor(params, container) {
@@ -1118,10 +1464,13 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1118
1464
  if (container) this.container = container;
1119
1465
  }
1120
1466
  async load() {
1121
- var _a2, _b, _c, _d, _e, _f, _g, _h;
1467
+ var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
1122
1468
  const brandingConfig = (_b = (_a2 = this.context.widgetConfig) == null ? void 0 : _a2.values) == null ? void 0 : _b.brandingConfig;
1123
- const initialHeight = (_e = (_d = (_c = this.context.widgetConfig) == null ? void 0 : _c.values) == null ? void 0 : _d.brandingConfig) == null ? void 0 : _e.loadingHeight;
1124
- const sizes = (_f = brandingConfig == null ? void 0 : brandingConfig.widgetSize) == null ? void 0 : _f.embeddedWidgets;
1469
+ const initialHeight = brandingConfig == null ? void 0 : brandingConfig.loadingHeight;
1470
+ const skeletonBackgroundColor = (_d = (_c = brandingConfig == null ? void 0 : brandingConfig.color) == null ? void 0 : _c.loadingSkeleton) == null ? void 0 : _d.background;
1471
+ const skeletonShimmerColor = (_f = (_e = brandingConfig == null ? void 0 : brandingConfig.color) == null ? void 0 : _e.loadingSkeleton) == null ? void 0 : _f.animationBackground;
1472
+ const borderColor = (_g = brandingConfig == null ? void 0 : brandingConfig.border) == null ? void 0 : _g.borderColor;
1473
+ const sizes = (_h = brandingConfig == null ? void 0 : brandingConfig.widgetSize) == null ? void 0 : _h.embeddedWidgets;
1125
1474
  const maxWidth = (sizes == null ? void 0 : sizes.maxWidth) ? formatWidth(sizes.maxWidth) : "";
1126
1475
  const minWidth = (sizes == null ? void 0 : sizes.minWidth) ? formatWidth(sizes.minWidth) : "";
1127
1476
  console.log({
@@ -1129,31 +1478,45 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1129
1478
  initialHeight,
1130
1479
  widgetConfig: this.context.widgetConfig
1131
1480
  });
1481
+ const skeletonHTML = getSkeleton({
1482
+ height: initialHeight,
1483
+ skeletonBackgroundColor,
1484
+ skeletonShimmerColor,
1485
+ borderColor
1486
+ });
1487
+ const skeletonContainer = document.createElement("div");
1488
+ skeletonContainer.innerHTML = skeletonHTML;
1132
1489
  const frame = this._createFrame({
1133
1490
  minWidth,
1134
1491
  maxWidth,
1135
1492
  initialHeight
1136
1493
  });
1137
1494
  const element = this._findElement();
1138
- if ((_g = this.context) == null ? void 0 : _g.container) {
1495
+ frame.style.display = "none";
1496
+ const injectContents = (target) => {
1497
+ target.appendChild(skeletonContainer);
1498
+ target.appendChild(frame);
1499
+ };
1500
+ if ((_i = this.context) == null ? void 0 : _i.container) {
1139
1501
  element.style.visibility = "hidden";
1140
1502
  element.style.height = "0";
1141
1503
  element.style["overflow-y"] = "hidden";
1142
1504
  }
1143
1505
  if (this.container) {
1144
1506
  if (element.shadowRoot) {
1145
- if (((_h = element.shadowRoot.lastChild) == null ? void 0 : _h.nodeName) === "IFRAME") {
1507
+ if (((_j = element.shadowRoot.lastChild) == null ? void 0 : _j.nodeName) === "IFRAME") {
1146
1508
  element.shadowRoot.replaceChild(frame, element.shadowRoot.lastChild);
1147
1509
  } else {
1148
- element.shadowRoot.appendChild(frame);
1510
+ injectContents(element.shadowRoot);
1149
1511
  }
1150
1512
  } else if (element.firstChild) {
1151
- element.replaceChild(frame, element.firstChild);
1513
+ element.innerHTML = "";
1514
+ injectContents(element);
1152
1515
  } else {
1153
- element.appendChild(frame);
1516
+ injectContents(element);
1154
1517
  }
1155
1518
  } else if (!element.firstChild || element.firstChild.nodeName === "#text") {
1156
- element.appendChild(frame);
1519
+ injectContents(element);
1157
1520
  }
1158
1521
  const { contentWindow } = frame;
1159
1522
  if (!contentWindow) {
@@ -1161,16 +1524,29 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1161
1524
  }
1162
1525
  const frameDoc = contentWindow.document;
1163
1526
  frameDoc.open();
1164
- console.log({ content: this.content });
1527
+ console.log({ content: this.content, context: this.context, this: this });
1528
+ const domain = this.widgetApi.domain;
1165
1529
  frameDoc.write(`
1530
+ ${((_k = brandingConfig == null ? void 0 : brandingConfig.main) == null ? void 0 : _k.brandFont) && `
1531
+ <link rel="preconnect" href="https://fast${domain === "https://staging.referralsaasquatch.com" && "-staging"}.ssqt.io">
1532
+ <link rel="preconnect" href="https://fonts.gstatic.com">
1533
+ <link rel="preconnect" href="https://fonts.googleapis.com">
1534
+ <link rel="preload" href="https://fonts.googleapis.com/css2?family=${encodeURIComponent(
1535
+ (_l = brandingConfig == null ? void 0 : brandingConfig.main) == null ? void 0 : _l.brandFont
1536
+ )}">`}
1166
1537
  <script src="${this.npmCdn}/resize-observer-polyfill@1.5.x"><\/script>
1167
- ${this.content}
1168
- <style data-styles>
1169
- html:not(.hydrated) { visibility:hidden; }
1538
+ <style data-styles>
1539
+ html { visibility:hidden;}
1170
1540
  </style>
1541
+ ${this.content}
1542
+
1171
1543
  `);
1172
1544
  frameDoc.close();
1173
1545
  domready(frameDoc, async () => {
1546
+ if (skeletonContainer && skeletonContainer.parentNode) {
1547
+ skeletonContainer.parentNode.removeChild(skeletonContainer);
1548
+ }
1549
+ frame.style.display = "block";
1174
1550
  const _sqh = contentWindow.squatch || contentWindow.widgetIdent;
1175
1551
  frame.height = initialHeight || frameDoc.body.scrollHeight;
1176
1552
  console.log({ height: frameDoc.body.scrollHeight });
@@ -1809,7 +2185,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1809
2185
  }
1810
2186
  }
1811
2187
  const _log$3 = browserExports.debug("squatch-js");
1812
- function _getAutoConfig(configIn) {
2188
+ function _getAutoConfig() {
2189
+ var _a2;
1813
2190
  const queryString = window.location.search;
1814
2191
  const urlParams = new URLSearchParams(queryString);
1815
2192
  const refParam = urlParams.get("_saasquatchExtra") || "";
@@ -1817,6 +2194,13 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1817
2194
  _log$3("No _saasquatchExtra param");
1818
2195
  return;
1819
2196
  }
2197
+ const config = validateConfig({
2198
+ tenantAlias: "UNKNOWN"
2199
+ });
2200
+ if (!config.domain) {
2201
+ _log$3("domain must be provided in config to use _saasquatchExtra");
2202
+ return;
2203
+ }
1820
2204
  let raw;
1821
2205
  try {
1822
2206
  raw = JSON.parse(b64decode(refParam));
@@ -1824,8 +2208,13 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1824
2208
  _log$3("Unable to decode _saasquatchExtra config");
1825
2209
  return;
1826
2210
  }
1827
- const { domain, tenantAlias, widgetConfig } = convertExtraToConfig(raw);
1828
- if (!domain || !tenantAlias || !widgetConfig) {
2211
+ function normalizeDomain(domain) {
2212
+ return domain.replace(/^https?:\/\//, "");
2213
+ }
2214
+ const normalizedDomain = normalizeDomain(config.domain);
2215
+ const tenantAlias = Object.keys((raw == null ? void 0 : raw[normalizedDomain]) || {})[0];
2216
+ const widgetConfig = (_a2 = raw == null ? void 0 : raw[normalizedDomain]) == null ? void 0 : _a2[tenantAlias];
2217
+ if (!widgetConfig) {
1829
2218
  _log$3("_saasquatchExtra did not have an expected structure");
1830
2219
  return void 0;
1831
2220
  }
@@ -1837,20 +2226,11 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1837
2226
  ...rest
1838
2227
  },
1839
2228
  squatchConfig: {
1840
- ...configIn ? { configIn } : {},
1841
- domain,
2229
+ ...config,
1842
2230
  tenantAlias
1843
2231
  }
1844
2232
  };
1845
2233
  }
1846
- function convertExtraToConfig(obj) {
1847
- var _a2;
1848
- const _domain = Object.keys(obj || {})[0];
1849
- const tenantAlias = Object.keys((obj == null ? void 0 : obj[_domain]) || {})[0];
1850
- const widgetConfig = (_a2 = obj == null ? void 0 : obj[_domain]) == null ? void 0 : _a2[tenantAlias];
1851
- const domain = _domain ? `https://${_domain}` : void 0;
1852
- return { domain, tenantAlias, widgetConfig };
1853
- }
1854
2234
  const _log$2 = browserExports.debug("squatch-js:decodeUserJwt");
1855
2235
  function decodeUserJwt(tokenStr) {
1856
2236
  var _a2;
@@ -2163,9 +2543,9 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2163
2543
  var _a2;
2164
2544
  return (_a2 = widgets()) == null ? void 0 : _a2.render(widgetConfig);
2165
2545
  }
2166
- function _auto(configIn) {
2546
+ function _auto() {
2167
2547
  var _a2;
2168
- const configs = _getAutoConfig(configIn);
2548
+ const configs = _getAutoConfig();
2169
2549
  if (configs) {
2170
2550
  const { squatchConfig, widgetConfig } = configs;
2171
2551
  init(squatchConfig);