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

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