@strapi/admin 5.48.1 → 5.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/admin/src/StrapiApp.js +33 -20
- package/dist/admin/admin/src/StrapiApp.js.map +1 -1
- package/dist/admin/admin/src/StrapiApp.mjs +6 -1
- package/dist/admin/admin/src/StrapiApp.mjs.map +1 -1
- package/dist/admin/admin/src/components/ConfirmDialog.js +3 -2
- package/dist/admin/admin/src/components/ConfirmDialog.js.map +1 -1
- package/dist/admin/admin/src/components/Context.js +4 -3
- package/dist/admin/admin/src/components/Context.js.map +1 -1
- package/dist/admin/admin/src/components/DescriptionComponentRenderer.js +8 -4
- package/dist/admin/admin/src/components/DescriptionComponentRenderer.js.map +1 -1
- package/dist/admin/admin/src/components/ErrorElement.js +97 -2
- package/dist/admin/admin/src/components/ErrorElement.js.map +1 -1
- package/dist/admin/admin/src/components/ErrorElement.mjs +99 -4
- package/dist/admin/admin/src/components/ErrorElement.mjs.map +1 -1
- package/dist/admin/admin/src/components/Filters.js +3 -2
- package/dist/admin/admin/src/components/Filters.js.map +1 -1
- package/dist/admin/admin/src/components/Form.js +9 -5
- package/dist/admin/admin/src/components/Form.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Boolean.js +3 -2
- package/dist/admin/admin/src/components/FormInputs/Boolean.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Boolean.mjs +3 -2
- package/dist/admin/admin/src/components/FormInputs/Boolean.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Date.js +3 -2
- package/dist/admin/admin/src/components/FormInputs/Date.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Json.js +3 -2
- package/dist/admin/admin/src/components/FormInputs/Json.js.map +1 -1
- package/dist/admin/admin/src/components/GapDropZone.js +3 -2
- package/dist/admin/admin/src/components/GapDropZone.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Context.js +3 -2
- package/dist/admin/admin/src/components/GuidedTour/Context.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js +3 -2
- package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Tours.js +9 -3
- package/dist/admin/admin/src/components/GuidedTour/Tours.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Tours.mjs +6 -1
- package/dist/admin/admin/src/components/GuidedTour/Tours.mjs.map +1 -1
- package/dist/admin/admin/src/components/LanguageProvider.js +5 -1
- package/dist/admin/admin/src/components/LanguageProvider.js.map +1 -1
- package/dist/admin/admin/src/components/Layouts/HeaderLayout.js +3 -2
- package/dist/admin/admin/src/components/Layouts/HeaderLayout.js.map +1 -1
- package/dist/admin/admin/src/components/LazyOutlet.js +57 -0
- package/dist/admin/admin/src/components/LazyOutlet.js.map +1 -0
- package/dist/admin/admin/src/components/LazyOutlet.mjs +35 -0
- package/dist/admin/admin/src/components/LazyOutlet.mjs.map +1 -0
- package/dist/admin/admin/src/components/LeftMenu.js +3 -2
- package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/NavUser.js +10 -0
- package/dist/admin/admin/src/components/MainNav/NavUser.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/NavUser.mjs +10 -0
- package/dist/admin/admin/src/components/MainNav/NavUser.mjs.map +1 -1
- package/dist/admin/admin/src/components/NpsSurvey.js +4 -3
- package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
- package/dist/admin/admin/src/components/PageHelpers.js +3 -2
- package/dist/admin/admin/src/components/PageHelpers.js.map +1 -1
- package/dist/admin/admin/src/components/Pagination.js +3 -2
- package/dist/admin/admin/src/components/Pagination.js.map +1 -1
- package/dist/admin/admin/src/components/PluginsInitializer.js +3 -2
- package/dist/admin/admin/src/components/PluginsInitializer.js.map +1 -1
- package/dist/admin/admin/src/components/RelativeTime.js +6 -4
- package/dist/admin/admin/src/components/RelativeTime.js.map +1 -1
- package/dist/admin/admin/src/components/RelativeTime.mjs +3 -2
- package/dist/admin/admin/src/components/RelativeTime.mjs.map +1 -1
- package/dist/admin/admin/src/components/ResizeIndicator.js +3 -2
- package/dist/admin/admin/src/components/ResizeIndicator.js.map +1 -1
- package/dist/admin/admin/src/components/SearchInput.js +3 -2
- package/dist/admin/admin/src/components/SearchInput.js.map +1 -1
- package/dist/admin/admin/src/components/Table.js +3 -2
- package/dist/admin/admin/src/components/Table.js.map +1 -1
- package/dist/admin/admin/src/components/Theme.js +3 -2
- package/dist/admin/admin/src/components/Theme.js.map +1 -1
- package/dist/admin/admin/src/components/WidgetRoot.js +9 -5
- package/dist/admin/admin/src/components/WidgetRoot.js.map +1 -1
- package/dist/admin/admin/src/core/apis/CustomFields.js +14 -10
- package/dist/admin/admin/src/core/apis/CustomFields.js.map +1 -1
- package/dist/admin/admin/src/core/apis/Widgets.js +8 -4
- package/dist/admin/admin/src/core/apis/Widgets.js.map +1 -1
- package/dist/admin/admin/src/core/apis/router.js +39 -33
- package/dist/admin/admin/src/core/apis/router.js.map +1 -1
- package/dist/admin/admin/src/core/apis/router.mjs +19 -17
- package/dist/admin/admin/src/core/apis/router.mjs.map +1 -1
- package/dist/admin/admin/src/features/Auth.js +78 -6
- package/dist/admin/admin/src/features/Auth.js.map +1 -1
- package/dist/admin/admin/src/features/Auth.mjs +77 -6
- package/dist/admin/admin/src/features/Auth.mjs.map +1 -1
- package/dist/admin/admin/src/features/BackButton.js +3 -2
- package/dist/admin/admin/src/features/BackButton.js.map +1 -1
- package/dist/admin/admin/src/features/Configuration.js +3 -2
- package/dist/admin/admin/src/features/Configuration.js.map +1 -1
- package/dist/admin/admin/src/features/Notifications.js +3 -2
- package/dist/admin/admin/src/features/Notifications.js.map +1 -1
- package/dist/admin/admin/src/features/Tracking.js +7 -3
- package/dist/admin/admin/src/features/Tracking.js.map +1 -1
- package/dist/admin/admin/src/features/Widgets.js +3 -2
- package/dist/admin/admin/src/features/Widgets.js.map +1 -1
- package/dist/admin/admin/src/hooks/useAPIErrorHandler.js +3 -2
- package/dist/admin/admin/src/hooks/useAPIErrorHandler.js.map +1 -1
- package/dist/admin/admin/src/hooks/useAdminRoles.js +3 -2
- package/dist/admin/admin/src/hooks/useAdminRoles.js.map +1 -1
- package/dist/admin/admin/src/hooks/useControllableState.js +3 -2
- package/dist/admin/admin/src/hooks/useControllableState.js.map +1 -1
- package/dist/admin/admin/src/hooks/useDebounce.js +3 -2
- package/dist/admin/admin/src/hooks/useDebounce.js.map +1 -1
- package/dist/admin/admin/src/hooks/useDeviceType.js +3 -2
- package/dist/admin/admin/src/hooks/useDeviceType.js.map +1 -1
- package/dist/admin/admin/src/hooks/useElementOnScreen.js +3 -2
- package/dist/admin/admin/src/hooks/useElementOnScreen.js.map +1 -1
- package/dist/admin/admin/src/hooks/useEnterprise.js +3 -2
- package/dist/admin/admin/src/hooks/useEnterprise.js.map +1 -1
- package/dist/admin/admin/src/hooks/useFetchClient.js +3 -2
- package/dist/admin/admin/src/hooks/useFetchClient.js.map +1 -1
- package/dist/admin/admin/src/hooks/useForceUpdate.js +3 -2
- package/dist/admin/admin/src/hooks/useForceUpdate.js.map +1 -1
- package/dist/admin/admin/src/hooks/useIdleSessionLogout.js +85 -15
- package/dist/admin/admin/src/hooks/useIdleSessionLogout.js.map +1 -1
- package/dist/admin/admin/src/hooks/useIdleSessionLogout.mjs +82 -14
- package/dist/admin/admin/src/hooks/useIdleSessionLogout.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useIsMounted.js +3 -2
- package/dist/admin/admin/src/hooks/useIsMounted.js.map +1 -1
- package/dist/admin/admin/src/hooks/useMediaQuery.js +3 -2
- package/dist/admin/admin/src/hooks/useMediaQuery.js.map +1 -1
- package/dist/admin/admin/src/hooks/useMenu.js +7 -3
- package/dist/admin/admin/src/hooks/useMenu.js.map +1 -1
- package/dist/admin/admin/src/hooks/useOnce.js +3 -2
- package/dist/admin/admin/src/hooks/useOnce.js.map +1 -1
- package/dist/admin/admin/src/hooks/useQueryParams.js +0 -1
- package/dist/admin/admin/src/hooks/useQueryParams.js.map +1 -1
- package/dist/admin/admin/src/hooks/useQueryParams.mjs +0 -1
- package/dist/admin/admin/src/hooks/useQueryParams.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useRBAC.js +7 -3
- package/dist/admin/admin/src/hooks/useRBAC.js.map +1 -1
- package/dist/admin/admin/src/hooks/useSettingsMenu.js +7 -3
- package/dist/admin/admin/src/hooks/useSettingsMenu.js.map +1 -1
- package/dist/admin/admin/src/hooks/useThrottledCallback.js +5 -1
- package/dist/admin/admin/src/hooks/useThrottledCallback.js.map +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +15 -7
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +4 -2
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Auth/AuthPage.js +3 -2
- package/dist/admin/admin/src/pages/Auth/AuthPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/AuthPage.mjs +3 -2
- package/dist/admin/admin/src/pages/Auth/AuthPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/ForgotPassword.js +3 -2
- package/dist/admin/admin/src/pages/Auth/components/ForgotPassword.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Login.js +8 -4
- package/dist/admin/admin/src/pages/Auth/components/Login.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Oops.js +3 -2
- package/dist/admin/admin/src/pages/Auth/components/Oops.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Register.js +9 -5
- package/dist/admin/admin/src/pages/Auth/components/Register.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js +4 -3
- package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/HomePage.js +3 -2
- package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.js +8 -4
- package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js +7 -3
- package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.js +7 -3
- package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.js.map +1 -1
- package/dist/admin/admin/src/pages/ProfilePage.js +8 -4
- package/dist/admin/admin/src/pages/ProfilePage.js.map +1 -1
- package/dist/admin/admin/src/pages/SessionsPage.js +318 -0
- package/dist/admin/admin/src/pages/SessionsPage.js.map +1 -0
- package/dist/admin/admin/src/pages/SessionsPage.mjs +296 -0
- package/dist/admin/admin/src/pages/SessionsPage.mjs.map +1 -0
- package/dist/admin/admin/src/pages/Settings/Layout.js +4 -1
- package/dist/admin/admin/src/pages/Settings/Layout.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/Layout.mjs +5 -2
- package/dist/admin/admin/src/pages/Settings/Layout.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js +3 -2
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js +3 -2
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/constants.js +3 -2
- package/dist/admin/admin/src/pages/Settings/components/Tokens/constants.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/utils/getDateOfExpiration.js +3 -2
- package/dist/admin/admin/src/pages/Settings/components/Tokens/utils/getDateOfExpiration.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/ListView.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/ListView.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js +7 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js +5 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/reducer.js +6 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/reducer.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +4 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js +7 -3
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js +11 -3
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs +7 -0
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js +11 -4
- package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs +7 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js +44 -6
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.mjs +34 -0
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsButton.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsButton.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js +13 -7
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js +15 -9
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js +9 -5
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js +71 -27
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs +38 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js +10 -6
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/difference.js +9 -3
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/difference.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/forms.js +26 -4
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/forms.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/forms.mjs +18 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/forms.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/layouts.js +6 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/layouts.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/localePermissionValidation.js +59 -0
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/localePermissionValidation.js.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/localePermissionValidation.mjs +52 -0
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/localePermissionValidation.mjs.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/updateConditionsToFalse.js +8 -3
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/updateConditionsToFalse.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.js +9 -5
- package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/CreateActionCE.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/CreateActionCE.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/NewUserForm.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/NewUserForm.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/utils/validation.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/Users/utils/validation.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/EditPage.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/EditPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.js.map +1 -1
- package/dist/admin/admin/src/pages/UseCasePage.js +3 -2
- package/dist/admin/admin/src/pages/UseCasePage.js.map +1 -1
- package/dist/admin/admin/src/router.js +9 -0
- package/dist/admin/admin/src/router.js.map +1 -1
- package/dist/admin/admin/src/router.mjs +9 -0
- package/dist/admin/admin/src/router.mjs.map +1 -1
- package/dist/admin/admin/src/services/auth.js +43 -2
- package/dist/admin/admin/src/services/auth.js.map +1 -1
- package/dist/admin/admin/src/services/auth.mjs +41 -3
- package/dist/admin/admin/src/services/auth.mjs.map +1 -1
- package/dist/admin/admin/src/translations/en.json.js +22 -0
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +22 -0
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/ja.json.js +748 -265
- package/dist/admin/admin/src/translations/ja.json.js.map +1 -1
- package/dist/admin/admin/src/translations/ja.json.mjs +745 -266
- package/dist/admin/admin/src/translations/ja.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/languageNativeNames.js +1 -0
- package/dist/admin/admin/src/translations/languageNativeNames.js.map +1 -1
- package/dist/admin/admin/src/translations/languageNativeNames.mjs +1 -0
- package/dist/admin/admin/src/translations/languageNativeNames.mjs.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.js +7 -2
- package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
- package/dist/admin/admin/src/utils/locales.js +3 -2
- package/dist/admin/admin/src/utils/locales.js.map +1 -1
- package/dist/admin/admin/src/utils/objects.js +9 -4
- package/dist/admin/admin/src/utils/objects.js.map +1 -1
- package/dist/admin/admin/src/utils/retryDynamicImport.js +85 -0
- package/dist/admin/admin/src/utils/retryDynamicImport.js.map +1 -0
- package/dist/admin/admin/src/utils/retryDynamicImport.mjs +80 -0
- package/dist/admin/admin/src/utils/retryDynamicImport.mjs.map +1 -0
- package/dist/admin/admin/src/utils/rulesEngine.js +5 -1
- package/dist/admin/admin/src/utils/rulesEngine.js.map +1 -1
- package/dist/admin/admin/src/utils/urls.js +5 -1
- package/dist/admin/admin/src/utils/urls.js.map +1 -1
- package/dist/admin/admin/tests/server.js +25 -0
- package/dist/admin/admin/tests/server.js.map +1 -1
- package/dist/admin/admin/tests/server.mjs +25 -0
- package/dist/admin/admin/tests/server.mjs.map +1 -1
- package/dist/admin/admin/tests/utils.js +3 -2
- package/dist/admin/admin/tests/utils.js.map +1 -1
- package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.js +7 -3
- package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.js.map +1 -1
- package/dist/admin/ee/admin/src/hooks/useLicenseLimits.js +3 -2
- package/dist/admin/ee/admin/src/hooks/useLicenseLimits.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthResponse.js +3 -2
- package/dist/admin/ee/admin/src/pages/AuthResponse.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/Modal.js +3 -2
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/Modal.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useAuditLogsData.js +3 -2
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useAuditLogsData.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useFormatTimeStamp.js +5 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useFormatTimeStamp.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js +3 -2
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.js +7 -3
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.js.map +1 -1
- package/dist/admin/index.js +2 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +1 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/src/StrapiApp.d.ts +11 -5
- package/dist/admin/src/components/FormInputs/Boolean.d.ts +0 -1
- package/dist/admin/src/components/FormInputs/Checkbox.d.ts +0 -1
- package/dist/admin/src/components/FormInputs/DateTime.d.ts +0 -1
- package/dist/admin/src/components/FormInputs/Email.d.ts +0 -1
- package/dist/admin/src/components/FormInputs/Enumeration.d.ts +0 -1
- package/dist/admin/src/components/FormInputs/Number.d.ts +0 -1
- package/dist/admin/src/components/FormInputs/Password.d.ts +0 -1
- package/dist/admin/src/components/FormInputs/Renderer.d.ts +0 -1
- package/dist/admin/src/components/FormInputs/String.d.ts +0 -1
- package/dist/admin/src/components/FormInputs/Textarea.d.ts +0 -1
- package/dist/admin/src/components/FormInputs/Time.d.ts +0 -1
- package/dist/admin/src/components/GuidedTour/GuidedTourProvider.d.ts +0 -1
- package/dist/admin/src/components/LazyOutlet.d.ts +20 -0
- package/dist/admin/src/components/MainNav/MainNav.d.ts +1 -1
- package/dist/admin/src/components/MainNav/NavUser.d.ts +0 -1
- package/dist/admin/src/components/SubNav.d.ts +5 -6
- package/dist/admin/src/core/apis/Plugin.d.ts +1 -1
- package/dist/admin/src/core/apis/Widgets.d.ts +0 -1
- package/dist/admin/src/core/apis/router.d.ts +2 -3
- package/dist/admin/src/core/store/configure.d.ts +2 -2
- package/dist/admin/src/core/utils/createHook.d.ts +4 -4
- package/dist/admin/src/features/AppInfo.d.ts +1 -2
- package/dist/admin/src/features/StrapiApp.d.ts +1 -2
- package/dist/admin/src/hooks/useAPIErrorHandler.d.ts +1 -1
- package/dist/admin/src/hooks/useAdminRoles.d.ts +2 -2
- package/dist/admin/src/hooks/useFetchClient.d.ts +1 -1
- package/dist/admin/src/hooks/useIdleSessionLogout.d.ts +66 -12
- package/dist/admin/src/hooks/usePersistentState.d.ts +0 -1
- package/dist/admin/src/hooks/useQueryParams.d.ts +1 -1
- package/dist/admin/src/hooks/useThrottledCallback.d.ts +0 -1
- package/dist/admin/src/index.d.ts +1 -0
- package/dist/admin/src/layouts/UnauthenticatedLayout.d.ts +2 -2
- package/dist/admin/src/pages/SessionsPage.d.ts +2 -0
- package/dist/admin/src/pages/Settings/pages/Roles/components/CollapseLabel.d.ts +2 -3
- package/dist/admin/src/pages/Settings/pages/Roles/components/ConditionsButton.d.ts +2 -2
- package/dist/admin/src/pages/Settings/pages/Roles/components/HiddenAction.d.ts +0 -1
- package/dist/admin/src/pages/Settings/pages/Roles/components/Permissions.d.ts +2 -0
- package/dist/admin/src/pages/Settings/pages/Roles/utils/forms.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Roles/utils/localePermissionValidation.d.ts +5 -0
- package/dist/admin/src/pages/Settings/pages/Roles/utils/permissions.d.ts +3 -1
- package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +8 -8
- package/dist/admin/src/reducer.d.ts +1 -1
- package/dist/admin/src/services/admin.d.ts +2 -2
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/apiTokens.d.ts +1 -1
- package/dist/admin/src/services/auth.d.ts +29 -27
- package/dist/admin/src/services/contentApi.d.ts +1 -1
- package/dist/admin/src/services/users.d.ts +7 -7
- package/dist/admin/src/services/webhooks.d.ts +2 -2
- package/dist/admin/src/translations/languageNativeNames.d.ts +1 -0
- package/dist/admin/src/utils/locales.d.ts +0 -1
- package/dist/admin/src/utils/retryDynamicImport.d.ts +19 -0
- package/dist/admin/src/utils/shims.d.ts +1 -1
- package/dist/admin/tests/store.d.ts +4 -4
- package/dist/admin/tests/utils.d.ts +5 -5
- package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.d.ts +1 -1
- package/dist/ee/admin/src/services/ai.d.ts +2 -2
- package/dist/ee/server/src/audit-logs/services/audit-logs.d.ts +1 -1
- package/dist/ee/server/src/audit-logs/services/audit-logs.d.ts.map +1 -1
- package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +3 -3
- package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
- package/dist/ee/server/src/audit-logs/validation/audit-logs.d.ts +2 -2
- package/dist/ee/server/src/audit-logs/validation/audit-logs.d.ts.map +1 -1
- package/dist/ee/server/src/bootstrap.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts +30 -31
- package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/index.d.ts +1 -2
- package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/user.d.ts +1 -1
- package/dist/ee/server/src/destroy.d.ts.map +1 -1
- package/dist/ee/server/src/index.d.ts +2 -3
- package/dist/ee/server/src/index.d.ts.map +1 -1
- package/dist/ee/server/src/register.d.ts.map +1 -1
- package/dist/ee/server/src/routes/utils.d.ts.map +1 -1
- package/dist/ee/server/src/services/auth.d.ts.map +1 -1
- package/dist/ee/server/src/services/index.d.ts +1 -1
- package/dist/ee/server/src/services/metrics.d.ts.map +1 -1
- package/dist/ee/server/src/services/passport/sso.d.ts.map +1 -1
- package/dist/ee/server/src/services/persist-tables.d.ts +1 -1
- package/dist/ee/server/src/services/persist-tables.d.ts.map +1 -1
- package/dist/ee/server/src/services/role.d.ts.map +1 -1
- package/dist/ee/server/src/services/user.d.ts.map +1 -1
- package/dist/ee/server/src/utils/index.d.ts.map +1 -1
- package/dist/ee/server/src/utils/sso-lock.d.ts.map +1 -1
- package/dist/ee/server/src/validation/authentication.d.ts +2 -2
- package/dist/ee/server/src/validation/role.d.ts +6 -6
- package/dist/ee/server/src/validation/role.d.ts.map +1 -1
- package/dist/ee/server/src/validation/user.d.ts.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js +5 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication.js +5 -1
- package/dist/server/ee/server/src/controllers/authentication.js.map +1 -1
- package/dist/server/ee/server/src/controllers/user.js +6 -2
- package/dist/server/ee/server/src/controllers/user.js.map +1 -1
- package/dist/server/ee/server/src/services/auth.js +5 -1
- package/dist/server/ee/server/src/services/auth.js.map +1 -1
- package/dist/server/ee/server/src/services/user.js +8 -4
- package/dist/server/ee/server/src/services/user.js.map +1 -1
- package/dist/server/index.js +6 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/server/src/ai/services/ai.js +10 -4
- package/dist/server/server/src/ai/services/ai.js.map +1 -1
- package/dist/server/server/src/content-types/session.js +6 -0
- package/dist/server/server/src/content-types/session.js.map +1 -1
- package/dist/server/server/src/content-types/session.mjs +6 -0
- package/dist/server/server/src/content-types/session.mjs.map +1 -1
- package/dist/server/server/src/controllers/admin.js +9 -4
- package/dist/server/server/src/controllers/admin.js.map +1 -1
- package/dist/server/server/src/controllers/admin.mjs.map +1 -1
- package/dist/server/server/src/controllers/authenticated-session.js +61 -0
- package/dist/server/server/src/controllers/authenticated-session.js.map +1 -0
- package/dist/server/server/src/controllers/authenticated-session.mjs +59 -0
- package/dist/server/server/src/controllers/authenticated-session.mjs.map +1 -0
- package/dist/server/server/src/controllers/authentication.js +18 -6
- package/dist/server/server/src/controllers/authentication.js.map +1 -1
- package/dist/server/server/src/controllers/authentication.mjs +12 -5
- package/dist/server/server/src/controllers/authentication.mjs.map +1 -1
- package/dist/server/server/src/controllers/index.js +2 -0
- package/dist/server/server/src/controllers/index.js.map +1 -1
- package/dist/server/server/src/controllers/index.mjs +2 -0
- package/dist/server/server/src/controllers/index.mjs.map +1 -1
- package/dist/server/server/src/controllers/role.js +2 -4
- package/dist/server/server/src/controllers/role.js.map +1 -1
- package/dist/server/server/src/controllers/role.mjs +2 -4
- package/dist/server/server/src/controllers/role.mjs.map +1 -1
- package/dist/server/server/src/controllers/user.js +3 -2
- package/dist/server/server/src/controllers/user.js.map +1 -1
- package/dist/server/server/src/controllers/webhooks.js +7 -2
- package/dist/server/server/src/controllers/webhooks.js.map +1 -1
- package/dist/server/server/src/middlewares/rateLimit.js +7 -2
- package/dist/server/server/src/middlewares/rateLimit.js.map +1 -1
- package/dist/server/server/src/policies/hasPermissions.js +7 -3
- package/dist/server/server/src/policies/hasPermissions.js.map +1 -1
- package/dist/server/server/src/routes/serve-admin-panel.js +9 -4
- package/dist/server/server/src/routes/serve-admin-panel.js.map +1 -1
- package/dist/server/server/src/routes/serve-admin-panel.mjs +1 -1
- package/dist/server/server/src/routes/serve-admin-panel.mjs.map +1 -1
- package/dist/server/server/src/routes/users.js +12 -26
- package/dist/server/server/src/routes/users.js.map +1 -1
- package/dist/server/server/src/routes/users.mjs +12 -26
- package/dist/server/server/src/routes/users.mjs.map +1 -1
- package/dist/server/server/src/services/api-token.js +7 -3
- package/dist/server/server/src/services/api-token.js.map +1 -1
- package/dist/server/server/src/services/auth.js +8 -3
- package/dist/server/server/src/services/auth.js.map +1 -1
- package/dist/server/server/src/services/content-type.js +6 -2
- package/dist/server/server/src/services/content-type.js.map +1 -1
- package/dist/server/server/src/services/encryption.js +8 -4
- package/dist/server/server/src/services/encryption.js.map +1 -1
- package/dist/server/server/src/services/passport.js +6 -2
- package/dist/server/server/src/services/passport.js.map +1 -1
- package/dist/server/server/src/services/permission/engine.js +5 -1
- package/dist/server/server/src/services/permission/engine.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/index.js +5 -1
- package/dist/server/server/src/services/permission/permissions-manager/index.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/query-builders.js +14 -10
- package/dist/server/server/src/services/permission/permissions-manager/query-builders.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/sanitize.js +0 -2
- package/dist/server/server/src/services/permission/permissions-manager/sanitize.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs +0 -2
- package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs.map +1 -1
- package/dist/server/server/src/services/permission/queries.js +5 -1
- package/dist/server/server/src/services/permission/queries.js.map +1 -1
- package/dist/server/server/src/services/project-settings.js +6 -2
- package/dist/server/server/src/services/project-settings.js.map +1 -1
- package/dist/server/server/src/services/role.js +10 -5
- package/dist/server/server/src/services/role.js.map +1 -1
- package/dist/server/server/src/services/role.mjs +2 -1
- package/dist/server/server/src/services/role.mjs.map +1 -1
- package/dist/server/server/src/services/token.js +7 -2
- package/dist/server/server/src/services/token.js.map +1 -1
- package/dist/server/server/src/services/transfer/permission.js +5 -1
- package/dist/server/server/src/services/transfer/permission.js.map +1 -1
- package/dist/server/server/src/services/transfer/token.js +10 -5
- package/dist/server/server/src/services/transfer/token.js.map +1 -1
- package/dist/server/server/src/services/user.js +10 -6
- package/dist/server/server/src/services/user.js.map +1 -1
- package/dist/server/server/src/strategies/admin.js +4 -0
- package/dist/server/server/src/strategies/admin.js.map +1 -1
- package/dist/server/server/src/strategies/admin.mjs +4 -0
- package/dist/server/server/src/strategies/admin.mjs.map +1 -1
- package/dist/server/server/src/validation/common-functions/check-fields-are-correctly-nested.js +5 -1
- package/dist/server/server/src/validation/common-functions/check-fields-are-correctly-nested.js.map +1 -1
- package/dist/server/server/src/validation/common-functions/check-fields-dont-have-duplicates.js +6 -2
- package/dist/server/server/src/validation/common-functions/check-fields-dont-have-duplicates.js.map +1 -1
- package/dist/server/server/src/validation/common-validators.js +6 -2
- package/dist/server/server/src/validation/common-validators.js.map +1 -1
- package/dist/server/server/src/validation/policies/hasPermissions.js +6 -2
- package/dist/server/server/src/validation/policies/hasPermissions.js.map +1 -1
- package/dist/server/shared/utils/session-auth.js +5 -1
- package/dist/server/shared/utils/session-auth.js.map +1 -1
- package/dist/server/src/ai/controllers/ai.d.ts +3 -3
- package/dist/server/src/ai/services/ai.d.ts.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/config/admin-conditions.d.ts +2 -2
- package/dist/server/src/config/admin-conditions.d.ts.map +1 -1
- package/dist/server/src/content-types/index.d.ts +6 -0
- package/dist/server/src/content-types/index.d.ts.map +1 -1
- package/dist/server/src/content-types/session.d.ts +6 -0
- package/dist/server/src/content-types/session.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-token.d.ts +5 -5
- package/dist/server/src/controllers/api-token.d.ts +1 -1
- package/dist/server/src/controllers/authenticated-session.d.ts +8 -0
- package/dist/server/src/controllers/authenticated-session.d.ts.map +1 -0
- package/dist/server/src/controllers/authenticated-user.d.ts +1 -1
- package/dist/server/src/controllers/authentication.d.ts +4 -4
- package/dist/server/src/controllers/authentication.d.ts.map +1 -1
- package/dist/server/src/controllers/formatters/conditions.d.ts +0 -1
- package/dist/server/src/controllers/formatters/conditions.d.ts.map +1 -1
- package/dist/server/src/controllers/formatters/format-actions-by-sections.d.ts.map +1 -1
- package/dist/server/src/controllers/homepage.d.ts +2 -2
- package/dist/server/src/controllers/homepage.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +33 -43
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/controllers/role.d.ts +4 -4
- package/dist/server/src/controllers/transfer/runner.d.ts +4 -4
- package/dist/server/src/controllers/transfer/runner.d.ts.map +1 -1
- package/dist/server/src/controllers/transfer/token.d.ts +1 -1
- package/dist/server/src/controllers/user.d.ts +2 -2
- package/dist/server/src/controllers/webhooks.d.ts +4 -4
- package/dist/server/src/domain/action/index.d.ts +4 -65
- package/dist/server/src/domain/action/index.d.ts.map +1 -1
- package/dist/server/src/domain/action/provider.d.ts +30 -3
- package/dist/server/src/domain/action/provider.d.ts.map +1 -1
- package/dist/server/src/domain/condition/index.d.ts.map +1 -1
- package/dist/server/src/domain/condition/provider.d.ts +19 -2
- package/dist/server/src/domain/condition/provider.d.ts.map +1 -1
- package/dist/server/src/domain/permission/index.d.ts +0 -1
- package/dist/server/src/domain/permission/index.d.ts.map +1 -1
- package/dist/server/src/domain/user.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +51 -63
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/middlewares/data-transfer.d.ts.map +1 -1
- package/dist/server/src/middlewares/index.d.ts +0 -1
- package/dist/server/src/middlewares/index.d.ts.map +1 -1
- package/dist/server/src/middlewares/rateLimit.d.ts.map +1 -1
- package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
- package/dist/server/src/policies/index.d.ts.map +1 -1
- package/dist/server/src/policies/isAuthenticatedAdmin.d.ts.map +1 -1
- package/dist/server/src/policies/isTelemetryEnabled.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/routes/index.d.ts +0 -1
- package/dist/server/src/routes/index.d.ts.map +1 -1
- package/dist/server/src/routes/serve-admin-panel.d.ts.map +1 -1
- package/dist/server/src/routes/transfer.d.ts +0 -1
- package/dist/server/src/routes/transfer.d.ts.map +1 -1
- package/dist/server/src/routes/users.d.ts.map +1 -1
- package/dist/server/src/services/action.d.ts.map +1 -1
- package/dist/server/src/services/api-token.d.ts +5 -6
- package/dist/server/src/services/api-token.d.ts.map +1 -1
- package/dist/server/src/services/auth.d.ts.map +1 -1
- package/dist/server/src/services/condition.d.ts.map +1 -1
- package/dist/server/src/services/content-type.d.ts.map +1 -1
- package/dist/server/src/services/encryption.d.ts.map +1 -1
- package/dist/server/src/services/homepage.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +12 -21
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/metrics.d.ts.map +1 -1
- package/dist/server/src/services/passport/local-strategy.d.ts.map +1 -1
- package/dist/server/src/services/passport.d.ts +0 -1
- package/dist/server/src/services/passport.d.ts.map +1 -1
- package/dist/server/src/services/permission/engine.d.ts +1 -2
- package/dist/server/src/services/permission/engine.d.ts.map +1 -1
- package/dist/server/src/services/permission/permissions-manager/index.d.ts +5 -5
- package/dist/server/src/services/permission/permissions-manager/index.d.ts.map +1 -1
- package/dist/server/src/services/permission/permissions-manager/permission-fields.d.ts.map +1 -1
- package/dist/server/src/services/permission/permissions-manager/query-builders.d.ts.map +1 -1
- package/dist/server/src/services/permission/permissions-manager/sanitize.d.ts +3 -3
- package/dist/server/src/services/permission/permissions-manager/sanitize.d.ts.map +1 -1
- package/dist/server/src/services/permission/permissions-manager/validate.d.ts.map +1 -1
- package/dist/server/src/services/permission/queries.d.ts.map +1 -1
- package/dist/server/src/services/permission/sections-builder/builder.d.ts +4 -4
- package/dist/server/src/services/permission/sections-builder/builder.d.ts.map +1 -1
- package/dist/server/src/services/permission/sections-builder/handlers.d.ts.map +1 -1
- package/dist/server/src/services/permission/sections-builder/index.d.ts +4 -4
- package/dist/server/src/services/permission/sections-builder/section.d.ts.map +1 -1
- package/dist/server/src/services/permission/sections-builder/utils.d.ts +0 -1
- package/dist/server/src/services/permission/sections-builder/utils.d.ts.map +1 -1
- package/dist/server/src/services/permission.d.ts +13 -38
- package/dist/server/src/services/permission.d.ts.map +1 -1
- package/dist/server/src/services/project-settings.d.ts +2 -4
- package/dist/server/src/services/project-settings.d.ts.map +1 -1
- package/dist/server/src/services/role.d.ts +7 -1
- package/dist/server/src/services/role.d.ts.map +1 -1
- package/dist/server/src/services/token.d.ts +1 -1
- package/dist/server/src/services/token.d.ts.map +1 -1
- package/dist/server/src/services/transfer/token.d.ts +11 -11
- package/dist/server/src/services/transfer/token.d.ts.map +1 -1
- package/dist/server/src/services/user.d.ts +3 -3
- package/dist/server/src/services/user.d.ts.map +1 -1
- package/dist/server/src/strategies/admin-token.d.ts +4 -4
- package/dist/server/src/strategies/admin-token.d.ts.map +1 -1
- package/dist/server/src/strategies/admin.d.ts.map +1 -1
- package/dist/server/src/strategies/api-token-utils.d.ts.map +1 -1
- package/dist/server/src/strategies/content-api-token.d.ts.map +1 -1
- package/dist/server/src/strategies/data-transfer.d.ts.map +1 -1
- package/dist/server/src/utils/normalize-email.d.ts.map +1 -1
- package/dist/server/src/validation/action-provider.d.ts +2 -2
- package/dist/server/src/validation/action-provider.d.ts.map +1 -1
- package/dist/server/src/validation/admin-tokens.d.ts +2 -2
- package/dist/server/src/validation/api-tokens.d.ts +4 -4
- package/dist/server/src/validation/authentication/forgot-password.d.ts +1 -1
- package/dist/server/src/validation/authentication/login.d.ts +1 -1
- package/dist/server/src/validation/authentication/register.d.ts +6 -6
- package/dist/server/src/validation/authentication/register.d.ts.map +1 -1
- package/dist/server/src/validation/authentication/reset-password.d.ts +1 -1
- package/dist/server/src/validation/common-functions/check-fields-are-correctly-nested.d.ts.map +1 -1
- package/dist/server/src/validation/common-functions/check-fields-dont-have-duplicates.d.ts.map +1 -1
- package/dist/server/src/validation/common-validators.d.ts.map +1 -1
- package/dist/server/src/validation/permission.d.ts +6 -6
- package/dist/server/src/validation/permission.d.ts.map +1 -1
- package/dist/server/src/validation/policies/hasPermissions.d.ts +2 -2
- package/dist/server/src/validation/project-settings.d.ts +6 -6
- package/dist/server/src/validation/role.d.ts +8 -8
- package/dist/server/src/validation/role.d.ts.map +1 -1
- package/dist/server/src/validation/transfer/token.d.ts +4 -4
- package/dist/server/src/validation/user.d.ts +8 -8
- package/dist/shared/contracts/permissions.d.ts +1 -0
- package/dist/shared/contracts/permissions.d.ts.map +1 -1
- package/dist/shared/contracts/sessions.d.ts +62 -0
- package/dist/shared/contracts/sessions.d.ts.map +1 -0
- package/dist/shared/contracts/shared.d.ts +1 -1
- package/dist/shared/contracts/shared.d.ts.map +1 -1
- package/dist/shared/utils/session-auth.d.ts +1 -1
- package/dist/shared/utils/session-auth.d.ts.map +1 -1
- package/package.json +11 -11
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
var React = require('react');
|
|
4
4
|
var jwt = require('../utils/jwt.js');
|
|
5
5
|
|
|
6
|
-
function
|
|
6
|
+
function _interopNamespace(e) {
|
|
7
|
+
if (e && e.__esModule) return e;
|
|
7
8
|
var n = Object.create(null);
|
|
8
9
|
if (e) {
|
|
9
10
|
Object.keys(e).forEach(function (k) {
|
|
@@ -20,21 +21,37 @@ function _interopNamespaceDefault(e) {
|
|
|
20
21
|
return Object.freeze(n);
|
|
21
22
|
}
|
|
22
23
|
|
|
23
|
-
var React__namespace = /*#__PURE__*/
|
|
24
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
24
25
|
|
|
25
26
|
const SESSION_EXPIRY_BUFFER_MS = 1000;
|
|
26
27
|
/**
|
|
27
|
-
*
|
|
28
|
+
* How long before the access token's `exp` an active tab renews. Renewing
|
|
29
|
+
* ahead of expiry (rather than at it) means the refreshed token is already in
|
|
30
|
+
* shared storage by the time any *other* tab's logout timer fires — so an idle
|
|
31
|
+
* sibling re-syncs instead of racing the refresh and logging itself out.
|
|
32
|
+
*/ const SESSION_RENEW_MARGIN_MS = 10000;
|
|
33
|
+
/**
|
|
34
|
+
* Keep the admin session alive while the user is active, and end it when they
|
|
35
|
+
* are genuinely idle — without one tab tearing down another.
|
|
36
|
+
*
|
|
37
|
+
* The access token is short-lived (`accessTokenLifespan`, e.g. 30 min) and is
|
|
38
|
+
* meant to be refreshed, not to be the session length. Two timers are armed per
|
|
39
|
+
* token:
|
|
28
40
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
41
|
+
* - Renew (at `exp` minus a margin): if the user interacted during this token's
|
|
42
|
+
* lifetime, silently renew *ahead* of expiry. The new `setToken` re-arms the
|
|
43
|
+
* hook; a server rejection (`onSessionDead`) ends the session globally.
|
|
44
|
+
* Renewing early guarantees the refreshed token reaches shared storage before
|
|
45
|
+
* any sibling tab's logout timer fires.
|
|
46
|
+
* - Logout (just after `exp`): the fallback when this tab did not renew. It
|
|
47
|
+
* first re-syncs from a token another tab refreshed (so an idle tab rides on
|
|
48
|
+
* an active sibling), then renews if activity arrived late, and only otherwise
|
|
49
|
+
* logs out — locally, so idle tabs never force-logout active ones.
|
|
33
50
|
*
|
|
34
|
-
* If the JWT can't be decoded (malformed, missing `exp`), the
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*/ const useIdleSessionLogout = ({ token, onExpired, disabled = false })=>{
|
|
51
|
+
* If the JWT can't be decoded (malformed, missing `exp`), the timers are skipped
|
|
52
|
+
* silently — the active-tab redirect on 401 still covers the symptom on the next
|
|
53
|
+
* user-initiated request.
|
|
54
|
+
*/ const useIdleSessionLogout = ({ token, onExpired, onSessionDead, getStoredToken, onResync, getLastActivityAt, renewSession, disabled = false })=>{
|
|
38
55
|
React__namespace.useEffect(()=>{
|
|
39
56
|
if (!token || disabled) {
|
|
40
57
|
return undefined;
|
|
@@ -43,20 +60,73 @@ const SESSION_EXPIRY_BUFFER_MS = 1000;
|
|
|
43
60
|
if (expiry === null) {
|
|
44
61
|
return undefined;
|
|
45
62
|
}
|
|
46
|
-
|
|
47
|
-
|
|
63
|
+
// When this token became active. Activity recorded after this point means
|
|
64
|
+
// the user was present during the token's lifetime.
|
|
65
|
+
const armedAt = Date.now();
|
|
66
|
+
const wasActive = ()=>typeof getLastActivityAt === 'function' && getLastActivityAt() >= armedAt;
|
|
67
|
+
// Adopt a fresher token another tab wrote to shared storage. Returns true
|
|
68
|
+
// when it re-synced (caller should stop).
|
|
69
|
+
const tryResync = ()=>{
|
|
70
|
+
const storedToken = getStoredToken?.() ?? null;
|
|
71
|
+
if (storedToken && storedToken !== token && onResync) {
|
|
72
|
+
const storedExpiry = jwt.decodeAccessTokenExpiry(storedToken);
|
|
73
|
+
if (storedExpiry !== null && storedExpiry > expiry) {
|
|
74
|
+
onResync(storedToken);
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
79
|
+
};
|
|
80
|
+
const renew = ()=>{
|
|
81
|
+
renewSession().then((renewed)=>{
|
|
82
|
+
if (!renewed) {
|
|
83
|
+
// Server rejected the refresh: the session is truly over.
|
|
84
|
+
(onSessionDead ?? onExpired)();
|
|
85
|
+
}
|
|
86
|
+
// On success, storeToken -> setToken updates the token prop, which
|
|
87
|
+
// re-runs this effect and re-arms against the new exp.
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
// Renew ahead of expiry while the user is active.
|
|
91
|
+
const renewDelay = Math.max(expiry - armedAt - SESSION_RENEW_MARGIN_MS, 0);
|
|
92
|
+
const renewTimeoutId = window.setTimeout(()=>{
|
|
93
|
+
if (tryResync()) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (wasActive() && renewSession) {
|
|
97
|
+
renew();
|
|
98
|
+
}
|
|
99
|
+
}, renewDelay);
|
|
100
|
+
// Fallback decision just after expiry, for tabs that did not renew.
|
|
101
|
+
const logoutDelay = Math.max(expiry - armedAt + SESSION_EXPIRY_BUFFER_MS, 0);
|
|
102
|
+
const logoutTimeoutId = window.setTimeout(()=>{
|
|
103
|
+
if (tryResync()) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (wasActive() && renewSession) {
|
|
107
|
+
renew();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// Genuinely idle: log out only this tab.
|
|
48
111
|
onExpired();
|
|
49
|
-
},
|
|
112
|
+
}, logoutDelay);
|
|
50
113
|
return ()=>{
|
|
51
|
-
window.clearTimeout(
|
|
114
|
+
window.clearTimeout(renewTimeoutId);
|
|
115
|
+
window.clearTimeout(logoutTimeoutId);
|
|
52
116
|
};
|
|
53
117
|
}, [
|
|
54
118
|
token,
|
|
55
119
|
onExpired,
|
|
120
|
+
onSessionDead,
|
|
121
|
+
getStoredToken,
|
|
122
|
+
onResync,
|
|
123
|
+
getLastActivityAt,
|
|
124
|
+
renewSession,
|
|
56
125
|
disabled
|
|
57
126
|
]);
|
|
58
127
|
};
|
|
59
128
|
|
|
60
129
|
exports.SESSION_EXPIRY_BUFFER_MS = SESSION_EXPIRY_BUFFER_MS;
|
|
130
|
+
exports.SESSION_RENEW_MARGIN_MS = SESSION_RENEW_MARGIN_MS;
|
|
61
131
|
exports.useIdleSessionLogout = useIdleSessionLogout;
|
|
62
132
|
//# sourceMappingURL=useIdleSessionLogout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIdleSessionLogout.js","sources":["../../../../../admin/src/hooks/useIdleSessionLogout.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { decodeAccessTokenExpiry } from '../utils/jwt';\n\nconst SESSION_EXPIRY_BUFFER_MS = 1000;\n\ninterface UseIdleSessionLogoutOptions {\n /**\n * The current admin access JWT (from Redux), or `null` when logged out.\n */\n token: string | null;\n /**\n * Called when the timer fires.
|
|
1
|
+
{"version":3,"file":"useIdleSessionLogout.js","sources":["../../../../../admin/src/hooks/useIdleSessionLogout.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { decodeAccessTokenExpiry } from '../utils/jwt';\n\nconst SESSION_EXPIRY_BUFFER_MS = 1000;\n/**\n * How long before the access token's `exp` an active tab renews. Renewing\n * ahead of expiry (rather than at it) means the refreshed token is already in\n * shared storage by the time any *other* tab's logout timer fires — so an idle\n * sibling re-syncs instead of racing the refresh and logging itself out.\n */\nconst SESSION_RENEW_MARGIN_MS = 10_000;\n\ninterface UseIdleSessionLogoutOptions {\n /**\n * The current admin access JWT (from Redux), or `null` when logged out.\n */\n token: string | null;\n /**\n * Called when the timer fires and the user is genuinely idle. Should clear\n * *this tab's* local auth state and navigate to /auth/login. It must NOT\n * broadcast a global logout (e.g. by removing the shared `isLoggedIn` key),\n * otherwise an idle tab firing on a stale token would log out other tabs that\n * are still active — see the cross-tab handling below.\n */\n onExpired: () => void;\n /**\n * Called when a renewal attempt is rejected by the server (the session is\n * truly over: refresh token idle/max window elapsed). This is a\n * server-confirmed end of session, so unlike `onExpired` it SHOULD broadcast\n * a global logout to every tab. Falls back to `onExpired` when omitted.\n */\n onSessionDead?: () => void;\n /**\n * Read the access token currently in shared storage (localStorage/cookie).\n * Because every open tab shares the same refresh cookie, an active tab that\n * refreshes writes a newer access token here. When omitted, the hook never\n * re-syncs across tabs.\n */\n getStoredToken?: () => string | null;\n /**\n * Adopt a newer shared token instead of expiring. Typically dispatches\n * `setToken`, which updates Redux and causes this hook to re-arm against the\n * later `exp`. Only called when `getStoredToken` returns a token whose `exp`\n * is later than the in-memory one.\n */\n onResync?: (token: string) => void;\n /**\n * Epoch ms of the user's last interaction (pointer, key, scroll, …). Used to\n * decide whether to silently renew (active) or log out (idle) when the access\n * token expires. When omitted, the hook always treats expiry as idle.\n */\n getLastActivityAt?: () => number;\n /**\n * Silently renew the session (rotate the refresh token + mint a new access\n * token). Resolves `true` on success — the resulting `setToken` re-arms this\n * hook against the new `exp` — or `false` when the server rejects it. Only\n * called when the user was active during the current token's lifetime.\n */\n renewSession?: () => Promise<boolean>;\n /**\n * Escape hatch for tests / dev environments where we don't want the\n * automatic logout behavior. Mirrors the existing `_disableRenewToken`\n * prop on `<AuthProvider>`.\n */\n disabled?: boolean;\n}\n\n/**\n * Keep the admin session alive while the user is active, and end it when they\n * are genuinely idle — without one tab tearing down another.\n *\n * The access token is short-lived (`accessTokenLifespan`, e.g. 30 min) and is\n * meant to be refreshed, not to be the session length. Two timers are armed per\n * token:\n *\n * - Renew (at `exp` minus a margin): if the user interacted during this token's\n * lifetime, silently renew *ahead* of expiry. The new `setToken` re-arms the\n * hook; a server rejection (`onSessionDead`) ends the session globally.\n * Renewing early guarantees the refreshed token reaches shared storage before\n * any sibling tab's logout timer fires.\n * - Logout (just after `exp`): the fallback when this tab did not renew. It\n * first re-syncs from a token another tab refreshed (so an idle tab rides on\n * an active sibling), then renews if activity arrived late, and only otherwise\n * logs out — locally, so idle tabs never force-logout active ones.\n *\n * If the JWT can't be decoded (malformed, missing `exp`), the timers are skipped\n * silently — the active-tab redirect on 401 still covers the symptom on the next\n * user-initiated request.\n */\nconst useIdleSessionLogout = ({\n token,\n onExpired,\n onSessionDead,\n getStoredToken,\n onResync,\n getLastActivityAt,\n renewSession,\n disabled = false,\n}: UseIdleSessionLogoutOptions): void => {\n React.useEffect(() => {\n if (!token || disabled) {\n return undefined;\n }\n\n const expiry = decodeAccessTokenExpiry(token);\n if (expiry === null) {\n return undefined;\n }\n\n // When this token became active. Activity recorded after this point means\n // the user was present during the token's lifetime.\n const armedAt = Date.now();\n const wasActive = () =>\n typeof getLastActivityAt === 'function' && getLastActivityAt() >= armedAt;\n\n // Adopt a fresher token another tab wrote to shared storage. Returns true\n // when it re-synced (caller should stop).\n const tryResync = (): boolean => {\n const storedToken = getStoredToken?.() ?? null;\n if (storedToken && storedToken !== token && onResync) {\n const storedExpiry = decodeAccessTokenExpiry(storedToken);\n if (storedExpiry !== null && storedExpiry > expiry) {\n onResync(storedToken);\n return true;\n }\n }\n return false;\n };\n\n const renew = () => {\n renewSession!().then((renewed) => {\n if (!renewed) {\n // Server rejected the refresh: the session is truly over.\n (onSessionDead ?? onExpired)();\n }\n // On success, storeToken -> setToken updates the token prop, which\n // re-runs this effect and re-arms against the new exp.\n });\n };\n\n // Renew ahead of expiry while the user is active.\n const renewDelay = Math.max(expiry - armedAt - SESSION_RENEW_MARGIN_MS, 0);\n const renewTimeoutId = window.setTimeout(() => {\n if (tryResync()) {\n return;\n }\n if (wasActive() && renewSession) {\n renew();\n }\n }, renewDelay);\n\n // Fallback decision just after expiry, for tabs that did not renew.\n const logoutDelay = Math.max(expiry - armedAt + SESSION_EXPIRY_BUFFER_MS, 0);\n const logoutTimeoutId = window.setTimeout(() => {\n if (tryResync()) {\n return;\n }\n if (wasActive() && renewSession) {\n renew();\n return;\n }\n // Genuinely idle: log out only this tab.\n onExpired();\n }, logoutDelay);\n\n return () => {\n window.clearTimeout(renewTimeoutId);\n window.clearTimeout(logoutTimeoutId);\n };\n }, [\n token,\n onExpired,\n onSessionDead,\n getStoredToken,\n onResync,\n getLastActivityAt,\n renewSession,\n disabled,\n ]);\n};\n\nexport { useIdleSessionLogout, SESSION_EXPIRY_BUFFER_MS, SESSION_RENEW_MARGIN_MS };\nexport type { UseIdleSessionLogoutOptions };\n"],"names":["SESSION_EXPIRY_BUFFER_MS","SESSION_RENEW_MARGIN_MS","useIdleSessionLogout","token","onExpired","onSessionDead","getStoredToken","onResync","getLastActivityAt","renewSession","disabled","React","useEffect","undefined","expiry","decodeAccessTokenExpiry","armedAt","Date","now","wasActive","tryResync","storedToken","storedExpiry","renew","then","renewed","renewDelay","Math","max","renewTimeoutId","window","setTimeout","logoutDelay","logoutTimeoutId","clearTimeout"],"mappings":"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"}
|
|
@@ -3,17 +3,33 @@ import { decodeAccessTokenExpiry } from '../utils/jwt.mjs';
|
|
|
3
3
|
|
|
4
4
|
const SESSION_EXPIRY_BUFFER_MS = 1000;
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* How long before the access token's `exp` an active tab renews. Renewing
|
|
7
|
+
* ahead of expiry (rather than at it) means the refreshed token is already in
|
|
8
|
+
* shared storage by the time any *other* tab's logout timer fires — so an idle
|
|
9
|
+
* sibling re-syncs instead of racing the refresh and logging itself out.
|
|
10
|
+
*/ const SESSION_RENEW_MARGIN_MS = 10000;
|
|
11
|
+
/**
|
|
12
|
+
* Keep the admin session alive while the user is active, and end it when they
|
|
13
|
+
* are genuinely idle — without one tab tearing down another.
|
|
14
|
+
*
|
|
15
|
+
* The access token is short-lived (`accessTokenLifespan`, e.g. 30 min) and is
|
|
16
|
+
* meant to be refreshed, not to be the session length. Two timers are armed per
|
|
17
|
+
* token:
|
|
7
18
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
19
|
+
* - Renew (at `exp` minus a margin): if the user interacted during this token's
|
|
20
|
+
* lifetime, silently renew *ahead* of expiry. The new `setToken` re-arms the
|
|
21
|
+
* hook; a server rejection (`onSessionDead`) ends the session globally.
|
|
22
|
+
* Renewing early guarantees the refreshed token reaches shared storage before
|
|
23
|
+
* any sibling tab's logout timer fires.
|
|
24
|
+
* - Logout (just after `exp`): the fallback when this tab did not renew. It
|
|
25
|
+
* first re-syncs from a token another tab refreshed (so an idle tab rides on
|
|
26
|
+
* an active sibling), then renews if activity arrived late, and only otherwise
|
|
27
|
+
* logs out — locally, so idle tabs never force-logout active ones.
|
|
12
28
|
*
|
|
13
|
-
* If the JWT can't be decoded (malformed, missing `exp`), the
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*/ const useIdleSessionLogout = ({ token, onExpired, disabled = false })=>{
|
|
29
|
+
* If the JWT can't be decoded (malformed, missing `exp`), the timers are skipped
|
|
30
|
+
* silently — the active-tab redirect on 401 still covers the symptom on the next
|
|
31
|
+
* user-initiated request.
|
|
32
|
+
*/ const useIdleSessionLogout = ({ token, onExpired, onSessionDead, getStoredToken, onResync, getLastActivityAt, renewSession, disabled = false })=>{
|
|
17
33
|
React.useEffect(()=>{
|
|
18
34
|
if (!token || disabled) {
|
|
19
35
|
return undefined;
|
|
@@ -22,19 +38,71 @@ const SESSION_EXPIRY_BUFFER_MS = 1000;
|
|
|
22
38
|
if (expiry === null) {
|
|
23
39
|
return undefined;
|
|
24
40
|
}
|
|
25
|
-
|
|
26
|
-
|
|
41
|
+
// When this token became active. Activity recorded after this point means
|
|
42
|
+
// the user was present during the token's lifetime.
|
|
43
|
+
const armedAt = Date.now();
|
|
44
|
+
const wasActive = ()=>typeof getLastActivityAt === 'function' && getLastActivityAt() >= armedAt;
|
|
45
|
+
// Adopt a fresher token another tab wrote to shared storage. Returns true
|
|
46
|
+
// when it re-synced (caller should stop).
|
|
47
|
+
const tryResync = ()=>{
|
|
48
|
+
const storedToken = getStoredToken?.() ?? null;
|
|
49
|
+
if (storedToken && storedToken !== token && onResync) {
|
|
50
|
+
const storedExpiry = decodeAccessTokenExpiry(storedToken);
|
|
51
|
+
if (storedExpiry !== null && storedExpiry > expiry) {
|
|
52
|
+
onResync(storedToken);
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return false;
|
|
57
|
+
};
|
|
58
|
+
const renew = ()=>{
|
|
59
|
+
renewSession().then((renewed)=>{
|
|
60
|
+
if (!renewed) {
|
|
61
|
+
// Server rejected the refresh: the session is truly over.
|
|
62
|
+
(onSessionDead ?? onExpired)();
|
|
63
|
+
}
|
|
64
|
+
// On success, storeToken -> setToken updates the token prop, which
|
|
65
|
+
// re-runs this effect and re-arms against the new exp.
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
// Renew ahead of expiry while the user is active.
|
|
69
|
+
const renewDelay = Math.max(expiry - armedAt - SESSION_RENEW_MARGIN_MS, 0);
|
|
70
|
+
const renewTimeoutId = window.setTimeout(()=>{
|
|
71
|
+
if (tryResync()) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (wasActive() && renewSession) {
|
|
75
|
+
renew();
|
|
76
|
+
}
|
|
77
|
+
}, renewDelay);
|
|
78
|
+
// Fallback decision just after expiry, for tabs that did not renew.
|
|
79
|
+
const logoutDelay = Math.max(expiry - armedAt + SESSION_EXPIRY_BUFFER_MS, 0);
|
|
80
|
+
const logoutTimeoutId = window.setTimeout(()=>{
|
|
81
|
+
if (tryResync()) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (wasActive() && renewSession) {
|
|
85
|
+
renew();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// Genuinely idle: log out only this tab.
|
|
27
89
|
onExpired();
|
|
28
|
-
},
|
|
90
|
+
}, logoutDelay);
|
|
29
91
|
return ()=>{
|
|
30
|
-
window.clearTimeout(
|
|
92
|
+
window.clearTimeout(renewTimeoutId);
|
|
93
|
+
window.clearTimeout(logoutTimeoutId);
|
|
31
94
|
};
|
|
32
95
|
}, [
|
|
33
96
|
token,
|
|
34
97
|
onExpired,
|
|
98
|
+
onSessionDead,
|
|
99
|
+
getStoredToken,
|
|
100
|
+
onResync,
|
|
101
|
+
getLastActivityAt,
|
|
102
|
+
renewSession,
|
|
35
103
|
disabled
|
|
36
104
|
]);
|
|
37
105
|
};
|
|
38
106
|
|
|
39
|
-
export { SESSION_EXPIRY_BUFFER_MS, useIdleSessionLogout };
|
|
107
|
+
export { SESSION_EXPIRY_BUFFER_MS, SESSION_RENEW_MARGIN_MS, useIdleSessionLogout };
|
|
40
108
|
//# sourceMappingURL=useIdleSessionLogout.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIdleSessionLogout.mjs","sources":["../../../../../admin/src/hooks/useIdleSessionLogout.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { decodeAccessTokenExpiry } from '../utils/jwt';\n\nconst SESSION_EXPIRY_BUFFER_MS = 1000;\n\ninterface UseIdleSessionLogoutOptions {\n /**\n * The current admin access JWT (from Redux), or `null` when logged out.\n */\n token: string | null;\n /**\n * Called when the timer fires.
|
|
1
|
+
{"version":3,"file":"useIdleSessionLogout.mjs","sources":["../../../../../admin/src/hooks/useIdleSessionLogout.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { decodeAccessTokenExpiry } from '../utils/jwt';\n\nconst SESSION_EXPIRY_BUFFER_MS = 1000;\n/**\n * How long before the access token's `exp` an active tab renews. Renewing\n * ahead of expiry (rather than at it) means the refreshed token is already in\n * shared storage by the time any *other* tab's logout timer fires — so an idle\n * sibling re-syncs instead of racing the refresh and logging itself out.\n */\nconst SESSION_RENEW_MARGIN_MS = 10_000;\n\ninterface UseIdleSessionLogoutOptions {\n /**\n * The current admin access JWT (from Redux), or `null` when logged out.\n */\n token: string | null;\n /**\n * Called when the timer fires and the user is genuinely idle. Should clear\n * *this tab's* local auth state and navigate to /auth/login. It must NOT\n * broadcast a global logout (e.g. by removing the shared `isLoggedIn` key),\n * otherwise an idle tab firing on a stale token would log out other tabs that\n * are still active — see the cross-tab handling below.\n */\n onExpired: () => void;\n /**\n * Called when a renewal attempt is rejected by the server (the session is\n * truly over: refresh token idle/max window elapsed). This is a\n * server-confirmed end of session, so unlike `onExpired` it SHOULD broadcast\n * a global logout to every tab. Falls back to `onExpired` when omitted.\n */\n onSessionDead?: () => void;\n /**\n * Read the access token currently in shared storage (localStorage/cookie).\n * Because every open tab shares the same refresh cookie, an active tab that\n * refreshes writes a newer access token here. When omitted, the hook never\n * re-syncs across tabs.\n */\n getStoredToken?: () => string | null;\n /**\n * Adopt a newer shared token instead of expiring. Typically dispatches\n * `setToken`, which updates Redux and causes this hook to re-arm against the\n * later `exp`. Only called when `getStoredToken` returns a token whose `exp`\n * is later than the in-memory one.\n */\n onResync?: (token: string) => void;\n /**\n * Epoch ms of the user's last interaction (pointer, key, scroll, …). Used to\n * decide whether to silently renew (active) or log out (idle) when the access\n * token expires. When omitted, the hook always treats expiry as idle.\n */\n getLastActivityAt?: () => number;\n /**\n * Silently renew the session (rotate the refresh token + mint a new access\n * token). Resolves `true` on success — the resulting `setToken` re-arms this\n * hook against the new `exp` — or `false` when the server rejects it. Only\n * called when the user was active during the current token's lifetime.\n */\n renewSession?: () => Promise<boolean>;\n /**\n * Escape hatch for tests / dev environments where we don't want the\n * automatic logout behavior. Mirrors the existing `_disableRenewToken`\n * prop on `<AuthProvider>`.\n */\n disabled?: boolean;\n}\n\n/**\n * Keep the admin session alive while the user is active, and end it when they\n * are genuinely idle — without one tab tearing down another.\n *\n * The access token is short-lived (`accessTokenLifespan`, e.g. 30 min) and is\n * meant to be refreshed, not to be the session length. Two timers are armed per\n * token:\n *\n * - Renew (at `exp` minus a margin): if the user interacted during this token's\n * lifetime, silently renew *ahead* of expiry. The new `setToken` re-arms the\n * hook; a server rejection (`onSessionDead`) ends the session globally.\n * Renewing early guarantees the refreshed token reaches shared storage before\n * any sibling tab's logout timer fires.\n * - Logout (just after `exp`): the fallback when this tab did not renew. It\n * first re-syncs from a token another tab refreshed (so an idle tab rides on\n * an active sibling), then renews if activity arrived late, and only otherwise\n * logs out — locally, so idle tabs never force-logout active ones.\n *\n * If the JWT can't be decoded (malformed, missing `exp`), the timers are skipped\n * silently — the active-tab redirect on 401 still covers the symptom on the next\n * user-initiated request.\n */\nconst useIdleSessionLogout = ({\n token,\n onExpired,\n onSessionDead,\n getStoredToken,\n onResync,\n getLastActivityAt,\n renewSession,\n disabled = false,\n}: UseIdleSessionLogoutOptions): void => {\n React.useEffect(() => {\n if (!token || disabled) {\n return undefined;\n }\n\n const expiry = decodeAccessTokenExpiry(token);\n if (expiry === null) {\n return undefined;\n }\n\n // When this token became active. Activity recorded after this point means\n // the user was present during the token's lifetime.\n const armedAt = Date.now();\n const wasActive = () =>\n typeof getLastActivityAt === 'function' && getLastActivityAt() >= armedAt;\n\n // Adopt a fresher token another tab wrote to shared storage. Returns true\n // when it re-synced (caller should stop).\n const tryResync = (): boolean => {\n const storedToken = getStoredToken?.() ?? null;\n if (storedToken && storedToken !== token && onResync) {\n const storedExpiry = decodeAccessTokenExpiry(storedToken);\n if (storedExpiry !== null && storedExpiry > expiry) {\n onResync(storedToken);\n return true;\n }\n }\n return false;\n };\n\n const renew = () => {\n renewSession!().then((renewed) => {\n if (!renewed) {\n // Server rejected the refresh: the session is truly over.\n (onSessionDead ?? onExpired)();\n }\n // On success, storeToken -> setToken updates the token prop, which\n // re-runs this effect and re-arms against the new exp.\n });\n };\n\n // Renew ahead of expiry while the user is active.\n const renewDelay = Math.max(expiry - armedAt - SESSION_RENEW_MARGIN_MS, 0);\n const renewTimeoutId = window.setTimeout(() => {\n if (tryResync()) {\n return;\n }\n if (wasActive() && renewSession) {\n renew();\n }\n }, renewDelay);\n\n // Fallback decision just after expiry, for tabs that did not renew.\n const logoutDelay = Math.max(expiry - armedAt + SESSION_EXPIRY_BUFFER_MS, 0);\n const logoutTimeoutId = window.setTimeout(() => {\n if (tryResync()) {\n return;\n }\n if (wasActive() && renewSession) {\n renew();\n return;\n }\n // Genuinely idle: log out only this tab.\n onExpired();\n }, logoutDelay);\n\n return () => {\n window.clearTimeout(renewTimeoutId);\n window.clearTimeout(logoutTimeoutId);\n };\n }, [\n token,\n onExpired,\n onSessionDead,\n getStoredToken,\n onResync,\n getLastActivityAt,\n renewSession,\n disabled,\n ]);\n};\n\nexport { useIdleSessionLogout, SESSION_EXPIRY_BUFFER_MS, SESSION_RENEW_MARGIN_MS };\nexport type { UseIdleSessionLogoutOptions };\n"],"names":["SESSION_EXPIRY_BUFFER_MS","SESSION_RENEW_MARGIN_MS","useIdleSessionLogout","token","onExpired","onSessionDead","getStoredToken","onResync","getLastActivityAt","renewSession","disabled","React","useEffect","undefined","expiry","decodeAccessTokenExpiry","armedAt","Date","now","wasActive","tryResync","storedToken","storedExpiry","renew","then","renewed","renewDelay","Math","max","renewTimeoutId","window","setTimeout","logoutDelay","logoutTimeoutId","clearTimeout"],"mappings":"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"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
var React = require('react');
|
|
4
4
|
|
|
5
|
-
function
|
|
5
|
+
function _interopNamespace(e) {
|
|
6
|
+
if (e && e.__esModule) return e;
|
|
6
7
|
var n = Object.create(null);
|
|
7
8
|
if (e) {
|
|
8
9
|
Object.keys(e).forEach(function (k) {
|
|
@@ -19,7 +20,7 @@ function _interopNamespaceDefault(e) {
|
|
|
19
20
|
return Object.freeze(n);
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
var React__namespace = /*#__PURE__*/
|
|
23
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
23
24
|
|
|
24
25
|
const useIsMounted = ()=>{
|
|
25
26
|
const isMounted = React__namespace.useRef(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIsMounted.js","sources":["../../../../../admin/src/hooks/useIsMounted.ts"],"sourcesContent":["import * as React from 'react';\n\nconst useIsMounted = () => {\n const isMounted = React.useRef(false);\n\n React.useLayoutEffect(() => {\n isMounted.current = true;\n\n return () => {\n isMounted.current = false;\n };\n }, []);\n\n return isMounted;\n};\n\nexport { useIsMounted };\n"],"names":["useIsMounted","isMounted","React","useRef","useLayoutEffect","current"],"mappings":"
|
|
1
|
+
{"version":3,"file":"useIsMounted.js","sources":["../../../../../admin/src/hooks/useIsMounted.ts"],"sourcesContent":["import * as React from 'react';\n\nconst useIsMounted = () => {\n const isMounted = React.useRef(false);\n\n React.useLayoutEffect(() => {\n isMounted.current = true;\n\n return () => {\n isMounted.current = false;\n };\n }, []);\n\n return isMounted;\n};\n\nexport { useIsMounted };\n"],"names":["useIsMounted","isMounted","React","useRef","useLayoutEffect","current"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAMA,YAAAA,GAAe,IAAA;IACnB,MAAMC,SAAAA,GAAYC,gBAAAA,CAAMC,MAAM,CAAC,KAAA,CAAA;AAE/BD,IAAAA,gBAAAA,CAAME,eAAe,CAAC,IAAA;AACpBH,QAAAA,SAAAA,CAAUI,OAAO,GAAG,IAAA;QAEpB,OAAO,IAAA;AACLJ,YAAAA,SAAAA,CAAUI,OAAO,GAAG,KAAA;AACtB,QAAA,CAAA;AACF,IAAA,CAAA,EAAG,EAAE,CAAA;IAEL,OAAOJ,SAAAA;AACT;;;;"}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
var React = require('react');
|
|
4
4
|
var styled = require('styled-components');
|
|
5
5
|
|
|
6
|
-
function
|
|
6
|
+
function _interopNamespace(e) {
|
|
7
|
+
if (e && e.__esModule) return e;
|
|
7
8
|
var n = Object.create(null);
|
|
8
9
|
if (e) {
|
|
9
10
|
Object.keys(e).forEach(function (k) {
|
|
@@ -20,7 +21,7 @@ function _interopNamespaceDefault(e) {
|
|
|
20
21
|
return Object.freeze(n);
|
|
21
22
|
}
|
|
22
23
|
|
|
23
|
-
var React__namespace = /*#__PURE__*/
|
|
24
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
24
25
|
|
|
25
26
|
/**
|
|
26
27
|
* Hook to detect if a media query matches
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMediaQuery.js","sources":["../../../../../admin/src/hooks/useMediaQuery.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useTheme } from 'styled-components';\n\n/**\n * Hook to detect if a media query matches\n * @param query - Media query string (e.g., '(min-width: 768px)' or theme.breakpoints.large)\n * @returns boolean indicating if the media query matches\n */\nexport const useMediaQuery = (query: string): boolean => {\n const cleanQuery = query.replace('@media', '').trim();\n\n const [matches, setMatches] = React.useState(() => window.matchMedia(cleanQuery).matches);\n\n React.useEffect(() => {\n const mediaQuery = window.matchMedia(cleanQuery);\n const handler = (e: MediaQueryListEvent) => setMatches(e.matches);\n\n mediaQuery.addEventListener('change', handler);\n\n return () => mediaQuery.removeEventListener('change', handler);\n }, [cleanQuery]);\n\n return matches;\n};\n\n/**\n * Hook to detect if the current viewport is desktop size\n * Uses the theme's large breakpoint\n */\nexport const useIsDesktop = (): boolean => {\n const theme = useTheme();\n return useMediaQuery(theme.breakpoints.large);\n};\n\n/**\n * Hook to detect if the current viewport is tablet size\n * Uses the theme's medium breakpoint\n */\nexport const useIsTablet = (): boolean => {\n const theme = useTheme();\n const isTabletOrAbove = useMediaQuery(theme.breakpoints.medium);\n const isDesktop = useMediaQuery(theme.breakpoints.large);\n return isTabletOrAbove && !isDesktop;\n};\n\n/**\n * Hook to detect if the current viewport is mobile size\n * Uses the theme's medium breakpoint (inverted)\n */\nexport const useIsMobile = (): boolean => {\n const theme = useTheme();\n return !useMediaQuery(theme.breakpoints.medium);\n};\n"],"names":["useMediaQuery","query","cleanQuery","replace","trim","matches","setMatches","React","useState","window","matchMedia","useEffect","mediaQuery","handler","e","addEventListener","removeEventListener","useIsDesktop","theme","useTheme","breakpoints","large","useIsTablet","isTabletOrAbove","medium","isDesktop","useIsMobile"],"mappings":"
|
|
1
|
+
{"version":3,"file":"useMediaQuery.js","sources":["../../../../../admin/src/hooks/useMediaQuery.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useTheme } from 'styled-components';\n\n/**\n * Hook to detect if a media query matches\n * @param query - Media query string (e.g., '(min-width: 768px)' or theme.breakpoints.large)\n * @returns boolean indicating if the media query matches\n */\nexport const useMediaQuery = (query: string): boolean => {\n const cleanQuery = query.replace('@media', '').trim();\n\n const [matches, setMatches] = React.useState(() => window.matchMedia(cleanQuery).matches);\n\n React.useEffect(() => {\n const mediaQuery = window.matchMedia(cleanQuery);\n const handler = (e: MediaQueryListEvent) => setMatches(e.matches);\n\n mediaQuery.addEventListener('change', handler);\n\n return () => mediaQuery.removeEventListener('change', handler);\n }, [cleanQuery]);\n\n return matches;\n};\n\n/**\n * Hook to detect if the current viewport is desktop size\n * Uses the theme's large breakpoint\n */\nexport const useIsDesktop = (): boolean => {\n const theme = useTheme();\n return useMediaQuery(theme.breakpoints.large);\n};\n\n/**\n * Hook to detect if the current viewport is tablet size\n * Uses the theme's medium breakpoint\n */\nexport const useIsTablet = (): boolean => {\n const theme = useTheme();\n const isTabletOrAbove = useMediaQuery(theme.breakpoints.medium);\n const isDesktop = useMediaQuery(theme.breakpoints.large);\n return isTabletOrAbove && !isDesktop;\n};\n\n/**\n * Hook to detect if the current viewport is mobile size\n * Uses the theme's medium breakpoint (inverted)\n */\nexport const useIsMobile = (): boolean => {\n const theme = useTheme();\n return !useMediaQuery(theme.breakpoints.medium);\n};\n"],"names":["useMediaQuery","query","cleanQuery","replace","trim","matches","setMatches","React","useState","window","matchMedia","useEffect","mediaQuery","handler","e","addEventListener","removeEventListener","useIsDesktop","theme","useTheme","breakpoints","large","useIsTablet","isTabletOrAbove","medium","isDesktop","useIsMobile"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAIA;;;;IAKO,MAAMA,aAAAA,GAAgB,CAACC,KAAAA,GAAAA;AAC5B,IAAA,MAAMC,aAAaD,KAAAA,CAAME,OAAO,CAAC,QAAA,EAAU,IAAIC,IAAI,EAAA;AAEnD,IAAA,MAAM,CAACC,OAAAA,EAASC,UAAAA,CAAW,GAAGC,gBAAAA,CAAMC,QAAQ,CAAC,IAAMC,MAAAA,CAAOC,UAAU,CAACR,UAAAA,CAAAA,CAAYG,OAAO,CAAA;AAExFE,IAAAA,gBAAAA,CAAMI,SAAS,CAAC,IAAA;QACd,MAAMC,UAAAA,GAAaH,MAAAA,CAAOC,UAAU,CAACR,UAAAA,CAAAA;AACrC,QAAA,MAAMW,OAAAA,GAAU,CAACC,CAAAA,GAA2BR,UAAAA,CAAWQ,EAAET,OAAO,CAAA;QAEhEO,UAAAA,CAAWG,gBAAgB,CAAC,QAAA,EAAUF,OAAAA,CAAAA;AAEtC,QAAA,OAAO,IAAMD,UAAAA,CAAWI,mBAAmB,CAAC,QAAA,EAAUH,OAAAA,CAAAA;IACxD,CAAA,EAAG;AAACX,QAAAA;AAAW,KAAA,CAAA;IAEf,OAAOG,OAAAA;AACT;AAEA;;;UAIaY,YAAAA,GAAe,IAAA;AAC1B,IAAA,MAAMC,KAAAA,GAAQC,eAAAA,EAAAA;AACd,IAAA,OAAOnB,aAAAA,CAAckB,KAAAA,CAAME,WAAW,CAACC,KAAK,CAAA;AAC9C;AAEA;;;UAIaC,WAAAA,GAAc,IAAA;AACzB,IAAA,MAAMJ,KAAAA,GAAQC,eAAAA,EAAAA;AACd,IAAA,MAAMI,eAAAA,GAAkBvB,aAAAA,CAAckB,KAAAA,CAAME,WAAW,CAACI,MAAM,CAAA;AAC9D,IAAA,MAAMC,SAAAA,GAAYzB,aAAAA,CAAckB,KAAAA,CAAME,WAAW,CAACC,KAAK,CAAA;AACvD,IAAA,OAAOE,mBAAmB,CAACE,SAAAA;AAC7B;AAEA;;;UAIaC,WAAAA,GAAc,IAAA;AACzB,IAAA,MAAMR,KAAAA,GAAQC,eAAAA,EAAAA;AACd,IAAA,OAAO,CAACnB,aAAAA,CAAckB,KAAAA,CAAME,WAAW,CAACI,MAAM,CAAA;AAChD;;;;;;;"}
|
|
@@ -7,7 +7,10 @@ var hooks = require('../core/store/hooks.js');
|
|
|
7
7
|
var Auth = require('../features/Auth.js');
|
|
8
8
|
var StrapiApp = require('../features/StrapiApp.js');
|
|
9
9
|
|
|
10
|
-
function
|
|
10
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
|
|
12
|
+
function _interopNamespace(e) {
|
|
13
|
+
if (e && e.__esModule) return e;
|
|
11
14
|
var n = Object.create(null);
|
|
12
15
|
if (e) {
|
|
13
16
|
Object.keys(e).forEach(function (k) {
|
|
@@ -24,7 +27,8 @@ function _interopNamespaceDefault(e) {
|
|
|
24
27
|
return Object.freeze(n);
|
|
25
28
|
}
|
|
26
29
|
|
|
27
|
-
var React__namespace = /*#__PURE__*/
|
|
30
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
31
|
+
var cloneDeep__default = /*#__PURE__*/_interopDefault(cloneDeep);
|
|
28
32
|
|
|
29
33
|
const useMenu = (shouldUpdateStrapi)=>{
|
|
30
34
|
const checkUserHasPermissions = Auth.useAuth('useMenu', (state)=>state.checkUserHasPermissions);
|
|
@@ -125,7 +129,7 @@ const useMenu = (shouldUpdateStrapi)=>{
|
|
|
125
129
|
if (settingsLinkIndex === -1) {
|
|
126
130
|
return [];
|
|
127
131
|
}
|
|
128
|
-
const authorizedGeneralLinksClone =
|
|
132
|
+
const authorizedGeneralLinksClone = cloneDeep__default.default(authorizedGeneralSectionLinks);
|
|
129
133
|
authorizedGeneralLinksClone[settingsLinkIndex].notificationsCount = shouldUpdateStrapi ? 1 : 0;
|
|
130
134
|
return authorizedGeneralLinksClone;
|
|
131
135
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMenu.js","sources":["../../../../../admin/src/hooks/useMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Cog, ShoppingCart, House } from '@strapi/icons';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { useAuth, AuthContextValue } from '../features/Auth';\nimport { StrapiAppContextValue, useStrapiApp } from '../features/StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * useMenu\n * -----------------------------------------------------------------------------------------------*/\n\nexport type MenuItem = Omit<StrapiAppContextValue['menu'][number], 'Component'> & {\n navigationLink?: string;\n};\nexport type MobileMenuItem = {\n to: string;\n target?: string;\n link?: string;\n};\n\nexport interface Menu {\n generalSectionLinks: MenuItem[];\n pluginsSectionLinks: MenuItem[];\n topMobileNavigation: MobileMenuItem[];\n burgerMobileNavigation: MobileMenuItem[];\n isLoading: boolean;\n}\n\nconst useMenu = (shouldUpdateStrapi: boolean) => {\n const checkUserHasPermissions = useAuth('useMenu', (state) => state.checkUserHasPermissions);\n const rawMenu = useStrapiApp('useMenu', (state) => state.menu);\n const menu = React.useMemo(() => normalizeMenuLinks(rawMenu), [rawMenu]);\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [menuWithUserPermissions, setMenuWithUserPermissions] = React.useState<Menu>({\n generalSectionLinks: [\n {\n icon: House,\n intlLabel: {\n id: 'global.home',\n defaultMessage: 'Home',\n },\n to: '/',\n permissions: [],\n position: 0,\n },\n {\n icon: ShoppingCart,\n intlLabel: {\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n },\n to: 'https://market.strapi.io',\n target: '_blank',\n permissions: permissions.marketplace?.main ?? [],\n position: 7,\n },\n {\n icon: Cog,\n intlLabel: {\n id: 'global.settings',\n defaultMessage: 'Settings',\n },\n to: '/settings',\n // Permissions of this link are retrieved in the init phase\n // using the settings menu\n permissions: [],\n notificationsCount: 0,\n position: 9,\n },\n ],\n pluginsSectionLinks: [],\n topMobileNavigation: [\n {\n to: '/',\n },\n {\n to: 'content-manager',\n },\n {\n to: 'plugins/content-releases',\n },\n {\n to: 'plugins/upload',\n },\n ],\n burgerMobileNavigation: [\n {\n to: '/settings',\n },\n ],\n isLoading: true,\n });\n const generalSectionLinksRef = React.useRef(menuWithUserPermissions.generalSectionLinks);\n\n React.useEffect(() => {\n async function applyMenuPermissions() {\n const authorizedPluginSectionLinks = await getPluginSectionLinks(\n menu,\n checkUserHasPermissions\n );\n\n const authorizedGeneralSectionLinks = await getGeneralLinks(\n generalSectionLinksRef.current,\n shouldUpdateStrapi,\n checkUserHasPermissions\n );\n\n setMenuWithUserPermissions((state) => ({\n ...state,\n generalSectionLinks: authorizedGeneralSectionLinks,\n pluginsSectionLinks: authorizedPluginSectionLinks,\n isLoading: false,\n }));\n }\n\n applyMenuPermissions();\n }, [\n setMenuWithUserPermissions,\n generalSectionLinksRef,\n menu,\n permissions,\n shouldUpdateStrapi,\n checkUserHasPermissions,\n ]);\n\n return menuWithUserPermissions;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Utils\n * -----------------------------------------------------------------------------------------------*/\n\nconst getGeneralLinks = async (\n generalSectionRawLinks: MenuItem[],\n shouldUpdateStrapi: boolean = false,\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const generalSectionLinks = normalizeMenuLinks(generalSectionRawLinks);\n const generalSectionLinksPermissions = await Promise.all(\n generalSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedGeneralSectionLinks = generalSectionLinks.filter(\n (_, index) => generalSectionLinksPermissions[index].length > 0\n );\n\n const settingsLinkIndex = authorizedGeneralSectionLinks.findIndex(\n (obj) => obj.to === '/settings'\n );\n\n if (settingsLinkIndex === -1) {\n return [];\n }\n\n const authorizedGeneralLinksClone = cloneDeep(authorizedGeneralSectionLinks);\n\n authorizedGeneralLinksClone[settingsLinkIndex].notificationsCount = shouldUpdateStrapi ? 1 : 0;\n\n return authorizedGeneralLinksClone;\n};\n\nconst getPluginSectionLinks = async (\n pluginsSectionRawLinks: MenuItem[],\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const pluginSectionLinks = normalizeMenuLinks(pluginsSectionRawLinks);\n const pluginSectionLinksPermissions = await Promise.all(\n pluginSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedPluginSectionLinks = pluginSectionLinks.filter(\n (_, index) => pluginSectionLinksPermissions[index].length > 0\n );\n\n return authorizedPluginSectionLinks;\n};\n\nconst normalizeMenuLinks = (links: unknown): MenuItem[] => {\n if (!Array.isArray(links)) {\n return [];\n }\n\n const isValidIcon = (icon: unknown) => {\n if (typeof icon === 'string' || typeof icon === 'function' || React.isValidElement(icon)) {\n return true;\n }\n\n if (!icon || typeof icon !== 'object') {\n return false;\n }\n\n const reactType = (icon as { $$typeof?: symbol }).$$typeof;\n\n return (\n reactType === Symbol.for('react.forward_ref') ||\n reactType === Symbol.for('react.memo') ||\n reactType === Symbol.for('react.lazy')\n );\n };\n\n return links.reduce<MenuItem[]>((acc, link) => {\n if (!link || typeof link !== 'object') {\n return acc;\n }\n\n const candidate = link as Partial<MenuItem>;\n\n if (\n typeof candidate.to !== 'string' ||\n !isValidIcon(candidate.icon) ||\n typeof candidate.intlLabel?.id !== 'string' ||\n typeof candidate.intlLabel.defaultMessage !== 'string'\n ) {\n return acc;\n }\n\n acc.push({\n ...candidate,\n permissions: Array.isArray(candidate.permissions) ? candidate.permissions : [],\n } as MenuItem);\n\n return acc;\n }, []);\n};\n\nexport { useMenu, normalizeMenuLinks };\n"],"names":["useMenu","shouldUpdateStrapi","checkUserHasPermissions","useAuth","state","rawMenu","useStrapiApp","menu","React","useMemo","normalizeMenuLinks","permissions","useTypedSelector","admin_app","menuWithUserPermissions","setMenuWithUserPermissions","useState","generalSectionLinks","icon","House","intlLabel","id","defaultMessage","to","position","ShoppingCart","target","marketplace","main","Cog","notificationsCount","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","isLoading","generalSectionLinksRef","useRef","useEffect","applyMenuPermissions","authorizedPluginSectionLinks","getPluginSectionLinks","authorizedGeneralSectionLinks","getGeneralLinks","current","generalSectionRawLinks","generalSectionLinksPermissions","Promise","all","map","filter","_","index","length","settingsLinkIndex","findIndex","obj","authorizedGeneralLinksClone","cloneDeep","pluginsSectionRawLinks","pluginSectionLinks","pluginSectionLinksPermissions","links","Array","isArray","isValidIcon","isValidElement","reactType","$$typeof","Symbol","for","reduce","acc","link","candidate","push"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useMenu.js","sources":["../../../../../admin/src/hooks/useMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Cog, ShoppingCart, House } from '@strapi/icons';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { useAuth, AuthContextValue } from '../features/Auth';\nimport { StrapiAppContextValue, useStrapiApp } from '../features/StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * useMenu\n * -----------------------------------------------------------------------------------------------*/\n\nexport type MenuItem = Omit<StrapiAppContextValue['menu'][number], 'Component'> & {\n navigationLink?: string;\n};\nexport type MobileMenuItem = {\n to: string;\n target?: string;\n link?: string;\n};\n\nexport interface Menu {\n generalSectionLinks: MenuItem[];\n pluginsSectionLinks: MenuItem[];\n topMobileNavigation: MobileMenuItem[];\n burgerMobileNavigation: MobileMenuItem[];\n isLoading: boolean;\n}\n\nconst useMenu = (shouldUpdateStrapi: boolean) => {\n const checkUserHasPermissions = useAuth('useMenu', (state) => state.checkUserHasPermissions);\n const rawMenu = useStrapiApp('useMenu', (state) => state.menu);\n const menu = React.useMemo(() => normalizeMenuLinks(rawMenu), [rawMenu]);\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [menuWithUserPermissions, setMenuWithUserPermissions] = React.useState<Menu>({\n generalSectionLinks: [\n {\n icon: House,\n intlLabel: {\n id: 'global.home',\n defaultMessage: 'Home',\n },\n to: '/',\n permissions: [],\n position: 0,\n },\n {\n icon: ShoppingCart,\n intlLabel: {\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n },\n to: 'https://market.strapi.io',\n target: '_blank',\n permissions: permissions.marketplace?.main ?? [],\n position: 7,\n },\n {\n icon: Cog,\n intlLabel: {\n id: 'global.settings',\n defaultMessage: 'Settings',\n },\n to: '/settings',\n // Permissions of this link are retrieved in the init phase\n // using the settings menu\n permissions: [],\n notificationsCount: 0,\n position: 9,\n },\n ],\n pluginsSectionLinks: [],\n topMobileNavigation: [\n {\n to: '/',\n },\n {\n to: 'content-manager',\n },\n {\n to: 'plugins/content-releases',\n },\n {\n to: 'plugins/upload',\n },\n ],\n burgerMobileNavigation: [\n {\n to: '/settings',\n },\n ],\n isLoading: true,\n });\n const generalSectionLinksRef = React.useRef(menuWithUserPermissions.generalSectionLinks);\n\n React.useEffect(() => {\n async function applyMenuPermissions() {\n const authorizedPluginSectionLinks = await getPluginSectionLinks(\n menu,\n checkUserHasPermissions\n );\n\n const authorizedGeneralSectionLinks = await getGeneralLinks(\n generalSectionLinksRef.current,\n shouldUpdateStrapi,\n checkUserHasPermissions\n );\n\n setMenuWithUserPermissions((state) => ({\n ...state,\n generalSectionLinks: authorizedGeneralSectionLinks,\n pluginsSectionLinks: authorizedPluginSectionLinks,\n isLoading: false,\n }));\n }\n\n applyMenuPermissions();\n }, [\n setMenuWithUserPermissions,\n generalSectionLinksRef,\n menu,\n permissions,\n shouldUpdateStrapi,\n checkUserHasPermissions,\n ]);\n\n return menuWithUserPermissions;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Utils\n * -----------------------------------------------------------------------------------------------*/\n\nconst getGeneralLinks = async (\n generalSectionRawLinks: MenuItem[],\n shouldUpdateStrapi: boolean = false,\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const generalSectionLinks = normalizeMenuLinks(generalSectionRawLinks);\n const generalSectionLinksPermissions = await Promise.all(\n generalSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedGeneralSectionLinks = generalSectionLinks.filter(\n (_, index) => generalSectionLinksPermissions[index].length > 0\n );\n\n const settingsLinkIndex = authorizedGeneralSectionLinks.findIndex(\n (obj) => obj.to === '/settings'\n );\n\n if (settingsLinkIndex === -1) {\n return [];\n }\n\n const authorizedGeneralLinksClone = cloneDeep(authorizedGeneralSectionLinks);\n\n authorizedGeneralLinksClone[settingsLinkIndex].notificationsCount = shouldUpdateStrapi ? 1 : 0;\n\n return authorizedGeneralLinksClone;\n};\n\nconst getPluginSectionLinks = async (\n pluginsSectionRawLinks: MenuItem[],\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const pluginSectionLinks = normalizeMenuLinks(pluginsSectionRawLinks);\n const pluginSectionLinksPermissions = await Promise.all(\n pluginSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedPluginSectionLinks = pluginSectionLinks.filter(\n (_, index) => pluginSectionLinksPermissions[index].length > 0\n );\n\n return authorizedPluginSectionLinks;\n};\n\nconst normalizeMenuLinks = (links: unknown): MenuItem[] => {\n if (!Array.isArray(links)) {\n return [];\n }\n\n const isValidIcon = (icon: unknown) => {\n if (typeof icon === 'string' || typeof icon === 'function' || React.isValidElement(icon)) {\n return true;\n }\n\n if (!icon || typeof icon !== 'object') {\n return false;\n }\n\n const reactType = (icon as { $$typeof?: symbol }).$$typeof;\n\n return (\n reactType === Symbol.for('react.forward_ref') ||\n reactType === Symbol.for('react.memo') ||\n reactType === Symbol.for('react.lazy')\n );\n };\n\n return links.reduce<MenuItem[]>((acc, link) => {\n if (!link || typeof link !== 'object') {\n return acc;\n }\n\n const candidate = link as Partial<MenuItem>;\n\n if (\n typeof candidate.to !== 'string' ||\n !isValidIcon(candidate.icon) ||\n typeof candidate.intlLabel?.id !== 'string' ||\n typeof candidate.intlLabel.defaultMessage !== 'string'\n ) {\n return acc;\n }\n\n acc.push({\n ...candidate,\n permissions: Array.isArray(candidate.permissions) ? candidate.permissions : [],\n } as MenuItem);\n\n return acc;\n }, []);\n};\n\nexport { useMenu, normalizeMenuLinks };\n"],"names":["useMenu","shouldUpdateStrapi","checkUserHasPermissions","useAuth","state","rawMenu","useStrapiApp","menu","React","useMemo","normalizeMenuLinks","permissions","useTypedSelector","admin_app","menuWithUserPermissions","setMenuWithUserPermissions","useState","generalSectionLinks","icon","House","intlLabel","id","defaultMessage","to","position","ShoppingCart","target","marketplace","main","Cog","notificationsCount","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","isLoading","generalSectionLinksRef","useRef","useEffect","applyMenuPermissions","authorizedPluginSectionLinks","getPluginSectionLinks","authorizedGeneralSectionLinks","getGeneralLinks","current","generalSectionRawLinks","generalSectionLinksPermissions","Promise","all","map","filter","_","index","length","settingsLinkIndex","findIndex","obj","authorizedGeneralLinksClone","cloneDeep","pluginsSectionRawLinks","pluginSectionLinks","pluginSectionLinksPermissions","links","Array","isArray","isValidIcon","isValidElement","reactType","$$typeof","Symbol","for","reduce","acc","link","candidate","push"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,MAAMA,UAAU,CAACC,kBAAAA,GAAAA;AACf,IAAA,MAAMC,0BAA0BC,YAAAA,CAAQ,SAAA,EAAW,CAACC,KAAAA,GAAUA,MAAMF,uBAAuB,CAAA;AAC3F,IAAA,MAAMG,UAAUC,sBAAAA,CAAa,SAAA,EAAW,CAACF,KAAAA,GAAUA,MAAMG,IAAI,CAAA;AAC7D,IAAA,MAAMA,OAAOC,gBAAAA,CAAMC,OAAO,CAAC,IAAMC,mBAAmBL,OAAAA,CAAAA,EAAU;AAACA,QAAAA;AAAQ,KAAA,CAAA;AACvE,IAAA,MAAMM,cAAcC,sBAAAA,CAAiB,CAACR,QAAUA,KAAAA,CAAMS,SAAS,CAACF,WAAW,CAAA;AAC3E,IAAA,MAAM,CAACG,uBAAAA,EAAyBC,0BAAAA,CAA2B,GAAGP,gBAAAA,CAAMQ,QAAQ,CAAO;QACjFC,mBAAAA,EAAqB;AACnB,YAAA;gBACEC,IAAAA,EAAMC,WAAAA;gBACNC,SAAAA,EAAW;oBACTC,EAAAA,EAAI,aAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA;gBACAC,EAAAA,EAAI,GAAA;AACJZ,gBAAAA,WAAAA,EAAa,EAAE;gBACfa,QAAAA,EAAU;AACZ,aAAA;AACA,YAAA;gBACEN,IAAAA,EAAMO,kBAAAA;gBACNL,SAAAA,EAAW;oBACTC,EAAAA,EAAI,oBAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA;gBACAC,EAAAA,EAAI,0BAAA;gBACJG,MAAAA,EAAQ,QAAA;AACRf,gBAAAA,WAAAA,EAAaA,WAAAA,CAAYgB,WAAW,EAAEC,IAAAA,IAAQ,EAAE;gBAChDJ,QAAAA,EAAU;AACZ,aAAA;AACA,YAAA;gBACEN,IAAAA,EAAMW,SAAAA;gBACNT,SAAAA,EAAW;oBACTC,EAAAA,EAAI,iBAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA;gBACAC,EAAAA,EAAI,WAAA;;;AAGJZ,gBAAAA,WAAAA,EAAa,EAAE;gBACfmB,kBAAAA,EAAoB,CAAA;gBACpBN,QAAAA,EAAU;AACZ;AACD,SAAA;AACDO,QAAAA,mBAAAA,EAAqB,EAAE;QACvBC,mBAAAA,EAAqB;AACnB,YAAA;gBACET,EAAAA,EAAI;AACN,aAAA;AACA,YAAA;gBACEA,EAAAA,EAAI;AACN,aAAA;AACA,YAAA;gBACEA,EAAAA,EAAI;AACN,aAAA;AACA,YAAA;gBACEA,EAAAA,EAAI;AACN;AACD,SAAA;QACDU,sBAAAA,EAAwB;AACtB,YAAA;gBACEV,EAAAA,EAAI;AACN;AACD,SAAA;QACDW,SAAAA,EAAW;AACb,KAAA,CAAA;AACA,IAAA,MAAMC,sBAAAA,GAAyB3B,gBAAAA,CAAM4B,MAAM,CAACtB,wBAAwBG,mBAAmB,CAAA;AAEvFT,IAAAA,gBAAAA,CAAM6B,SAAS,CAAC,IAAA;QACd,eAAeC,oBAAAA,GAAAA;YACb,MAAMC,4BAAAA,GAA+B,MAAMC,qBAAAA,CACzCjC,IAAAA,EACAL,uBAAAA,CAAAA;AAGF,YAAA,MAAMuC,gCAAgC,MAAMC,eAAAA,CAC1CP,sBAAAA,CAAuBQ,OAAO,EAC9B1C,kBAAAA,EACAC,uBAAAA,CAAAA;YAGFa,0BAAAA,CAA2B,CAACX,SAAW;AACrC,oBAAA,GAAGA,KAAK;oBACRa,mBAAAA,EAAqBwB,6BAAAA;oBACrBV,mBAAAA,EAAqBQ,4BAAAA;oBACrBL,SAAAA,EAAW;iBACb,CAAA,CAAA;AACF,QAAA;AAEAI,QAAAA,oBAAAA,EAAAA;IACF,CAAA,EAAG;AACDvB,QAAAA,0BAAAA;AACAoB,QAAAA,sBAAAA;AACA5B,QAAAA,IAAAA;AACAI,QAAAA,WAAAA;AACAV,QAAAA,kBAAAA;AACAC,QAAAA;AACD,KAAA,CAAA;IAED,OAAOY,uBAAAA;AACT;AAEA;;AAEkG,qGAElG,MAAM4B,eAAAA,GAAkB,OACtBE,sBAAAA,EACA3C,kBAAAA,GAA8B,KAAK,EACnCC,uBAAAA,GAAAA;AAEA,IAAA,MAAMe,sBAAsBP,kBAAAA,CAAmBkC,sBAAAA,CAAAA;AAC/C,IAAA,MAAMC,8BAAAA,GAAiC,MAAMC,OAAAA,CAAQC,GAAG,CACtD9B,mBAAAA,CAAoB+B,GAAG,CAAC,CAAC,EAAErC,WAAW,EAAE,GAAKT,uBAAAA,CAAwBS,WAAAA,CAAAA,CAAAA,CAAAA;AAGvE,IAAA,MAAM8B,6BAAAA,GAAgCxB,mBAAAA,CAAoBgC,MAAM,CAC9D,CAACC,CAAAA,EAAGC,KAAAA,GAAUN,8BAA8B,CAACM,KAAAA,CAAM,CAACC,MAAM,GAAG,CAAA,CAAA;IAG/D,MAAMC,iBAAAA,GAAoBZ,8BAA8Ba,SAAS,CAC/D,CAACC,GAAAA,GAAQA,GAAAA,CAAIhC,EAAE,KAAK,WAAA,CAAA;IAGtB,IAAI8B,iBAAAA,KAAsB,EAAC,EAAG;AAC5B,QAAA,OAAO,EAAE;AACX,IAAA;AAEA,IAAA,MAAMG,8BAA8BC,0BAAAA,CAAUhB,6BAAAA,CAAAA;AAE9Ce,IAAAA,2BAA2B,CAACH,iBAAAA,CAAkB,CAACvB,kBAAkB,GAAG7B,qBAAqB,CAAA,GAAI,CAAA;IAE7F,OAAOuD,2BAAAA;AACT,CAAA;AAEA,MAAMhB,qBAAAA,GAAwB,OAC5BkB,sBAAAA,EACAxD,uBAAAA,GAAAA;AAEA,IAAA,MAAMyD,qBAAqBjD,kBAAAA,CAAmBgD,sBAAAA,CAAAA;AAC9C,IAAA,MAAME,6BAAAA,GAAgC,MAAMd,OAAAA,CAAQC,GAAG,CACrDY,kBAAAA,CAAmBX,GAAG,CAAC,CAAC,EAAErC,WAAW,EAAE,GAAKT,uBAAAA,CAAwBS,WAAAA,CAAAA,CAAAA,CAAAA;AAGtE,IAAA,MAAM4B,4BAAAA,GAA+BoB,kBAAAA,CAAmBV,MAAM,CAC5D,CAACC,CAAAA,EAAGC,KAAAA,GAAUS,6BAA6B,CAACT,KAAAA,CAAM,CAACC,MAAM,GAAG,CAAA,CAAA;IAG9D,OAAOb,4BAAAA;AACT,CAAA;AAEA,MAAM7B,qBAAqB,CAACmD,KAAAA,GAAAA;AAC1B,IAAA,IAAI,CAACC,KAAAA,CAAMC,OAAO,CAACF,KAAAA,CAAAA,EAAQ;AACzB,QAAA,OAAO,EAAE;AACX,IAAA;AAEA,IAAA,MAAMG,cAAc,CAAC9C,IAAAA,GAAAA;QACnB,IAAI,OAAOA,SAAS,QAAA,IAAY,OAAOA,SAAS,UAAA,IAAcV,gBAAAA,CAAMyD,cAAc,CAAC/C,IAAAA,CAAAA,EAAO;YACxF,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,IAAI,CAACA,IAAAA,IAAQ,OAAOA,IAAAA,KAAS,QAAA,EAAU;YACrC,OAAO,KAAA;AACT,QAAA;QAEA,MAAMgD,SAAAA,GAAY,IAAChD,CAA+BiD,QAAQ;AAE1D,QAAA,OACED,SAAAA,KAAcE,MAAAA,CAAOC,GAAG,CAAC,mBAAA,CAAA,IACzBH,SAAAA,KAAcE,MAAAA,CAAOC,GAAG,CAAC,YAAA,CAAA,IACzBH,SAAAA,KAAcE,MAAAA,CAAOC,GAAG,CAAC,YAAA,CAAA;AAE7B,IAAA,CAAA;AAEA,IAAA,OAAOR,KAAAA,CAAMS,MAAM,CAAa,CAACC,GAAAA,EAAKC,IAAAA,GAAAA;AACpC,QAAA,IAAI,CAACA,IAAAA,IAAQ,OAAOA,IAAAA,KAAS,QAAA,EAAU;YACrC,OAAOD,GAAAA;AACT,QAAA;AAEA,QAAA,MAAME,SAAAA,GAAYD,IAAAA;QAElB,IACE,OAAOC,UAAUlD,EAAE,KAAK,YACxB,CAACyC,WAAAA,CAAYS,SAAAA,CAAUvD,IAAI,CAAA,IAC3B,OAAOuD,UAAUrD,SAAS,EAAEC,OAAO,QAAA,IACnC,OAAOoD,UAAUrD,SAAS,CAACE,cAAc,KAAK,QAAA,EAC9C;YACA,OAAOiD,GAAAA;AACT,QAAA;AAEAA,QAAAA,GAAAA,CAAIG,IAAI,CAAC;AACP,YAAA,GAAGD,SAAS;YACZ9D,WAAAA,EAAamD,KAAAA,CAAMC,OAAO,CAACU,SAAAA,CAAU9D,WAAW,CAAA,GAAI8D,SAAAA,CAAU9D,WAAW,GAAG;AAC9E,SAAA,CAAA;QAEA,OAAO4D,GAAAA;AACT,IAAA,CAAA,EAAG,EAAE,CAAA;AACP;;;;;"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
var React = require('react');
|
|
4
4
|
|
|
5
|
-
function
|
|
5
|
+
function _interopNamespace(e) {
|
|
6
|
+
if (e && e.__esModule) return e;
|
|
6
7
|
var n = Object.create(null);
|
|
7
8
|
if (e) {
|
|
8
9
|
Object.keys(e).forEach(function (k) {
|
|
@@ -19,7 +20,7 @@ function _interopNamespaceDefault(e) {
|
|
|
19
20
|
return Object.freeze(n);
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
var React__namespace = /*#__PURE__*/
|
|
23
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
23
24
|
|
|
24
25
|
const useOnce = (effect)=>React__namespace.useEffect(effect, emptyDeps);
|
|
25
26
|
const emptyDeps = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOnce.js","sources":["../../../../../admin/src/hooks/useOnce.ts"],"sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\nimport * as React from 'react';\n\nexport const useOnce = (effect: React.EffectCallback) => React.useEffect(effect, emptyDeps);\n\nconst emptyDeps: React.DependencyList = [];\n"],"names":["useOnce","effect","React","useEffect","emptyDeps"],"mappings":"
|
|
1
|
+
{"version":3,"file":"useOnce.js","sources":["../../../../../admin/src/hooks/useOnce.ts"],"sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\nimport * as React from 'react';\n\nexport const useOnce = (effect: React.EffectCallback) => React.useEffect(effect, emptyDeps);\n\nconst emptyDeps: React.DependencyList = [];\n"],"names":["useOnce","effect","React","useEffect","emptyDeps"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAGO,MAAMA,UAAU,CAACC,MAAAA,GAAiCC,iBAAMC,SAAS,CAACF,QAAQG,SAAAA;AAEjF,MAAMA,YAAkC,EAAE;;;;"}
|
|
@@ -34,7 +34,6 @@ const useQueryParams = (initialParams)=>{
|
|
|
34
34
|
if (method === 'remove') {
|
|
35
35
|
Object.keys(nextParams).forEach((key)=>{
|
|
36
36
|
if (Object.prototype.hasOwnProperty.call(nextQuery, key)) {
|
|
37
|
-
// @ts-expect-error – this is fine, if you want to fix it, please do.
|
|
38
37
|
delete nextQuery[key];
|
|
39
38
|
}
|
|
40
39
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQueryParams.js","sources":["../../../../../admin/src/hooks/useQueryParams.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\n\nimport { parse, stringify } from 'qs';\nimport { useNavigate, useLocation } from 'react-router-dom';\n\nconst useSearch = () => {\n const { search } = useLocation();\n\n return useMemo(() => search, [search]);\n};\n\nconst useQueryParams = <TQuery extends object>(initialParams?: TQuery) => {\n const search = useSearch();\n const navigate = useNavigate();\n\n const query = useMemo(() => {\n // TODO: investigate why sometimes we're getting the search with a leading `?` and sometimes not.\n const searchQuery = search.startsWith('?') ? search.slice(1) : search;\n if (!search && initialParams) {\n return initialParams;\n }\n\n return { ...initialParams, ...parse(searchQuery) } as TQuery;\n }, [search, initialParams]);\n\n const setQuery = useCallback(\n (nextParams: TQuery, method: 'push' | 'remove' = 'push', replace = false) => {\n let nextQuery = { ...query };\n\n if (method === 'remove') {\n Object.keys(nextParams).forEach((key) => {\n if (Object.prototype.hasOwnProperty.call(nextQuery, key)) {\n
|
|
1
|
+
{"version":3,"file":"useQueryParams.js","sources":["../../../../../admin/src/hooks/useQueryParams.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\n\nimport { parse, stringify } from 'qs';\nimport { useNavigate, useLocation } from 'react-router-dom';\n\nconst useSearch = () => {\n const { search } = useLocation();\n\n return useMemo(() => search, [search]);\n};\n\nconst useQueryParams = <TQuery extends object>(initialParams?: TQuery) => {\n const search = useSearch();\n const navigate = useNavigate();\n\n const query = useMemo(() => {\n // TODO: investigate why sometimes we're getting the search with a leading `?` and sometimes not.\n const searchQuery = search.startsWith('?') ? search.slice(1) : search;\n if (!search && initialParams) {\n return initialParams;\n }\n\n return { ...initialParams, ...parse(searchQuery) } as TQuery;\n }, [search, initialParams]);\n\n const setQuery = useCallback(\n (nextParams: TQuery, method: 'push' | 'remove' = 'push', replace = false) => {\n let nextQuery: Partial<TQuery> = { ...query };\n\n if (method === 'remove') {\n Object.keys(nextParams).forEach((key) => {\n if (Object.prototype.hasOwnProperty.call(nextQuery, key)) {\n delete nextQuery[key as keyof TQuery];\n }\n });\n } else {\n nextQuery = { ...query, ...nextParams };\n }\n\n navigate({ search: stringify(nextQuery, { encode: false }) }, { replace });\n },\n [navigate, query]\n );\n\n return [{ query, rawQuery: search }, setQuery] as const;\n};\n\nexport { useQueryParams };\n"],"names":["useSearch","search","useLocation","useMemo","useQueryParams","initialParams","navigate","useNavigate","query","searchQuery","startsWith","slice","parse","setQuery","useCallback","nextParams","method","replace","nextQuery","Object","keys","forEach","key","prototype","hasOwnProperty","call","stringify","encode","rawQuery"],"mappings":";;;;;;AAKA,MAAMA,SAAAA,GAAY,IAAA;IAChB,MAAM,EAAEC,MAAM,EAAE,GAAGC,0BAAAA,EAAAA;IAEnB,OAAOC,aAAAA,CAAQ,IAAMF,MAAAA,EAAQ;AAACA,QAAAA;AAAO,KAAA,CAAA;AACvC,CAAA;AAEA,MAAMG,iBAAiB,CAAwBC,aAAAA,GAAAA;AAC7C,IAAA,MAAMJ,MAAAA,GAASD,SAAAA,EAAAA;AACf,IAAA,MAAMM,QAAAA,GAAWC,0BAAAA,EAAAA;AAEjB,IAAA,MAAMC,QAAQL,aAAAA,CAAQ,IAAA;;QAEpB,MAAMM,WAAAA,GAAcR,OAAOS,UAAU,CAAC,OAAOT,MAAAA,CAAOU,KAAK,CAAC,CAAA,CAAA,GAAKV,MAAAA;QAC/D,IAAI,CAACA,UAAUI,aAAAA,EAAe;YAC5B,OAAOA,aAAAA;AACT,QAAA;QAEA,OAAO;AAAE,YAAA,GAAGA,aAAa;AAAE,YAAA,GAAGO,SAAMH,WAAAA;AAAa,SAAA;IACnD,CAAA,EAAG;AAACR,QAAAA,MAAAA;AAAQI,QAAAA;AAAc,KAAA,CAAA;IAE1B,MAAMQ,QAAAA,GAAWC,kBACf,CAACC,UAAAA,EAAoBC,SAA4B,MAAM,EAAEC,UAAU,KAAK,GAAA;AACtE,QAAA,IAAIC,SAAAA,GAA6B;AAAE,YAAA,GAAGV;AAAM,SAAA;AAE5C,QAAA,IAAIQ,WAAW,QAAA,EAAU;AACvBG,YAAAA,MAAAA,CAAOC,IAAI,CAACL,UAAAA,CAAAA,CAAYM,OAAO,CAAC,CAACC,GAAAA,GAAAA;gBAC/B,IAAIH,MAAAA,CAAOI,SAAS,CAACC,cAAc,CAACC,IAAI,CAACP,WAAWI,GAAAA,CAAAA,EAAM;oBACxD,OAAOJ,SAAS,CAACI,GAAAA,CAAoB;AACvC,gBAAA;AACF,YAAA,CAAA,CAAA;QACF,CAAA,MAAO;YACLJ,SAAAA,GAAY;AAAE,gBAAA,GAAGV,KAAK;AAAE,gBAAA,GAAGO;AAAW,aAAA;AACxC,QAAA;QAEAT,QAAAA,CAAS;AAAEL,YAAAA,MAAAA,EAAQyB,aAAUR,SAAAA,EAAW;gBAAES,MAAAA,EAAQ;AAAM,aAAA;SAAG,EAAG;AAAEV,YAAAA;AAAQ,SAAA,CAAA;IAC1E,CAAA,EACA;AAACX,QAAAA,QAAAA;AAAUE,QAAAA;AAAM,KAAA,CAAA;IAGnB,OAAO;AAAC,QAAA;AAAEA,YAAAA,KAAAA;YAAOoB,QAAAA,EAAU3B;AAAO,SAAA;AAAGY,QAAAA;AAAS,KAAA;AAChD;;;;"}
|
|
@@ -32,7 +32,6 @@ const useQueryParams = (initialParams)=>{
|
|
|
32
32
|
if (method === 'remove') {
|
|
33
33
|
Object.keys(nextParams).forEach((key)=>{
|
|
34
34
|
if (Object.prototype.hasOwnProperty.call(nextQuery, key)) {
|
|
35
|
-
// @ts-expect-error – this is fine, if you want to fix it, please do.
|
|
36
35
|
delete nextQuery[key];
|
|
37
36
|
}
|
|
38
37
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQueryParams.mjs","sources":["../../../../../admin/src/hooks/useQueryParams.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\n\nimport { parse, stringify } from 'qs';\nimport { useNavigate, useLocation } from 'react-router-dom';\n\nconst useSearch = () => {\n const { search } = useLocation();\n\n return useMemo(() => search, [search]);\n};\n\nconst useQueryParams = <TQuery extends object>(initialParams?: TQuery) => {\n const search = useSearch();\n const navigate = useNavigate();\n\n const query = useMemo(() => {\n // TODO: investigate why sometimes we're getting the search with a leading `?` and sometimes not.\n const searchQuery = search.startsWith('?') ? search.slice(1) : search;\n if (!search && initialParams) {\n return initialParams;\n }\n\n return { ...initialParams, ...parse(searchQuery) } as TQuery;\n }, [search, initialParams]);\n\n const setQuery = useCallback(\n (nextParams: TQuery, method: 'push' | 'remove' = 'push', replace = false) => {\n let nextQuery = { ...query };\n\n if (method === 'remove') {\n Object.keys(nextParams).forEach((key) => {\n if (Object.prototype.hasOwnProperty.call(nextQuery, key)) {\n
|
|
1
|
+
{"version":3,"file":"useQueryParams.mjs","sources":["../../../../../admin/src/hooks/useQueryParams.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\n\nimport { parse, stringify } from 'qs';\nimport { useNavigate, useLocation } from 'react-router-dom';\n\nconst useSearch = () => {\n const { search } = useLocation();\n\n return useMemo(() => search, [search]);\n};\n\nconst useQueryParams = <TQuery extends object>(initialParams?: TQuery) => {\n const search = useSearch();\n const navigate = useNavigate();\n\n const query = useMemo(() => {\n // TODO: investigate why sometimes we're getting the search with a leading `?` and sometimes not.\n const searchQuery = search.startsWith('?') ? search.slice(1) : search;\n if (!search && initialParams) {\n return initialParams;\n }\n\n return { ...initialParams, ...parse(searchQuery) } as TQuery;\n }, [search, initialParams]);\n\n const setQuery = useCallback(\n (nextParams: TQuery, method: 'push' | 'remove' = 'push', replace = false) => {\n let nextQuery: Partial<TQuery> = { ...query };\n\n if (method === 'remove') {\n Object.keys(nextParams).forEach((key) => {\n if (Object.prototype.hasOwnProperty.call(nextQuery, key)) {\n delete nextQuery[key as keyof TQuery];\n }\n });\n } else {\n nextQuery = { ...query, ...nextParams };\n }\n\n navigate({ search: stringify(nextQuery, { encode: false }) }, { replace });\n },\n [navigate, query]\n );\n\n return [{ query, rawQuery: search }, setQuery] as const;\n};\n\nexport { useQueryParams };\n"],"names":["useSearch","search","useLocation","useMemo","useQueryParams","initialParams","navigate","useNavigate","query","searchQuery","startsWith","slice","parse","setQuery","useCallback","nextParams","method","replace","nextQuery","Object","keys","forEach","key","prototype","hasOwnProperty","call","stringify","encode","rawQuery"],"mappings":";;;;AAKA,MAAMA,SAAAA,GAAY,IAAA;IAChB,MAAM,EAAEC,MAAM,EAAE,GAAGC,WAAAA,EAAAA;IAEnB,OAAOC,OAAAA,CAAQ,IAAMF,MAAAA,EAAQ;AAACA,QAAAA;AAAO,KAAA,CAAA;AACvC,CAAA;AAEA,MAAMG,iBAAiB,CAAwBC,aAAAA,GAAAA;AAC7C,IAAA,MAAMJ,MAAAA,GAASD,SAAAA,EAAAA;AACf,IAAA,MAAMM,QAAAA,GAAWC,WAAAA,EAAAA;AAEjB,IAAA,MAAMC,QAAQL,OAAAA,CAAQ,IAAA;;QAEpB,MAAMM,WAAAA,GAAcR,OAAOS,UAAU,CAAC,OAAOT,MAAAA,CAAOU,KAAK,CAAC,CAAA,CAAA,GAAKV,MAAAA;QAC/D,IAAI,CAACA,UAAUI,aAAAA,EAAe;YAC5B,OAAOA,aAAAA;AACT,QAAA;QAEA,OAAO;AAAE,YAAA,GAAGA,aAAa;AAAE,YAAA,GAAGO,MAAMH,WAAAA;AAAa,SAAA;IACnD,CAAA,EAAG;AAACR,QAAAA,MAAAA;AAAQI,QAAAA;AAAc,KAAA,CAAA;IAE1B,MAAMQ,QAAAA,GAAWC,YACf,CAACC,UAAAA,EAAoBC,SAA4B,MAAM,EAAEC,UAAU,KAAK,GAAA;AACtE,QAAA,IAAIC,SAAAA,GAA6B;AAAE,YAAA,GAAGV;AAAM,SAAA;AAE5C,QAAA,IAAIQ,WAAW,QAAA,EAAU;AACvBG,YAAAA,MAAAA,CAAOC,IAAI,CAACL,UAAAA,CAAAA,CAAYM,OAAO,CAAC,CAACC,GAAAA,GAAAA;gBAC/B,IAAIH,MAAAA,CAAOI,SAAS,CAACC,cAAc,CAACC,IAAI,CAACP,WAAWI,GAAAA,CAAAA,EAAM;oBACxD,OAAOJ,SAAS,CAACI,GAAAA,CAAoB;AACvC,gBAAA;AACF,YAAA,CAAA,CAAA;QACF,CAAA,MAAO;YACLJ,SAAAA,GAAY;AAAE,gBAAA,GAAGV,KAAK;AAAE,gBAAA,GAAGO;AAAW,aAAA;AACxC,QAAA;QAEAT,QAAAA,CAAS;AAAEL,YAAAA,MAAAA,EAAQyB,UAAUR,SAAAA,EAAW;gBAAES,MAAAA,EAAQ;AAAM,aAAA;SAAG,EAAG;AAAEV,YAAAA;AAAQ,SAAA,CAAA;IAC1E,CAAA,EACA;AAACX,QAAAA,QAAAA;AAAUE,QAAAA;AAAM,KAAA,CAAA;IAGnB,OAAO;AAAC,QAAA;AAAEA,YAAAA,KAAAA;YAAOoB,QAAAA,EAAU3B;AAAO,SAAA;AAAGY,QAAAA;AAAS,KAAA;AAChD;;;;"}
|
|
@@ -7,7 +7,10 @@ var once = require('../utils/once.js');
|
|
|
7
7
|
var strings = require('../utils/strings.js');
|
|
8
8
|
var usePrev = require('./usePrev.js');
|
|
9
9
|
|
|
10
|
-
function
|
|
10
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
|
|
12
|
+
function _interopNamespace(e) {
|
|
13
|
+
if (e && e.__esModule) return e;
|
|
11
14
|
var n = Object.create(null);
|
|
12
15
|
if (e) {
|
|
13
16
|
Object.keys(e).forEach(function (k) {
|
|
@@ -24,7 +27,8 @@ function _interopNamespaceDefault(e) {
|
|
|
24
27
|
return Object.freeze(n);
|
|
25
28
|
}
|
|
26
29
|
|
|
27
|
-
var React__namespace = /*#__PURE__*/
|
|
30
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
31
|
+
var isEqual__default = /*#__PURE__*/_interopDefault(isEqual);
|
|
28
32
|
|
|
29
33
|
/**
|
|
30
34
|
* @public
|
|
@@ -90,7 +94,7 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
|
90
94
|
const permssionsChecked = usePrev.usePrev(actualPermissionsToCheck);
|
|
91
95
|
const contextChecked = usePrev.usePrev(rawQueryContext);
|
|
92
96
|
React__namespace.useEffect(()=>{
|
|
93
|
-
if (!
|
|
97
|
+
if (!isEqual__default.default(permssionsChecked, actualPermissionsToCheck) || // TODO: also run this when the query context changes
|
|
94
98
|
contextChecked !== rawQueryContext) {
|
|
95
99
|
setIsLoading(true);
|
|
96
100
|
setData(undefined);
|