@uxbertlabs/reportly 1.0.30 → 1.0.32

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ReportlyProvider.d.ts","sourceRoot":"","sources":["../../src/components/ReportlyProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAyC,SAAS,EAAwB,MAAM,OAAO,CAAC;AACtG,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAI/D,OAAO,iBAAiB,MAAM,wBAAwB,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,UAAU,GAAG,UAAU,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,cAAc,CAAC;CACxB;AAmED,UAAU,mBAAmB;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC5C,oBAAoB,EAAE,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAAC;IAClE,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,iBAAiB,EAAE,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;IAC5C,WAAW,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5D,YAAY,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACxD,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAID,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CAClC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,MAAW,EAAE,EAAE,qBAAqB,qBAwLhF;AAED,wBAAgB,WAAW,IAAI,mBAAmB,CAMjD"}
1
+ {"version":3,"file":"ReportlyProvider.d.ts","sourceRoot":"","sources":["../../src/components/ReportlyProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAyC,SAAS,EAAwB,MAAM,OAAO,CAAC;AACtG,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAI/D,OAAO,iBAAiB,MAAM,wBAAwB,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,UAAU,GAAG,UAAU,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,cAAc,CAAC;CACxB;AAmED,UAAU,mBAAmB;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC5C,oBAAoB,EAAE,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAAC;IAClE,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,iBAAiB,EAAE,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;IAC5C,WAAW,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5D,YAAY,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACxD,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAID,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CAClC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,MAAW,EAAE,EAAE,qBAAqB,qBAiMhF;AAED,wBAAgB,WAAW,IAAI,mBAAmB,CAMjD"}
@@ -1,7 +1,11 @@
1
+ import type { ScreenshotHooks } from "../types";
1
2
  declare class Screenshot {
2
3
  private currentScreenshot;
3
4
  private captureDelay;
4
- constructor();
5
+ private hooks;
6
+ private quality;
7
+ private format;
8
+ constructor(hooks?: ScreenshotHooks, captureDelay?: number, quality?: number, format?: "png" | "jpeg" | "webp");
5
9
  /**
6
10
  * Wait for specified milliseconds
7
11
  */
@@ -36,6 +40,25 @@ declare class Screenshot {
36
40
  * Get the current capture delay
37
41
  */
38
42
  getCaptureDelay(): number;
43
+ /**
44
+ * Update screenshot hooks dynamically
45
+ * @param hooks - New hooks configuration
46
+ */
47
+ setHooks(hooks: ScreenshotHooks): void;
48
+ /**
49
+ * Get current hooks configuration
50
+ */
51
+ getHooks(): ScreenshotHooks;
52
+ /**
53
+ * Set screenshot format
54
+ * @param format - Image format (png, jpeg, webp)
55
+ */
56
+ setFormat(format: "png" | "jpeg" | "webp"): void;
57
+ /**
58
+ * Set screenshot quality (for JPEG/WebP)
59
+ * @param quality - Quality between 0 and 1
60
+ */
61
+ setQuality(quality: number): void;
39
62
  getScreenshot(): string | null;
40
63
  clear(): void;
41
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/features/screenshot.ts"],"names":[],"mappings":"AAGA,cAAM,UAAU;IACd,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,YAAY,CAAe;;IAMnC;;OAEG;IACH,OAAO,CAAC,IAAI;IAIZ;;OAEG;YACW,gBAAgB;IAc9B;;OAEG;YACW,aAAa;IAgB3B;;OAEG;YACW,YAAY;IAc1B;;OAEG;IACH,OAAO,CAAC,WAAW;IAKb,OAAO,CAAC,IAAI,GAAE,UAAU,GAAG,UAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;IAqL1E,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,iBAAiB;IA6DzB,OAAO,CAAC,iBAAiB;IAOzB;;;OAGG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIjC;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB,aAAa,IAAI,MAAM,GAAG,IAAI;IAI9B,KAAK,IAAI,IAAI;CAGd;AAED,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/features/screenshot.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAyB,MAAM,UAAU,CAAC;AAEvE,cAAM,UAAU;IACd,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,MAAM,CAAkC;gBAEpC,KAAK,CAAC,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM;IAQ9G;;OAEG;IACH,OAAO,CAAC,IAAI;IAIZ;;OAEG;YACW,gBAAgB;IAc9B;;OAEG;YACW,aAAa;IAgB3B;;OAEG;YACW,YAAY;IAc1B;;OAEG;IACH,OAAO,CAAC,WAAW;IAKb,OAAO,CAAC,IAAI,GAAE,UAAU,GAAG,UAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;IAuO1E,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,iBAAiB;IA6DzB,OAAO,CAAC,iBAAiB;IAOzB;;;OAGG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIjC;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAItC;;OAEG;IACH,QAAQ,IAAI,eAAe;IAI3B;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI;IAIhD;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC,aAAa,IAAI,MAAM,GAAG,IAAI;IAI9B,KAAK,IAAI,IAAI;CAGd;AAED,eAAe,UAAU,CAAC"}
package/dist/index.cjs.js CHANGED
@@ -9301,9 +9301,16 @@ var parseBackgroundColor = function (context, element, backgroundColorOverride)
9301
9301
 
9302
9302
  // Screenshot capture using html2canvas
9303
9303
  class Screenshot {
9304
- constructor() {
9304
+ constructor(hooks, captureDelay, quality, format) {
9305
9305
  this.captureDelay = 500; // Default delay before capture
9306
+ this.hooks = {};
9307
+ this.quality = 0.95; // Default quality for JPEG/WebP
9308
+ this.format = "png"; // Default format
9306
9309
  this.currentScreenshot = null;
9310
+ if (hooks) this.hooks = hooks;
9311
+ if (captureDelay !== undefined) this.captureDelay = captureDelay;
9312
+ if (quality !== undefined) this.quality = quality;
9313
+ if (format) this.format = format;
9307
9314
  }
9308
9315
  /**
9309
9316
  * Wait for specified milliseconds
@@ -9368,7 +9375,15 @@ class Screenshot {
9368
9375
  document.body.offsetHeight;
9369
9376
  }
9370
9377
  async capture(mode = "fullpage") {
9378
+ const context = {
9379
+ mode,
9380
+ timestamp: Date.now()
9381
+ };
9371
9382
  try {
9383
+ // Hook: onCaptureStart - notify that capture is starting
9384
+ if (this.hooks.onCaptureStart) {
9385
+ await Promise.resolve(this.hooks.onCaptureStart(context));
9386
+ }
9372
9387
  // Show loading screen immediately (before hiding UI)
9373
9388
  this.showLoadingScreen();
9374
9389
  // Wait for DOM to stabilize, animations to complete, and assets to load
@@ -9378,6 +9393,10 @@ class Screenshot {
9378
9393
  this.hideUXbertElements();
9379
9394
  // Force a reflow to ensure all styles are computed
9380
9395
  this.forceReflow();
9396
+ // Hook: beforeCapture - allow developers to modify DOM before capture
9397
+ if (this.hooks.beforeCapture) {
9398
+ await Promise.resolve(this.hooks.beforeCapture(context));
9399
+ }
9381
9400
  let canvas;
9382
9401
  if (mode === "viewport") {
9383
9402
  // Capture only the current viewport
@@ -9512,13 +9531,40 @@ class Screenshot {
9512
9531
  }
9513
9532
  // Show UXbert UI elements again
9514
9533
  this.showUXbertElements();
9515
- // Convert to base64
9516
- this.currentScreenshot = canvas.toDataURL("image/png");
9534
+ // Add canvas to context for afterCapture hook
9535
+ context.canvas = canvas;
9536
+ // Convert to base64 with configurable format and quality
9537
+ let screenshotData;
9538
+ if (this.format === "png") {
9539
+ screenshotData = canvas.toDataURL("image/png");
9540
+ } else if (this.format === "jpeg") {
9541
+ screenshotData = canvas.toDataURL("image/jpeg", this.quality);
9542
+ } else {
9543
+ screenshotData = canvas.toDataURL("image/webp", this.quality);
9544
+ }
9545
+ context.screenshot = screenshotData;
9546
+ // Hook: afterCapture - allow developers to modify the screenshot or canvas
9547
+ if (this.hooks.afterCapture) {
9548
+ const result = await Promise.resolve(this.hooks.afterCapture(context));
9549
+ // If hook returns a string, use it as the screenshot; otherwise use the original
9550
+ if (typeof result === "string" && result.length > 0) {
9551
+ screenshotData = result;
9552
+ }
9553
+ }
9554
+ this.currentScreenshot = screenshotData;
9555
+ // Hook: onCaptureComplete - notify that capture completed successfully
9556
+ if (this.hooks.onCaptureComplete) {
9557
+ await Promise.resolve(this.hooks.onCaptureComplete(context));
9558
+ }
9517
9559
  return this.currentScreenshot;
9518
9560
  } catch (error) {
9519
9561
  console.error("Screenshot capture failed:", error);
9520
9562
  this.hideLoadingScreen();
9521
9563
  this.showUXbertElements();
9564
+ // Hook: onCaptureError - notify about the error
9565
+ if (this.hooks.onCaptureError) {
9566
+ await Promise.resolve(this.hooks.onCaptureError(error, context));
9567
+ }
9522
9568
  throw error;
9523
9569
  }
9524
9570
  }
@@ -9615,6 +9661,38 @@ class Screenshot {
9615
9661
  getCaptureDelay() {
9616
9662
  return this.captureDelay;
9617
9663
  }
9664
+ /**
9665
+ * Update screenshot hooks dynamically
9666
+ * @param hooks - New hooks configuration
9667
+ */
9668
+ setHooks(hooks) {
9669
+ this.hooks = {
9670
+ ...this.hooks,
9671
+ ...hooks
9672
+ };
9673
+ }
9674
+ /**
9675
+ * Get current hooks configuration
9676
+ */
9677
+ getHooks() {
9678
+ return {
9679
+ ...this.hooks
9680
+ };
9681
+ }
9682
+ /**
9683
+ * Set screenshot format
9684
+ * @param format - Image format (png, jpeg, webp)
9685
+ */
9686
+ setFormat(format) {
9687
+ this.format = format;
9688
+ }
9689
+ /**
9690
+ * Set screenshot quality (for JPEG/WebP)
9691
+ * @param quality - Quality between 0 and 1
9692
+ */
9693
+ setQuality(quality) {
9694
+ this.quality = Math.max(0, Math.min(quality, 1));
9695
+ }
9618
9696
  getScreenshot() {
9619
9697
  return this.currentScreenshot;
9620
9698
  }
@@ -9738,7 +9816,7 @@ function ReportlyProvider({
9738
9816
  // Initialize services with useMemo to ensure they're only created once and support SSR
9739
9817
  const deviceInfo = React.useMemo(() => new DeviceInfo(), []);
9740
9818
  const exportService = React.useMemo(() => new Export(config.integrations?.n8n), [config.integrations?.n8n]);
9741
- const screenshot = React.useMemo(() => new Screenshot(), []);
9819
+ const screenshot = React.useMemo(() => new Screenshot(config.screenshot?.hooks, config.screenshot?.captureDelay, config.screenshot?.quality, config.screenshot?.format), [config.screenshot?.hooks, config.screenshot?.captureDelay, config.screenshot?.quality, config.screenshot?.format]);
9742
9820
  const openModal = React.useCallback(() => {
9743
9821
  dispatch({
9744
9822
  type: "OPEN_MODAL"