@magicfeedback/popup-sdk 1.9.0 → 1.11.0

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/index.d.mts CHANGED
@@ -188,6 +188,11 @@ interface FeedbackSinkOptions {
188
188
  * romper a quien lo pase.
189
189
  */
190
190
  sendBeaconImpl?: (url: string, body: Blob | string) => boolean;
191
+ /**
192
+ * Registro en el que seguir desde el primer lote: el de una sesión suspendida por un
193
+ * `pagehide` y reanudada tras recargar la página (ver `suspended-session.ts`).
194
+ */
195
+ initialSessionId?: string;
191
196
  /** Callback invocado cuando el backend devuelve un nuevo sessionId (primer POST). */
192
197
  onSessionId?: (id: string) => void;
193
198
  /** Callback invocado al cerrar la sesión (`completed:true`): el sessionId cacheado se olvida. */
@@ -708,6 +713,14 @@ declare class DeepdotsPopups {
708
713
  private popupContainer;
709
714
  private popupDefinitions;
710
715
  private popupsLoaded;
716
+ /**
717
+ * `true` mientras el `GET /sdk/{apiKey}/popups` de `init()` está en vuelo. En esa ventana los
718
+ * disparos del host (`triggerEvent`, `triggerSurvey`) no tienen contra qué evaluarse, así que
719
+ * se guardan en `pendingTriggers` y se reproducen al cargar. Click, scroll, time y exit no
720
+ * hacen falta: son listeners que `autoLaunch` instala ya con las definiciones cargadas.
721
+ */
722
+ private awaitingPopups;
723
+ private pendingTriggers;
711
724
  private pendingAutoLaunch;
712
725
  private answeredSurveys;
713
726
  private surveyProgress;
@@ -756,6 +769,13 @@ declare class DeepdotsPopups {
756
769
  private lastEngagementAt;
757
770
  /** Cuándo se ocultó la pestaña por última vez (ms epoch); null si está visible. */
758
771
  private hiddenAt;
772
+ /**
773
+ * Sesión suspendida por un `pagehide` (ms epoch y `deepdots_user_id`); null si no hay.
774
+ * `openSession` la reanuda si sigue a tiempo (ver ANALYTICS_RESUME_WINDOW_MS).
775
+ */
776
+ private suspended;
777
+ /** Integración de analytics del init: la sesión suspendida solo la hereda la misma. */
778
+ private analyticsIntegration;
759
779
  /**
760
780
  * Idioma resuelto en init() (explícito > navigator.language > Intl). Única fuente de
761
781
  * verdad para el context de analytics Y para la segmentación por idioma de los popups.
@@ -898,6 +918,31 @@ declare class DeepdotsPopups {
898
918
  * - Más: ya la cerró el backend → se descarta sin enviar nada.
899
919
  */
900
920
  private onDocumentVisible;
921
+ /**
922
+ * `pagehide` en web: SUSPENDE la sesión en vez de cerrarla, porque el navegador lo lanza
923
+ * igual al recargar que al cerrar la pestaña. Vuelca lo pendiente (page_view de la
924
+ * pantalla, mini-services, engagement) con un `deepdots_session_suspend` y SIN
925
+ * `completed`, y deja el registro en `sessionStorage` (ver `suspended-session.ts`):
926
+ * - si la página vuelve a cargar en esta pestaña, `init()` sigue en el mismo registro;
927
+ * - si la pestaña se cerró, el backend lo cierra a los pocos minutos sin otro lote.
928
+ *
929
+ * Devuelve false cuando no se puede suspender — aún no se conoce el registro (el primer
930
+ * POST sigue en vuelo) o no hay `sessionStorage` — y entonces el caller cierra como antes.
931
+ */
932
+ private suspendSession;
933
+ /**
934
+ * Recoge la sesión que dejó suspendida la carga anterior de esta pestaña (ver
935
+ * `suspendSession`). Solo con analytics configurado y el tracking activo: sin ellos no hay
936
+ * registro en el que seguir.
937
+ */
938
+ private readResumableSession;
939
+ /**
940
+ * Consume la sesión suspendida al abrir: los ms que estuvo suspendida si se puede seguir en
941
+ * ella (mismo usuario, dentro de ANALYTICS_RESUME_WINDOW_MS); null si no había o ya no toca.
942
+ * En ese caso se olvida su registro sin enviar nada: lo cierra el backend, y la sesión que
943
+ * se abre ahora va a uno nuevo.
944
+ */
945
+ private takeSuspendedSession;
901
946
  /** Olvida la sesión abierta sin enviar nada (ver onDocumentVisible). */
902
947
  private discardSession;
903
948
  /**
@@ -923,6 +968,17 @@ declare class DeepdotsPopups {
923
968
  triggerSurvey(surveyId: string, popupId?: string): void;
924
969
  /** Trigger popups configured with trigger.type = 'event' and matching trigger.value */
925
970
  triggerEvent(eventName: string): void;
971
+ private evaluateEvent;
972
+ /**
973
+ * Guarda `trigger` si las definiciones aún no han llegado. Devuelve `true` si lo guardó (el
974
+ * llamador no debe evaluarlo ahora) y `false` si no hay carga en vuelo (se evalúa ya, como
975
+ * siempre: tras cargar, tras un fallo o sin apiKey).
976
+ */
977
+ private bufferIfAwaitingPopups;
978
+ /** La carga falló: sin definiciones no hay nada que reproducir, se descarta todo. */
979
+ private dropPendingTriggers;
980
+ /** Reproduce en orden por la evaluación normal (segmentos, cooldowns y condiciones de AHORA). */
981
+ private replayPendingTriggers;
926
982
  private showDefinition;
927
983
  private shouldShow;
928
984
  private matchesSegmentsLang;
@@ -961,7 +1017,7 @@ declare class DeepdotsPopups {
961
1017
  private removeDeferredExitPopup;
962
1018
  private getDeferredExitQueue;
963
1019
  private setDeferredExitQueue;
964
- /** Fetch al servidor para obtener popups */
1020
+ /** Fetch al servidor para obtener popups. `null` si la carga falló (red, no-2xx, payload inválido). */
965
1021
  private fetchPopupsFromServer;
966
1022
  /** Envía los atributos de contact a la API (`POST /sdk/popups/contact`). */
967
1023
  private postContact;
package/dist/index.d.ts CHANGED
@@ -188,6 +188,11 @@ interface FeedbackSinkOptions {
188
188
  * romper a quien lo pase.
189
189
  */
190
190
  sendBeaconImpl?: (url: string, body: Blob | string) => boolean;
191
+ /**
192
+ * Registro en el que seguir desde el primer lote: el de una sesión suspendida por un
193
+ * `pagehide` y reanudada tras recargar la página (ver `suspended-session.ts`).
194
+ */
195
+ initialSessionId?: string;
191
196
  /** Callback invocado cuando el backend devuelve un nuevo sessionId (primer POST). */
192
197
  onSessionId?: (id: string) => void;
193
198
  /** Callback invocado al cerrar la sesión (`completed:true`): el sessionId cacheado se olvida. */
@@ -708,6 +713,14 @@ declare class DeepdotsPopups {
708
713
  private popupContainer;
709
714
  private popupDefinitions;
710
715
  private popupsLoaded;
716
+ /**
717
+ * `true` mientras el `GET /sdk/{apiKey}/popups` de `init()` está en vuelo. En esa ventana los
718
+ * disparos del host (`triggerEvent`, `triggerSurvey`) no tienen contra qué evaluarse, así que
719
+ * se guardan en `pendingTriggers` y se reproducen al cargar. Click, scroll, time y exit no
720
+ * hacen falta: son listeners que `autoLaunch` instala ya con las definiciones cargadas.
721
+ */
722
+ private awaitingPopups;
723
+ private pendingTriggers;
711
724
  private pendingAutoLaunch;
712
725
  private answeredSurveys;
713
726
  private surveyProgress;
@@ -756,6 +769,13 @@ declare class DeepdotsPopups {
756
769
  private lastEngagementAt;
757
770
  /** Cuándo se ocultó la pestaña por última vez (ms epoch); null si está visible. */
758
771
  private hiddenAt;
772
+ /**
773
+ * Sesión suspendida por un `pagehide` (ms epoch y `deepdots_user_id`); null si no hay.
774
+ * `openSession` la reanuda si sigue a tiempo (ver ANALYTICS_RESUME_WINDOW_MS).
775
+ */
776
+ private suspended;
777
+ /** Integración de analytics del init: la sesión suspendida solo la hereda la misma. */
778
+ private analyticsIntegration;
759
779
  /**
760
780
  * Idioma resuelto en init() (explícito > navigator.language > Intl). Única fuente de
761
781
  * verdad para el context de analytics Y para la segmentación por idioma de los popups.
@@ -898,6 +918,31 @@ declare class DeepdotsPopups {
898
918
  * - Más: ya la cerró el backend → se descarta sin enviar nada.
899
919
  */
900
920
  private onDocumentVisible;
921
+ /**
922
+ * `pagehide` en web: SUSPENDE la sesión en vez de cerrarla, porque el navegador lo lanza
923
+ * igual al recargar que al cerrar la pestaña. Vuelca lo pendiente (page_view de la
924
+ * pantalla, mini-services, engagement) con un `deepdots_session_suspend` y SIN
925
+ * `completed`, y deja el registro en `sessionStorage` (ver `suspended-session.ts`):
926
+ * - si la página vuelve a cargar en esta pestaña, `init()` sigue en el mismo registro;
927
+ * - si la pestaña se cerró, el backend lo cierra a los pocos minutos sin otro lote.
928
+ *
929
+ * Devuelve false cuando no se puede suspender — aún no se conoce el registro (el primer
930
+ * POST sigue en vuelo) o no hay `sessionStorage` — y entonces el caller cierra como antes.
931
+ */
932
+ private suspendSession;
933
+ /**
934
+ * Recoge la sesión que dejó suspendida la carga anterior de esta pestaña (ver
935
+ * `suspendSession`). Solo con analytics configurado y el tracking activo: sin ellos no hay
936
+ * registro en el que seguir.
937
+ */
938
+ private readResumableSession;
939
+ /**
940
+ * Consume la sesión suspendida al abrir: los ms que estuvo suspendida si se puede seguir en
941
+ * ella (mismo usuario, dentro de ANALYTICS_RESUME_WINDOW_MS); null si no había o ya no toca.
942
+ * En ese caso se olvida su registro sin enviar nada: lo cierra el backend, y la sesión que
943
+ * se abre ahora va a uno nuevo.
944
+ */
945
+ private takeSuspendedSession;
901
946
  /** Olvida la sesión abierta sin enviar nada (ver onDocumentVisible). */
902
947
  private discardSession;
903
948
  /**
@@ -923,6 +968,17 @@ declare class DeepdotsPopups {
923
968
  triggerSurvey(surveyId: string, popupId?: string): void;
924
969
  /** Trigger popups configured with trigger.type = 'event' and matching trigger.value */
925
970
  triggerEvent(eventName: string): void;
971
+ private evaluateEvent;
972
+ /**
973
+ * Guarda `trigger` si las definiciones aún no han llegado. Devuelve `true` si lo guardó (el
974
+ * llamador no debe evaluarlo ahora) y `false` si no hay carga en vuelo (se evalúa ya, como
975
+ * siempre: tras cargar, tras un fallo o sin apiKey).
976
+ */
977
+ private bufferIfAwaitingPopups;
978
+ /** La carga falló: sin definiciones no hay nada que reproducir, se descarta todo. */
979
+ private dropPendingTriggers;
980
+ /** Reproduce en orden por la evaluación normal (segmentos, cooldowns y condiciones de AHORA). */
981
+ private replayPendingTriggers;
926
982
  private showDefinition;
927
983
  private shouldShow;
928
984
  private matchesSegmentsLang;
@@ -961,7 +1017,7 @@ declare class DeepdotsPopups {
961
1017
  private removeDeferredExitPopup;
962
1018
  private getDeferredExitQueue;
963
1019
  private setDeferredExitQueue;
964
- /** Fetch al servidor para obtener popups */
1020
+ /** Fetch al servidor para obtener popups. `null` si la carga falló (red, no-2xx, payload inválido). */
965
1021
  private fetchPopupsFromServer;
966
1022
  /** Envía los atributos de contact a la API (`POST /sdk/popups/contact`). */
967
1023
  private postContact;