@qualified-salesforce/web 0.0.1-oidc-bootstrap
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/41842993ec71d6628e4949e9a22b146b.svg +3 -0
- package/7271f3433ed82fc7f56adcd9e30275f4.svg +17 -0
- package/LICENSE.txt +82 -0
- package/components/helpers/entriesStringValidations.js +69 -0
- package/components/helpers/languages.js +32 -0
- package/components/shared/assertUnreachable.js +5 -0
- package/components/shared/controls/imageCropperHelpers.js +43 -0
- package/components/shared/meetingLoadingProgressSpec.js +116 -0
- package/constants.generated.js +9883 -0
- package/css/widget/multimodal_v2/host.split-css.css +162 -0
- package/css/widget/multimodal_v2/index.split-css.panda.css +5240 -0
- package/css/widget/widget.split-css.css +100 -0
- package/fonts/inter/Inter-Black.woff +0 -0
- package/fonts/inter/Inter-Black.woff2 +0 -0
- package/fonts/inter/Inter-BlackItalic.woff +0 -0
- package/fonts/inter/Inter-BlackItalic.woff2 +0 -0
- package/fonts/inter/Inter-Bold.woff +0 -0
- package/fonts/inter/Inter-Bold.woff2 +0 -0
- package/fonts/inter/Inter-BoldItalic.woff +0 -0
- package/fonts/inter/Inter-BoldItalic.woff2 +0 -0
- package/fonts/inter/Inter-ExtraBold.woff +0 -0
- package/fonts/inter/Inter-ExtraBold.woff2 +0 -0
- package/fonts/inter/Inter-ExtraBoldItalic.woff +0 -0
- package/fonts/inter/Inter-ExtraBoldItalic.woff2 +0 -0
- package/fonts/inter/Inter-ExtraLight.woff +0 -0
- package/fonts/inter/Inter-ExtraLight.woff2 +0 -0
- package/fonts/inter/Inter-ExtraLightItalic.woff +0 -0
- package/fonts/inter/Inter-ExtraLightItalic.woff2 +0 -0
- package/fonts/inter/Inter-Italic.woff +0 -0
- package/fonts/inter/Inter-Italic.woff2 +0 -0
- package/fonts/inter/Inter-Light.woff +0 -0
- package/fonts/inter/Inter-Light.woff2 +0 -0
- package/fonts/inter/Inter-LightItalic.woff +0 -0
- package/fonts/inter/Inter-LightItalic.woff2 +0 -0
- package/fonts/inter/Inter-Medium.woff +0 -0
- package/fonts/inter/Inter-Medium.woff2 +0 -0
- package/fonts/inter/Inter-MediumItalic.woff +0 -0
- package/fonts/inter/Inter-MediumItalic.woff2 +0 -0
- package/fonts/inter/Inter-Regular.woff +0 -0
- package/fonts/inter/Inter-Regular.woff2 +0 -0
- package/fonts/inter/Inter-SemiBold.woff +0 -0
- package/fonts/inter/Inter-SemiBold.woff2 +0 -0
- package/fonts/inter/Inter-SemiBoldItalic.woff +0 -0
- package/fonts/inter/Inter-SemiBoldItalic.woff2 +0 -0
- package/fonts/inter/Inter-Thin.woff +0 -0
- package/fonts/inter/Inter-Thin.woff2 +0 -0
- package/fonts/inter/Inter-ThinItalic.woff +0 -0
- package/fonts/inter/Inter-ThinItalic.woff2 +0 -0
- package/fonts/inter/Inter-italic.var.woff2 +0 -0
- package/fonts/inter/Inter-roman.var.woff2 +0 -0
- package/images/close.js +63 -0
- package/images/logo.js +22 -0
- package/js/4101.js +19721 -0
- package/js/daily-esm.js +9948 -0
- package/js/date-fns.js +427 -0
- package/js/multimodal_v2.js +1653 -0
- package/js/runtime.js +109 -0
- package/media/Inter-Black.796be8d8bf.woff2 +0 -0
- package/media/Inter-Black.b254104c56.woff +0 -0
- package/media/Inter-BlackItalic.70306b0eae.woff +0 -0
- package/media/Inter-BlackItalic.752f1e0aaa.woff2 +0 -0
- package/media/Inter-Bold.579e0f95ca.woff2 +0 -0
- package/media/Inter-Bold.b1234477a5.woff +0 -0
- package/media/Inter-BoldItalic.3d0d804323.woff +0 -0
- package/media/Inter-BoldItalic.828a494e04.woff2 +0 -0
- package/media/Inter-ExtraBold.208a9e6c99.woff +0 -0
- package/media/Inter-ExtraBold.d65f028165.woff2 +0 -0
- package/media/Inter-ExtraBoldItalic.30429962ec.woff +0 -0
- package/media/Inter-ExtraBoldItalic.8c7eac5ce3.woff2 +0 -0
- package/media/Inter-ExtraLight.15c082a57d.woff +0 -0
- package/media/Inter-ExtraLight.6824177d1e.woff2 +0 -0
- package/media/Inter-ExtraLightItalic.05138dddf3.woff2 +0 -0
- package/media/Inter-ExtraLightItalic.3beee54f59.woff +0 -0
- package/media/Inter-Italic.9beab78452.woff +0 -0
- package/media/Inter-Italic.d593a8df79.woff2 +0 -0
- package/media/Inter-Light.27083fa637.woff2 +0 -0
- package/media/Inter-Light.91dfddd842.woff +0 -0
- package/media/Inter-LightItalic.0a783b89b3.woff2 +0 -0
- package/media/Inter-LightItalic.f8ccf2813f.woff +0 -0
- package/media/Inter-Medium.dc792b508e.woff2 +0 -0
- package/media/Inter-Medium.ec7dd2d9d8.woff +0 -0
- package/media/Inter-MediumItalic.17301e5b40.woff +0 -0
- package/media/Inter-MediumItalic.84d3493a9f.woff2 +0 -0
- package/media/Inter-Regular.f1f0c35b32.woff2 +0 -0
- package/media/Inter-Regular.f356e84aa0.woff +0 -0
- package/media/Inter-SemiBold.55027e4724.woff +0 -0
- package/media/Inter-SemiBold.fcb100c760.woff2 +0 -0
- package/media/Inter-SemiBoldItalic.ab9105ed3b.woff +0 -0
- package/media/Inter-SemiBoldItalic.d90f295d0c.woff2 +0 -0
- package/media/Inter-Thin.16325d9b0f.woff +0 -0
- package/media/Inter-Thin.dafaa44d99.woff2 +0 -0
- package/media/Inter-ThinItalic.4fc662b3cf.woff2 +0 -0
- package/media/Inter-ThinItalic.d3d8994788.woff +0 -0
- package/media/Inter-italic.var.958a0b9742.woff2 +0 -0
- package/media/Inter-roman.var.b2129c009c.woff2 +0 -0
- package/package.json +20 -0
- package/packs/widget/api/docking/docking_host.js +97 -0
- package/packs/widget/api/docking/index.js +294 -0
- package/packs/widget/api/docking/shared.js +164 -0
- package/packs/widget/api/docking/viewport_lock.js +488 -0
- package/packs/widget/api/docking/viewport_resize.js +1203 -0
- package/packs/widget/esm/fonts/Inter-Black.796be8d8bf.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Black.b254104c56.woff +0 -0
- package/packs/widget/esm/fonts/Inter-BlackItalic.70306b0eae.woff +0 -0
- package/packs/widget/esm/fonts/Inter-BlackItalic.752f1e0aaa.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Bold.579e0f95ca.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Bold.b1234477a5.woff +0 -0
- package/packs/widget/esm/fonts/Inter-BoldItalic.3d0d804323.woff +0 -0
- package/packs/widget/esm/fonts/Inter-BoldItalic.828a494e04.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraBold.208a9e6c99.woff +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraBold.d65f028165.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraBoldItalic.30429962ec.woff +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraBoldItalic.8c7eac5ce3.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraLight.15c082a57d.woff +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraLight.6824177d1e.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraLightItalic.05138dddf3.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraLightItalic.3beee54f59.woff +0 -0
- package/packs/widget/esm/fonts/Inter-Italic.9beab78452.woff +0 -0
- package/packs/widget/esm/fonts/Inter-Italic.d593a8df79.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Light.27083fa637.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Light.91dfddd842.woff +0 -0
- package/packs/widget/esm/fonts/Inter-LightItalic.0a783b89b3.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-LightItalic.f8ccf2813f.woff +0 -0
- package/packs/widget/esm/fonts/Inter-Medium.dc792b508e.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Medium.ec7dd2d9d8.woff +0 -0
- package/packs/widget/esm/fonts/Inter-MediumItalic.17301e5b40.woff +0 -0
- package/packs/widget/esm/fonts/Inter-MediumItalic.84d3493a9f.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Regular.f1f0c35b32.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Regular.f356e84aa0.woff +0 -0
- package/packs/widget/esm/fonts/Inter-SemiBold.55027e4724.woff +0 -0
- package/packs/widget/esm/fonts/Inter-SemiBold.fcb100c760.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-SemiBoldItalic.ab9105ed3b.woff +0 -0
- package/packs/widget/esm/fonts/Inter-SemiBoldItalic.d90f295d0c.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Thin.16325d9b0f.woff +0 -0
- package/packs/widget/esm/fonts/Inter-Thin.dafaa44d99.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ThinItalic.4fc662b3cf.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ThinItalic.d3d8994788.woff +0 -0
- package/packs/widget/esm/fonts/Inter-italic.var.958a0b9742.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-roman.var.b2129c009c.woff2 +0 -0
- package/packs/widget/esm/index.js +183 -0
- package/packs/widget/esm/qualified.css +5502 -0
- package/routes/app/offers/scripts/OfferMainScript.js +154 -0
- package/routes/app/offers/scripts/constants.js +71 -0
- package/routes/app/offers/scripts/main/ButtonManager.js +65 -0
- package/routes/app/offers/scripts/main/FormManager.js +325 -0
- package/routes/app/offers/scripts/main/MainContext.js +19 -0
- package/routes/app/offers/scripts/main/OfferManager.js +91 -0
- package/routes/app/offers/scripts/main/TriggerManager.js +125 -0
- package/routes/app/offers/scripts/rendering/ContentManager.js +53 -0
- package/routes/app/offers/scripts/rendering/LocationManager.js +83 -0
- package/routes/app/offers/scripts/rendering/RenderedOffer.js +188 -0
- package/routes/app/offers/scripts/rendering/Renderer.js +69 -0
- package/routes/app/offers/scripts/rendering/RenderingInitializer.js +62 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManager.js +31 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManagerFooter.js +81 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManagerHeader.js +81 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManagerModal.js +117 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManagerSidebar.js +75 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationResult.js +43 -0
- package/routes/app/offers/scripts/rendering/animations/Animator.js +78 -0
- package/routes/app/offers/scripts/rendering/animations/BaseAnimationManager.js +25 -0
- package/routes/app/offers/scripts/rendering/lib/BaseComponent.js +106 -0
- package/routes/app/offers/scripts/rendering/lib/FormComponent.js +134 -0
- package/routes/app/offers/scripts/rendering/lib/OfferComponent.js +144 -0
- package/routes/app/offers/scripts/rendering/lib/ScrollbarWidth.js +27 -0
- package/routes/app/offers/scripts/rendering/lib/decorators.js +20 -0
- package/routes/app/offers/scripts/rendering/locations/CSSVarsManager.js +66 -0
- package/routes/app/offers/scripts/rendering/locations/ElementResizeObserver.js +49 -0
- package/routes/app/offers/scripts/rendering/locations/footer.js +53 -0
- package/routes/app/offers/scripts/rendering/locations/header/AsyncBatchProcessor.js +70 -0
- package/routes/app/offers/scripts/rendering/locations/header/CSSTransitionObserver.js +182 -0
- package/routes/app/offers/scripts/rendering/locations/header/ElementStyleChangeObserver.js +138 -0
- package/routes/app/offers/scripts/rendering/locations/header/ExternalStyleManager.js +110 -0
- package/routes/app/offers/scripts/rendering/locations/header/Header.js +353 -0
- package/routes/app/offers/scripts/rendering/locations/header/InlineStyleManager.js +105 -0
- package/routes/app/offers/scripts/rendering/locations/header/MatchingElementsObserver.js +107 -0
- package/routes/app/offers/scripts/rendering/locations/header/NewElementsObserver.js +129 -0
- package/routes/app/offers/scripts/rendering/locations/header/RuleWrapper.js +46 -0
- package/routes/app/offers/scripts/rendering/locations/header/SelectorObservable.js +23 -0
- package/routes/app/offers/scripts/rendering/locations/header/SelectorObserver.js +61 -0
- package/routes/app/offers/scripts/rendering/locations/header/ShiftedElementsManager.js +45 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleElementManager.js +37 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleElementWrapper.js +62 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/ObservedSelectorValue.js +45 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/ObservedSelectors.js +62 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/StyleSelectorObserver.js +294 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/constants.js +21 -0
- package/routes/app/offers/scripts/rendering/locations/header/WindowResizeObserver.js +43 -0
- package/routes/app/offers/scripts/rendering/locations/header/utils.js +25 -0
- package/routes/app/offers/scripts/rendering/locations/popup.js +66 -0
- package/routes/app/offers/scripts/rendering/locations/sidebar.js +21 -0
- package/routes/app/offers/scripts/rendering/variations/ButtonBanner.js +105 -0
- package/routes/app/offers/scripts/rendering/variations/ButtonModal.js +114 -0
- package/routes/app/offers/scripts/rendering/variations/FormBanner.js +214 -0
- package/routes/app/offers/scripts/rendering/variations/FormModal.js +325 -0
- package/routes/app/offers/scripts/rendering/variations/LinkBanner.js +105 -0
- package/routes/app/offers/scripts/rendering/variations/components/Body.js +29 -0
- package/routes/app/offers/scripts/rendering/variations/components/Button.js +128 -0
- package/routes/app/offers/scripts/rendering/variations/components/DismissButton.js +39 -0
- package/routes/app/offers/scripts/rendering/variations/components/ForegroundImageBanner.js +110 -0
- package/routes/app/offers/scripts/rendering/variations/components/ForegroundImageModal.js +128 -0
- package/routes/app/offers/scripts/rendering/variations/components/Headline.js +94 -0
- package/routes/app/offers/scripts/rendering/variations/components/MultiFieldForm.js +302 -0
- package/routes/app/offers/scripts/rendering/variations/components/Tooltip.js +74 -0
- package/routes/app/offers/scripts/rendering/variations/icons.js +15 -0
- package/routes/app/offers/scripts/utils.js +115 -0
- package/routes/app/offers/utils/HTMLUtils.js +10 -0
- package/routes/app/offers/utils/createTypeGuard.js +32 -0
- package/routes/app/offers/utils/promise-utils.js +22 -0
- package/routes/app/websiteBuilder/stores/storeHelpers.js +18 -0
- package/sounds/message-initial.mp3 +0 -0
- package/sounds/message-received.mp3 +0 -0
- package/sounds/message-sent.mp3 +0 -0
- package/src/arrays.js +15 -0
- package/src/audio.js +106 -0
- package/src/bounded-set.js +16 -0
- package/src/bounding_box_observer.js +129 -0
- package/src/decorators.js +29 -0
- package/src/dom.js +128 -0
- package/src/dom_roots.js +26 -0
- package/src/embedded_forms/EmbeddedForm.js +638 -0
- package/src/embedded_forms/QualifiedEmbeddedForm.js +51 -0
- package/src/embedded_forms/QualifiedFormField.js +137 -0
- package/src/embedded_forms/utils.js +17 -0
- package/src/graphql-types.js +1686 -0
- package/src/iframes.js +86 -0
- package/src/localstorage.js +43 -0
- package/src/mirror/Shipper.js +133 -0
- package/src/mirror/constants.generated.js +13 -0
- package/src/mirror/constants.js +238 -0
- package/src/mirror/shipper/ChangeQueue.js +155 -0
- package/src/mirror/shipper/DOMSerializer.js +392 -0
- package/src/mirror/shipper/observers.js +441 -0
- package/src/mirror/shipper/utils.js +98 -0
- package/src/mixins/disposable.js +125 -0
- package/src/mixins/injectable.js +37 -0
- package/src/personalizations/personalization-manager.js +110 -0
- package/src/personalizations/strategies/node-freezing-strategy.js +174 -0
- package/src/personalizations/utils.js +187 -0
- package/src/promises.js +107 -0
- package/src/proxy.js +144 -0
- package/src/qualified_root.js +35 -0
- package/src/query_params.js +55 -0
- package/src/shadow-dom-helper.js +63 -0
- package/src/singleton_host.js +39 -0
- package/src/smart_website/trigger.js +49 -0
- package/src/smart_website/utils.js +149 -0
- package/src/string.js +53 -0
- package/src/timezone.js +57 -0
- package/src/timing.js +49 -0
- package/src/type-utils.js +76 -0
- package/src/url-utils.js +102 -0
- package/src/url.js +50 -0
- package/src/utils.js +72 -0
- package/src/validation.js.js +29 -0
- package/src/validation_ts.js +6 -0
- package/vendor/actioncable/adapters.js +6 -0
- package/vendor/actioncable/connection.js +204 -0
- package/vendor/actioncable/connection_monitor.js +129 -0
- package/vendor/actioncable/consumer.js +91 -0
- package/vendor/actioncable/index.js +34 -0
- package/vendor/actioncable/internal.js +22 -0
- package/vendor/actioncable/logger.js +28 -0
- package/vendor/actioncable/subscription.js +93 -0
- package/vendor/actioncable/subscriptions.js +89 -0
- package/vendor/open-telemetry-idgenerator.js +43 -0
- package/widget/analytics/facebook_tracker.js +8 -0
- package/widget/analytics/google_analytics_tracker.js +83 -0
- package/widget/analytics/google_tag_manager_tracker.js +22 -0
- package/widget/analytics.js +58 -0
- package/widget/api_handler/api_handler.js +730 -0
- package/widget/api_handler/base_api_handler.js +249 -0
- package/widget/booker_intent_tracker.js +391 -0
- package/widget/booker_outcome_tracker.js +329 -0
- package/widget/capture_widget_exceptions.js +150 -0
- package/widget/channel.js +282 -0
- package/widget/composite_experience_adapter.js +101 -0
- package/widget/constants.generated.js +350 -0
- package/widget/constants.js +21 -0
- package/widget/container.js +193 -0
- package/widget/content_activity_emitter.js +36 -0
- package/widget/data360_visitor.js +67 -0
- package/widget/date_provider.js +11 -0
- package/widget/debug_mode_state.js +175 -0
- package/widget/dummy_module.js +9 -0
- package/widget/eloqua_visitor.js +17 -0
- package/widget/form_cta_booker_intent.js +246 -0
- package/widget/hubspot_visitor.js +39 -0
- package/widget/inline_meeting_booker_page.js +90 -0
- package/widget/local_state/abstract_local_state.js +38 -0
- package/widget/local_state/debug_state/abstract_debug_flow.js +29 -0
- package/widget/local_state/debug_state/custom_form_flow.js +14 -0
- package/widget/local_state/debug_state/hubspot_form_flow.js +19 -0
- package/widget/local_state/debug_state/hubspot_v4_form_flow.js +19 -0
- package/widget/local_state/debug_state/marketo_form_flow.js +20 -0
- package/widget/local_state/debug_state/pardot_form_flow.js +18 -0
- package/widget/local_state/debug_state.js +362 -0
- package/widget/local_state/trace_state.js +20 -0
- package/widget/location_provider.js +9 -0
- package/widget/marketo_visitor.js +39 -0
- package/widget/meetings/tracing/buttons_forms_triggering_tracer.js +124 -0
- package/widget/meetings/tracing/spans/button_spans.js +18 -0
- package/widget/meetings/tracing/spans/form_spans.js +11 -0
- package/widget/multimodal_v2/assets_preloader.js +97 -0
- package/widget/multimodal_v2/components/AppLayout.js +93 -0
- package/widget/multimodal_v2/components/CursorOverlay.js +93 -0
- package/widget/multimodal_v2/components/PointerRectOverlay.js +74 -0
- package/widget/multimodal_v2/components/app/Artifact.js +109 -0
- package/widget/multimodal_v2/components/app/Background.js +27 -0
- package/widget/multimodal_v2/components/app/CalendarLoadingContent.js +255 -0
- package/widget/multimodal_v2/components/app/Chat.js +39 -0
- package/widget/multimodal_v2/components/app/CookieConsentModal.js +149 -0
- package/widget/multimodal_v2/components/app/Foreground.js +48 -0
- package/widget/multimodal_v2/components/app/HiddenInput.js +41 -0
- package/widget/multimodal_v2/components/app/Input.js +72 -0
- package/widget/multimodal_v2/components/app/LightboxExperience.js +769 -0
- package/widget/multimodal_v2/components/app/LoadingOverlay.js +97 -0
- package/widget/multimodal_v2/components/app/Main.js +985 -0
- package/widget/multimodal_v2/components/app/MessengerButton.js +160 -0
- package/widget/multimodal_v2/components/app/Multimodal.js +17 -0
- package/widget/multimodal_v2/components/app/OverlayControls.js +79 -0
- package/widget/multimodal_v2/components/app/Preview.js +32 -0
- package/widget/multimodal_v2/components/app/PrivacyDisclosure.js +57 -0
- package/widget/multimodal_v2/components/app/RotateDeviceOverlay.js +70 -0
- package/widget/multimodal_v2/components/app/Toolbar.js +156 -0
- package/widget/multimodal_v2/components/chat/ChatComposer.js +129 -0
- package/widget/multimodal_v2/components/chat/ChatInputForm.js +398 -0
- package/widget/multimodal_v2/components/chat/ColdStartQuestions.js +354 -0
- package/widget/multimodal_v2/components/chat/ComposerErrorBanner.js +62 -0
- package/widget/multimodal_v2/components/chat/PostCallSurvey.js +359 -0
- package/widget/multimodal_v2/components/chat/preview/FieldRequestRenderer.js +41 -0
- package/widget/multimodal_v2/components/chat/preview/PreviewMessageRenderer.js +60 -0
- package/widget/multimodal_v2/components/chat/preview/SharedOfferRenderer.js +143 -0
- package/widget/multimodal_v2/components/chat/preview/TextRenderer.js +27 -0
- package/widget/multimodal_v2/components/chat/preview/TimelinePreview.js +254 -0
- package/widget/multimodal_v2/components/chat/timeline/CalendarEventOfferRenderer.js +103 -0
- package/widget/multimodal_v2/components/chat/timeline/CalendarEventPickRenderer.js +148 -0
- package/widget/multimodal_v2/components/chat/timeline/FieldEntryRenderer.js +84 -0
- package/widget/multimodal_v2/components/chat/timeline/FieldRequestRenderer.js +56 -0
- package/widget/multimodal_v2/components/chat/timeline/InlinePrivacyDisclosure.js +66 -0
- package/widget/multimodal_v2/components/chat/timeline/LinkPreviewCard.js +70 -0
- package/widget/multimodal_v2/components/chat/timeline/MessageEntry.js +88 -0
- package/widget/multimodal_v2/components/chat/timeline/PresentContentRenderer.js +30 -0
- package/widget/multimodal_v2/components/chat/timeline/PresentDeckRenderer.js +279 -0
- package/widget/multimodal_v2/components/chat/timeline/PresentVideoRenderer.js +131 -0
- package/widget/multimodal_v2/components/chat/timeline/ShareContentRenderer.js +59 -0
- package/widget/multimodal_v2/components/chat/timeline/SharedOfferRenderer.js +131 -0
- package/widget/multimodal_v2/components/chat/timeline/SystemRenderer.js +82 -0
- package/widget/multimodal_v2/components/chat/timeline/TextRenderer.js +66 -0
- package/widget/multimodal_v2/components/chat/timeline/Timeline.js +158 -0
- package/widget/multimodal_v2/components/debug/DebugMultimodalPanel.js +327 -0
- package/widget/multimodal_v2/components/decks/index.js +160 -0
- package/widget/multimodal_v2/components/field_request/BooleanField.js +77 -0
- package/widget/multimodal_v2/components/field_request/FieldComponents.js +69 -0
- package/widget/multimodal_v2/components/field_request/Form.js +87 -0
- package/widget/multimodal_v2/components/field_request/MultiPicklistField.js +240 -0
- package/widget/multimodal_v2/components/field_request/PicklistField.js +166 -0
- package/widget/multimodal_v2/components/field_request/SingleLineInputField.js +69 -0
- package/widget/multimodal_v2/components/field_request/TextField.js +37 -0
- package/widget/multimodal_v2/components/field_request/index.js +170 -0
- package/widget/multimodal_v2/components/helpers/AutoScroll.js +37 -0
- package/widget/multimodal_v2/components/helpers/ErrorBoundary.js +53 -0
- package/widget/multimodal_v2/components/helpers/FocusTrapDialog.js +26 -0
- package/widget/multimodal_v2/components/helpers/ImpressionTracker.js +94 -0
- package/widget/multimodal_v2/components/helpers/ListRenderer.js +37 -0
- package/widget/multimodal_v2/components/helpers/Localization.js +76 -0
- package/widget/multimodal_v2/components/helpers/Persisted.js +166 -0
- package/widget/multimodal_v2/components/helpers/RichText.js +358 -0
- package/widget/multimodal_v2/components/helpers/ScreenReaderHeading.js +17 -0
- package/widget/multimodal_v2/components/helpers/Thumbnail.js +190 -0
- package/widget/multimodal_v2/components/helpers/VisuallyHidden.js +41 -0
- package/widget/multimodal_v2/components/helpers/content_click_payloads.js +58 -0
- package/widget/multimodal_v2/components/helpers/useDraggable.js +103 -0
- package/widget/multimodal_v2/components/helpers/useTextOverflow.js +44 -0
- package/widget/multimodal_v2/components/lightbox_gather/index.js +741 -0
- package/widget/multimodal_v2/components/meetings/ArtifactEntryPoint.js +252 -0
- package/widget/multimodal_v2/components/meetings/MeetingAdditionalAttendees.js +325 -0
- package/widget/multimodal_v2/components/meetings/MeetingBookerEntry.js +100 -0
- package/widget/multimodal_v2/components/meetings/MeetingDetailsCard.js +99 -0
- package/widget/multimodal_v2/components/meetings/MeetingErrorBanner.js +62 -0
- package/widget/multimodal_v2/components/meetings/MeetingOfferEmailStep.js +239 -0
- package/widget/multimodal_v2/components/meetings/MeetingOfferFooter.js +104 -0
- package/widget/multimodal_v2/components/meetings/MeetingOfferSelectionStep.js +60 -0
- package/widget/multimodal_v2/components/meetings/MeetingRepHeader.js +222 -0
- package/widget/multimodal_v2/components/meetings/MeetingStepShell.js +92 -0
- package/widget/multimodal_v2/components/meetings/MeetingSummaryRail.js +515 -0
- package/widget/multimodal_v2/components/meetings/MeetingTimeSelector.js +603 -0
- package/widget/multimodal_v2/components/meetings/MonthDatePicker.js +422 -0
- package/widget/multimodal_v2/components/meetings/NavigationButtons.js +76 -0
- package/widget/multimodal_v2/components/meetings/TimeSlotHeader.js +357 -0
- package/widget/multimodal_v2/components/meetings/WeekViewHeader.js +20 -0
- package/widget/multimodal_v2/components/meetings/constants.js +7 -0
- package/widget/multimodal_v2/components/meetings/index.js +47 -0
- package/widget/multimodal_v2/components/meetings/utils.js +328 -0
- package/widget/multimodal_v2/components/multimodal/Audio.js +28 -0
- package/widget/multimodal_v2/components/multimodal/Controls.js +188 -0
- package/widget/multimodal_v2/components/multimodal/LiveVideo.js +63 -0
- package/widget/multimodal_v2/components/multimodal/MultiModalComponent.js +424 -0
- package/widget/multimodal_v2/components/multimodal/MultimodalAvatar.js +36 -0
- package/widget/multimodal_v2/components/multimodal/OrbAvatar.js +326 -0
- package/widget/multimodal_v2/components/multimodal/Status.js +220 -0
- package/widget/multimodal_v2/components/multimodal/VideoAvatar.js +24 -0
- package/widget/multimodal_v2/components/multimodal/VideoPreview.js +114 -0
- package/widget/multimodal_v2/components/multimodal/useAudioLevelMonitoring.js +96 -0
- package/widget/multimodal_v2/components/multimodal/useMultimodal.js +434 -0
- package/widget/multimodal_v2/components/presentations/index.js +372 -0
- package/widget/multimodal_v2/components/shared/Avatar.js +92 -0
- package/widget/multimodal_v2/components/shared/AvatarGroup.js +135 -0
- package/widget/multimodal_v2/components/shared/Button.js +245 -0
- package/widget/multimodal_v2/components/shared/ButtonGroup.js +133 -0
- package/widget/multimodal_v2/components/shared/ComposerForm.js +98 -0
- package/widget/multimodal_v2/components/shared/SpeakingIndicator.js +239 -0
- package/widget/multimodal_v2/components/shared/ThinkingAnimation.js +165 -0
- package/widget/multimodal_v2/components/shared/Tooltip.js +266 -0
- package/widget/multimodal_v2/components/shared/controls/Dropdown.js +79 -0
- package/widget/multimodal_v2/components/shared/controls/PillToggle.js +142 -0
- package/widget/multimodal_v2/components/shared/controls/TextArea.js +114 -0
- package/widget/multimodal_v2/components/shared/toolCallLabels.js +12 -0
- package/widget/multimodal_v2/components/slides/SlidesThumbnail.js +47 -0
- package/widget/multimodal_v2/components/slides/index.js +61 -0
- package/widget/multimodal_v2/constants.js +88 -0
- package/widget/multimodal_v2/host.split-css.js +2 -0
- package/widget/multimodal_v2/host.string.js +96 -0
- package/widget/multimodal_v2/images/icons.js +582 -0
- package/widget/multimodal_v2/images/posters/piper_low_res.jpg +0 -0
- package/widget/multimodal_v2/index.js +23 -0
- package/widget/multimodal_v2/index.panda.js +28 -0
- package/widget/multimodal_v2/index.split-css.panda.js +2 -0
- package/widget/multimodal_v2/inline_meeting_booker.js +182 -0
- package/widget/multimodal_v2/locales/cs.js +196 -0
- package/widget/multimodal_v2/locales/da.js +196 -0
- package/widget/multimodal_v2/locales/de.js +196 -0
- package/widget/multimodal_v2/locales/en.js +196 -0
- package/widget/multimodal_v2/locales/en_AU.js +197 -0
- package/widget/multimodal_v2/locales/en_GB.js +197 -0
- package/widget/multimodal_v2/locales/es.js +197 -0
- package/widget/multimodal_v2/locales/es_LA.js +196 -0
- package/widget/multimodal_v2/locales/fi.js +196 -0
- package/widget/multimodal_v2/locales/fr.js +197 -0
- package/widget/multimodal_v2/locales/fr_CA.js +196 -0
- package/widget/multimodal_v2/locales/id.js +196 -0
- package/widget/multimodal_v2/locales/index.js +48 -0
- package/widget/multimodal_v2/locales/it.js +196 -0
- package/widget/multimodal_v2/locales/ja.js +196 -0
- package/widget/multimodal_v2/locales/ko.js +196 -0
- package/widget/multimodal_v2/locales/nb.js +196 -0
- package/widget/multimodal_v2/locales/nl.js +196 -0
- package/widget/multimodal_v2/locales/pl.js +196 -0
- package/widget/multimodal_v2/locales/pt_BR.js +196 -0
- package/widget/multimodal_v2/locales/ru.js +196 -0
- package/widget/multimodal_v2/locales/sv.js +196 -0
- package/widget/multimodal_v2/locales/th.js +196 -0
- package/widget/multimodal_v2/locales/tr.js +196 -0
- package/widget/multimodal_v2/locales/vi.js +196 -0
- package/widget/multimodal_v2/locales/zh_CN.js +196 -0
- package/widget/multimodal_v2/locales/zh_TW.js +196 -0
- package/widget/multimodal_v2/multimodal.js +633 -0
- package/widget/multimodal_v2/multimodal_channel.js +195 -0
- package/widget/multimodal_v2/signals/active_conversation_signal.js +33 -0
- package/widget/multimodal_v2/signals/allowed_conversation_mode_signal.js +38 -0
- package/widget/multimodal_v2/signals/artifact_signal.js +22 -0
- package/widget/multimodal_v2/signals/layout_signal.js +98 -0
- package/widget/multimodal_v2/signals/messages_signal.js +207 -0
- package/widget/multimodal_v2/signals/ui_state_signal.js +128 -0
- package/widget/multimodal_v2/stable_bundle_src.js +44 -0
- package/widget/multimodal_v2/stores/ai_conversation_store.js +221 -0
- package/widget/multimodal_v2/stores/artifact_store.js +205 -0
- package/widget/multimodal_v2/stores/base_store.js +16 -0
- package/widget/multimodal_v2/stores/call_store.js +770 -0
- package/widget/multimodal_v2/stores/call_ui_adapter.js +225 -0
- package/widget/multimodal_v2/stores/debug_multimodal_scenario_store.js +471 -0
- package/widget/multimodal_v2/stores/decks_store.js +285 -0
- package/widget/multimodal_v2/stores/device_store.js +63 -0
- package/widget/multimodal_v2/stores/docking_store.js +62 -0
- package/widget/multimodal_v2/stores/field_request_store.js +326 -0
- package/widget/multimodal_v2/stores/meeting_store.js +477 -0
- package/widget/multimodal_v2/stores/participant_store.js +73 -0
- package/widget/multimodal_v2/stores/post_call_survey_store.js +160 -0
- package/widget/multimodal_v2/stores/pounce_tracking_store.js +163 -0
- package/widget/multimodal_v2/stores/pounce_tracking_store_v2.js +511 -0
- package/widget/multimodal_v2/stores/presentations_store.js +111 -0
- package/widget/multimodal_v2/stores/root_store.js +1919 -0
- package/widget/multimodal_v2/stores/screen_share_store.js +217 -0
- package/widget/multimodal_v2/stores/slides_store.js +21 -0
- package/widget/multimodal_v2/stores/translation_store.js +185 -0
- package/widget/multimodal_v2/stores/ui_store.js +496 -0
- package/widget/multimodal_v2/stores/waiting_store.js +159 -0
- package/widget/multimodal_v2/stores/website_navigation_store.js +767 -0
- package/widget/multimodal_v2/styled-system/css/conditions.js +34 -0
- package/widget/multimodal_v2/styled-system/css/css.js +48 -0
- package/widget/multimodal_v2/styled-system/css/cva.js +96 -0
- package/widget/multimodal_v2/styled-system/css/cx.js +13 -0
- package/widget/multimodal_v2/styled-system/css/index.js +15 -0
- package/widget/multimodal_v2/styled-system/css/sva.js +69 -0
- package/widget/multimodal_v2/styled-system/helpers.js +384 -0
- package/widget/multimodal_v2/styled-system/jsx/create-style-context.js +96 -0
- package/widget/multimodal_v2/styled-system/jsx/factory-helper.js +19 -0
- package/widget/multimodal_v2/styled-system/jsx/factory.js +111 -0
- package/widget/multimodal_v2/styled-system/jsx/index.js +12 -0
- package/widget/multimodal_v2/styled-system/jsx/is-valid-prop.js +22 -0
- package/widget/multimodal_v2/types.js +105 -0
- package/widget/multimodal_v2/utils/auto_scroller.js +157 -0
- package/widget/multimodal_v2/utils/flip_animation.js +124 -0
- package/widget/multimodal_v2/utils/focus_gate.js +237 -0
- package/widget/multimodal_v2/utils/locale.js +16 -0
- package/widget/multimodal_v2/utils/media_queries.js +30 -0
- package/widget/multimodal_v2/utils/multimodal_cache.js +19 -0
- package/widget/multimodal_v2/utils/mutation_effect.js +14 -0
- package/widget/multimodal_v2/utils/navigation_interceptor.js +205 -0
- package/widget/multimodal_v2/utils/navigation_strategies/dom_swap.js +393 -0
- package/widget/multimodal_v2/utils/navigation_strategies/index.js +12 -0
- package/widget/multimodal_v2/utils/navigation_strategies/lwr.js +61 -0
- package/widget/multimodal_v2/utils/navigation_strategies/navigation_utils.js +46 -0
- package/widget/multimodal_v2/utils/navigation_strategies/next_js.js +24 -0
- package/widget/multimodal_v2/utils/navigation_strategies/wouter_v3.js +15 -0
- package/widget/multimodal_v2/utils/objects_map.js +38 -0
- package/widget/multimodal_v2/utils/perceived_voice_turn_tracker.js +345 -0
- package/widget/multimodal_v2/utils/sanitize_html.js +132 -0
- package/widget/multimodal_v2/utils/signals.js +97 -0
- package/widget/multimodal_v2/utils/slide_zoom.js +114 -0
- package/widget/multimodal_v2/utils/theme_styles.js +137 -0
- package/widget/multimodal_v2/utils/url_observer.js +52 -0
- package/widget/multimodal_v2/utils/voice_onset_detector.js +127 -0
- package/widget/page_mirror.js +89 -0
- package/widget/page_view_activity_emitter.js +71 -0
- package/widget/pardot_visitor.js +137 -0
- package/widget/personalization_observer.js +96 -0
- package/widget/personalizations_config.js +160 -0
- package/widget/qualified_form/constants.js +23 -0
- package/widget/qualified_form/phone_utils.js +38 -0
- package/widget/qualified_form/qualified_form_action.js +91 -0
- package/widget/qualified_form/qualified_form_action_orchestrator.js +21 -0
- package/widget/qualified_form/qualified_form_api.js +471 -0
- package/widget/scroll_disabler.js +109 -0
- package/widget/server-logger.js +156 -0
- package/widget/smart_website_config.js +112 -0
- package/widget/telemetry/context.js +75 -0
- package/widget/telemetry/index.js +16 -0
- package/widget/telemetry/messenger_uptime.js +80 -0
- package/widget/telemetry/metrics.js +120 -0
- package/widget/telemetry/span.js +82 -0
- package/widget/telemetry/telemetry.js +180 -0
- package/widget/telemetry/tracer.js +41 -0
- package/widget/telemetry/tracing_store.js +310 -0
- package/widget/tracker.js +916 -0
- package/widget/utils/native_globals.js +129 -0
- package/widget/v1_adapter.js +50 -0
- package/widget/v2_adapter.js +368 -0
- package/widget/visitor/base_visitor_state.js +11 -0
- package/widget/visitor/cookie_visitor_state.js +128 -0
- package/widget/visitor/in_memory_visitor_state.js +29 -0
- package/widget/visitor/visitor_state.js +384 -0
- package/widget/visitor.js +356 -0
- package/widget/widget/linked_widget_v2.js +227 -0
- package/widget/widget/page_mirror_factory.js +22 -0
- package/widget/widget/sentry.js +130 -0
- package/widget/widget/widget.js +1698 -0
- package/widget/widget.split-css.js +2 -0
- package/widget/widget_bootstrap.js +97 -0
- package/widget/widget_object.js +73 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { __webpack_require__ } from "../../js/runtime.js";
|
|
2
|
+
import { _class_private_field_loose_base, _class_private_field_loose_key } from "../../js/4101.js";
|
|
3
|
+
import { isIframed } from "../../src/iframes.js";
|
|
4
|
+
import { isIn } from "../../src/utils.js";
|
|
5
|
+
import { default as WidgetObject } from "../widget_object.js";
|
|
6
|
+
|
|
7
|
+
__webpack_require__("67353");
|
|
8
|
+
const isFunction = __webpack_require__("42902");
|
|
9
|
+
var isFunction_default = /*#__PURE__*/__webpack_require__.n(isFunction);
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
const API_VERBS = (/* unused pure expression or super */ null && ([
|
|
18
|
+
"initialize",
|
|
19
|
+
"open",
|
|
20
|
+
"initPardotForm",
|
|
21
|
+
"initPardotFormThankYou",
|
|
22
|
+
"parsePardotForm",
|
|
23
|
+
"parsePardotFormForLandingPage",
|
|
24
|
+
"saveFormData",
|
|
25
|
+
"saveSmartFormData",
|
|
26
|
+
"sendSmartFormData",
|
|
27
|
+
"pardotFormSubmitted",
|
|
28
|
+
"showExperience",
|
|
29
|
+
"endExperience",
|
|
30
|
+
"registerForm",
|
|
31
|
+
"showForm",
|
|
32
|
+
"showFormExperience",
|
|
33
|
+
"showExperienceForForm",
|
|
34
|
+
"refreshVisitorState",
|
|
35
|
+
"getIdentity",
|
|
36
|
+
"handleEvents",
|
|
37
|
+
"handleMessengerEvents",
|
|
38
|
+
"handleWidgetEvents",
|
|
39
|
+
"identify",
|
|
40
|
+
"page",
|
|
41
|
+
"setCookieConsent",
|
|
42
|
+
"teardown",
|
|
43
|
+
"emitFormFill",
|
|
44
|
+
"submitEmbeddedForm",
|
|
45
|
+
"logDebugEvent",
|
|
46
|
+
"setChatIsVisible",
|
|
47
|
+
"startCall",
|
|
48
|
+
"startChat"
|
|
49
|
+
]));
|
|
50
|
+
const API_VERBS_ALLOWED_FOR_ACTIONS = [
|
|
51
|
+
"open",
|
|
52
|
+
"showExperience"
|
|
53
|
+
];
|
|
54
|
+
const PARDOT_EMAIL_SELECTOR = "p.email input, div.email input";
|
|
55
|
+
/**
|
|
56
|
+
* List of API properties that should be preserved when the qualified object is replaced.
|
|
57
|
+
* These are sub-APIs that can be registered independently (e.g., via separate scripts).
|
|
58
|
+
*/ const API_PROPERTIES = [
|
|
59
|
+
"docking",
|
|
60
|
+
"sentinel"
|
|
61
|
+
];
|
|
62
|
+
var // TODO get classPrivateMethods working for eslint below....
|
|
63
|
+
// E.g. <button data-qualified-action="doit"
|
|
64
|
+
// data-qualified-arg="value1"
|
|
65
|
+
// data-qualified-arg-1="value2"/>
|
|
66
|
+
//
|
|
67
|
+
_initDeclarativeApi = /*#__PURE__*/ _class_private_field_loose_key("_initDeclarativeApi"), _initSmartForms = /*#__PURE__*/ _class_private_field_loose_key("_initSmartForms"), /**
|
|
68
|
+
* Extract only the known API properties from an object.
|
|
69
|
+
*/ _getPreservedProperties = /*#__PURE__*/ _class_private_field_loose_key("_getPreservedProperties");
|
|
70
|
+
class BaseApiHandler extends WidgetObject {
|
|
71
|
+
init() {
|
|
72
|
+
var _this = this;
|
|
73
|
+
// Ensure all public facing objects exist. Usually created by the preamble before <script> we
|
|
74
|
+
// give to customers in the snippet.
|
|
75
|
+
if (!window.QualifiedObject) {
|
|
76
|
+
window.QualifiedObject = "qualified";
|
|
77
|
+
}
|
|
78
|
+
const qObjName = window.QualifiedObject, qObj = window[qObjName], hasEnqueued = isFunction_default()(qObj) && Array.isArray(qObj.q) && qObj.q.length > 0;
|
|
79
|
+
if (hasEnqueued) {
|
|
80
|
+
const queue = qObj.q;
|
|
81
|
+
// Prioritize execution of the first 'initialize' call if present.
|
|
82
|
+
const initializeIdx = queue.findIndex((fn)=>fn && fn[0] === "initialize");
|
|
83
|
+
if (initializeIdx !== -1) {
|
|
84
|
+
this.execute(...queue[initializeIdx]);
|
|
85
|
+
queue.splice(initializeIdx, 1);
|
|
86
|
+
}
|
|
87
|
+
// Save off remaining enqueued api calls
|
|
88
|
+
this.queue = queue;
|
|
89
|
+
delete qObj.q;
|
|
90
|
+
}
|
|
91
|
+
// Redefine public-facing API to use this handler.
|
|
92
|
+
// Preserve known sub-API properties (like .docking) from the old qualified object
|
|
93
|
+
const preservedProps = _class_private_field_loose_base(this, _getPreservedProperties)[_getPreservedProperties](qObj);
|
|
94
|
+
window[qObjName] = function() {
|
|
95
|
+
for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){
|
|
96
|
+
args[_key] = arguments[_key];
|
|
97
|
+
}
|
|
98
|
+
_this.execute(...args); // eslint-disable-line prefer-rest-params
|
|
99
|
+
};
|
|
100
|
+
Object.defineProperties(window[qObjName], preservedProps);
|
|
101
|
+
this.initialized = true;
|
|
102
|
+
}
|
|
103
|
+
cleanup() {
|
|
104
|
+
if (this.initialized) {
|
|
105
|
+
// Restore snippet's original qualified(...) function that queues up API calls.
|
|
106
|
+
// Preserve known sub-API properties (like .docking) from the current qualified object
|
|
107
|
+
const preservedProps = _class_private_field_loose_base(this, _getPreservedProperties)[_getPreservedProperties](window[window.QualifiedObject]);
|
|
108
|
+
window[window.QualifiedObject] = function() {
|
|
109
|
+
for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){
|
|
110
|
+
args[_key] = arguments[_key];
|
|
111
|
+
}
|
|
112
|
+
window[window.QualifiedObject].q.push(args);
|
|
113
|
+
};
|
|
114
|
+
window[window.QualifiedObject].q = [];
|
|
115
|
+
Object.defineProperties(window[window.QualifiedObject], preservedProps);
|
|
116
|
+
this.initialized = false;
|
|
117
|
+
}
|
|
118
|
+
super.cleanup();
|
|
119
|
+
}
|
|
120
|
+
markReady() {
|
|
121
|
+
this.ready = true;
|
|
122
|
+
if (this.queue.length > 0) {
|
|
123
|
+
this.queue.forEach((args)=>this.execute(...args));
|
|
124
|
+
this.queue = [];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
execute(fn) {
|
|
128
|
+
for(var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){
|
|
129
|
+
args[_key - 1] = arguments[_key];
|
|
130
|
+
}
|
|
131
|
+
if (fn && this.handlers[fn]) {
|
|
132
|
+
if (this.ready || fn === "initialize") {
|
|
133
|
+
// Should execute immediately?
|
|
134
|
+
this.handlers[fn].apply(undefined, args);
|
|
135
|
+
} else {
|
|
136
|
+
this.queue.push([
|
|
137
|
+
fn,
|
|
138
|
+
...args
|
|
139
|
+
]);
|
|
140
|
+
}
|
|
141
|
+
} else {
|
|
142
|
+
console.warn("Qualified: Invalid API call '" + fn + "'."); // eslint-disable-line no-console
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
constructor(injectionProps, handlers){
|
|
146
|
+
super(injectionProps), Object.defineProperty(this, _getPreservedProperties, {
|
|
147
|
+
value: getPreservedProperties
|
|
148
|
+
}), Object.defineProperty(this, _initDeclarativeApi, {
|
|
149
|
+
writable: true,
|
|
150
|
+
value: void 0
|
|
151
|
+
}), Object.defineProperty(this, _initSmartForms, {
|
|
152
|
+
writable: true,
|
|
153
|
+
value: void 0
|
|
154
|
+
}), this.initialized = false, this.ready = false, _class_private_field_loose_base(this, _initDeclarativeApi)[_initDeclarativeApi] = ()=>{
|
|
155
|
+
[].slice.call(document.querySelectorAll("[data-qualified-action]")).forEach((el)=>{
|
|
156
|
+
// Parse API args from data attributes
|
|
157
|
+
const fn = el.dataset.qualifiedAction;
|
|
158
|
+
if (!isIn(API_VERBS_ALLOWED_FOR_ACTIONS, fn)) return;
|
|
159
|
+
const args = Object.keys(el.dataset).sort().reduce((args, name)=>{
|
|
160
|
+
if (/^qualifiedArg/.test(name)) {
|
|
161
|
+
var _exec;
|
|
162
|
+
const foo = Number((_exec = /^qualifiedArg-([0-9])+/.exec(name)) == null ? void 0 : _exec[1]) || 0;
|
|
163
|
+
args[foo] = el.dataset[name];
|
|
164
|
+
}
|
|
165
|
+
return args;
|
|
166
|
+
}, []);
|
|
167
|
+
const exec = ()=>this.execute(fn, ...args);
|
|
168
|
+
// Execute API call on click
|
|
169
|
+
// TODO: event type support?
|
|
170
|
+
el.addEventListener("click", exec);
|
|
171
|
+
this.callOnDispose(()=>el.removeEventListener("click", exec));
|
|
172
|
+
});
|
|
173
|
+
}, _class_private_field_loose_base(this, _initSmartForms)[_initSmartForms] = ()=>{
|
|
174
|
+
// TODO: mutation observer for dynamically generated forms
|
|
175
|
+
[].slice.call(document.querySelectorAll("[data-qualified-smart-form]")).forEach((el)=>{
|
|
176
|
+
// Save the original on submit and wrap it with our own
|
|
177
|
+
const { onsubmit } = el;
|
|
178
|
+
// Old smart form api specified data-qualified-smart-form="true"
|
|
179
|
+
const botApiName = el.dataset.qualifiedSmartForm === "true" ? "default" : el.dataset.qualifiedSmartForm, trigger = el.dataset.qualifiedSmartFormTrigger;
|
|
180
|
+
el.onsubmit = (e)=>{
|
|
181
|
+
const returnValue = onsubmit ? onsubmit.call(el, e) : true;
|
|
182
|
+
// eslint-disable-next-line no-useless-catch
|
|
183
|
+
try {
|
|
184
|
+
const fields = [].slice.call(e.target.querySelectorAll("[data-qualified-field]"));
|
|
185
|
+
const fieldValues = fields.reduce((values, param)=>{
|
|
186
|
+
let { dataset: { qualifiedField: apiName }, value, checked, type } = param;
|
|
187
|
+
switch(type){
|
|
188
|
+
case "checkbox":
|
|
189
|
+
values[apiName] = checked;
|
|
190
|
+
break;
|
|
191
|
+
case "radio":
|
|
192
|
+
checked && (values[apiName] = value);
|
|
193
|
+
break;
|
|
194
|
+
case "password":
|
|
195
|
+
break; // Never capture password fields
|
|
196
|
+
default:
|
|
197
|
+
value.trim() && (values[apiName] = value);
|
|
198
|
+
}
|
|
199
|
+
return values;
|
|
200
|
+
}, {});
|
|
201
|
+
// If return value is `false`, or if `e.preventDefault()` was called,
|
|
202
|
+
// the form will not submit and we can save gathered field values and
|
|
203
|
+
// bot api name right away. Otherwise, they'll be sent the next time
|
|
204
|
+
// the messenger loads.
|
|
205
|
+
//
|
|
206
|
+
// If iframed, always trigger save immediately and it will be bubbled
|
|
207
|
+
// up to the parent window.
|
|
208
|
+
if (trigger === "submit" || trigger !== "redirect" && (returnValue === false || e.defaultPrevented) || isIframed()) {
|
|
209
|
+
this.execute("sendSmartFormData", fieldValues, botApiName);
|
|
210
|
+
} else {
|
|
211
|
+
this.execute("saveSmartFormData", fieldValues, botApiName);
|
|
212
|
+
}
|
|
213
|
+
} catch (e) {
|
|
214
|
+
// TODO: sentry
|
|
215
|
+
throw e;
|
|
216
|
+
}
|
|
217
|
+
return returnValue;
|
|
218
|
+
};
|
|
219
|
+
this.callOnDispose(()=>el.onsubmit = onsubmit);
|
|
220
|
+
});
|
|
221
|
+
};
|
|
222
|
+
// For safety, check that a handler is defined for all verbs and that all
|
|
223
|
+
// verbs are declared
|
|
224
|
+
if (false) {}
|
|
225
|
+
this.handlers = handlers;
|
|
226
|
+
this.queue = [];
|
|
227
|
+
_class_private_field_loose_base(this, _initDeclarativeApi)[_initDeclarativeApi]();
|
|
228
|
+
_class_private_field_loose_base(this, _initSmartForms)[_initSmartForms]();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function getPreservedProperties(obj) {
|
|
232
|
+
if (!obj) return {};
|
|
233
|
+
const descriptors = {};
|
|
234
|
+
for (const key of API_PROPERTIES){
|
|
235
|
+
if (key in obj) {
|
|
236
|
+
const descriptor = Object.getOwnPropertyDescriptor(obj, key);
|
|
237
|
+
if (descriptor) {
|
|
238
|
+
descriptors[key] = descriptor;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return descriptors;
|
|
243
|
+
}
|
|
244
|
+
/* export default */ const base_api_handler = (BaseApiHandler);
|
|
245
|
+
|
|
246
|
+
var base_api_handler_API_VERBS = /* unused export */ undefined;
|
|
247
|
+
var base_api_handler_API_VERBS_ALLOWED_FOR_ACTIONS = /* unused export */ undefined;
|
|
248
|
+
export { PARDOT_EMAIL_SELECTOR, base_api_handler_API_VERBS as API_VERBS, base_api_handler_API_VERBS_ALLOWED_FOR_ACTIONS as API_VERBS_ALLOWED_FOR_ACTIONS };
|
|
249
|
+
export default base_api_handler;
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
import { __webpack_require__ } from "../js/runtime.js";
|
|
2
|
+
import "./utils/native_globals.js";
|
|
3
|
+
import { _extends } from "../js/4101.js";
|
|
4
|
+
|
|
5
|
+
/* provided dependency */ var __nativeWindowAddEventListener = __webpack_require__(68034).zh;
|
|
6
|
+
/* provided dependency */ var __nativeDocumentAddEventListener = __webpack_require__(68034).Qj;
|
|
7
|
+
/* provided dependency */ var __nativeWindowRemoveEventListener = __webpack_require__(68034).kZ;
|
|
8
|
+
/* provided dependency */ var __nativeDocumentRemoveEventListener = __webpack_require__(68034).LA;
|
|
9
|
+
|
|
10
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
11
|
+
// Booker *intent* SLI — the window BEFORE an offer exists.
|
|
12
|
+
//
|
|
13
|
+
// `booker_outcome` (booker_outcome_tracker.ts) arms once an offer exists and
|
|
14
|
+
// measures offer -> booker shown. This tracker measures the step before that:
|
|
15
|
+
// something decided to offer a meeting -> the offer actually arrived. On the AI
|
|
16
|
+
// pathway that window holds an LLM turn, meeting routing, and offer creation —
|
|
17
|
+
// time the visitor sits waiting, without knowing why. It is invisible to
|
|
18
|
+
// `booker_outcome`, which cannot arm until the offer it measures exists.
|
|
19
|
+
//
|
|
20
|
+
// The `outcome` facet is emitted exactly ONCE per intent (`offered` |
|
|
21
|
+
// `abandoned_pre_offer` | `no_offer`) so the offer-made rate is a straight count
|
|
22
|
+
// over the facet rather than a join.
|
|
23
|
+
//
|
|
24
|
+
// `no_offer` is only reportable where the client can see a terminal non-meeting
|
|
25
|
+
// result. The form/CTA pathway can (the trigger response says so). The AI pathway
|
|
26
|
+
// cannot — when the AI decides not to offer, the conversation simply continues —
|
|
27
|
+
// so it sources that leg server-side from the `ai_offer_meeting_booker`
|
|
28
|
+
// `decision_outcome` instead.
|
|
29
|
+
//
|
|
30
|
+
// Surface-agnostic on purpose: the form/CTA pathway arms the same tracker from a
|
|
31
|
+
// click/submit instead of an AI signal.
|
|
32
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
33
|
+
const BOOKER_INTENT_OUTCOME = {
|
|
34
|
+
OFFERED: "offered",
|
|
35
|
+
ABANDONED_PRE_OFFER: "abandoned_pre_offer",
|
|
36
|
+
/**
|
|
37
|
+
* The trigger resolved to something that is not a meeting. Only for pathways
|
|
38
|
+
* where the client can observe a *terminal* non-meeting result — on the AI
|
|
39
|
+
* pathway it cannot (the conversation just continues), so that one sources
|
|
40
|
+
* `no_offer` from the server `decision_outcome` instead.
|
|
41
|
+
*/ NO_OFFER: "no_offer"
|
|
42
|
+
};
|
|
43
|
+
// Client-observed stages, deliberately NOT reused from the server's
|
|
44
|
+
// `meeting_stage` vocabulary: the server's stages mean "the step executed",
|
|
45
|
+
// these mean "the visitor experienced it". Colliding them would make the two
|
|
46
|
+
// uncomparable within one facet.
|
|
47
|
+
const BOOKER_INTENT_MEETING_STAGE = "booker_intent";
|
|
48
|
+
const INTENT_TO_BOOKER_SHOWN_MEETING_STAGE = "intent_to_booker_shown";
|
|
49
|
+
/**
|
|
50
|
+
* Trigger -> the questions arrived on the wire. **Not** the paint: the caller
|
|
51
|
+
* resolves this from `channel.ts`'s inbound handler, which runs before the
|
|
52
|
+
* payload is emitted to either renderer, so render and paint are excluded. Named
|
|
53
|
+
* `received` rather than `shown` for that reason — every other client stage here
|
|
54
|
+
* means "the visitor saw it", and this one cannot, because the questions render
|
|
55
|
+
* inside the messenger iframe while the trigger fired in the host realm.
|
|
56
|
+
*
|
|
57
|
+
* The *rest* of the qualification lifecycle is deliberately absent for the same
|
|
58
|
+
* cross-realm reason: the submit moment is unobservable from the host, and any
|
|
59
|
+
* interval spanning it would blend visitor think-time with our latency. That
|
|
60
|
+
* split is sourced from the server's `triggered_to_qq` / `qq_to_meeting_booker`.
|
|
61
|
+
*/ const INTENT_TO_QUALIFICATION_RECEIVED_MEETING_STAGE = "intent_to_qualification_received";
|
|
62
|
+
/**
|
|
63
|
+
* How long after a `visibilitychange` to hidden a `pagehide` still counts as the
|
|
64
|
+
* same unload sequence.
|
|
65
|
+
*
|
|
66
|
+
* Browsers dispatch `visibilitychange` -> hidden immediately *before* `pagehide`
|
|
67
|
+
* on an ordinary navigation, so a naive "was the tab ever hidden?" check treats
|
|
68
|
+
* every abandonment as backgrounded and silently drops its duration. The two
|
|
69
|
+
* events are sub-frame apart during unload, whereas a genuine background
|
|
70
|
+
* interval is orders of magnitude longer, so a short grace window separates them
|
|
71
|
+
* without needing to distinguish the event causes.
|
|
72
|
+
*/ const UNLOAD_VISIBILITY_GRACE_MS = 200;
|
|
73
|
+
/**
|
|
74
|
+
* Prefix for the per-intent "already counted" marker.
|
|
75
|
+
*
|
|
76
|
+
* `sessionStorage`, not `localStorage`: the marker only needs to outlive a reload
|
|
77
|
+
* within the same tab, which is exactly its scope, and it should not leak into a
|
|
78
|
+
* later visit.
|
|
79
|
+
*/ const RESOLVED_INTENT_KEY_PREFIX = "qlfd:booker_intent_resolved:";
|
|
80
|
+
class BookerIntentTracker {
|
|
81
|
+
/** True while an intent is being tracked, for callers that gate on it. */ get isArmed() {
|
|
82
|
+
return this.intent !== null;
|
|
83
|
+
}
|
|
84
|
+
arm(param) {
|
|
85
|
+
let { intentId, pathwayOrigin, conversationType, botApiName, scriptId, fromHistory = false } = param;
|
|
86
|
+
this.safely(()=>{
|
|
87
|
+
var _this_intent;
|
|
88
|
+
if (((_this_intent = this.intent) == null ? void 0 : _this_intent.intentId) === intentId) return;
|
|
89
|
+
// A reload mid-wait sends the old page a non-persisted `pagehide`, which
|
|
90
|
+
// already reported this intent's terminal outcome. Re-arming from the
|
|
91
|
+
// hydrated message would let the same intent report a second one — an
|
|
92
|
+
// `offered` here against the `abandoned_pre_offer` the old page sent — and
|
|
93
|
+
// put one journey in the SLI denominator twice. `fromHistory` alone cannot
|
|
94
|
+
// see that: the outcome was emitted by a different JS context.
|
|
95
|
+
if (fromHistory && this.alreadyResolved(intentId)) return;
|
|
96
|
+
this.teardown();
|
|
97
|
+
const hidden = !this.documentVisible();
|
|
98
|
+
this.intent = {
|
|
99
|
+
intentId,
|
|
100
|
+
pathwayOrigin,
|
|
101
|
+
conversationType,
|
|
102
|
+
botApiName,
|
|
103
|
+
scriptId,
|
|
104
|
+
startedAtMs: this.nowMs(),
|
|
105
|
+
// No `performance` means no honest duration; keep the outcome, drop the timing.
|
|
106
|
+
measureTiming: !fromHistory && typeof performance !== "undefined",
|
|
107
|
+
fromHistory,
|
|
108
|
+
outcomeEmitted: false,
|
|
109
|
+
shownEmitted: false,
|
|
110
|
+
qualificationReceivedEmitted: false,
|
|
111
|
+
// A tab already hidden at arm time is as untrustworthy as one hidden later.
|
|
112
|
+
wasEverHidden: hidden,
|
|
113
|
+
hiddenAtMs: hidden ? this.nowMs() : undefined
|
|
114
|
+
};
|
|
115
|
+
if (typeof window !== "undefined") {
|
|
116
|
+
__nativeWindowAddEventListener("pagehide", this.handlePagehide);
|
|
117
|
+
}
|
|
118
|
+
if (typeof document !== "undefined") {
|
|
119
|
+
__nativeDocumentAddEventListener("visibilitychange", this.handleVisibilityChange);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* The qualification questions arrived on the wire — **not** painted. Callers
|
|
125
|
+
* resolve this from the inbound channel handler, which runs before the payload
|
|
126
|
+
* reaches a renderer, so the emitted `intent_to_qualification_received` excludes
|
|
127
|
+
* render and paint. Naming it otherwise would invite consumers to read this
|
|
128
|
+
* latency as time-to-visible, which it is not and cannot be from the host realm.
|
|
129
|
+
*
|
|
130
|
+
* Then **stays armed**: the questions are not a terminal outcome — the
|
|
131
|
+
* booker can still arrive in a later broadcast once they are answered, and
|
|
132
|
+
* resolving here would misclassify every questions-then-booker journey as a
|
|
133
|
+
* failure. Most questions journeys do not reach a booker (prod 7d:
|
|
134
|
+
* `triggered_to_qq` 24,543 vs `qq_to_meeting_booker` 2,532), which is expected
|
|
135
|
+
* product behaviour and must never count as a booker failure.
|
|
136
|
+
*/ markQualificationReceived() {
|
|
137
|
+
this.safely(()=>{
|
|
138
|
+
const { intent } = this;
|
|
139
|
+
if (!intent || intent.qualificationReceivedEmitted) return;
|
|
140
|
+
// Claimed before the timing check, deliberately. Untrustworthy timing is
|
|
141
|
+
// monotonic within an intent: `measureTiming` is fixed at arm, and
|
|
142
|
+
// `wasEverHidden` latches true the moment a hidden tab returns and is never
|
|
143
|
+
// cleared. So a call that finds no timing guarantees every later call finds
|
|
144
|
+
// none either — leaving the flag unset would invite a retry that cannot
|
|
145
|
+
// succeed.
|
|
146
|
+
//
|
|
147
|
+
// Single-shot is also the only correct model, and not merely a duplicate
|
|
148
|
+
// guard. A flow can paint many gathers — the server strips exactly this
|
|
149
|
+
// case in `remove_looped_messages` when a rematching visitor loops the
|
|
150
|
+
// questions. Only `intent -> first gather` is free of visitor input; every
|
|
151
|
+
// later interval contains the visitor answering the previous gather, so
|
|
152
|
+
// emitting one under this stage would mix think-time into a latency facet.
|
|
153
|
+
intent.qualificationReceivedEmitted = true;
|
|
154
|
+
// Timing-only line, no `outcome` facet: with no trustworthy duration there
|
|
155
|
+
// is nothing left to report, so skip it rather than emit an empty row. Same
|
|
156
|
+
// rule as `markShown`.
|
|
157
|
+
const timing = this.timing(intent);
|
|
158
|
+
if (timing.timing === undefined) return;
|
|
159
|
+
this.emit(intent, _extends({
|
|
160
|
+
meeting_stage: INTENT_TO_QUALIFICATION_RECEIVED_MEETING_STAGE
|
|
161
|
+
}, timing));
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* The trigger reached a terminal non-meeting result. Callers must pass only
|
|
166
|
+
* genuinely terminal signals — never "qualification questions were shown",
|
|
167
|
+
* which is a waypoint (see `markQualificationReceived`).
|
|
168
|
+
*/ markNoOffer() {
|
|
169
|
+
this.safely(()=>{
|
|
170
|
+
const { intent } = this;
|
|
171
|
+
if (!intent || intent.outcomeEmitted) return;
|
|
172
|
+
intent.outcomeEmitted = true;
|
|
173
|
+
const timing = this.timing(intent);
|
|
174
|
+
// Release before emitting: a throwing transport must not strand the
|
|
175
|
+
// listeners, and `safely()` would otherwise unwind past this cleanup.
|
|
176
|
+
this.teardown();
|
|
177
|
+
this.intent = null;
|
|
178
|
+
this.emit(intent, _extends({
|
|
179
|
+
meeting_stage: BOOKER_INTENT_MEETING_STAGE,
|
|
180
|
+
outcome: BOOKER_INTENT_OUTCOME.NO_OFFER
|
|
181
|
+
}, timing));
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
/** The offer arrived: closes the outcome facet, keeps the window open for `shown`. */ markOffered(offerMessageId, param) {
|
|
185
|
+
let { calendarEventTypeId } = param === void 0 ? {} : param;
|
|
186
|
+
this.safely(()=>{
|
|
187
|
+
const { intent } = this;
|
|
188
|
+
if (!intent || intent.outcomeEmitted) return;
|
|
189
|
+
intent.outcomeEmitted = true;
|
|
190
|
+
intent.offerMessageId = offerMessageId;
|
|
191
|
+
// Only knowable once an offer exists, so it is absent from any line emitted
|
|
192
|
+
// before this point rather than backfilled onto them.
|
|
193
|
+
intent.calendarEventTypeId = calendarEventTypeId;
|
|
194
|
+
this.emit(intent, _extends({
|
|
195
|
+
meeting_stage: BOOKER_INTENT_MEETING_STAGE,
|
|
196
|
+
outcome: BOOKER_INTENT_OUTCOME.OFFERED,
|
|
197
|
+
offer_message_id: offerMessageId
|
|
198
|
+
}, this.timing(intent)));
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* The booker painted: emits the visitor-experienced total (intent -> shown).
|
|
203
|
+
* With `booker_outcome`'s offer -> shown timing this decomposes as
|
|
204
|
+
* `total = intent->offer + offer->shown`, so a bad total attributes to either
|
|
205
|
+
* the upstream wait or the client render.
|
|
206
|
+
*/ markShown(offerMessageId) {
|
|
207
|
+
this.safely(()=>{
|
|
208
|
+
const { intent } = this;
|
|
209
|
+
if (!intent || !intent.outcomeEmitted || intent.shownEmitted) return;
|
|
210
|
+
// Only the offer this intent produced closes this window; a later offer
|
|
211
|
+
// belongs to its own intent.
|
|
212
|
+
if (intent.offerMessageId !== offerMessageId) return;
|
|
213
|
+
intent.shownEmitted = true;
|
|
214
|
+
// Unlike the outcome events, this line exists *only* to carry the timing —
|
|
215
|
+
// it has no `outcome` facet (which would double-count the SLI denominator).
|
|
216
|
+
// With no trustworthy timing there is nothing left to report, so skip it.
|
|
217
|
+
const timing = this.timing(intent);
|
|
218
|
+
// Release before emitting: a throwing transport must not strand the
|
|
219
|
+
// listeners, and `safely()` would otherwise unwind past this cleanup.
|
|
220
|
+
this.teardown();
|
|
221
|
+
this.intent = null;
|
|
222
|
+
if (timing.timing !== undefined) {
|
|
223
|
+
this.emit(intent, _extends({
|
|
224
|
+
meeting_stage: INTENT_TO_BOOKER_SHOWN_MEETING_STAGE,
|
|
225
|
+
offer_message_id: offerMessageId
|
|
226
|
+
}, timing));
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
dispose() {
|
|
231
|
+
this.safely(()=>{
|
|
232
|
+
this.teardown();
|
|
233
|
+
this.intent = null;
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Elapsed time since intent, or nothing when it cannot be trusted.
|
|
238
|
+
*
|
|
239
|
+
* Backgrounded tabs carry the whole backgrounded interval in their wall clock —
|
|
240
|
+
* the defect CORE-2607 fixed on the standalone TTI metric, where the 30-day max
|
|
241
|
+
* reached ~9 days. Omitting the field (rather than emitting a wrong number)
|
|
242
|
+
* keeps the outcome counts complete while leaving the latency distribution
|
|
243
|
+
* honest. No rAF deferral is needed: the callers already fire from a rendered
|
|
244
|
+
* component's effect, i.e. after the paint they report on.
|
|
245
|
+
*/ timing(intent, param) {
|
|
246
|
+
let { atUnload = false } = param === void 0 ? {} : param;
|
|
247
|
+
if (!intent.measureTiming) return {};
|
|
248
|
+
if (intent.wasEverHidden) return {};
|
|
249
|
+
if (intent.hiddenAtMs !== undefined) {
|
|
250
|
+
// Hidden right now. During unload that is just the `visibilitychange` that
|
|
251
|
+
// precedes `pagehide`; any longer stretch is a real background interval.
|
|
252
|
+
const hiddenForMs = this.nowMs() - intent.hiddenAtMs;
|
|
253
|
+
if (!atUnload || hiddenForMs > UNLOAD_VISIBILITY_GRACE_MS) return {};
|
|
254
|
+
} else if (!atUnload && !this.documentVisible()) {
|
|
255
|
+
return {};
|
|
256
|
+
}
|
|
257
|
+
const elapsed = Math.round(this.nowMs() - intent.startedAtMs);
|
|
258
|
+
return Number.isFinite(elapsed) && elapsed >= 0 ? {
|
|
259
|
+
timing: elapsed
|
|
260
|
+
} : {};
|
|
261
|
+
}
|
|
262
|
+
emit(intent, extra, fireAndForget) {
|
|
263
|
+
if (fireAndForget === void 0) fireAndForget = false;
|
|
264
|
+
// Marked here rather than at each call site: this is the one place a terminal
|
|
265
|
+
// outcome leaves the tracker, and lines without an `outcome` facet (the
|
|
266
|
+
// timing-only `intent_to_booker_shown`) must not claim the intent.
|
|
267
|
+
if (extra.outcome) this.markResolved(intent.intentId);
|
|
268
|
+
this.log(_extends({
|
|
269
|
+
type: "log",
|
|
270
|
+
message: "booker_intent",
|
|
271
|
+
extra: _extends({}, this.surface ? {
|
|
272
|
+
surface: this.surface
|
|
273
|
+
} : {}, {
|
|
274
|
+
pathway_origin: intent.pathwayOrigin,
|
|
275
|
+
conversation_type: intent.conversationType
|
|
276
|
+
}, intent.botApiName ? {
|
|
277
|
+
bot_api_name: intent.botApiName
|
|
278
|
+
} : {}, intent.scriptId ? {
|
|
279
|
+
script_id: intent.scriptId
|
|
280
|
+
} : {}, intent.calendarEventTypeId ? {
|
|
281
|
+
calendar_event_type_id: intent.calendarEventTypeId
|
|
282
|
+
} : {}, extra)
|
|
283
|
+
}, fireAndForget ? {
|
|
284
|
+
fireAndForget: true
|
|
285
|
+
} : {}));
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Records that this intent has reported a terminal outcome, so a later page in
|
|
289
|
+
* the same tab does not report a second one.
|
|
290
|
+
*
|
|
291
|
+
* Storage can be unavailable — third-party-cookie blocking and some embeds throw
|
|
292
|
+
* on access. Failing silently degrades to the previous behaviour (a reload
|
|
293
|
+
* mid-wait may double-count) rather than breaking the booker, which is the right
|
|
294
|
+
* trade for instrumentation.
|
|
295
|
+
*/ markResolved(intentId) {
|
|
296
|
+
try {
|
|
297
|
+
window.sessionStorage.setItem("" + RESOLVED_INTENT_KEY_PREFIX + intentId, "1");
|
|
298
|
+
} catch (unused) {
|
|
299
|
+
// Intentionally swallowed — see above.
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
alreadyResolved(intentId) {
|
|
303
|
+
try {
|
|
304
|
+
return window.sessionStorage.getItem("" + RESOLVED_INTENT_KEY_PREFIX + intentId) !== null;
|
|
305
|
+
} catch (unused) {
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
nowMs() {
|
|
310
|
+
return typeof performance !== "undefined" ? performance.now() : 0;
|
|
311
|
+
}
|
|
312
|
+
documentVisible() {
|
|
313
|
+
if (typeof document === "undefined") return true;
|
|
314
|
+
return document.visibilityState === "visible";
|
|
315
|
+
}
|
|
316
|
+
teardown() {
|
|
317
|
+
if (typeof window !== "undefined") {
|
|
318
|
+
__nativeWindowRemoveEventListener("pagehide", this.handlePagehide);
|
|
319
|
+
}
|
|
320
|
+
if (typeof document !== "undefined") {
|
|
321
|
+
__nativeDocumentRemoveEventListener("visibilitychange", this.handleVisibilityChange);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
// This tracker is pure observability; a fault here must never disrupt the
|
|
325
|
+
// booker it instruments. Every public entry point and event handler runs
|
|
326
|
+
// through this guard, so a broken transport (or an exotic browser API) drops
|
|
327
|
+
// one SLI datapoint instead of throwing into the conversation's message path.
|
|
328
|
+
safely(fn) {
|
|
329
|
+
try {
|
|
330
|
+
fn();
|
|
331
|
+
} catch (unused) {
|
|
332
|
+
// Intentionally swallowed: losing a datapoint is strictly preferable to
|
|
333
|
+
// breaking the meeting booker.
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
constructor({ surface, log }){
|
|
337
|
+
this.intent = null;
|
|
338
|
+
// Abandonment rides on `pagehide` (fires reliably on tab close, navigation,
|
|
339
|
+
// refresh) but skips bfcache transitions (`persisted`) — the page can be
|
|
340
|
+
// restored, so the visitor has not left. `visibilitychange:hidden` is
|
|
341
|
+
// deliberately not used as the trigger; it fires on plain tab switches too.
|
|
342
|
+
this.handlePagehide = (event)=>{
|
|
343
|
+
this.safely(()=>{
|
|
344
|
+
if (event.persisted) return;
|
|
345
|
+
const { intent } = this;
|
|
346
|
+
if (!intent || intent.outcomeEmitted) return;
|
|
347
|
+
// Once the offer exists, leaving is `booker_outcome`'s `abandoned`.
|
|
348
|
+
// Emitting here as well would count one visitor in two SLIs.
|
|
349
|
+
// A hydrated intent never reports abandonment at all (see `fromHistory`).
|
|
350
|
+
if (intent.fromHistory) return;
|
|
351
|
+
intent.outcomeEmitted = true;
|
|
352
|
+
const timing = this.timing(intent, {
|
|
353
|
+
atUnload: true
|
|
354
|
+
});
|
|
355
|
+
// Release before emitting, as in `markShown`.
|
|
356
|
+
this.teardown();
|
|
357
|
+
this.intent = null;
|
|
358
|
+
this.emit(intent, _extends({
|
|
359
|
+
meeting_stage: BOOKER_INTENT_MEETING_STAGE,
|
|
360
|
+
outcome: BOOKER_INTENT_OUTCOME.ABANDONED_PRE_OFFER
|
|
361
|
+
}, timing), // Fires during page teardown; cannot wait for a response.
|
|
362
|
+
true);
|
|
363
|
+
});
|
|
364
|
+
};
|
|
365
|
+
/**
|
|
366
|
+
* Records backgrounding, but only counts it against the timing once the tab
|
|
367
|
+
* comes *back*. A tab that goes hidden and never returns is either the unload
|
|
368
|
+
* sequence (harmless, handled by the grace window) or a background interval
|
|
369
|
+
* that `timing` catches via `hiddenAtMs`.
|
|
370
|
+
*/ this.handleVisibilityChange = ()=>{
|
|
371
|
+
this.safely(()=>{
|
|
372
|
+
const { intent } = this;
|
|
373
|
+
if (!intent) return;
|
|
374
|
+
if (this.documentVisible()) {
|
|
375
|
+
if (intent.hiddenAtMs !== undefined) intent.wasEverHidden = true;
|
|
376
|
+
intent.hiddenAtMs = undefined;
|
|
377
|
+
} else {
|
|
378
|
+
intent.hiddenAtMs = this.nowMs();
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
};
|
|
382
|
+
this.surface = surface;
|
|
383
|
+
this.log = log;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
var booker_intent_tracker_BOOKER_INTENT_MEETING_STAGE = /* unused export */ undefined;
|
|
388
|
+
var booker_intent_tracker_BOOKER_INTENT_OUTCOME = /* unused export */ undefined;
|
|
389
|
+
var booker_intent_tracker_INTENT_TO_BOOKER_SHOWN_MEETING_STAGE = /* unused export */ undefined;
|
|
390
|
+
var booker_intent_tracker_INTENT_TO_QUALIFICATION_RECEIVED_MEETING_STAGE = /* unused export */ undefined;
|
|
391
|
+
export { BookerIntentTracker, booker_intent_tracker_BOOKER_INTENT_MEETING_STAGE as BOOKER_INTENT_MEETING_STAGE, booker_intent_tracker_BOOKER_INTENT_OUTCOME as BOOKER_INTENT_OUTCOME, booker_intent_tracker_INTENT_TO_BOOKER_SHOWN_MEETING_STAGE as INTENT_TO_BOOKER_SHOWN_MEETING_STAGE, booker_intent_tracker_INTENT_TO_QUALIFICATION_RECEIVED_MEETING_STAGE as INTENT_TO_QUALIFICATION_RECEIVED_MEETING_STAGE };
|