@sparkvault/sdk 1.8.2 → 1.8.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.
@@ -5272,6 +5272,25 @@ class InlineContainer {
5272
5272
  }
5273
5273
  }
5274
5274
 
5275
+ /**
5276
+ * DOM Utilities
5277
+ *
5278
+ * Shared utilities for DOM operations.
5279
+ */
5280
+ /**
5281
+ * Execute a callback when the DOM is ready.
5282
+ * If DOM is already ready, executes immediately.
5283
+ * Otherwise, waits for DOMContentLoaded.
5284
+ */
5285
+ function onDomReady(callback) {
5286
+ if (document.readyState === 'loading') {
5287
+ document.addEventListener('DOMContentLoaded', callback, { once: true });
5288
+ }
5289
+ else {
5290
+ callback();
5291
+ }
5292
+ }
5293
+
5275
5294
  /* global Element */
5276
5295
  /**
5277
5296
  * Identity Module
@@ -5383,7 +5402,7 @@ class IdentityModule {
5383
5402
  * cleanup();
5384
5403
  */
5385
5404
  attach(selector, options = {}) {
5386
- const elements = document.querySelectorAll(selector);
5405
+ let observer = null;
5387
5406
  const handleClick = async (event) => {
5388
5407
  event.preventDefault();
5389
5408
  try {
@@ -5400,40 +5419,45 @@ class IdentityModule {
5400
5419
  // Error already handled by callbacks or will use server redirect
5401
5420
  }
5402
5421
  };
5403
- elements.forEach((element) => {
5404
- element.addEventListener('click', handleClick);
5405
- this.attachedElements.set(element, () => {
5406
- element.removeEventListener('click', handleClick);
5422
+ const attachToElements = () => {
5423
+ const elements = document.querySelectorAll(selector);
5424
+ elements.forEach((element) => {
5425
+ element.addEventListener('click', handleClick);
5426
+ this.attachedElements.set(element, () => {
5427
+ element.removeEventListener('click', handleClick);
5428
+ });
5407
5429
  });
5408
- });
5409
- // Watch for dynamically added elements
5410
- const observer = new MutationObserver((mutations) => {
5411
- mutations.forEach((mutation) => {
5412
- mutation.addedNodes.forEach((node) => {
5413
- if (node instanceof Element) {
5414
- if (node.matches(selector)) {
5415
- node.addEventListener('click', handleClick);
5416
- this.attachedElements.set(node, () => {
5417
- node.removeEventListener('click', handleClick);
5418
- });
5419
- }
5420
- // Check descendants
5421
- node.querySelectorAll(selector).forEach((el) => {
5422
- if (!this.attachedElements.has(el)) {
5423
- el.addEventListener('click', handleClick);
5424
- this.attachedElements.set(el, () => {
5425
- el.removeEventListener('click', handleClick);
5430
+ // Watch for dynamically added elements
5431
+ observer = new MutationObserver((mutations) => {
5432
+ mutations.forEach((mutation) => {
5433
+ mutation.addedNodes.forEach((node) => {
5434
+ if (node instanceof Element) {
5435
+ if (node.matches(selector)) {
5436
+ node.addEventListener('click', handleClick);
5437
+ this.attachedElements.set(node, () => {
5438
+ node.removeEventListener('click', handleClick);
5426
5439
  });
5427
5440
  }
5428
- });
5429
- }
5441
+ // Check descendants
5442
+ node.querySelectorAll(selector).forEach((el) => {
5443
+ if (!this.attachedElements.has(el)) {
5444
+ el.addEventListener('click', handleClick);
5445
+ this.attachedElements.set(el, () => {
5446
+ el.removeEventListener('click', handleClick);
5447
+ });
5448
+ }
5449
+ });
5450
+ }
5451
+ });
5430
5452
  });
5431
5453
  });
5432
- });
5433
- observer.observe(document.body, { childList: true, subtree: true });
5454
+ observer.observe(document.body, { childList: true, subtree: true });
5455
+ };
5456
+ // Defer attachment until DOM is ready
5457
+ onDomReady(attachToElements);
5434
5458
  // Return cleanup function
5435
5459
  return () => {
5436
- observer.disconnect();
5460
+ observer?.disconnect();
5437
5461
  this.attachedElements.forEach((cleanup) => cleanup());
5438
5462
  this.attachedElements.clear();
5439
5463
  };
@@ -8227,7 +8251,7 @@ class VaultUploadModule {
8227
8251
  if (!options.vaultId) {
8228
8252
  throw new ValidationError('vaultId is required');
8229
8253
  }
8230
- const elements = document.querySelectorAll(selector);
8254
+ let observer = null;
8231
8255
  const handleClick = async (event) => {
8232
8256
  event.preventDefault();
8233
8257
  try {
@@ -8243,40 +8267,45 @@ class VaultUploadModule {
8243
8267
  // Error already handled by callbacks or will use server redirect
8244
8268
  }
8245
8269
  };
8246
- elements.forEach((element) => {
8247
- element.addEventListener('click', handleClick);
8248
- this.attachedElements.set(element, () => {
8249
- element.removeEventListener('click', handleClick);
8270
+ const attachToElements = () => {
8271
+ const elements = document.querySelectorAll(selector);
8272
+ elements.forEach((element) => {
8273
+ element.addEventListener('click', handleClick);
8274
+ this.attachedElements.set(element, () => {
8275
+ element.removeEventListener('click', handleClick);
8276
+ });
8250
8277
  });
8251
- });
8252
- // Watch for dynamically added elements
8253
- const observer = new MutationObserver((mutations) => {
8254
- mutations.forEach((mutation) => {
8255
- mutation.addedNodes.forEach((node) => {
8256
- if (node instanceof Element) {
8257
- if (node.matches(selector)) {
8258
- node.addEventListener('click', handleClick);
8259
- this.attachedElements.set(node, () => {
8260
- node.removeEventListener('click', handleClick);
8261
- });
8262
- }
8263
- // Check descendants
8264
- node.querySelectorAll(selector).forEach((el) => {
8265
- if (!this.attachedElements.has(el)) {
8266
- el.addEventListener('click', handleClick);
8267
- this.attachedElements.set(el, () => {
8268
- el.removeEventListener('click', handleClick);
8278
+ // Watch for dynamically added elements
8279
+ observer = new MutationObserver((mutations) => {
8280
+ mutations.forEach((mutation) => {
8281
+ mutation.addedNodes.forEach((node) => {
8282
+ if (node instanceof Element) {
8283
+ if (node.matches(selector)) {
8284
+ node.addEventListener('click', handleClick);
8285
+ this.attachedElements.set(node, () => {
8286
+ node.removeEventListener('click', handleClick);
8269
8287
  });
8270
8288
  }
8271
- });
8272
- }
8289
+ // Check descendants
8290
+ node.querySelectorAll(selector).forEach((el) => {
8291
+ if (!this.attachedElements.has(el)) {
8292
+ el.addEventListener('click', handleClick);
8293
+ this.attachedElements.set(el, () => {
8294
+ el.removeEventListener('click', handleClick);
8295
+ });
8296
+ }
8297
+ });
8298
+ }
8299
+ });
8273
8300
  });
8274
8301
  });
8275
- });
8276
- observer.observe(document.body, { childList: true, subtree: true });
8302
+ observer.observe(document.body, { childList: true, subtree: true });
8303
+ };
8304
+ // Defer attachment until DOM is ready
8305
+ onDomReady(attachToElements);
8277
8306
  // Return cleanup function
8278
8307
  return () => {
8279
- observer.disconnect();
8308
+ observer?.disconnect();
8280
8309
  this.attachedElements.forEach((cleanup) => cleanup());
8281
8310
  this.attachedElements.clear();
8282
8311
  };