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