@wildo-ai/saas-frontend-lib 1.1.5 → 1.1.6
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/esm/components/actions/action-bar.d.ts +15 -0
- package/dist/esm/components/actions/action-bar.d.ts.map +1 -1
- package/dist/esm/components/actions/action-bar.js +15 -0
- package/dist/esm/components/actions/action-bar.js.map +1 -1
- package/dist/esm/components/ai-elements/decision/approval.d.ts +97 -7
- package/dist/esm/components/ai-elements/decision/approval.d.ts.map +1 -1
- package/dist/esm/components/ai-elements/decision/approval.js.map +1 -1
- package/dist/esm/components/app/AppLayout_AuthenticatedRoute.d.ts.map +1 -1
- package/dist/esm/components/app/AppLayout_AuthenticatedRoute.js +8 -3
- package/dist/esm/components/app/AppLayout_AuthenticatedRoute.js.map +1 -1
- package/dist/esm/components/auth/Auth_EnrollmentRequired.d.ts.map +1 -1
- package/dist/esm/components/auth/Auth_EnrollmentRequired.js +5 -1
- package/dist/esm/components/auth/Auth_EnrollmentRequired.js.map +1 -1
- package/dist/esm/components/auth/Auth_Main.d.ts.map +1 -1
- package/dist/esm/components/auth/Auth_Main.js +1 -4
- package/dist/esm/components/auth/Auth_Main.js.map +1 -1
- package/dist/esm/components/auth/Auth_Register.d.ts.map +1 -1
- package/dist/esm/components/auth/Auth_Register.js +1 -3
- package/dist/esm/components/auth/Auth_Register.js.map +1 -1
- package/dist/esm/components/auth/StepUpAuthDialog.d.ts +7 -0
- package/dist/esm/components/auth/StepUpAuthDialog.d.ts.map +1 -1
- package/dist/esm/components/auth/StepUpAuthDialog.js +13 -7
- package/dist/esm/components/auth/StepUpAuthDialog.js.map +1 -1
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.d.ts.map +1 -1
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.js +32 -33
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.js.map +1 -1
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.d.ts.map +1 -1
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.js +18 -20
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.js.map +1 -1
- package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.d.ts.map +1 -1
- package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.js +2 -3
- package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.js.map +1 -1
- package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.d.ts +13 -16
- package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.d.ts.map +1 -1
- package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.js +18 -15
- package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.js.map +1 -1
- package/dist/esm/components/billing/billing-invoice-history.js +2 -2
- package/dist/esm/components/billing/billing-invoice-history.js.map +1 -1
- package/dist/esm/components/billing/billing-portal-link.js +2 -2
- package/dist/esm/components/billing/billing-portal-link.js.map +1 -1
- package/dist/esm/components/billing/billing-pricing-table.d.ts +33 -1
- package/dist/esm/components/billing/billing-pricing-table.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-pricing-table.js +34 -5
- package/dist/esm/components/billing/billing-pricing-table.js.map +1 -1
- package/dist/esm/components/billing/billing-subscription-status.js +2 -2
- package/dist/esm/components/billing/billing-subscription-status.js.map +1 -1
- package/dist/esm/components/billing/billing-usage-dashboard.d.ts +2 -0
- package/dist/esm/components/billing/billing-usage-dashboard.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-usage-dashboard.js +1 -0
- package/dist/esm/components/billing/billing-usage-dashboard.js.map +1 -1
- package/dist/esm/components/data-display/DisplayField.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayField.js +15 -1
- package/dist/esm/components/data-display/DisplayField.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldArray.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldArray.js +11 -0
- package/dist/esm/components/data-display/DisplayFieldArray.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldEditable.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldEditable.js +2 -2
- package/dist/esm/components/data-display/DisplayFieldEditable.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldEditableArray.d.ts +12 -2
- package/dist/esm/components/data-display/DisplayFieldEditableArray.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldEditableArray.js +3 -2
- package/dist/esm/components/data-display/DisplayFieldEditableArray.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldReadOnly.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldReadOnly.js +2 -2
- package/dist/esm/components/data-display/DisplayFieldReadOnly.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.js +8 -2
- package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.js.map +1 -1
- package/dist/esm/components/data-display/DisplayValueDispatcher.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayValueDispatcher.js +18 -4
- package/dist/esm/components/data-display/DisplayValueDispatcher.js.map +1 -1
- package/dist/esm/components/data-display/ResourceAutomaticDisplayer.d.ts.map +1 -1
- package/dist/esm/components/data-display/ResourceAutomaticDisplayer.js +61 -3
- package/dist/esm/components/data-display/ResourceAutomaticDisplayer.js.map +1 -1
- package/dist/esm/components/data-display/ResourceSummaryDisplayer.d.ts +7 -5
- package/dist/esm/components/data-display/ResourceSummaryDisplayer.d.ts.map +1 -1
- package/dist/esm/components/data-display/ResourceSummaryDisplayer.js.map +1 -1
- package/dist/esm/components/data-display/chromes/DisplayFieldChrome.d.ts +11 -1
- package/dist/esm/components/data-display/chromes/DisplayFieldChrome.d.ts.map +1 -1
- package/dist/esm/components/data-display/chromes/DisplayFieldChrome.js +36 -11
- package/dist/esm/components/data-display/chromes/DisplayFieldChrome.js.map +1 -1
- package/dist/esm/components/data-display/display-field-resolved-props.d.ts +6 -0
- package/dist/esm/components/data-display/display-field-resolved-props.d.ts.map +1 -1
- package/dist/esm/components/data-display/display-field-resolved-props.js.map +1 -1
- package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.d.ts +23 -0
- package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.d.ts.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.js +35 -0
- package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.js.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.d.ts +47 -0
- package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.d.ts.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.js +124 -0
- package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.js.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.d.ts +8 -0
- package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.d.ts.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.js +46 -0
- package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.js.map +1 -0
- package/dist/esm/components/feedback/resource-empty-state.d.ts +21 -8
- package/dist/esm/components/feedback/resource-empty-state.d.ts.map +1 -1
- package/dist/esm/components/feedback/resource-empty-state.js +56 -26
- package/dist/esm/components/feedback/resource-empty-state.js.map +1 -1
- package/dist/esm/components/flows-actors/approval.d.ts +29 -7
- package/dist/esm/components/flows-actors/approval.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/approval.js +231 -101
- package/dist/esm/components/flows-actors/approval.js.map +1 -1
- package/dist/esm/components/flows-actors/approval.labels.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/approval.labels.js +57 -0
- package/dist/esm/components/flows-actors/approval.labels.js.map +1 -1
- package/dist/esm/components/flows-actors/system-catalog.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/system-catalog.js +4 -4
- package/dist/esm/components/flows-actors/system-catalog.js.map +1 -1
- package/dist/esm/components/flows-actors/system-catalog.labels.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/system-catalog.labels.js +0 -5
- package/dist/esm/components/flows-actors/system-catalog.labels.js.map +1 -1
- package/dist/esm/components/form/Form.d.ts +2 -2
- package/dist/esm/components/form/Form.js +2 -2
- package/dist/esm/components/form/Form.js.map +1 -1
- package/dist/esm/components/form/automated/AutomatedArrayField.d.ts +28 -3
- package/dist/esm/components/form/automated/AutomatedArrayField.d.ts.map +1 -1
- package/dist/esm/components/form/automated/AutomatedArrayField.js +43 -14
- package/dist/esm/components/form/automated/AutomatedArrayField.js.map +1 -1
- package/dist/esm/components/form/automated/FormField.d.ts +3 -0
- package/dist/esm/components/form/automated/FormField.d.ts.map +1 -1
- package/dist/esm/components/form/automated/FormField.js +60 -21
- package/dist/esm/components/form/automated/FormField.js.map +1 -1
- package/dist/esm/components/form/automated/FormFieldArray.d.ts +6 -3
- package/dist/esm/components/form/automated/FormFieldArray.d.ts.map +1 -1
- package/dist/esm/components/form/automated/FormFieldArray.js +3 -2
- package/dist/esm/components/form/automated/FormFieldArray.js.map +1 -1
- package/dist/esm/components/form/automated/ResourceAutomatedForm.d.ts +5 -4
- package/dist/esm/components/form/automated/ResourceAutomatedForm.d.ts.map +1 -1
- package/dist/esm/components/form/automated/ResourceAutomatedForm.js +148 -55
- package/dist/esm/components/form/automated/ResourceAutomatedForm.js.map +1 -1
- package/dist/esm/components/form/automated/ResourceFormActionsContext.d.ts +30 -0
- package/dist/esm/components/form/automated/ResourceFormActionsContext.d.ts.map +1 -1
- package/dist/esm/components/form/automated/ResourceFormActionsContext.js +30 -1
- package/dist/esm/components/form/automated/ResourceFormActionsContext.js.map +1 -1
- package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.d.ts +79 -0
- package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.d.ts.map +1 -0
- package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.js +203 -0
- package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.js.map +1 -0
- package/dist/esm/components/form/automated/automated-form-submit.utils.d.ts +12 -0
- package/dist/esm/components/form/automated/automated-form-submit.utils.d.ts.map +1 -1
- package/dist/esm/components/form/automated/automated-form-submit.utils.js +11 -0
- package/dist/esm/components/form/automated/automated-form-submit.utils.js.map +1 -1
- package/dist/esm/components/form/chromes/FormFieldChrome.d.ts.map +1 -1
- package/dist/esm/components/form/chromes/FormFieldChrome.js +2 -2
- package/dist/esm/components/form/chromes/FormFieldChrome.js.map +1 -1
- package/dist/esm/components/form/combobox.d.ts +7 -0
- package/dist/esm/components/form/combobox.d.ts.map +1 -1
- package/dist/esm/components/form/combobox.js.map +1 -1
- package/dist/esm/components/form/controls/form-field-checkbox-group.d.ts.map +1 -1
- package/dist/esm/components/form/controls/form-field-checkbox-group.js +13 -0
- package/dist/esm/components/form/controls/form-field-checkbox-group.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-address.d.ts +58 -0
- package/dist/esm/components/form/fields/form-field-address.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-address.js +34 -6
- package/dist/esm/components/form/fields/form-field-address.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-address.labels.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-address.labels.js +60 -1
- package/dist/esm/components/form/fields/form-field-address.labels.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.d.ts +0 -12
- package/dist/esm/components/form/fields/form-field-file.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.js +34 -13
- package/dist/esm/components/form/fields/form-field-file.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.labels.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.labels.js +46 -0
- package/dist/esm/components/form/fields/form-field-file.labels.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-string-organization-role.d.ts +73 -0
- package/dist/esm/components/form/fields/form-field-string-organization-role.d.ts.map +1 -0
- package/dist/esm/components/form/fields/form-field-string-organization-role.js +64 -0
- package/dist/esm/components/form/fields/form-field-string-organization-role.js.map +1 -0
- package/dist/esm/components/form/fields/form-field-string.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-string.js +8 -1
- package/dist/esm/components/form/fields/form-field-string.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-string.labels.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-string.labels.js +4 -0
- package/dist/esm/components/form/fields/form-field-string.labels.js.map +1 -1
- package/dist/esm/components/form/validation-errors/FormErrorSummary.js +1 -1
- package/dist/esm/components/form/validation-errors/FormErrorSummary.js.map +1 -1
- package/dist/esm/components/form/validation-errors/resolver-error-nesting.d.ts +31 -0
- package/dist/esm/components/form/validation-errors/resolver-error-nesting.d.ts.map +1 -0
- package/dist/esm/components/form/validation-errors/resolver-error-nesting.js +81 -0
- package/dist/esm/components/form/validation-errors/resolver-error-nesting.js.map +1 -0
- package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.d.ts +14 -1
- package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.d.ts.map +1 -1
- package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.js +14 -0
- package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.js.map +1 -1
- package/dist/esm/components/form/validation-errors/zod-issue-resolver.d.ts +22 -0
- package/dist/esm/components/form/validation-errors/zod-issue-resolver.d.ts.map +1 -1
- package/dist/esm/components/form/validation-errors/zod-issue-resolver.js +1 -22
- package/dist/esm/components/form/validation-errors/zod-issue-resolver.js.map +1 -1
- package/dist/esm/components/layout/resizable.d.ts +11 -0
- package/dist/esm/components/layout/resizable.d.ts.map +1 -1
- package/dist/esm/components/layout/resizable.js.map +1 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.d.ts +11 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.js +15 -3
- package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.js.map +1 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.d.ts +2 -2
- package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.js.map +1 -1
- package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.d.ts +2 -2
- package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.js +2 -2
- package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.js.map +1 -1
- package/dist/esm/components/navigation/app-level/SidebarResourceBrowser.js +18 -20
- package/dist/esm/components/navigation/app-level/SidebarResourceBrowser.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.js +7 -1
- package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useMenuBarBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useMenuBarBehavior.js +4 -1
- package/dist/esm/components/navigation/app-level/useMenuBarBehavior.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.js +18 -2
- package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useSidebarBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useSidebarBehavior.js +82 -10
- package/dist/esm/components/navigation/app-level/useSidebarBehavior.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useStatusBarBehavior.d.ts +2 -2
- package/dist/esm/components/navigation/app-level/useStatusBarBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useStatusBarBehavior.js.map +1 -1
- package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.js +8 -1
- package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.js.map +1 -1
- package/dist/esm/components/resources/ResourceCollectionToolbar.d.ts +8 -2
- package/dist/esm/components/resources/ResourceCollectionToolbar.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceCollectionToolbar.js +6 -2
- package/dist/esm/components/resources/ResourceCollectionToolbar.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Breadcrumb.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Breadcrumb.js +31 -16
- package/dist/esm/components/resources/ResourceLayout_Breadcrumb.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.js +23 -8
- package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ContainerNested.js +2 -2
- package/dist/esm/components/resources/ResourceLayout_ContainerNested.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Header.d.ts +13 -0
- package/dist/esm/components/resources/ResourceLayout_Header.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Header.js +55 -28
- package/dist/esm/components/resources/ResourceLayout_Header.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_List.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_List.js +41 -20
- package/dist/esm/components/resources/ResourceLayout_List.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_List.labels.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_List.labels.js +1 -2
- package/dist/esm/components/resources/ResourceLayout_List.labels.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Read.d.ts +9 -4
- package/dist/esm/components/resources/ResourceLayout_Read.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Read.js +30 -11
- package/dist/esm/components/resources/ResourceLayout_Read.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ReadSummary.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ReadSummary.js +4 -2
- package/dist/esm/components/resources/ResourceLayout_ReadSummary.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.js +6 -2
- package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Search.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Search.js +30 -14
- package/dist/esm/components/resources/ResourceLayout_Search.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.js +14 -198
- package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Update.d.ts +2 -2
- package/dist/esm/components/resources/ResourceLayout_Update.js +2 -2
- package/dist/esm/components/resources/ResourceLayout_Update.js.map +1 -1
- package/dist/esm/components/resources/ResourceListItemRenderer.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceListItemRenderer.js +69 -39
- package/dist/esm/components/resources/ResourceListItemRenderer.js.map +1 -1
- package/dist/esm/components/resources/ResourceOperationActionDropdown.d.ts +32 -0
- package/dist/esm/components/resources/ResourceOperationActionDropdown.d.ts.map +1 -0
- package/dist/esm/components/resources/ResourceOperationActionDropdown.js +130 -0
- package/dist/esm/components/resources/ResourceOperationActionDropdown.js.map +1 -0
- package/dist/esm/components/resources/collection-create-placement.utils.d.ts +32 -0
- package/dist/esm/components/resources/collection-create-placement.utils.d.ts.map +1 -0
- package/dist/esm/components/resources/collection-create-placement.utils.js +37 -0
- package/dist/esm/components/resources/collection-create-placement.utils.js.map +1 -0
- package/dist/esm/components/resources/embeds/RelatedResourcePreview.d.ts.map +1 -1
- package/dist/esm/components/resources/embeds/RelatedResourcePreview.js +5 -1
- package/dist/esm/components/resources/embeds/RelatedResourcePreview.js.map +1 -1
- package/dist/esm/components/resources/embeds/RelatedResourceSections.d.ts +8 -1
- package/dist/esm/components/resources/embeds/RelatedResourceSections.d.ts.map +1 -1
- package/dist/esm/components/resources/embeds/RelatedResourceSections.js +49 -2
- package/dist/esm/components/resources/embeds/RelatedResourceSections.js.map +1 -1
- package/dist/esm/components/resources/embeds/ResourceEmbeds.d.ts +22 -0
- package/dist/esm/components/resources/embeds/ResourceEmbeds.d.ts.map +1 -1
- package/dist/esm/components/resources/embeds/ResourceEmbeds.js +85 -2
- package/dist/esm/components/resources/embeds/ResourceEmbeds.js.map +1 -1
- package/dist/esm/components/resources/resourceLayout.utils.d.ts +14 -0
- package/dist/esm/components/resources/resourceLayout.utils.d.ts.map +1 -1
- package/dist/esm/components/resources/resourceLayout.utils.js +22 -0
- package/dist/esm/components/resources/resourceLayout.utils.js.map +1 -1
- package/dist/esm/components/resources/skeleton/ArrayField.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/ArrayField.js +3 -0
- package/dist/esm/components/resources/skeleton/ArrayField.js.map +1 -1
- package/dist/esm/components/resources/skeleton/FormLayout.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/FormLayout.js +33 -1
- package/dist/esm/components/resources/skeleton/FormLayout.js.map +1 -1
- package/dist/esm/components/resources/skeleton/ObjectScope.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/ObjectScope.js +3 -0
- package/dist/esm/components/resources/skeleton/ObjectScope.js.map +1 -1
- package/dist/esm/components/resources/skeleton/Section.d.ts +12 -0
- package/dist/esm/components/resources/skeleton/Section.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/Section.js +28 -2
- package/dist/esm/components/resources/skeleton/Section.js.map +1 -1
- package/dist/esm/components/resources/skeleton/SectionFieldsContext.d.ts +70 -0
- package/dist/esm/components/resources/skeleton/SectionFieldsContext.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/SectionFieldsContext.js +157 -1
- package/dist/esm/components/resources/skeleton/SectionFieldsContext.js.map +1 -1
- package/dist/esm/components/resources/skeleton/WizardLayout.d.ts +6 -0
- package/dist/esm/components/resources/skeleton/WizardLayout.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/WizardLayout.js +13 -2
- package/dist/esm/components/resources/skeleton/WizardLayout.js.map +1 -1
- package/dist/esm/components/resources/skeleton/WizardStep.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/WizardStep.js +2 -1
- package/dist/esm/components/resources/skeleton/WizardStep.js.map +1 -1
- package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.d.ts.map +1 -1
- package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.js +61 -15
- package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.js.map +1 -1
- package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.d.ts +24 -2
- package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.d.ts.map +1 -1
- package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.js +69 -1
- package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.js.map +1 -1
- package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.d.ts.map +1 -1
- package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.js +18 -19
- package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.js.map +1 -1
- package/dist/esm/components/sections/ContentSectionContainer.d.ts.map +1 -1
- package/dist/esm/components/sections/ContentSectionContainer.js +5 -4
- package/dist/esm/components/sections/ContentSectionContainer.js.map +1 -1
- package/dist/esm/components/sections/stepper.d.ts +5 -0
- package/dist/esm/components/sections/stepper.d.ts.map +1 -1
- package/dist/esm/components/sections/stepper.js.map +1 -1
- package/dist/esm/components/sections/surface.d.ts.map +1 -1
- package/dist/esm/components/sections/surface.js +12 -3
- package/dist/esm/components/sections/surface.js.map +1 -1
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.d.ts +43 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.d.ts.map +1 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.js +129 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.js.map +1 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.d.ts +3 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.d.ts.map +1 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.js +34 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.js.map +1 -0
- package/dist/esm/components/settings/AppPage_AppearanceSettings.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_AppearanceSettings.js +9 -11
- package/dist/esm/components/settings/AppPage_AppearanceSettings.js.map +1 -1
- package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.js +3 -2
- package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.js.map +1 -1
- package/dist/esm/components/settings/AppPage_BillingSettings.d.ts +4 -2
- package/dist/esm/components/settings/AppPage_BillingSettings.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_BillingSettings.js +21 -3
- package/dist/esm/components/settings/AppPage_BillingSettings.js.map +1 -1
- package/dist/esm/components/settings/AppPage_BillingSettings.labels.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_BillingSettings.labels.js +5 -10
- package/dist/esm/components/settings/AppPage_BillingSettings.labels.js.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.d.ts +58 -0
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.js +243 -40
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.js.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.js +67 -6
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.js.map +1 -1
- package/dist/esm/components/settings/AppPage_InvitationsSettings.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_InvitationsSettings.js +19 -11
- package/dist/esm/components/settings/AppPage_InvitationsSettings.js.map +1 -1
- package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.js +4 -2
- package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.js.map +1 -1
- package/dist/esm/components/settings/SettingsHub.d.ts.map +1 -1
- package/dist/esm/components/settings/SettingsHub.js +3 -0
- package/dist/esm/components/settings/SettingsHub.js.map +1 -1
- package/dist/esm/components/settings/SettingsResourceOperationPanel.d.ts.map +1 -1
- package/dist/esm/components/settings/SettingsResourceOperationPanel.js +16 -1
- package/dist/esm/components/settings/SettingsResourceOperationPanel.js.map +1 -1
- package/dist/esm/components/settings/useOwnerProviderConnections.d.ts +59 -0
- package/dist/esm/components/settings/useOwnerProviderConnections.d.ts.map +1 -0
- package/dist/esm/components/settings/useOwnerProviderConnections.js +136 -0
- package/dist/esm/components/settings/useOwnerProviderConnections.js.map +1 -0
- package/dist/esm/components/views/chart-view/chart-view.utils.d.ts +5 -0
- package/dist/esm/components/views/chart-view/chart-view.utils.d.ts.map +1 -1
- package/dist/esm/components/views/chart-view/chart-view.utils.js +5 -0
- package/dist/esm/components/views/chart-view/chart-view.utils.js.map +1 -1
- package/dist/esm/components/views/chart-view/useResourceChartData.d.ts +50 -0
- package/dist/esm/components/views/chart-view/useResourceChartData.d.ts.map +1 -0
- package/dist/esm/components/views/chart-view/useResourceChartData.js +72 -0
- package/dist/esm/components/views/chart-view/useResourceChartData.js.map +1 -0
- package/dist/esm/components/views/composite-view/CompositeLayout.d.ts.map +1 -1
- package/dist/esm/components/views/composite-view/CompositeLayout.js +2 -1
- package/dist/esm/components/views/composite-view/CompositeLayout.js.map +1 -1
- package/dist/esm/core/app-shell/AppShellBuildingBlocks.d.ts +86 -0
- package/dist/esm/core/app-shell/AppShellBuildingBlocks.d.ts.map +1 -0
- package/dist/esm/core/app-shell/AppShellBuildingBlocks.js +187 -0
- package/dist/esm/core/app-shell/AppShellBuildingBlocks.js.map +1 -0
- package/dist/esm/core/app-shell/PortalContainerContext.d.ts +5 -2
- package/dist/esm/core/app-shell/PortalContainerContext.d.ts.map +1 -1
- package/dist/esm/core/app-shell/PortalContainerContext.js +5 -2
- package/dist/esm/core/app-shell/PortalContainerContext.js.map +1 -1
- package/dist/esm/core/app-shell/app-shell.schemas.d.ts +18 -9
- package/dist/esm/core/app-shell/app-shell.schemas.d.ts.map +1 -1
- package/dist/esm/core/app-shell/app-shell.schemas.js +1 -0
- package/dist/esm/core/app-shell/app-shell.schemas.js.map +1 -1
- package/dist/esm/core/app-shell/useAppShellLayout.d.ts +10 -0
- package/dist/esm/core/app-shell/useAppShellLayout.d.ts.map +1 -1
- package/dist/esm/core/app-shell/useAppShellLayout.js +28 -5
- package/dist/esm/core/app-shell/useAppShellLayout.js.map +1 -1
- package/dist/esm/core/app-shell/usePublicShellLayout.d.ts.map +1 -1
- package/dist/esm/core/app-shell/usePublicShellLayout.js +38 -0
- package/dist/esm/core/app-shell/usePublicShellLayout.js.map +1 -1
- package/dist/esm/core/automated-layout/automated-layout.frontend.utils.d.ts +15 -1
- package/dist/esm/core/automated-layout/automated-layout.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/automated-layout/automated-layout.frontend.utils.js +47 -13
- package/dist/esm/core/automated-layout/automated-layout.frontend.utils.js.map +1 -1
- package/dist/esm/core/billing/BillingContext.d.ts +25 -2
- package/dist/esm/core/billing/BillingContext.d.ts.map +1 -1
- package/dist/esm/core/billing/BillingContext.js +16 -25
- package/dist/esm/core/billing/BillingContext.js.map +1 -1
- package/dist/esm/core/billing/billing-provider-display.frontend.utils.d.ts +11 -3
- package/dist/esm/core/billing/billing-provider-display.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/billing/billing-provider-display.frontend.utils.js +14 -8
- package/dist/esm/core/billing/billing-provider-display.frontend.utils.js.map +1 -1
- package/dist/esm/core/billing/useBillingPlanChange.d.ts.map +1 -1
- package/dist/esm/core/billing/useBillingPlanChange.js +2 -0
- package/dist/esm/core/billing/useBillingPlanChange.js.map +1 -1
- package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.d.ts.map +1 -1
- package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.js +1 -0
- package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.js.map +1 -1
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.d.ts +29 -229
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.js +29 -327
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.js.map +1 -1
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.d.ts +17 -27
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.d.ts.map +1 -1
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.js +28 -48
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.js.map +1 -1
- package/dist/esm/core/config/app-configuration-frontend.schemas.d.ts +21 -11
- package/dist/esm/core/config/app-configuration-frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/config/app-configuration-frontend.schemas.js +4 -4
- package/dist/esm/core/config/app-configuration-frontend.schemas.js.map +1 -1
- package/dist/esm/core/config/app-level-components.frontend.schemas.d.ts +17 -0
- package/dist/esm/core/config/app-level-components.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/config/app-level-components.frontend.schemas.js +17 -0
- package/dist/esm/core/config/app-level-components.frontend.schemas.js.map +1 -1
- package/dist/esm/core/config/chart-view.frontend.schemas.d.ts +10 -10
- package/dist/esm/core/config/engine-settings-destinations.d.ts.map +1 -1
- package/dist/esm/core/config/engine-settings-destinations.js +221 -6
- package/dist/esm/core/config/engine-settings-destinations.js.map +1 -1
- package/dist/esm/core/config/launcher-items.frontend.schemas.d.ts +8 -0
- package/dist/esm/core/config/launcher-items.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/config/launcher-items.frontend.schemas.js +1 -0
- package/dist/esm/core/config/launcher-items.frontend.schemas.js.map +1 -1
- package/dist/esm/core/config/settings-hub.frontend.schemas.d.ts +10 -1
- package/dist/esm/core/config/settings-hub.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/config/settings-hub.frontend.schemas.js +9 -0
- package/dist/esm/core/config/settings-hub.frontend.schemas.js.map +1 -1
- package/dist/esm/core/config/verify-launcher-content.d.ts.map +1 -1
- package/dist/esm/core/config/verify-launcher-content.js +30 -19
- package/dist/esm/core/config/verify-launcher-content.js.map +1 -1
- package/dist/esm/core/errors/ErrorContext.d.ts.map +1 -1
- package/dist/esm/core/errors/ErrorContext.js +9 -1
- package/dist/esm/core/errors/ErrorContext.js.map +1 -1
- package/dist/esm/core/errors/GlobalErrorHandler.d.ts.map +1 -1
- package/dist/esm/core/errors/GlobalErrorHandler.js +5 -4
- package/dist/esm/core/errors/GlobalErrorHandler.js.map +1 -1
- package/dist/esm/core/errors/RouterErrorBoundary.js +1 -1
- package/dist/esm/core/errors/RouterErrorBoundary.js.map +1 -1
- package/dist/esm/core/errors/errors-builder.frontend.services.d.ts +2 -2
- package/dist/esm/core/errors/errors-builder.frontend.services.d.ts.map +1 -1
- package/dist/esm/core/errors/errors-builder.frontend.services.js +4 -4
- package/dist/esm/core/errors/errors-builder.frontend.services.js.map +1 -1
- package/dist/esm/core/errors/user-facing-error-message.frontend.utils.js +1 -1
- package/dist/esm/core/errors/user-facing-error-message.frontend.utils.js.map +1 -1
- package/dist/esm/core/events/NotificationContext.d.ts.map +1 -1
- package/dist/esm/core/events/NotificationContext.js +23 -5
- package/dist/esm/core/events/NotificationContext.js.map +1 -1
- package/dist/esm/core/events/events.frontend.schemas.d.ts +110 -43
- package/dist/esm/core/events/events.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/events/events.frontend.schemas.js +89 -15
- package/dist/esm/core/events/events.frontend.schemas.js.map +1 -1
- package/dist/esm/core/execution/useExecutionParticipationRMM.d.ts +2 -0
- package/dist/esm/core/execution/useExecutionParticipationRMM.d.ts.map +1 -1
- package/dist/esm/core/execution/useExecutionParticipationRMM.js +2 -1
- package/dist/esm/core/execution/useExecutionParticipationRMM.js.map +1 -1
- package/dist/esm/core/execution/useExecutionResourceOperationSurface.d.ts +1 -1
- package/dist/esm/core/execution/useExecutionResourceOperationSurface.d.ts.map +1 -1
- package/dist/esm/core/execution/useExecutionResourceOperationSurface.js +5 -2
- package/dist/esm/core/execution/useExecutionResourceOperationSurface.js.map +1 -1
- package/dist/esm/core/external-providers/ConsentBasedProviderSdks.d.ts +63 -0
- package/dist/esm/core/external-providers/ConsentBasedProviderSdks.d.ts.map +1 -0
- package/dist/esm/core/external-providers/ConsentBasedProviderSdks.js +131 -0
- package/dist/esm/core/external-providers/ConsentBasedProviderSdks.js.map +1 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.d.ts +61 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.d.ts.map +1 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.js +178 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.js.map +1 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupHost.d.ts +52 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupHost.d.ts.map +1 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupHost.js +144 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupHost.js.map +1 -0
- package/dist/esm/core/external-providers/ProviderFilePickerHost.d.ts +22 -1
- package/dist/esm/core/external-providers/ProviderFilePickerHost.d.ts.map +1 -1
- package/dist/esm/core/external-providers/ProviderFilePickerHost.js +23 -3
- package/dist/esm/core/external-providers/ProviderFilePickerHost.js.map +1 -1
- package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.d.ts +55 -0
- package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.d.ts.map +1 -0
- package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.js +65 -0
- package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.js.map +1 -0
- package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.d.ts +63 -0
- package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.d.ts.map +1 -0
- package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.js +100 -0
- package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.js.map +1 -0
- package/dist/esm/core/flows-actors/FlowsActorsContext.d.ts +45 -7
- package/dist/esm/core/flows-actors/FlowsActorsContext.d.ts.map +1 -1
- package/dist/esm/core/flows-actors/FlowsActorsContext.js +112 -28
- package/dist/esm/core/flows-actors/FlowsActorsContext.js.map +1 -1
- package/dist/esm/core/flows-actors/usePendingDecisions.d.ts +32 -0
- package/dist/esm/core/flows-actors/usePendingDecisions.d.ts.map +1 -0
- package/dist/esm/core/flows-actors/usePendingDecisions.js +91 -0
- package/dist/esm/core/flows-actors/usePendingDecisions.js.map +1 -0
- package/dist/esm/core/guidance/GuidanceRenderer.d.ts.map +1 -1
- package/dist/esm/core/guidance/GuidanceRenderer.js +3 -2
- package/dist/esm/core/guidance/GuidanceRenderer.js.map +1 -1
- package/dist/esm/core/i18n/I18nContext.d.ts +22 -8
- package/dist/esm/core/i18n/I18nContext.d.ts.map +1 -1
- package/dist/esm/core/i18n/I18nContext.js +21 -9
- package/dist/esm/core/i18n/I18nContext.js.map +1 -1
- package/dist/esm/core/i18n/component-label-resolution.utils.d.ts +5 -3
- package/dist/esm/core/i18n/component-label-resolution.utils.d.ts.map +1 -1
- package/dist/esm/core/i18n/component-label-resolution.utils.js +5 -3
- package/dist/esm/core/i18n/component-label-resolution.utils.js.map +1 -1
- package/dist/esm/core/i18n/useI18n.d.ts +2 -1
- package/dist/esm/core/i18n/useI18n.d.ts.map +1 -1
- package/dist/esm/core/i18n/useI18n.js +2 -1
- package/dist/esm/core/i18n/useI18n.js.map +1 -1
- package/dist/esm/core/loading/LoadingContext.d.ts.map +1 -1
- package/dist/esm/core/loading/LoadingContext.js +7 -1
- package/dist/esm/core/loading/LoadingContext.js.map +1 -1
- package/dist/esm/core/loading/LoadingGate.d.ts.map +1 -1
- package/dist/esm/core/loading/LoadingGate.js +19 -1
- package/dist/esm/core/loading/LoadingGate.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/AnalyticsContext.d.ts +15 -2
- package/dist/esm/core/monitoring/analytics/AnalyticsContext.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/AnalyticsContext.js +183 -20
- package/dist/esm/core/monitoring/analytics/AnalyticsContext.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/AnalyticsEventBridge.js +2 -2
- package/dist/esm/core/monitoring/analytics/AnalyticsEventBridge.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.d.ts +7 -15
- package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.js +8 -26
- package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.d.ts +12 -3
- package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.js +3 -2
- package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.d.ts +42 -0
- package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.js +89 -5
- package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.d.ts +2 -0
- package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.js +2 -0
- package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.js.map +1 -1
- package/dist/esm/core/navigation/NavigationContentAreas.d.ts +78 -0
- package/dist/esm/core/navigation/NavigationContentAreas.d.ts.map +1 -1
- package/dist/esm/core/navigation/NavigationContentAreas.js +264 -16
- package/dist/esm/core/navigation/NavigationContentAreas.js.map +1 -1
- package/dist/esm/core/navigation/NavigationContext.d.ts +8 -0
- package/dist/esm/core/navigation/NavigationContext.d.ts.map +1 -1
- package/dist/esm/core/navigation/NavigationContext.js +137 -30
- package/dist/esm/core/navigation/NavigationContext.js.map +1 -1
- package/dist/esm/core/navigation/launcher-resolution.d.ts +2 -0
- package/dist/esm/core/navigation/launcher-resolution.d.ts.map +1 -1
- package/dist/esm/core/navigation/launcher-resolution.js +1 -0
- package/dist/esm/core/navigation/launcher-resolution.js.map +1 -1
- package/dist/esm/core/navigation/navigation-cascade.d.ts +46 -0
- package/dist/esm/core/navigation/navigation-cascade.d.ts.map +1 -0
- package/dist/esm/core/navigation/navigation-cascade.js +222 -0
- package/dist/esm/core/navigation/navigation-cascade.js.map +1 -0
- package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.js +21 -2
- package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.js.map +1 -1
- package/dist/esm/core/navigation/navigation-controller-internals.d.ts +71 -0
- package/dist/esm/core/navigation/navigation-controller-internals.d.ts.map +1 -0
- package/dist/esm/core/navigation/navigation-controller-internals.js +84 -0
- package/dist/esm/core/navigation/navigation-controller-internals.js.map +1 -0
- package/dist/esm/core/navigation/navigation-policy-resolver.service.d.ts +86 -2
- package/dist/esm/core/navigation/navigation-policy-resolver.service.d.ts.map +1 -1
- package/dist/esm/core/navigation/navigation-policy-resolver.service.js +242 -124
- package/dist/esm/core/navigation/navigation-policy-resolver.service.js.map +1 -1
- package/dist/esm/core/navigation/navigation.schemas.d.ts +170 -8
- package/dist/esm/core/navigation/navigation.schemas.d.ts.map +1 -1
- package/dist/esm/core/navigation/navigation.schemas.js +121 -2
- package/dist/esm/core/navigation/navigation.schemas.js.map +1 -1
- package/dist/esm/core/navigation/navigation.utils.d.ts +102 -6
- package/dist/esm/core/navigation/navigation.utils.d.ts.map +1 -1
- package/dist/esm/core/navigation/navigation.utils.js +283 -34
- package/dist/esm/core/navigation/navigation.utils.js.map +1 -1
- package/dist/esm/core/navigation/useIsStackEntryActive.d.ts +0 -10
- package/dist/esm/core/navigation/useIsStackEntryActive.d.ts.map +0 -1
- package/dist/esm/core/navigation/useIsStackEntryActive.js.map +0 -1
- package/dist/esm/core/navigation/useNavigationController.d.ts +28 -157
- package/dist/esm/core/navigation/useNavigationController.d.ts.map +1 -1
- package/dist/esm/core/navigation/useNavigationController.js +211 -1189
- package/dist/esm/core/navigation/useNavigationController.js.map +1 -1
- package/dist/esm/core/navigation/useNavigationRouterSync.d.ts +174 -0
- package/dist/esm/core/navigation/useNavigationRouterSync.d.ts.map +1 -0
- package/dist/esm/core/navigation/useNavigationRouterSync.js +977 -0
- package/dist/esm/core/navigation/useNavigationRouterSync.js.map +1 -0
- package/dist/esm/core/navigation/useOverlayTitle.d.ts +13 -1
- package/dist/esm/core/navigation/useOverlayTitle.d.ts.map +1 -1
- package/dist/esm/core/navigation/useOverlayTitle.js +15 -10
- package/dist/esm/core/navigation/useOverlayTitle.js.map +1 -1
- package/dist/esm/core/navigation/useResponsiveZoneMigration.d.ts +43 -0
- package/dist/esm/core/navigation/useResponsiveZoneMigration.d.ts.map +1 -0
- package/dist/esm/core/navigation/useResponsiveZoneMigration.js +44 -0
- package/dist/esm/core/navigation/useResponsiveZoneMigration.js.map +1 -0
- package/dist/esm/core/navigation/zone-collapse-migration.d.ts +83 -0
- package/dist/esm/core/navigation/zone-collapse-migration.d.ts.map +1 -0
- package/dist/esm/core/navigation/zone-collapse-migration.js +116 -0
- package/dist/esm/core/navigation/zone-collapse-migration.js.map +1 -0
- package/dist/esm/core/navigation/zone-collapse.d.ts +51 -0
- package/dist/esm/core/navigation/zone-collapse.d.ts.map +1 -0
- package/dist/esm/core/navigation/zone-collapse.js +59 -0
- package/dist/esm/core/navigation/zone-collapse.js.map +1 -0
- package/dist/esm/core/navigation/zone-emphasis.d.ts +3 -0
- package/dist/esm/core/navigation/zone-emphasis.d.ts.map +1 -1
- package/dist/esm/core/navigation/zone-emphasis.js +26 -4
- package/dist/esm/core/navigation/zone-emphasis.js.map +1 -1
- package/dist/esm/core/navigation/zone-visible-entry.d.ts +22 -0
- package/dist/esm/core/navigation/zone-visible-entry.d.ts.map +1 -1
- package/dist/esm/core/navigation/zone-visible-entry.js +25 -0
- package/dist/esm/core/navigation/zone-visible-entry.js.map +1 -1
- package/dist/esm/core/requests/websockets/WebSocketContext.d.ts.map +1 -1
- package/dist/esm/core/requests/websockets/WebSocketContext.js +53 -18
- package/dist/esm/core/requests/websockets/WebSocketContext.js.map +1 -1
- package/dist/esm/core/requests/websockets/WebSocketEventBridge.d.ts.map +1 -1
- package/dist/esm/core/requests/websockets/WebSocketEventBridge.js +3 -1
- package/dist/esm/core/requests/websockets/WebSocketEventBridge.js.map +1 -1
- package/dist/esm/core/requests/websockets/useNotificationBadges.d.ts +22 -0
- package/dist/esm/core/requests/websockets/useNotificationBadges.d.ts.map +1 -1
- package/dist/esm/core/requests/websockets/useNotificationBadges.js +72 -3
- package/dist/esm/core/requests/websockets/useNotificationBadges.js.map +1 -1
- package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.d.ts +28 -0
- package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.d.ts.map +1 -0
- package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.js +86 -0
- package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.js.map +1 -0
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.d.ts +38 -3
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.js +57 -2
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.js.map +1 -1
- package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.js +4 -2
- package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.js.map +1 -1
- package/dist/esm/core/requests/wildo-http-client.frontend.service.d.ts +30 -1
- package/dist/esm/core/requests/wildo-http-client.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/requests/wildo-http-client.frontend.service.js +47 -4
- package/dist/esm/core/requests/wildo-http-client.frontend.service.js.map +1 -1
- package/dist/esm/core/resources/ResourceRegistryContext.d.ts.map +1 -1
- package/dist/esm/core/resources/ResourceRegistryContext.js +22 -1
- package/dist/esm/core/resources/ResourceRegistryContext.js.map +1 -1
- package/dist/esm/core/resources/context-resource-identifiers.frontend.utils.js +1 -1
- package/dist/esm/core/resources/context-resource-identifiers.frontend.utils.js.map +1 -1
- package/dist/esm/core/resources/frontend-resource.utils.d.ts +22 -1
- package/dist/esm/core/resources/frontend-resource.utils.d.ts.map +1 -1
- package/dist/esm/core/resources/frontend-resource.utils.js +25 -2
- package/dist/esm/core/resources/frontend-resource.utils.js.map +1 -1
- package/dist/esm/core/resources/operation-semantics.frontend.utils.d.ts +113 -13
- package/dist/esm/core/resources/operation-semantics.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/resources/operation-semantics.frontend.utils.js +173 -20
- package/dist/esm/core/resources/operation-semantics.frontend.utils.js.map +1 -1
- package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.d.ts +11 -0
- package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.js +7 -0
- package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.js.map +1 -1
- package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.d.ts +3 -2
- package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.js +13 -5
- package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.js.map +1 -1
- package/dist/esm/core/resources/resources-repository.frontend.service.d.ts +6 -0
- package/dist/esm/core/resources/resources-repository.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/resources/resources-repository.frontend.service.js +90 -1
- package/dist/esm/core/resources/resources-repository.frontend.service.js.map +1 -1
- package/dist/esm/core/resources/resources.frontend.schemas.d.ts +139 -16
- package/dist/esm/core/resources/resources.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/resources/resources.frontend.schemas.js +110 -11
- package/dist/esm/core/resources/resources.frontend.schemas.js.map +1 -1
- package/dist/esm/core/resources/rmm/ResourceMutationManager.d.ts.map +1 -1
- package/dist/esm/core/resources/rmm/ResourceMutationManager.js +3 -1
- package/dist/esm/core/resources/rmm/ResourceMutationManager.js.map +1 -1
- package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.d.ts +10 -0
- package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.d.ts.map +1 -1
- package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.js +8 -0
- package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.js.map +1 -1
- package/dist/esm/core/resources/rmm/useResourceRMM.d.ts +7 -0
- package/dist/esm/core/resources/rmm/useResourceRMM.d.ts.map +1 -1
- package/dist/esm/core/resources/rmm/useResourceRMM.js +9 -2
- package/dist/esm/core/resources/rmm/useResourceRMM.js.map +1 -1
- package/dist/esm/core/resources/useOperationDirectExecution.d.ts +59 -0
- package/dist/esm/core/resources/useOperationDirectExecution.d.ts.map +1 -0
- package/dist/esm/core/resources/useOperationDirectExecution.js +278 -0
- package/dist/esm/core/resources/useOperationDirectExecution.js.map +1 -0
- package/dist/esm/core/resources/useResourceOperationActions.d.ts +1 -1
- package/dist/esm/core/resources/useResourceOperationActions.d.ts.map +1 -1
- package/dist/esm/core/resources/useResourceOperationActions.js +69 -22
- package/dist/esm/core/resources/useResourceOperationActions.js.map +1 -1
- package/dist/esm/core/resources/useResourceOperationSurface.d.ts +8 -6
- package/dist/esm/core/resources/useResourceOperationSurface.d.ts.map +1 -1
- package/dist/esm/core/resources/useResourceOperationSurface.js +3 -2
- package/dist/esm/core/resources/useResourceOperationSurface.js.map +1 -1
- package/dist/esm/core/runtime/AppRouter.d.ts.map +1 -1
- package/dist/esm/core/runtime/AppRouter.js +23 -2
- package/dist/esm/core/runtime/AppRouter.js.map +1 -1
- package/dist/esm/core/runtime/ApplicationContext.shared.d.ts +4 -2
- package/dist/esm/core/runtime/ApplicationContext.shared.d.ts.map +1 -1
- package/dist/esm/core/runtime/ApplicationContext.shared.js.map +1 -1
- package/dist/esm/core/runtime/ApplicationMainContext.d.ts +12 -2
- package/dist/esm/core/runtime/ApplicationMainContext.d.ts.map +1 -1
- package/dist/esm/core/runtime/ApplicationMainContext.js +5 -2
- package/dist/esm/core/runtime/ApplicationMainContext.js.map +1 -1
- package/dist/esm/core/runtime/domain-module.frontend.definitions.d.ts +25 -1
- package/dist/esm/core/runtime/domain-module.frontend.definitions.d.ts.map +1 -1
- package/dist/esm/core/runtime/domain-module.frontend.definitions.js +37 -1
- package/dist/esm/core/runtime/domain-module.frontend.definitions.js.map +1 -1
- package/dist/esm/core/runtime/start-application.frontend.service.d.ts +21 -2
- package/dist/esm/core/runtime/start-application.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/runtime/start-application.frontend.service.js +51 -4
- package/dist/esm/core/runtime/start-application.frontend.service.js.map +1 -1
- package/dist/esm/core/security/AuthSessionContext.d.ts +11 -0
- package/dist/esm/core/security/AuthSessionContext.d.ts.map +1 -1
- package/dist/esm/core/security/AuthSessionContext.js +70 -22
- package/dist/esm/core/security/AuthSessionContext.js.map +1 -1
- package/dist/esm/core/security/StepUpAuthContext.d.ts.map +1 -1
- package/dist/esm/core/security/StepUpAuthContext.js +10 -2
- package/dist/esm/core/security/StepUpAuthContext.js.map +1 -1
- package/dist/esm/core/security/UserOrgsContext.d.ts.map +1 -1
- package/dist/esm/core/security/UserOrgsContext.js +72 -8
- package/dist/esm/core/security/UserOrgsContext.js.map +1 -1
- package/dist/esm/core/security/route-organization-access.frontend.utils.d.ts +7 -0
- package/dist/esm/core/security/route-organization-access.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/security/route-organization-access.frontend.utils.js +8 -2
- package/dist/esm/core/security/route-organization-access.frontend.utils.js.map +1 -1
- package/dist/esm/core/security/useGrantedConsentPurposes.d.ts +30 -0
- package/dist/esm/core/security/useGrantedConsentPurposes.d.ts.map +1 -0
- package/dist/esm/core/security/useGrantedConsentPurposes.js +38 -0
- package/dist/esm/core/security/useGrantedConsentPurposes.js.map +1 -0
- package/dist/esm/core/ui/UIContext.d.ts.map +1 -1
- package/dist/esm/core/ui/UIContext.js +10 -6
- package/dist/esm/core/ui/UIContext.js.map +1 -1
- package/dist/esm/core/ui/color-conversion.utils.d.ts +20 -0
- package/dist/esm/core/ui/color-conversion.utils.d.ts.map +1 -1
- package/dist/esm/core/ui/color-conversion.utils.js +39 -5
- package/dist/esm/core/ui/color-conversion.utils.js.map +1 -1
- package/dist/esm/core/ui/themes/default.theme.d.ts.map +1 -1
- package/dist/esm/core/ui/themes/default.theme.js +22 -2
- package/dist/esm/core/ui/themes/default.theme.js.map +1 -1
- package/dist/esm/core/ui/ui.frontend.schemas.d.ts +6 -6
- package/dist/esm/core/ui/ui.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/ui/ui.frontend.schemas.js +3 -3
- package/dist/esm/core/ui/ui.frontend.schemas.js.map +1 -1
- package/dist/esm/index.d.ts +10 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +19 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/testing/app-shell-placement-coverage.d.ts +43 -0
- package/dist/esm/testing/app-shell-placement-coverage.d.ts.map +1 -0
- package/dist/esm/testing/app-shell-placement-coverage.js +114 -0
- package/dist/esm/testing/app-shell-placement-coverage.js.map +1 -0
- package/dist/esm/testing/mock-builders.d.ts.map +1 -1
- package/dist/esm/testing/mock-builders.js +5 -0
- package/dist/esm/testing/mock-builders.js.map +1 -1
- package/dist/esm/testing.d.ts +1 -0
- package/dist/esm/testing.d.ts.map +1 -1
- package/dist/esm/testing.js +1 -0
- package/dist/esm/testing.js.map +1 -1
- package/package.json +9 -7
- package/dist/esm/core/navigation/useIsStackEntryActive.js +0 -15
- package/dist/tsconfig.build.tsbuildinfo +0 -1
|
@@ -6,21 +6,40 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
6
6
|
* consent gating, and provider lifecycle management.
|
|
7
7
|
*/
|
|
8
8
|
import { createContext, useContext, useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
9
|
-
import { ConsentPurpose, CoreResourceType, hasGrantedConsentPurposes, normalizeConsentPurposes, ValueMomentRole, ValueMomentScope, AnalyticsTriggerSource, ANALYTICS_ACHIEVED_STORAGE_KEY_PREFIX } from '@wildo-ai/saas-models';
|
|
9
|
+
import { AnalyticsEventName, BUILTIN_PROVIDER_CAPABILITY, ConsentPurpose, CoreResourceType, hasGrantedConsentPurposes, normalizeConsentPurposes, ValueMomentRole, ValueMomentScope, AnalyticsTriggerSource, ANALYTICS_ACHIEVED_STORAGE_KEY_PREFIX } from '@wildo-ai/saas-models';
|
|
10
10
|
import { AnalyticsProviderRegistry } from './analytics-provider-registry.frontend.service.js';
|
|
11
11
|
import { ApplicationContext } from '../../../core/runtime/ApplicationContext.shared.js';
|
|
12
12
|
import { useEventBus } from '../../../core/events/useEventBus.js';
|
|
13
|
-
import { FrontendEvents } from '../../../core/events/events.frontend.schemas.js';
|
|
13
|
+
import { FrontendEvents, SessionEndReason, SessionEstablishment } from '../../../core/events/events.frontend.schemas.js';
|
|
14
14
|
import { getManualCallsHttpClient } from '../../../core/requests/wildo-http-client-manual-calls.frontend.service.js';
|
|
15
15
|
import { useResourceReachability } from '../../../core/resources/useResourceRegistry.js';
|
|
16
16
|
import { AnalyticsEventBridge } from './AnalyticsEventBridge.js';
|
|
17
|
+
import { isFrontendProductAnalyticsSink } from '@wildo-ai/saas-models/public-runtime';
|
|
18
|
+
import { useConsentBasedProviderActivations } from '../../../core/external-providers/ConsentBasedProviderSdks.js';
|
|
17
19
|
// ─── Context ────────────────────────────────────────────────────
|
|
18
20
|
// Note: useAnalytics hook is in a separate file (useAnalytics.ts) for React Fast Refresh compatibility.
|
|
19
21
|
export const AnalyticsContext = createContext(null);
|
|
20
22
|
export const AnalyticsIdentityPublisherContext = createContext(null);
|
|
21
23
|
// ─── Provider Registry (singleton) ──────────────────────────────
|
|
22
24
|
const providerRegistry = new AnalyticsProviderRegistry();
|
|
23
|
-
|
|
25
|
+
/** The event property carrying when a held sign-in happened, for destinations that stamp events themselves. */
|
|
26
|
+
const SIGNED_IN_AT_PROPERTY = 'signed_in_at';
|
|
27
|
+
/**
|
|
28
|
+
* Two kinds of destination, and only ONE of them is a vendor (#1704).
|
|
29
|
+
*
|
|
30
|
+
* - The ENGINE's own destinations (`console`, `backend_proxy`), selected by `analytics.providers`. They send
|
|
31
|
+
* nothing to a third party (the proxy posts to the application's own backend), and they keep the gate
|
|
32
|
+
* below: `analytics.enabled`, then `analytics.requiresConsent` / the ANALYTICS grant.
|
|
33
|
+
* - VENDORS (PostHog, …) arrive as `FRONTEND_PRODUCT_ANALYTICS` provider modules. They are started by the
|
|
34
|
+
* consent-based activation consumer once the person grants what they rest on, and stopped on withdrawal
|
|
35
|
+
* or sign-out; this context only dispatches to the sinks that are running. That replaced an
|
|
36
|
+
* `analyticsProviders` / `customProviders` door which let an application pass a vendor client here,
|
|
37
|
+
* behind a second consent gate and outside the CSP footprint — two gates for one decision.
|
|
38
|
+
*
|
|
39
|
+
* `analytics.enabled` stays the master switch for both: with it off, a `FRONTEND_PRODUCT_ANALYTICS` vendor is not
|
|
40
|
+
* even loaded (the consent-based consumer skips it), and any sink that is running receives nothing.
|
|
41
|
+
*/
|
|
42
|
+
export const AnalyticsContextProvider = ({ children, }) => {
|
|
24
43
|
const appContext = useContext(ApplicationContext);
|
|
25
44
|
const { on } = useEventBus();
|
|
26
45
|
// Whether this consumer serves the progression-backed analytics routes at all (#1069).
|
|
@@ -62,7 +81,17 @@ export const AnalyticsContextProvider = ({ children, customProviders, }) => {
|
|
|
62
81
|
* revoke: the old handler ignored it, so a signed-out browser kept the previous person's consent
|
|
63
82
|
* and analytics kept running for whoever used it next.
|
|
64
83
|
*/
|
|
84
|
+
/*
|
|
85
|
+
* A withdrawal drops what the destinations buffered, before the gate below shuts them down: their
|
|
86
|
+
* shutdown flushes, and events collected under the grant are not sent after it is withdrawn (#1977
|
|
87
|
+
* review). A sign-out already sent its person's buffer, under their consent, on `USER_LOGOUT`.
|
|
88
|
+
*/
|
|
89
|
+
const discardUnsent = () => {
|
|
90
|
+
if (requiresConsentRef.current)
|
|
91
|
+
providersRef.current.forEach(p => p.discard());
|
|
92
|
+
};
|
|
65
93
|
if (payload.privacy === null) {
|
|
94
|
+
discardUnsent();
|
|
66
95
|
setAccountPurposes([]);
|
|
67
96
|
return;
|
|
68
97
|
}
|
|
@@ -70,10 +99,24 @@ export const AnalyticsContextProvider = ({ children, customProviders, }) => {
|
|
|
70
99
|
// `undefined` means this event carried no privacy block; an EMPTY set is a real withdrawal and
|
|
71
100
|
// must reach the gate below, which is why this does not test truthiness.
|
|
72
101
|
if (purposes !== undefined) {
|
|
73
|
-
|
|
102
|
+
const granted = normalizeConsentPurposes(purposes);
|
|
103
|
+
if (!hasGrantedConsentPurposes(granted, [ConsentPurpose.ANALYTICS]))
|
|
104
|
+
discardUnsent();
|
|
105
|
+
setAccountPurposes(granted);
|
|
74
106
|
}
|
|
75
107
|
});
|
|
76
108
|
}, [on]);
|
|
109
|
+
/*
|
|
110
|
+
* The person `USER_LOGIN` announced, until `USER_LOGOUT` (#1977). Kept because the two arrive in the
|
|
111
|
+
* wrong order for the built-in destinations: `UserOrgsProvider` announces the person once their
|
|
112
|
+
* context has loaded, which is also when their preferences — and so their ANALYTICS grant — arrive,
|
|
113
|
+
* and the destinations below are initialised asynchronously after that grant. An identify sent only
|
|
114
|
+
* when the event fires would reach no destination, so each one is identified again as it starts.
|
|
115
|
+
*/
|
|
116
|
+
const signedInUserIdRef = useRef(null);
|
|
117
|
+
const [builtInsStartedVersion, setBuiltInsStartedVersion] = useState(0);
|
|
118
|
+
/** The latest `track`, for the departure listener, which must send while the grant still holds. */
|
|
119
|
+
const lifecycleTrackRef = useRef(() => { });
|
|
77
120
|
// Initialize/teardown providers based on config + consent
|
|
78
121
|
useEffect(() => {
|
|
79
122
|
if (!analyticsConfig?.enabled) {
|
|
@@ -90,33 +133,109 @@ export const AnalyticsContextProvider = ({ children, customProviders, }) => {
|
|
|
90
133
|
let aborted = false;
|
|
91
134
|
const httpClient = getManualCallsHttpClient();
|
|
92
135
|
const builtInProviders = providerRegistry.resolveFromConfig(analyticsConfig.providers ?? [], httpClient);
|
|
93
|
-
const allProviders = [...builtInProviders
|
|
136
|
+
const allProviders = [...builtInProviders];
|
|
94
137
|
Promise.all(allProviders.map(p => p.initialize(analyticsConfig.providers?.find(c => c.providerType === p.name)?.config).catch(err => {
|
|
95
138
|
console.warn(`[Analytics] Failed to initialize provider "${p.name}":`, err);
|
|
96
139
|
}))).then(() => {
|
|
97
140
|
if (aborted)
|
|
98
141
|
return;
|
|
99
142
|
providersRef.current = allProviders;
|
|
143
|
+
const signedInUserId = signedInUserIdRef.current;
|
|
144
|
+
if (signedInUserId !== null)
|
|
145
|
+
allProviders.forEach(p => p.identify({ userId: signedInUserId }));
|
|
100
146
|
setIsActive(true);
|
|
147
|
+
// `isActive` may already be true (a re-initialisation on a changed grant), so this is what tells a
|
|
148
|
+
// held sign-in that a fresh set of destinations has started.
|
|
149
|
+
setBuiltInsStartedVersion(version => version + 1);
|
|
101
150
|
});
|
|
102
151
|
return () => {
|
|
103
152
|
aborted = true;
|
|
104
153
|
allProviders.forEach(p => p.shutdown().catch(() => { }));
|
|
105
154
|
providersRef.current = [];
|
|
106
155
|
};
|
|
107
|
-
}, [analyticsConfig, grantedPurposes
|
|
108
|
-
//
|
|
156
|
+
}, [analyticsConfig, grantedPurposes]);
|
|
157
|
+
// The vendor sinks currently running (#1704) — empty until the person grants ANALYTICS, emptied on
|
|
158
|
+
// withdrawal or sign-out. Behind the same master switch as the built-in destinations.
|
|
159
|
+
const consentBasedActivations = useConsentBasedProviderActivations();
|
|
160
|
+
const vendorSinks = useMemo(() => {
|
|
161
|
+
if (!analyticsConfig?.enabled)
|
|
162
|
+
return [];
|
|
163
|
+
return consentBasedActivations
|
|
164
|
+
.filter((running) => running.providerCapabilities.includes(BUILTIN_PROVIDER_CAPABILITY.FRONTEND_PRODUCT_ANALYTICS))
|
|
165
|
+
.map((running) => running.activation.handle)
|
|
166
|
+
.filter(isFrontendProductAnalyticsSink);
|
|
167
|
+
}, [analyticsConfig?.enabled, consentBasedActivations]);
|
|
168
|
+
const isDispatching = isActive || vendorSinks.length > 0;
|
|
169
|
+
/*
|
|
170
|
+
* The person's arrival and departure (#1977) — identity for every destination, and the sign-in /
|
|
171
|
+
* sign-out analytics events (`autoInstrumentation.userLifecycle`).
|
|
172
|
+
*
|
|
173
|
+
* Handled HERE rather than in `AnalyticsEventBridge`, which is keyed on the published identity and is
|
|
174
|
+
* therefore remounted by exactly the transitions these events announce, and which only listens while
|
|
175
|
+
* analytics is already dispatching. Two consequences of the order things happen in:
|
|
176
|
+
*
|
|
177
|
+
* - A sign-in is announced when the person's context loads, and their ANALYTICS grant arrives with
|
|
178
|
+
* their preferences a moment later; so the sign-in event is HELD, stamped with the instant it
|
|
179
|
+
* happened. It is decided by the person's own preferences: if they carry the ANALYTICS grant (the
|
|
180
|
+
* grant the person had already recorded before this sign-in, so the sign-in happened under it), the
|
|
181
|
+
* event is sent to each kind of destination as that kind starts — the built-in destinations after
|
|
182
|
+
* their asynchronous initialisation, the vendor sinks when the consent-based phase starts them. If
|
|
183
|
+
* they do not, the event is DROPPED rather than sent after some later grant: an event that happened
|
|
184
|
+
* while the person had not consented is not collected retroactively. A departure drops it too, and
|
|
185
|
+
* a later withdrawal drops whatever has not been delivered yet. An application whose analytics does
|
|
186
|
+
* not rest on consent (`requiresConsent: false`) needs no decision.
|
|
187
|
+
* - A sign-out is announced BEFORE the sign-out publishes `privacy: null` (see `UserOrgsProvider`), so
|
|
188
|
+
* the event is sent while the person's grant still holds, and only then is the identity reset —
|
|
189
|
+
* `track` then `reset`, the order an analytics client expects.
|
|
190
|
+
*
|
|
191
|
+
* Only a sign-in in this tab and the person's own sign-out are COUNTED; a resumed session, a session
|
|
192
|
+
* the backend ended, one ended in another tab and one replaced by another person are identity changes
|
|
193
|
+
* only (see `SessionEstablishment` / `SessionEndReason`).
|
|
194
|
+
*/
|
|
195
|
+
const userLifecycleTracking = analyticsConfig?.autoInstrumentation?.userLifecycle === true;
|
|
196
|
+
const userLifecycleTrackingRef = useRef(userLifecycleTracking);
|
|
197
|
+
userLifecycleTrackingRef.current = userLifecycleTracking;
|
|
198
|
+
const requiresConsent = analyticsConfig?.requiresConsent !== false;
|
|
199
|
+
const requiresConsentRef = useRef(requiresConsent);
|
|
200
|
+
requiresConsentRef.current = requiresConsent;
|
|
201
|
+
const heldSignInRef = useRef(null);
|
|
202
|
+
/** Re-runs the delivery effect below when a held sign-in is decided (a ref alone would not). */
|
|
203
|
+
const [heldSignInVersion, setHeldSignInVersion] = useState(0);
|
|
204
|
+
const holdSignIn = useCallback((next) => {
|
|
205
|
+
heldSignInRef.current = next;
|
|
206
|
+
setHeldSignInVersion(version => version + 1);
|
|
207
|
+
}, []);
|
|
109
208
|
useEffect(() => {
|
|
110
209
|
return on(FrontendEvents.USER_LOGIN, (payload) => {
|
|
210
|
+
signedInUserIdRef.current = payload.userId;
|
|
111
211
|
providersRef.current.forEach(p => p.identify({ userId: payload.userId }));
|
|
212
|
+
if (payload.establishment === SessionEstablishment.SIGNED_IN) {
|
|
213
|
+
holdSignIn({ occurredAt: Date.now(), decided: !requiresConsentRef.current, owedToBuiltIns: true, owedToVendorSinks: true });
|
|
214
|
+
}
|
|
112
215
|
});
|
|
113
|
-
}, [on]);
|
|
114
|
-
// Reset on logout
|
|
216
|
+
}, [on, holdSignIn]);
|
|
115
217
|
useEffect(() => {
|
|
116
|
-
return on(FrontendEvents.
|
|
218
|
+
return on(FrontendEvents.USER_PREFERENCES_CHANGED, (payload) => {
|
|
219
|
+
const held = heldSignInRef.current;
|
|
220
|
+
// `privacy: null` is a sign-out's clearing, not this person's decision; a departure already dropped the hold.
|
|
221
|
+
if (held === null || !requiresConsentRef.current || !payload.privacy)
|
|
222
|
+
return;
|
|
223
|
+
const purposes = payload.privacy.consentedPurposes;
|
|
224
|
+
if (purposes === undefined)
|
|
225
|
+
return;
|
|
226
|
+
holdSignIn(hasGrantedConsentPurposes(normalizeConsentPurposes(purposes), [ConsentPurpose.ANALYTICS]) ? { ...held, decided: true } : null);
|
|
227
|
+
});
|
|
228
|
+
}, [on, holdSignIn]);
|
|
229
|
+
useEffect(() => {
|
|
230
|
+
return on(FrontendEvents.USER_LOGOUT, (payload) => {
|
|
231
|
+
if (payload.reason === SessionEndReason.SIGNED_OUT && userLifecycleTrackingRef.current) {
|
|
232
|
+
lifecycleTrackRef.current(AnalyticsEventName.USER_LOGOUT);
|
|
233
|
+
}
|
|
234
|
+
holdSignIn(null);
|
|
235
|
+
signedInUserIdRef.current = null;
|
|
117
236
|
providersRef.current.forEach(p => p.reset());
|
|
118
237
|
});
|
|
119
|
-
}, [on]);
|
|
238
|
+
}, [on, holdSignIn]);
|
|
120
239
|
// ─── Achieved moments persistence ─────────────────────────────
|
|
121
240
|
const [identity, setIdentity] = useState(null);
|
|
122
241
|
const identityOwner = useRef(null);
|
|
@@ -132,6 +251,23 @@ export const AnalyticsContextProvider = ({ children, customProviders, }) => {
|
|
|
132
251
|
};
|
|
133
252
|
}, []);
|
|
134
253
|
const identityKey = JSON.stringify(identity);
|
|
254
|
+
/*
|
|
255
|
+
* Who a running vendor sink attributes events to (#1704): the person the mounted app scope publishes
|
|
256
|
+
* (`publishIdentity`), which is the identity this provider already trusts for value moments. Keyed on the
|
|
257
|
+
* user id and on WHICH sinks run, so a sink started later is identified on its first render, and a person
|
|
258
|
+
* who leaves (identity lost) is forgotten by every sink still running. The published identity rather
|
|
259
|
+
* than `USER_LOGIN` / `USER_LOGOUT` because a sink starts whenever the grant arrives, and the identity
|
|
260
|
+
* is STATE a sink started later can read, where the announcement is a moment it would have missed.
|
|
261
|
+
*/
|
|
262
|
+
const identifiedUserId = identity?.userId ?? null;
|
|
263
|
+
useEffect(() => {
|
|
264
|
+
if (vendorSinks.length === 0)
|
|
265
|
+
return;
|
|
266
|
+
if (identifiedUserId !== null)
|
|
267
|
+
vendorSinks.forEach(sink => sink.identify({ userId: identifiedUserId }));
|
|
268
|
+
else
|
|
269
|
+
vendorSinks.forEach(sink => sink.reset());
|
|
270
|
+
}, [vendorSinks, identifiedUserId]);
|
|
135
271
|
const currentIdentityKey = useRef(identityKey);
|
|
136
272
|
currentIdentityKey.current = identityKey;
|
|
137
273
|
const momentProgress = useRef({ signals: new Map(), counts: new Map(), lastFired: new Map(), completed: new Set() });
|
|
@@ -253,28 +389,55 @@ export const AnalyticsContextProvider = ({ children, customProviders, }) => {
|
|
|
253
389
|
// ─── Track interceptor ref ────────────────────────────────────
|
|
254
390
|
const onTrackRef = useRef(null);
|
|
255
391
|
const track = useCallback((name, properties) => {
|
|
256
|
-
if (!
|
|
392
|
+
if (!isDispatching)
|
|
257
393
|
return;
|
|
258
394
|
const event = { name, properties, timestamp: Date.now() };
|
|
259
|
-
|
|
395
|
+
if (isActive)
|
|
396
|
+
providersRef.current.forEach(p => p.track(event));
|
|
397
|
+
vendorSinks.forEach(sink => sink.track({ name, properties }));
|
|
260
398
|
// Forward to bridge interceptor for CUSTOM_EVENT / FEATURE_ACCESS signal evaluation
|
|
261
399
|
onTrackRef.current?.(name, properties);
|
|
262
|
-
}, [isActive]);
|
|
400
|
+
}, [isActive, isDispatching, vendorSinks]);
|
|
401
|
+
lifecycleTrackRef.current = track;
|
|
402
|
+
// Deliver a decided sign-in to each kind of destination as that kind starts — see the block above.
|
|
403
|
+
useEffect(() => {
|
|
404
|
+
const held = heldSignInRef.current;
|
|
405
|
+
if (held === null || !held.decided || !userLifecycleTracking)
|
|
406
|
+
return;
|
|
407
|
+
const event = { name: AnalyticsEventName.USER_LOGIN, timestamp: held.occurredAt };
|
|
408
|
+
let owedToBuiltIns = held.owedToBuiltIns;
|
|
409
|
+
let owedToVendorSinks = held.owedToVendorSinks;
|
|
410
|
+
if (owedToBuiltIns && isActive && providersRef.current.length > 0) {
|
|
411
|
+
providersRef.current.forEach(p => p.track(event));
|
|
412
|
+
owedToBuiltIns = false;
|
|
413
|
+
}
|
|
414
|
+
if (owedToVendorSinks && vendorSinks.length > 0) {
|
|
415
|
+
// A vendor sink's `track` takes no timestamp — the vendor stamps receipt — so when the sign-in
|
|
416
|
+
// happened travels as a property, and the vendor-side time may be later than the sign-in.
|
|
417
|
+
vendorSinks.forEach(sink => sink.track({ name: event.name, properties: { [SIGNED_IN_AT_PROPERTY]: new Date(held.occurredAt).toISOString() } }));
|
|
418
|
+
owedToVendorSinks = false;
|
|
419
|
+
}
|
|
420
|
+
if (owedToBuiltIns !== held.owedToBuiltIns || owedToVendorSinks !== held.owedToVendorSinks) {
|
|
421
|
+
heldSignInRef.current = owedToBuiltIns || owedToVendorSinks ? { ...held, owedToBuiltIns, owedToVendorSinks } : null;
|
|
422
|
+
}
|
|
423
|
+
}, [heldSignInVersion, builtInsStartedVersion, isActive, vendorSinks, userLifecycleTracking]);
|
|
263
424
|
const page = useCallback((path, properties) => {
|
|
264
|
-
if (!
|
|
425
|
+
if (!isDispatching)
|
|
265
426
|
return;
|
|
266
|
-
|
|
267
|
-
|
|
427
|
+
if (isActive)
|
|
428
|
+
providersRef.current.forEach(p => p.page(path, properties));
|
|
429
|
+
vendorSinks.forEach(sink => sink.page(path, properties));
|
|
430
|
+
}, [isActive, isDispatching, vendorSinks]);
|
|
268
431
|
// ─── Render ───────────────────────────────────────────────────
|
|
269
432
|
const contextValue = useMemo(() => ({
|
|
270
433
|
track,
|
|
271
434
|
page,
|
|
272
|
-
isActive,
|
|
435
|
+
isActive: isDispatching,
|
|
273
436
|
sessionStartTimestamp,
|
|
274
437
|
achievedMoments,
|
|
275
438
|
markMomentAchieved,
|
|
276
439
|
_onTrackRef: onTrackRef,
|
|
277
|
-
}), [track, page,
|
|
278
|
-
return (_jsx(AnalyticsIdentityPublisherContext.Provider, { value: publishIdentity, children: _jsxs(AnalyticsContext.Provider, { value: contextValue, children: [
|
|
440
|
+
}), [track, page, isDispatching, sessionStartTimestamp, achievedMoments, markMomentAchieved]);
|
|
441
|
+
return (_jsx(AnalyticsIdentityPublisherContext.Provider, { value: publishIdentity, children: _jsxs(AnalyticsContext.Provider, { value: contextValue, children: [isDispatching && identity && analyticsConfig && (_jsx(AnalyticsEventBridge, { identity: identity, progress: momentProgress.current, config: analyticsConfig.autoInstrumentation, valueMoments: analyticsConfig.valueMoments }, `${identityKey}:${JSON.stringify(analyticsConfig.valueMoments)}`)), children] }) }));
|
|
279
442
|
};
|
|
280
443
|
//# sourceMappingURL=AnalyticsContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsContext.js","sourceRoot":"","sources":["../../../../../../src/core/monitoring/analytics/AnalyticsContext.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Analytics Context Provider\n * \n * Provides analytics tracking, value moment achievement persistence,\n * consent gating, and provider lifecycle management.\n */\n\nimport React, { createContext, useContext, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { ConsentPurpose, CoreResourceType, hasGrantedConsentPurposes, normalizeConsentPurposes, ValueMomentRole, ValueMomentScope, AnalyticsTriggerSource, type AnalyticsConfig, ANALYTICS_ACHIEVED_STORAGE_KEY_PREFIX } from '@wildo-ai/saas-models';\nimport type { IAnalyticsProvider, AnalyticsEvent } from './analytics-provider.frontend.interface';\nimport { AnalyticsProviderRegistry } from './analytics-provider-registry.frontend.service';\nimport { ApplicationContext } from '~wildo-frontend-lib/core/runtime/ApplicationContext.shared';\nimport { useEventBus } from '~wildo-frontend-lib/core/events/useEventBus';\nimport { FrontendEvents } from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport { getManualCallsHttpClient } from '~wildo-frontend-lib/core/requests/wildo-http-client-manual-calls.frontend.service';\nimport { useResourceReachability } from '~wildo-frontend-lib/core/resources/useResourceRegistry';\nimport { AnalyticsEventBridge, type AnalyticsMomentProgress } from './AnalyticsEventBridge';\n\n// ─── Context Value Interface ────────────────────────────────────\n\nexport interface AnalyticsContextValue {\n /** Track a custom event (app-custom usage) */\n track: (name: string, properties?: Record<string, unknown>) => void;\n /** Track a page view */\n page: (path: string, properties?: Record<string, unknown>) => void;\n /** Whether analytics is active (enabled + consent granted) */\n isActive: boolean;\n /** Session start timestamp (for TTFV computation) */\n sessionStartTimestamp: number;\n /** Set of achieved value moment identifiers (scope-aware, persisted) */\n achievedMoments: Set<string>;\n /** Mark a value moment as achieved (persists to localStorage + backend sync) */\n markMomentAchieved: (identifier: string) => boolean | Promise<boolean>;\n /**\n * Internal: ref for track() call interception (used by AnalyticsEventBridge).\n * The bridge registers a callback on mount to evaluate CUSTOM_EVENT and\n * FEATURE_ACCESS signals when track() is called.\n * @internal\n */\n _onTrackRef: React.MutableRefObject<((name: string, properties?: Record<string, unknown>) => void) | null>;\n}\n\n// ─── Context ────────────────────────────────────────────────────\n\n// Note: useAnalytics hook is in a separate file (useAnalytics.ts) for React Fast Refresh compatibility.\nexport const AnalyticsContext = createContext<AnalyticsContextValue | null>(null);\n\n/** Identity snapshots come from the mounted AppScope owner, never a decoded token or a late event. */\nexport interface AnalyticsIdentity {\n userId: string | null;\n organizationId: string | null;\n applicationId: string | null;\n anonymousUserId: string | null;\n}\nexport const AnalyticsIdentityPublisherContext = createContext<((identity: AnalyticsIdentity) => () => void) | null>(null);\n\n// ─── Provider Registry (singleton) ──────────────────────────────\n\nconst providerRegistry = new AnalyticsProviderRegistry();\n\n// ─── Provider Component ─────────────────────────────────────────\n\nexport interface AnalyticsContextProviderProps {\n children: React.ReactNode;\n customProviders?: IAnalyticsProvider[];\n}\n\nexport const AnalyticsContextProvider: React.FC<AnalyticsContextProviderProps> = ({\n children,\n customProviders,\n}) => {\n const appContext = useContext(ApplicationContext);\n const { on } = useEventBus();\n // Whether this consumer serves the progression-backed analytics routes at all (#1069).\n const momentsReachable = useResourceReachability(CoreResourceType.USER_PROGRESSION_STATE);\n const providersRef = useRef<IAnalyticsProvider[]>([]);\n const [isActive, setIsActive] = useState(false);\n\n // Session start: captured once at mount\n const sessionStartTimestamp = useRef(Date.now()).current;\n\n // Resolve analytics config from ApplicationContext\n const analyticsConfig = useMemo<AnalyticsConfig | undefined>(\n () => appContext?.appConfig?.analytics,\n [appContext?.appConfig?.analytics],\n );\n\n // ─── Consent gating ─────────────────────────────────────────\n\n /*\n * The purposes the signed-in person granted — a SET (#534). Starts EMPTY, never at a level: nothing\n * is known to be granted until the person's preferences arrive, and analytics that started on an\n * assumed consent would already have sent data by the time the real answer said otherwise.\n *\n * This used to hold one `DataProcessingConsent` and compare it against a module-private\n * `CONSENT_ORDER` with `>=`, which asserted that agreeing to marketing implied agreeing to analytics\n * — a claim nobody decided. Membership of ANALYTICS is the whole test now.\n */\n /*\n * ONE subject grants: the signed-in ACCOUNT.\n *\n * A second, VISITOR tier lived here briefly (#1258 Step 1d) and was removed on 2026-09-20 with the\n * pre-auth panel that fed it — see `PublicLayout_MainContainer` for why that panel went. Nothing\n * publishes a visitor decision to this provider any more, so a visitor tier here would be a state\n * nothing can ever set: the application's public pages run no consent-based analytics, which is the\n * behaviour they had before the panel existed and is the safe direction.\n *\n * `null` means \"nothing has been said\", which is not the same as granting nothing — an empty array\n * is a real, recorded withdrawal and must gate. That distinction is why this is not a bare array.\n */\n const [accountPurposes, setAccountPurposes] = useState<readonly ConsentPurpose[] | null>(null);\n const grantedPurposes = useMemo<readonly ConsentPurpose[]>(() => accountPurposes ?? [], [accountPurposes]);\n\n useEffect(() => {\n return on(FrontendEvents.USER_PREFERENCES_CHANGED, (payload) => {\n /*\n * `privacy: null` is the CLEARED state — sign-out, or an identity with no preferences. It must\n * revoke: the old handler ignored it, so a signed-out browser kept the previous person's consent\n * and analytics kept running for whoever used it next.\n */\n if (payload.privacy === null) {\n setAccountPurposes([]);\n return;\n }\n const purposes = payload.privacy?.consentedPurposes;\n // `undefined` means this event carried no privacy block; an EMPTY set is a real withdrawal and\n // must reach the gate below, which is why this does not test truthiness.\n if (purposes !== undefined) {\n setAccountPurposes(normalizeConsentPurposes(purposes));\n }\n });\n }, [on]);\n\n\n // Initialize/teardown providers based on config + consent\n useEffect(() => {\n if (!analyticsConfig?.enabled) {\n setIsActive(false);\n return;\n }\n\n const hasConsent = analyticsConfig.requiresConsent === false\n || hasGrantedConsentPurposes(grantedPurposes, [ConsentPurpose.ANALYTICS]);\n\n if (!hasConsent) {\n providersRef.current.forEach(p => p.reset());\n setIsActive(false);\n return;\n }\n\n let aborted = false;\n\n const httpClient = getManualCallsHttpClient();\n const builtInProviders = providerRegistry.resolveFromConfig(\n analyticsConfig.providers ?? [],\n httpClient,\n );\n const allProviders = [...builtInProviders, ...(customProviders ?? [])];\n\n Promise.all(\n allProviders.map(p =>\n p.initialize(analyticsConfig.providers?.find(c => c.providerType === p.name)?.config).catch(err => {\n console.warn(`[Analytics] Failed to initialize provider \"${p.name}\":`, err);\n })\n )\n ).then(() => {\n if (aborted) return;\n providersRef.current = allProviders;\n setIsActive(true);\n });\n\n return () => {\n aborted = true;\n allProviders.forEach(p => p.shutdown().catch(() => {}));\n providersRef.current = [];\n };\n }, [analyticsConfig, grantedPurposes, customProviders]);\n\n // Identify user on login\n useEffect(() => {\n return on(FrontendEvents.USER_LOGIN, (payload) => {\n providersRef.current.forEach(p =>\n p.identify({ userId: payload.userId })\n );\n });\n }, [on]);\n\n // Reset on logout\n useEffect(() => {\n return on(FrontendEvents.USER_LOGOUT, () => {\n providersRef.current.forEach(p => p.reset());\n });\n }, [on]);\n\n // ─── Achieved moments persistence ─────────────────────────────\n\n const [identity, setIdentity] = useState<AnalyticsIdentity | null>(null);\n const identityOwner = useRef<symbol | null>(null);\n const publishIdentity = useCallback((next: AnalyticsIdentity) => {\n const owner = Symbol();\n identityOwner.current = owner;\n setIdentity(next);\n return () => {\n if (identityOwner.current === owner) { identityOwner.current = null; setIdentity(null); }\n };\n }, []);\n const identityKey = JSON.stringify(identity);\n const currentIdentityKey = useRef(identityKey);\n currentIdentityKey.current = identityKey;\n const momentProgress = useRef<AnalyticsMomentProgress>({ signals: new Map(), counts: new Map(), lastFired: new Map(), completed: new Set() });\n const userStorageKey = identity?.userId\n ? `${ANALYTICS_ACHIEVED_STORAGE_KEY_PREFIX}${JSON.stringify([identity.applicationId, ValueMomentScope.USER, identity.userId])}` : null;\n const organizationStorageKey = identity?.organizationId\n ? `${ANALYTICS_ACHIEVED_STORAGE_KEY_PREFIX}${JSON.stringify([identity.applicationId, ValueMomentScope.ORGANIZATION, identity.organizationId])}` : null;\n const storageKey = JSON.stringify([userStorageKey, organizationStorageKey]);\n const isOrganizationMoment = useCallback((id: string) =>\n analyticsConfig?.valueMoments?.find(moment => moment.identifier === id)?.scope === ValueMomentScope.ORGANIZATION,\n [analyticsConfig?.valueMoments]);\n const isPersistentMoment = useCallback((id: string) =>\n analyticsConfig?.valueMoments?.find(moment => moment.identifier === id)?.role !== ValueMomentRole.ANTI_PATTERN,\n [analyticsConfig?.valueMoments]);\n\n const [achievementState, setAchievementState] = useState<{key: string; moments: Set<string>}>({key: identityKey, moments: new Set()});\n const achievedMoments = useMemo(() => achievementState.key === identityKey ? achievementState.moments : new Set<string>(), [achievementState, identityKey]);\n const setAchievedMoments = useCallback((update: React.SetStateAction<Set<string>>) => {\n setAchievementState(previous => ({key: identityKey, moments: typeof update === 'function'\n ? update(previous.key === identityKey ? previous.moments : new Set()) : update}));\n }, [identityKey]);\n\n // Helper: persist to localStorage\n const persistToStorage = useCallback((moments: Set<string>) => {\n try {\n if (userStorageKey) localStorage.setItem(userStorageKey, JSON.stringify([...moments].filter(id => !isOrganizationMoment(id))));\n if (organizationStorageKey) localStorage.setItem(organizationStorageKey, JSON.stringify([...moments].filter(isOrganizationMoment)));\n } catch {\n /* quota exceeded — best effort */\n }\n }, [userStorageKey, organizationStorageKey, isOrganizationMoment]);\n\n // Load from localStorage on mount + fetch from backend if backendSync\n useEffect(() => {\n setAchievedMoments(new Set());\n if (!analyticsConfig?.enabled || !identity || (!identity.userId && !identity.organizationId)) return;\n\n // Load from localStorage\n try {\n const loaded = new Set<string>();\n for (const [key, organization] of [[userStorageKey, false], [organizationStorageKey, true]] as const) {\n if (!key) continue;\n const stored = localStorage.getItem(key);\n if (stored) for (const id of JSON.parse(stored) as string[]) {\n if (isPersistentMoment(id) && isOrganizationMoment(id) === organization) loaded.add(id);\n }\n }\n setAchievedMoments(loaded);\n } catch {\n /* corrupt storage — start fresh */\n }\n\n // Fetch from backend if backendSync enabled AND this consumer can reach the route (#1069, the\n // #268 rule): achieved moments are read from the progression store, which a consumer whose\n // registry excludes it does not serve. localStorage still loads above.\n if (analyticsConfig?.persistence?.backendSync && momentsReachable) {\n let aborted = false;\n getManualCallsHttpClient()\n .getAnalyticsMomentsAchieved()\n .then((response: unknown) => {\n if (aborted || currentIdentityKey.current !== identityKey) return;\n const res = response as { moments?: string[] };\n if (res.moments) {\n setAchievedMoments(prev => {\n const merged = new Set([...prev, ...res.moments!].filter(isPersistentMoment));\n persistToStorage(merged);\n return merged;\n });\n }\n })\n .catch(() => {\n /* Backend unavailable — use localStorage only */\n });\n\n return () => { aborted = true; };\n }\n }, [analyticsConfig?.enabled, analyticsConfig?.persistence?.backendSync, momentsReachable, storageKey, identityKey, persistToStorage, isPersistentMoment, isOrganizationMoment]);\n\n // Subscribe to ANALYTICS_MOMENT_ACHIEVED events (backend-pushed via WS)\n useEffect(() => {\n return on(FrontendEvents.ANALYTICS_MOMENT_ACHIEVED, (payload) => {\n if (!identity || payload.triggerSource === AnalyticsTriggerSource.FRONTEND || payload.role === ValueMomentRole.ANTI_PATTERN || !isPersistentMoment(payload.momentIdentifier)) return;\n setAchievedMoments(prev => {\n const next = new Set(prev);\n next.add(payload.momentIdentifier);\n persistToStorage(next);\n return next;\n });\n });\n }, [on, persistToStorage, identityKey, isPersistentMoment]);\n\n const markMomentAchieved = useCallback((identifier: string): boolean | Promise<boolean> => {\n if (!identity || !isPersistentMoment(identifier)) return false;\n const definition = analyticsConfig?.valueMoments?.find(moment => moment.identifier === identifier);\n if (definition?.requires?.some(id => !achievedMoments.has(id)) || definition?.beforeStage?.some(id => achievedMoments.has(id))) return false;\n const record = (): boolean => {\n if (currentIdentityKey.current !== identityKey) return false;\n setAchievedMoments(prev => {\n const next = new Set(prev); next.add(identifier); persistToStorage(next); return next;\n });\n return true;\n };\n if (!analyticsConfig?.persistence?.backendSync) return record();\n // A refused report is not an achievement. Network failures retain the documented best-effort\n // local behavior; explicit server refusals must never be merged back as local truth.\n return getManualCallsHttpClient().postAnalyticsMomentsAchieved({ momentIdentifier: identifier, scope: definition?.scope })\n .then(result => result.success === false ? false : record())\n .catch((error: unknown) => {\n const response = error as {httpStatus?: number; response?: {status?: number}};\n const status = response?.httpStatus ?? response?.response?.status;\n return status && status >= 400 && status < 500 ? false : record();\n });\n }, [analyticsConfig, persistToStorage, identityKey, isPersistentMoment, achievedMoments]);\n\n // ─── Track interceptor ref ────────────────────────────────────\n\n const onTrackRef = useRef<((name: string, properties?: Record<string, unknown>) => void) | null>(null);\n\n const track = useCallback((name: string, properties?: Record<string, unknown>) => {\n if (!isActive) return;\n const event: AnalyticsEvent = { name, properties, timestamp: Date.now() };\n providersRef.current.forEach(p => p.track(event));\n // Forward to bridge interceptor for CUSTOM_EVENT / FEATURE_ACCESS signal evaluation\n onTrackRef.current?.(name, properties);\n }, [isActive]);\n\n const page = useCallback((path: string, properties?: Record<string, unknown>) => {\n if (!isActive) return;\n providersRef.current.forEach(p => p.page(path, properties));\n }, [isActive]);\n\n // ─── Render ───────────────────────────────────────────────────\n\n const contextValue = useMemo<AnalyticsContextValue>(() => ({\n track,\n page,\n isActive,\n sessionStartTimestamp,\n achievedMoments,\n markMomentAchieved,\n _onTrackRef: onTrackRef,\n }), [track, page, isActive, sessionStartTimestamp, achievedMoments, markMomentAchieved]);\n\n return (\n <AnalyticsIdentityPublisherContext.Provider value={publishIdentity}>\n <AnalyticsContext.Provider value={contextValue}>\n {isActive && identity && analyticsConfig && (\n <AnalyticsEventBridge\n key={`${identityKey}:${JSON.stringify(analyticsConfig.valueMoments)}`}\n identity={identity}\n progress={momentProgress.current}\n config={analyticsConfig.autoInstrumentation}\n valueMoments={analyticsConfig.valueMoments} \n />\n )}\n {children}\n </AnalyticsContext.Provider>\n </AnalyticsIdentityPublisherContext.Provider>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"AnalyticsContext.js","sourceRoot":"","sources":["../../../../../../src/core/monitoring/analytics/AnalyticsContext.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Analytics Context Provider\n * \n * Provides analytics tracking, value moment achievement persistence,\n * consent gating, and provider lifecycle management.\n */\n\nimport React, { createContext, useContext, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { AnalyticsEventName, BUILTIN_PROVIDER_CAPABILITY, ConsentPurpose, CoreResourceType, hasGrantedConsentPurposes, normalizeConsentPurposes, ValueMomentRole, ValueMomentScope, AnalyticsTriggerSource, type AnalyticsConfig, ANALYTICS_ACHIEVED_STORAGE_KEY_PREFIX } from '@wildo-ai/saas-models';\nimport type { IAnalyticsProvider, AnalyticsEvent } from './analytics-provider.frontend.interface';\nimport { AnalyticsProviderRegistry } from './analytics-provider-registry.frontend.service';\nimport { ApplicationContext } from '~wildo-frontend-lib/core/runtime/ApplicationContext.shared';\nimport { useEventBus } from '~wildo-frontend-lib/core/events/useEventBus';\nimport { FrontendEvents, SessionEndReason, SessionEstablishment } from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport { getManualCallsHttpClient } from '~wildo-frontend-lib/core/requests/wildo-http-client-manual-calls.frontend.service';\nimport { useResourceReachability } from '~wildo-frontend-lib/core/resources/useResourceRegistry';\nimport { AnalyticsEventBridge, type AnalyticsMomentProgress } from './AnalyticsEventBridge';\nimport { isFrontendProductAnalyticsSink, type FrontendProductAnalyticsSink } from '@wildo-ai/saas-models/public-runtime';\nimport { useConsentBasedProviderActivations } from '~wildo-frontend-lib/core/external-providers/ConsentBasedProviderSdks';\n\n// ─── Context Value Interface ────────────────────────────────────\n\nexport interface AnalyticsContextValue {\n /** Track a custom event (app-custom usage) */\n track: (name: string, properties?: Record<string, unknown>) => void;\n /** Track a page view */\n page: (path: string, properties?: Record<string, unknown>) => void;\n /** Whether analytics is active (enabled + consent granted) */\n isActive: boolean;\n /** Session start timestamp (for TTFV computation) */\n sessionStartTimestamp: number;\n /** Set of achieved value moment identifiers (scope-aware, persisted) */\n achievedMoments: Set<string>;\n /** Mark a value moment as achieved (persists to localStorage + backend sync) */\n markMomentAchieved: (identifier: string) => boolean | Promise<boolean>;\n /**\n * Internal: ref for track() call interception (used by AnalyticsEventBridge).\n * The bridge registers a callback on mount to evaluate CUSTOM_EVENT and\n * FEATURE_ACCESS signals when track() is called.\n * @internal\n */\n _onTrackRef: React.MutableRefObject<((name: string, properties?: Record<string, unknown>) => void) | null>;\n}\n\n// ─── Context ────────────────────────────────────────────────────\n\n// Note: useAnalytics hook is in a separate file (useAnalytics.ts) for React Fast Refresh compatibility.\nexport const AnalyticsContext = createContext<AnalyticsContextValue | null>(null);\n\n/** Identity snapshots come from the mounted AppScope owner, never a decoded token or a late event. */\nexport interface AnalyticsIdentity {\n userId: string | null;\n organizationId: string | null;\n applicationId: string | null;\n anonymousUserId: string | null;\n}\nexport const AnalyticsIdentityPublisherContext = createContext<((identity: AnalyticsIdentity) => () => void) | null>(null);\n\n// ─── Provider Registry (singleton) ──────────────────────────────\n\nconst providerRegistry = new AnalyticsProviderRegistry();\n\n/** The event property carrying when a held sign-in happened, for destinations that stamp events themselves. */\nconst SIGNED_IN_AT_PROPERTY = 'signed_in_at';\n\n/**\n * A sign-in announced before this tab knows whether the person consented to analytics (#1977): when it\n * happened, whether the person's own preferences have decided it, and which kinds of destination it\n * is still owed to.\n */\ninterface HeldSignIn {\n readonly occurredAt: number;\n readonly decided: boolean;\n readonly owedToBuiltIns: boolean;\n readonly owedToVendorSinks: boolean;\n}\n\n// ─── Provider Component ─────────────────────────────────────────\n\nexport interface AnalyticsContextProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Two kinds of destination, and only ONE of them is a vendor (#1704).\n *\n * - The ENGINE's own destinations (`console`, `backend_proxy`), selected by `analytics.providers`. They send\n * nothing to a third party (the proxy posts to the application's own backend), and they keep the gate\n * below: `analytics.enabled`, then `analytics.requiresConsent` / the ANALYTICS grant.\n * - VENDORS (PostHog, …) arrive as `FRONTEND_PRODUCT_ANALYTICS` provider modules. They are started by the\n * consent-based activation consumer once the person grants what they rest on, and stopped on withdrawal\n * or sign-out; this context only dispatches to the sinks that are running. That replaced an\n * `analyticsProviders` / `customProviders` door which let an application pass a vendor client here,\n * behind a second consent gate and outside the CSP footprint — two gates for one decision.\n *\n * `analytics.enabled` stays the master switch for both: with it off, a `FRONTEND_PRODUCT_ANALYTICS` vendor is not\n * even loaded (the consent-based consumer skips it), and any sink that is running receives nothing.\n */\nexport const AnalyticsContextProvider: React.FC<AnalyticsContextProviderProps> = ({\n children,\n}) => {\n const appContext = useContext(ApplicationContext);\n const { on } = useEventBus();\n // Whether this consumer serves the progression-backed analytics routes at all (#1069).\n const momentsReachable = useResourceReachability(CoreResourceType.USER_PROGRESSION_STATE);\n const providersRef = useRef<IAnalyticsProvider[]>([]);\n const [isActive, setIsActive] = useState(false);\n\n // Session start: captured once at mount\n const sessionStartTimestamp = useRef(Date.now()).current;\n\n // Resolve analytics config from ApplicationContext\n const analyticsConfig = useMemo<AnalyticsConfig | undefined>(\n () => appContext?.appConfig?.analytics,\n [appContext?.appConfig?.analytics],\n );\n\n // ─── Consent gating ─────────────────────────────────────────\n\n /*\n * The purposes the signed-in person granted — a SET (#534). Starts EMPTY, never at a level: nothing\n * is known to be granted until the person's preferences arrive, and analytics that started on an\n * assumed consent would already have sent data by the time the real answer said otherwise.\n *\n * This used to hold one `DataProcessingConsent` and compare it against a module-private\n * `CONSENT_ORDER` with `>=`, which asserted that agreeing to marketing implied agreeing to analytics\n * — a claim nobody decided. Membership of ANALYTICS is the whole test now.\n */\n /*\n * ONE subject grants: the signed-in ACCOUNT.\n *\n * A second, VISITOR tier lived here briefly (#1258 Step 1d) and was removed on 2026-09-20 with the\n * pre-auth panel that fed it — see `PublicLayout_MainContainer` for why that panel went. Nothing\n * publishes a visitor decision to this provider any more, so a visitor tier here would be a state\n * nothing can ever set: the application's public pages run no consent-based analytics, which is the\n * behaviour they had before the panel existed and is the safe direction.\n *\n * `null` means \"nothing has been said\", which is not the same as granting nothing — an empty array\n * is a real, recorded withdrawal and must gate. That distinction is why this is not a bare array.\n */\n const [accountPurposes, setAccountPurposes] = useState<readonly ConsentPurpose[] | null>(null);\n const grantedPurposes = useMemo<readonly ConsentPurpose[]>(() => accountPurposes ?? [], [accountPurposes]);\n\n useEffect(() => {\n return on(FrontendEvents.USER_PREFERENCES_CHANGED, (payload) => {\n /*\n * `privacy: null` is the CLEARED state — sign-out, or an identity with no preferences. It must\n * revoke: the old handler ignored it, so a signed-out browser kept the previous person's consent\n * and analytics kept running for whoever used it next.\n */\n /*\n * A withdrawal drops what the destinations buffered, before the gate below shuts them down: their\n * shutdown flushes, and events collected under the grant are not sent after it is withdrawn (#1977\n * review). A sign-out already sent its person's buffer, under their consent, on `USER_LOGOUT`.\n */\n const discardUnsent = (): void => {\n if (requiresConsentRef.current) providersRef.current.forEach(p => p.discard());\n };\n if (payload.privacy === null) {\n discardUnsent();\n setAccountPurposes([]);\n return;\n }\n const purposes = payload.privacy?.consentedPurposes;\n // `undefined` means this event carried no privacy block; an EMPTY set is a real withdrawal and\n // must reach the gate below, which is why this does not test truthiness.\n if (purposes !== undefined) {\n const granted = normalizeConsentPurposes(purposes);\n if (!hasGrantedConsentPurposes(granted, [ConsentPurpose.ANALYTICS])) discardUnsent();\n setAccountPurposes(granted);\n }\n });\n }, [on]);\n\n\n /*\n * The person `USER_LOGIN` announced, until `USER_LOGOUT` (#1977). Kept because the two arrive in the\n * wrong order for the built-in destinations: `UserOrgsProvider` announces the person once their\n * context has loaded, which is also when their preferences — and so their ANALYTICS grant — arrive,\n * and the destinations below are initialised asynchronously after that grant. An identify sent only\n * when the event fires would reach no destination, so each one is identified again as it starts.\n */\n const signedInUserIdRef = useRef<string | null>(null);\n const [builtInsStartedVersion, setBuiltInsStartedVersion] = useState(0);\n /** The latest `track`, for the departure listener, which must send while the grant still holds. */\n const lifecycleTrackRef = useRef<(name: string) => void>(() => {});\n\n // Initialize/teardown providers based on config + consent\n useEffect(() => {\n if (!analyticsConfig?.enabled) {\n setIsActive(false);\n return;\n }\n\n const hasConsent = analyticsConfig.requiresConsent === false\n || hasGrantedConsentPurposes(grantedPurposes, [ConsentPurpose.ANALYTICS]);\n\n if (!hasConsent) {\n providersRef.current.forEach(p => p.reset());\n setIsActive(false);\n return;\n }\n\n let aborted = false;\n\n const httpClient = getManualCallsHttpClient();\n const builtInProviders = providerRegistry.resolveFromConfig(\n analyticsConfig.providers ?? [],\n httpClient,\n );\n const allProviders = [...builtInProviders];\n\n Promise.all(\n allProviders.map(p =>\n p.initialize(analyticsConfig.providers?.find(c => c.providerType === p.name)?.config).catch(err => {\n console.warn(`[Analytics] Failed to initialize provider \"${p.name}\":`, err);\n })\n )\n ).then(() => {\n if (aborted) return;\n providersRef.current = allProviders;\n const signedInUserId = signedInUserIdRef.current;\n if (signedInUserId !== null) allProviders.forEach(p => p.identify({ userId: signedInUserId }));\n setIsActive(true);\n // `isActive` may already be true (a re-initialisation on a changed grant), so this is what tells a\n // held sign-in that a fresh set of destinations has started.\n setBuiltInsStartedVersion(version => version + 1);\n });\n\n return () => {\n aborted = true;\n allProviders.forEach(p => p.shutdown().catch(() => {}));\n providersRef.current = [];\n };\n }, [analyticsConfig, grantedPurposes]);\n\n // The vendor sinks currently running (#1704) — empty until the person grants ANALYTICS, emptied on\n // withdrawal or sign-out. Behind the same master switch as the built-in destinations.\n const consentBasedActivations = useConsentBasedProviderActivations();\n const vendorSinks = useMemo<readonly FrontendProductAnalyticsSink[]>(() => {\n if (!analyticsConfig?.enabled) return [];\n return consentBasedActivations\n .filter((running) => running.providerCapabilities.includes(BUILTIN_PROVIDER_CAPABILITY.FRONTEND_PRODUCT_ANALYTICS))\n .map((running) => running.activation.handle)\n .filter(isFrontendProductAnalyticsSink);\n }, [analyticsConfig?.enabled, consentBasedActivations]);\n const isDispatching = isActive || vendorSinks.length > 0;\n\n /*\n * The person's arrival and departure (#1977) — identity for every destination, and the sign-in /\n * sign-out analytics events (`autoInstrumentation.userLifecycle`).\n *\n * Handled HERE rather than in `AnalyticsEventBridge`, which is keyed on the published identity and is\n * therefore remounted by exactly the transitions these events announce, and which only listens while\n * analytics is already dispatching. Two consequences of the order things happen in:\n *\n * - A sign-in is announced when the person's context loads, and their ANALYTICS grant arrives with\n * their preferences a moment later; so the sign-in event is HELD, stamped with the instant it\n * happened. It is decided by the person's own preferences: if they carry the ANALYTICS grant (the\n * grant the person had already recorded before this sign-in, so the sign-in happened under it), the\n * event is sent to each kind of destination as that kind starts — the built-in destinations after\n * their asynchronous initialisation, the vendor sinks when the consent-based phase starts them. If\n * they do not, the event is DROPPED rather than sent after some later grant: an event that happened\n * while the person had not consented is not collected retroactively. A departure drops it too, and\n * a later withdrawal drops whatever has not been delivered yet. An application whose analytics does\n * not rest on consent (`requiresConsent: false`) needs no decision.\n * - A sign-out is announced BEFORE the sign-out publishes `privacy: null` (see `UserOrgsProvider`), so\n * the event is sent while the person's grant still holds, and only then is the identity reset —\n * `track` then `reset`, the order an analytics client expects.\n *\n * Only a sign-in in this tab and the person's own sign-out are COUNTED; a resumed session, a session\n * the backend ended, one ended in another tab and one replaced by another person are identity changes\n * only (see `SessionEstablishment` / `SessionEndReason`).\n */\n const userLifecycleTracking = analyticsConfig?.autoInstrumentation?.userLifecycle === true;\n const userLifecycleTrackingRef = useRef(userLifecycleTracking);\n userLifecycleTrackingRef.current = userLifecycleTracking;\n const requiresConsent = analyticsConfig?.requiresConsent !== false;\n const requiresConsentRef = useRef(requiresConsent);\n requiresConsentRef.current = requiresConsent;\n const heldSignInRef = useRef<HeldSignIn | null>(null);\n /** Re-runs the delivery effect below when a held sign-in is decided (a ref alone would not). */\n const [heldSignInVersion, setHeldSignInVersion] = useState(0);\n const holdSignIn = useCallback((next: HeldSignIn | null) => {\n heldSignInRef.current = next;\n setHeldSignInVersion(version => version + 1);\n }, []);\n useEffect(() => {\n return on(FrontendEvents.USER_LOGIN, (payload) => {\n signedInUserIdRef.current = payload.userId;\n providersRef.current.forEach(p =>\n p.identify({ userId: payload.userId })\n );\n if (payload.establishment === SessionEstablishment.SIGNED_IN) {\n holdSignIn({ occurredAt: Date.now(), decided: !requiresConsentRef.current, owedToBuiltIns: true, owedToVendorSinks: true });\n }\n });\n }, [on, holdSignIn]);\n\n useEffect(() => {\n return on(FrontendEvents.USER_PREFERENCES_CHANGED, (payload) => {\n const held = heldSignInRef.current;\n // `privacy: null` is a sign-out's clearing, not this person's decision; a departure already dropped the hold.\n if (held === null || !requiresConsentRef.current || !payload.privacy) return;\n const purposes = payload.privacy.consentedPurposes;\n if (purposes === undefined) return;\n holdSignIn(hasGrantedConsentPurposes(normalizeConsentPurposes(purposes), [ConsentPurpose.ANALYTICS]) ? { ...held, decided: true } : null);\n });\n }, [on, holdSignIn]);\n\n useEffect(() => {\n return on(FrontendEvents.USER_LOGOUT, (payload) => {\n if (payload.reason === SessionEndReason.SIGNED_OUT && userLifecycleTrackingRef.current) {\n lifecycleTrackRef.current(AnalyticsEventName.USER_LOGOUT);\n }\n holdSignIn(null);\n signedInUserIdRef.current = null;\n providersRef.current.forEach(p => p.reset());\n });\n }, [on, holdSignIn]);\n\n // ─── Achieved moments persistence ─────────────────────────────\n\n const [identity, setIdentity] = useState<AnalyticsIdentity | null>(null);\n const identityOwner = useRef<symbol | null>(null);\n const publishIdentity = useCallback((next: AnalyticsIdentity) => {\n const owner = Symbol();\n identityOwner.current = owner;\n setIdentity(next);\n return () => {\n if (identityOwner.current === owner) { identityOwner.current = null; setIdentity(null); }\n };\n }, []);\n const identityKey = JSON.stringify(identity);\n\n /*\n * Who a running vendor sink attributes events to (#1704): the person the mounted app scope publishes\n * (`publishIdentity`), which is the identity this provider already trusts for value moments. Keyed on the\n * user id and on WHICH sinks run, so a sink started later is identified on its first render, and a person\n * who leaves (identity lost) is forgotten by every sink still running. The published identity rather\n * than `USER_LOGIN` / `USER_LOGOUT` because a sink starts whenever the grant arrives, and the identity\n * is STATE a sink started later can read, where the announcement is a moment it would have missed.\n */\n const identifiedUserId = identity?.userId ?? null;\n useEffect(() => {\n if (vendorSinks.length === 0) return;\n if (identifiedUserId !== null) vendorSinks.forEach(sink => sink.identify({ userId: identifiedUserId }));\n else vendorSinks.forEach(sink => sink.reset());\n }, [vendorSinks, identifiedUserId]);\n const currentIdentityKey = useRef(identityKey);\n currentIdentityKey.current = identityKey;\n const momentProgress = useRef<AnalyticsMomentProgress>({ signals: new Map(), counts: new Map(), lastFired: new Map(), completed: new Set() });\n const userStorageKey = identity?.userId\n ? `${ANALYTICS_ACHIEVED_STORAGE_KEY_PREFIX}${JSON.stringify([identity.applicationId, ValueMomentScope.USER, identity.userId])}` : null;\n const organizationStorageKey = identity?.organizationId\n ? `${ANALYTICS_ACHIEVED_STORAGE_KEY_PREFIX}${JSON.stringify([identity.applicationId, ValueMomentScope.ORGANIZATION, identity.organizationId])}` : null;\n const storageKey = JSON.stringify([userStorageKey, organizationStorageKey]);\n const isOrganizationMoment = useCallback((id: string) =>\n analyticsConfig?.valueMoments?.find(moment => moment.identifier === id)?.scope === ValueMomentScope.ORGANIZATION,\n [analyticsConfig?.valueMoments]);\n const isPersistentMoment = useCallback((id: string) =>\n analyticsConfig?.valueMoments?.find(moment => moment.identifier === id)?.role !== ValueMomentRole.ANTI_PATTERN,\n [analyticsConfig?.valueMoments]);\n\n const [achievementState, setAchievementState] = useState<{key: string; moments: Set<string>}>({key: identityKey, moments: new Set()});\n const achievedMoments = useMemo(() => achievementState.key === identityKey ? achievementState.moments : new Set<string>(), [achievementState, identityKey]);\n const setAchievedMoments = useCallback((update: React.SetStateAction<Set<string>>) => {\n setAchievementState(previous => ({key: identityKey, moments: typeof update === 'function'\n ? update(previous.key === identityKey ? previous.moments : new Set()) : update}));\n }, [identityKey]);\n\n // Helper: persist to localStorage\n const persistToStorage = useCallback((moments: Set<string>) => {\n try {\n if (userStorageKey) localStorage.setItem(userStorageKey, JSON.stringify([...moments].filter(id => !isOrganizationMoment(id))));\n if (organizationStorageKey) localStorage.setItem(organizationStorageKey, JSON.stringify([...moments].filter(isOrganizationMoment)));\n } catch {\n /* quota exceeded — best effort */\n }\n }, [userStorageKey, organizationStorageKey, isOrganizationMoment]);\n\n // Load from localStorage on mount + fetch from backend if backendSync\n useEffect(() => {\n setAchievedMoments(new Set());\n if (!analyticsConfig?.enabled || !identity || (!identity.userId && !identity.organizationId)) return;\n\n // Load from localStorage\n try {\n const loaded = new Set<string>();\n for (const [key, organization] of [[userStorageKey, false], [organizationStorageKey, true]] as const) {\n if (!key) continue;\n const stored = localStorage.getItem(key);\n if (stored) for (const id of JSON.parse(stored) as string[]) {\n if (isPersistentMoment(id) && isOrganizationMoment(id) === organization) loaded.add(id);\n }\n }\n setAchievedMoments(loaded);\n } catch {\n /* corrupt storage — start fresh */\n }\n\n // Fetch from backend if backendSync enabled AND this consumer can reach the route (#1069, the\n // #268 rule): achieved moments are read from the progression store, which a consumer whose\n // registry excludes it does not serve. localStorage still loads above.\n if (analyticsConfig?.persistence?.backendSync && momentsReachable) {\n let aborted = false;\n getManualCallsHttpClient()\n .getAnalyticsMomentsAchieved()\n .then((response: unknown) => {\n if (aborted || currentIdentityKey.current !== identityKey) return;\n const res = response as { moments?: string[] };\n if (res.moments) {\n setAchievedMoments(prev => {\n const merged = new Set([...prev, ...res.moments!].filter(isPersistentMoment));\n persistToStorage(merged);\n return merged;\n });\n }\n })\n .catch(() => {\n /* Backend unavailable — use localStorage only */\n });\n\n return () => { aborted = true; };\n }\n }, [analyticsConfig?.enabled, analyticsConfig?.persistence?.backendSync, momentsReachable, storageKey, identityKey, persistToStorage, isPersistentMoment, isOrganizationMoment]);\n\n // Subscribe to ANALYTICS_MOMENT_ACHIEVED events (backend-pushed via WS)\n useEffect(() => {\n return on(FrontendEvents.ANALYTICS_MOMENT_ACHIEVED, (payload) => {\n if (!identity || payload.triggerSource === AnalyticsTriggerSource.FRONTEND || payload.role === ValueMomentRole.ANTI_PATTERN || !isPersistentMoment(payload.momentIdentifier)) return;\n setAchievedMoments(prev => {\n const next = new Set(prev);\n next.add(payload.momentIdentifier);\n persistToStorage(next);\n return next;\n });\n });\n }, [on, persistToStorage, identityKey, isPersistentMoment]);\n\n const markMomentAchieved = useCallback((identifier: string): boolean | Promise<boolean> => {\n if (!identity || !isPersistentMoment(identifier)) return false;\n const definition = analyticsConfig?.valueMoments?.find(moment => moment.identifier === identifier);\n if (definition?.requires?.some(id => !achievedMoments.has(id)) || definition?.beforeStage?.some(id => achievedMoments.has(id))) return false;\n const record = (): boolean => {\n if (currentIdentityKey.current !== identityKey) return false;\n setAchievedMoments(prev => {\n const next = new Set(prev); next.add(identifier); persistToStorage(next); return next;\n });\n return true;\n };\n if (!analyticsConfig?.persistence?.backendSync) return record();\n // A refused report is not an achievement. Network failures retain the documented best-effort\n // local behavior; explicit server refusals must never be merged back as local truth.\n return getManualCallsHttpClient().postAnalyticsMomentsAchieved({ momentIdentifier: identifier, scope: definition?.scope })\n .then(result => result.success === false ? false : record())\n .catch((error: unknown) => {\n const response = error as {httpStatus?: number; response?: {status?: number}};\n const status = response?.httpStatus ?? response?.response?.status;\n return status && status >= 400 && status < 500 ? false : record();\n });\n }, [analyticsConfig, persistToStorage, identityKey, isPersistentMoment, achievedMoments]);\n\n // ─── Track interceptor ref ────────────────────────────────────\n\n const onTrackRef = useRef<((name: string, properties?: Record<string, unknown>) => void) | null>(null);\n\n const track = useCallback((name: string, properties?: Record<string, unknown>) => {\n if (!isDispatching) return;\n const event: AnalyticsEvent = { name, properties, timestamp: Date.now() };\n if (isActive) providersRef.current.forEach(p => p.track(event));\n vendorSinks.forEach(sink => sink.track({ name, properties }));\n // Forward to bridge interceptor for CUSTOM_EVENT / FEATURE_ACCESS signal evaluation\n onTrackRef.current?.(name, properties);\n }, [isActive, isDispatching, vendorSinks]);\n lifecycleTrackRef.current = track;\n\n // Deliver a decided sign-in to each kind of destination as that kind starts — see the block above.\n useEffect(() => {\n const held = heldSignInRef.current;\n if (held === null || !held.decided || !userLifecycleTracking) return;\n const event: AnalyticsEvent = { name: AnalyticsEventName.USER_LOGIN, timestamp: held.occurredAt };\n let owedToBuiltIns = held.owedToBuiltIns;\n let owedToVendorSinks = held.owedToVendorSinks;\n if (owedToBuiltIns && isActive && providersRef.current.length > 0) {\n providersRef.current.forEach(p => p.track(event));\n owedToBuiltIns = false;\n }\n if (owedToVendorSinks && vendorSinks.length > 0) {\n // A vendor sink's `track` takes no timestamp — the vendor stamps receipt — so when the sign-in\n // happened travels as a property, and the vendor-side time may be later than the sign-in.\n vendorSinks.forEach(sink => sink.track({ name: event.name, properties: { [SIGNED_IN_AT_PROPERTY]: new Date(held.occurredAt).toISOString() } }));\n owedToVendorSinks = false;\n }\n if (owedToBuiltIns !== held.owedToBuiltIns || owedToVendorSinks !== held.owedToVendorSinks) {\n heldSignInRef.current = owedToBuiltIns || owedToVendorSinks ? { ...held, owedToBuiltIns, owedToVendorSinks } : null;\n }\n }, [heldSignInVersion, builtInsStartedVersion, isActive, vendorSinks, userLifecycleTracking]);\n\n const page = useCallback((path: string, properties?: Record<string, unknown>) => {\n if (!isDispatching) return;\n if (isActive) providersRef.current.forEach(p => p.page(path, properties));\n vendorSinks.forEach(sink => sink.page(path, properties));\n }, [isActive, isDispatching, vendorSinks]);\n\n // ─── Render ───────────────────────────────────────────────────\n\n const contextValue = useMemo<AnalyticsContextValue>(() => ({\n track,\n page,\n isActive: isDispatching,\n sessionStartTimestamp,\n achievedMoments,\n markMomentAchieved,\n _onTrackRef: onTrackRef,\n }), [track, page, isDispatching, sessionStartTimestamp, achievedMoments, markMomentAchieved]);\n\n return (\n <AnalyticsIdentityPublisherContext.Provider value={publishIdentity}>\n <AnalyticsContext.Provider value={contextValue}>\n {isDispatching && identity && analyticsConfig && (\n <AnalyticsEventBridge\n key={`${identityKey}:${JSON.stringify(analyticsConfig.valueMoments)}`}\n identity={identity}\n progress={momentProgress.current}\n config={analyticsConfig.autoInstrumentation}\n valueMoments={analyticsConfig.valueMoments} \n />\n )}\n {children}\n </AnalyticsContext.Provider>\n </AnalyticsIdentityPublisherContext.Provider>\n );\n};\n"]}
|
|
@@ -318,8 +318,8 @@ export const AnalyticsEventBridge = ({ config, valueMoments, identity, progress
|
|
|
318
318
|
if (!isActive || !config?.userLifecycle)
|
|
319
319
|
return;
|
|
320
320
|
const unsubs = [
|
|
321
|
-
|
|
322
|
-
|
|
321
|
+
// USER_LOGIN / USER_LOGOUT are counted by `AnalyticsContextProvider` (#1977): this bridge is keyed on
|
|
322
|
+
// the identity those events change, so it is remounted by the very transitions they announce.
|
|
323
323
|
on(FrontendEvents.USER_STATUS_CHANGED, (p) => track(AnalyticsEventName.USER_STATUS_CHANGED, { newStatus: p.newStatus, oldStatus: p.oldStatus })),
|
|
324
324
|
];
|
|
325
325
|
return () => unsubs.forEach(u => u());
|