@strapi/admin 5.3.0 → 5.4.1
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/{ApplicationInfoPage-ChJWPprT.mjs → ApplicationInfoPage-683CGPri.mjs} +2 -2
- package/dist/admin/{ApplicationInfoPage-ChJWPprT.mjs.map → ApplicationInfoPage-683CGPri.mjs.map} +1 -1
- package/dist/admin/{ApplicationInfoPage-DPkvYf2Y.js → ApplicationInfoPage-C9NiLWTS.js} +2 -2
- package/dist/admin/{ApplicationInfoPage-DPkvYf2Y.js.map → ApplicationInfoPage-C9NiLWTS.js.map} +1 -1
- package/dist/admin/{AuthenticatedLayout-58SgcXpo.js → AuthenticatedLayout-B0W-Ppik.js} +20 -12
- package/dist/admin/AuthenticatedLayout-B0W-Ppik.js.map +1 -0
- package/dist/admin/{AuthenticatedLayout-D_dJUE6U.mjs → AuthenticatedLayout-QjRy82SQ.mjs} +20 -12
- package/dist/admin/AuthenticatedLayout-QjRy82SQ.mjs.map +1 -0
- package/dist/admin/{CreatePage-CwMcqenC.mjs → CreatePage-B5cgJ0x4.mjs} +4 -4
- package/dist/admin/CreatePage-B5cgJ0x4.mjs.map +1 -0
- package/dist/admin/{CreatePage-D9NhSTIM.mjs → CreatePage-C4PU0AHF.mjs} +2 -2
- package/dist/admin/{CreatePage-D9NhSTIM.mjs.map → CreatePage-C4PU0AHF.mjs.map} +1 -1
- package/dist/admin/{CreatePage-DfWI01nN.js → CreatePage-CQ_PSjfy.js} +4 -4
- package/dist/admin/CreatePage-CQ_PSjfy.js.map +1 -0
- package/dist/admin/{CreatePage-BSpbWhSR.js → CreatePage-DdnSea92.js} +2 -2
- package/dist/admin/{CreatePage-BSpbWhSR.js.map → CreatePage-DdnSea92.js.map} +1 -1
- package/dist/admin/{CreateView-DGfjXp7s.js → CreateView-BkjGFO1q.js} +2 -2
- package/dist/admin/{CreateView-DGfjXp7s.js.map → CreateView-BkjGFO1q.js.map} +1 -1
- package/dist/admin/{CreateView-CNfzQsrt.mjs → CreateView-CAFMGwXw.mjs} +2 -2
- package/dist/admin/{CreateView-CNfzQsrt.mjs.map → CreateView-CAFMGwXw.mjs.map} +1 -1
- package/dist/admin/{CreateView-C8Ir364M.mjs → CreateView-LWgbJBGg.mjs} +2 -2
- package/dist/admin/{CreateView-C8Ir364M.mjs.map → CreateView-LWgbJBGg.mjs.map} +1 -1
- package/dist/admin/{CreateView-DSiqyNvd.js → CreateView-r2yuWZ7_.js} +2 -2
- package/dist/admin/{CreateView-DSiqyNvd.js.map → CreateView-r2yuWZ7_.js.map} +1 -1
- package/dist/admin/{EditPage-BwtMkeYt.mjs → EditPage-C3OJuYxY.mjs} +4 -4
- package/dist/admin/EditPage-C3OJuYxY.mjs.map +1 -0
- package/dist/admin/{EditPage-CMTrRUsN.js → EditPage-CSQazVET.js} +5 -5
- package/dist/admin/{EditPage-CMTrRUsN.js.map → EditPage-CSQazVET.js.map} +1 -1
- package/dist/admin/{EditPage-8kVlD727.js → EditPage-D144CUxd.js} +6 -6
- package/dist/admin/EditPage-D144CUxd.js.map +1 -0
- package/dist/admin/{EditPage-k2lL4TMh.mjs → EditPage-Din0xCNi.mjs} +6 -6
- package/dist/admin/EditPage-Din0xCNi.mjs.map +1 -0
- package/dist/admin/{EditPage-BEdPxP4g.mjs → EditPage-DkK2CcjP.mjs} +5 -5
- package/dist/admin/{EditPage-BEdPxP4g.mjs.map → EditPage-DkK2CcjP.mjs.map} +1 -1
- package/dist/admin/{EditPage-CN0ZI2gY.js → EditPage-DnvQHl4z.js} +4 -4
- package/dist/admin/EditPage-DnvQHl4z.js.map +1 -0
- package/dist/admin/{EditView-C3xh32m_.js → EditView-BxoYN0cp.js} +3 -3
- package/dist/admin/{EditView-C3xh32m_.js.map → EditView-BxoYN0cp.js.map} +1 -1
- package/dist/admin/{EditView-DWRBGzO8.mjs → EditView-CbfTBtQA.mjs} +3 -3
- package/dist/admin/{EditView-DWRBGzO8.mjs.map → EditView-CbfTBtQA.mjs.map} +1 -1
- package/dist/admin/{EditViewPage-D7ZgKP1X.js → EditViewPage-BgUsc1vI.js} +3 -3
- package/dist/admin/{EditViewPage-D7ZgKP1X.js.map → EditViewPage-BgUsc1vI.js.map} +1 -1
- package/dist/admin/{EditViewPage-DU5vF00W.mjs → EditViewPage-Ds7H3Ib6.mjs} +3 -3
- package/dist/admin/{EditViewPage-DU5vF00W.mjs.map → EditViewPage-Ds7H3Ib6.mjs.map} +1 -1
- package/dist/admin/{EventsTable-CTNTkrE7.js → EventsTable-B9ddYPQx.js} +2 -2
- package/dist/admin/{EventsTable-CTNTkrE7.js.map → EventsTable-B9ddYPQx.js.map} +1 -1
- package/dist/admin/{EventsTable-CFohx0tD.mjs → EventsTable-VBW6pGYW.mjs} +2 -2
- package/dist/admin/{EventsTable-CFohx0tD.mjs.map → EventsTable-VBW6pGYW.mjs.map} +1 -1
- package/dist/admin/{HomePage-4GqCE6BS.mjs → HomePage-BrGErg0o.mjs} +3 -3
- package/dist/admin/{HomePage-4GqCE6BS.mjs.map → HomePage-BrGErg0o.mjs.map} +1 -1
- package/dist/admin/{HomePage-DjkDfQrs.mjs → HomePage-_UCA75ne.mjs} +2 -2
- package/dist/admin/{HomePage-DjkDfQrs.mjs.map → HomePage-_UCA75ne.mjs.map} +1 -1
- package/dist/admin/{HomePage-CHuxYZSS.js → HomePage-uvzslDAc.js} +3 -3
- package/dist/admin/{HomePage-CHuxYZSS.js.map → HomePage-uvzslDAc.js.map} +1 -1
- package/dist/admin/{HomePage-BaNM9alO.js → HomePage-wT6KNByy.js} +2 -2
- package/dist/admin/{HomePage-BaNM9alO.js.map → HomePage-wT6KNByy.js.map} +1 -1
- package/dist/admin/{InstalledPlugins-C5Kd-OS2.mjs → InstalledPlugins-B4iKWlES.mjs} +2 -2
- package/dist/admin/{InstalledPlugins-C5Kd-OS2.mjs.map → InstalledPlugins-B4iKWlES.mjs.map} +1 -1
- package/dist/admin/{InstalledPlugins-6wR0C3ki.js → InstalledPlugins-q6iHMp8e.js} +2 -2
- package/dist/admin/{InstalledPlugins-6wR0C3ki.js.map → InstalledPlugins-q6iHMp8e.js.map} +1 -1
- package/dist/admin/{Layout-dokm6bl0.mjs → Layout-CaNlgN5n.mjs} +3 -3
- package/dist/admin/{Layout-dokm6bl0.mjs.map → Layout-CaNlgN5n.mjs.map} +1 -1
- package/dist/admin/{Layout-D7yUYm0k.js → Layout-DGeCkbBf.js} +3 -3
- package/dist/admin/{Layout-D7yUYm0k.js.map → Layout-DGeCkbBf.js.map} +1 -1
- package/dist/admin/{ListPage-ShtAROtw.js → ListPage-B7z3qFyl.js} +2 -2
- package/dist/admin/{ListPage-ShtAROtw.js.map → ListPage-B7z3qFyl.js.map} +1 -1
- package/dist/admin/{ListPage-vU0JBGYV.js → ListPage-CCnBCVJc.js} +3 -3
- package/dist/admin/{ListPage-vU0JBGYV.js.map → ListPage-CCnBCVJc.js.map} +1 -1
- package/dist/admin/{ListPage-pNnihVO3.js → ListPage-Cl2tgcBV.js} +2 -2
- package/dist/admin/{ListPage-pNnihVO3.js.map → ListPage-Cl2tgcBV.js.map} +1 -1
- package/dist/admin/{ListPage-tKYUG63R.mjs → ListPage-CocqTTCj.mjs} +2 -2
- package/dist/admin/{ListPage-tKYUG63R.mjs.map → ListPage-CocqTTCj.mjs.map} +1 -1
- package/dist/admin/{ListPage-feNYkeWT.mjs → ListPage-D5H8f2M-.mjs} +2 -2
- package/dist/admin/{ListPage-feNYkeWT.mjs.map → ListPage-D5H8f2M-.mjs.map} +1 -1
- package/dist/admin/{ListPage-CjZKW6al.js → ListPage-DDnATmBl.js} +2 -2
- package/dist/admin/{ListPage-CjZKW6al.js.map → ListPage-DDnATmBl.js.map} +1 -1
- package/dist/admin/{ListPage-DSXpMDQu.mjs → ListPage-DbHPSzvx.mjs} +2 -2
- package/dist/admin/{ListPage-DSXpMDQu.mjs.map → ListPage-DbHPSzvx.mjs.map} +1 -1
- package/dist/admin/{ListPage-BnSTgeR6.js → ListPage-Dhe2wcgV.js} +5 -5
- package/dist/admin/{ListPage-BnSTgeR6.js.map → ListPage-Dhe2wcgV.js.map} +1 -1
- package/dist/admin/{ListPage-D_sCLgCm.mjs → ListPage-cZ7G9ifV.mjs} +5 -5
- package/dist/admin/{ListPage-D_sCLgCm.mjs.map → ListPage-cZ7G9ifV.mjs.map} +1 -1
- package/dist/admin/{ListPage-BThkIbej.mjs → ListPage-fK1xgGBO.mjs} +3 -3
- package/dist/admin/{ListPage-BThkIbej.mjs.map → ListPage-fK1xgGBO.mjs.map} +1 -1
- package/dist/admin/{ListView-BqpRojyV.js → ListView-BAOu3t3r.js} +3 -3
- package/dist/admin/{ListView-BqpRojyV.js.map → ListView-BAOu3t3r.js.map} +1 -1
- package/dist/admin/{ListView-Dxp_ryfR.mjs → ListView-CDBJ6KxG.mjs} +3 -3
- package/dist/admin/{ListView-Dxp_ryfR.mjs.map → ListView-CDBJ6KxG.mjs.map} +1 -1
- package/dist/admin/{ListView-cbl5ESj2.mjs → ListView-DCHh8Z9Q.mjs} +3 -3
- package/dist/admin/{ListView-cbl5ESj2.mjs.map → ListView-DCHh8Z9Q.mjs.map} +1 -1
- package/dist/admin/{ListView-DS6P91hz.js → ListView-Uma8Kh0Y.js} +3 -3
- package/dist/admin/{ListView-DS6P91hz.js.map → ListView-Uma8Kh0Y.js.map} +1 -1
- package/dist/admin/{Login-BIrWAbkU.mjs → Login-BMNixw-B.mjs} +2 -2
- package/dist/admin/{Login-BIrWAbkU.mjs.map → Login-BMNixw-B.mjs.map} +1 -1
- package/dist/admin/{Login-Ci8VDsEA.js → Login-CIgQWbpY.js} +2 -2
- package/dist/admin/{Login-Ci8VDsEA.js.map → Login-CIgQWbpY.js.map} +1 -1
- package/dist/admin/{MagicLinkEE-Dekweog0.js → MagicLinkEE-Cfm5HTYA.js} +3 -3
- package/dist/admin/{MagicLinkEE-Dekweog0.js.map → MagicLinkEE-Cfm5HTYA.js.map} +1 -1
- package/dist/admin/{MagicLinkEE-Dv-aox3R.mjs → MagicLinkEE-DXVettXy.mjs} +3 -3
- package/dist/admin/{MagicLinkEE-Dv-aox3R.mjs.map → MagicLinkEE-DXVettXy.mjs.map} +1 -1
- package/dist/admin/{MarketplacePage-D9-K4S42.mjs → MarketplacePage-9oBw1vCF.mjs} +2 -2
- package/dist/admin/{MarketplacePage-D9-K4S42.mjs.map → MarketplacePage-9oBw1vCF.mjs.map} +1 -1
- package/dist/admin/{MarketplacePage-BatVEvO6.js → MarketplacePage-ybCMvYyZ.js} +2 -2
- package/dist/admin/{MarketplacePage-BatVEvO6.js.map → MarketplacePage-ybCMvYyZ.js.map} +1 -1
- package/dist/admin/{Permissions-p_cREK0b.mjs → Permissions-D-z4OQkJ.mjs} +2 -2
- package/dist/admin/Permissions-D-z4OQkJ.mjs.map +1 -0
- package/dist/admin/{Permissions-DvL1ZCzq.js → Permissions-DJGQDnx2.js} +2 -2
- package/dist/admin/Permissions-DJGQDnx2.js.map +1 -0
- package/dist/admin/{ProfilePage-C4CKIkBe.mjs → ProfilePage-Dye2XFUg.mjs} +3 -3
- package/dist/admin/{ProfilePage-C4CKIkBe.mjs.map → ProfilePage-Dye2XFUg.mjs.map} +1 -1
- package/dist/admin/{ProfilePage-CkppUu8h.js → ProfilePage-iJfFC8iM.js} +3 -3
- package/dist/admin/{ProfilePage-CkppUu8h.js.map → ProfilePage-iJfFC8iM.js.map} +1 -1
- package/dist/admin/{PurchaseAuditLogs-BW2HnKCB.mjs → PurchaseAuditLogs-Cm4FhsMb.mjs} +2 -2
- package/dist/admin/{PurchaseAuditLogs-BW2HnKCB.mjs.map → PurchaseAuditLogs-Cm4FhsMb.mjs.map} +1 -1
- package/dist/admin/{PurchaseAuditLogs-B03vUqBK.js → PurchaseAuditLogs-D01OAXZ1.js} +2 -2
- package/dist/admin/{PurchaseAuditLogs-B03vUqBK.js.map → PurchaseAuditLogs-D01OAXZ1.js.map} +1 -1
- package/dist/admin/{PurchaseSingleSignOn-D6REHzGm.js → PurchaseSingleSignOn-DuP_lPo5.js} +2 -2
- package/dist/admin/{PurchaseSingleSignOn-D6REHzGm.js.map → PurchaseSingleSignOn-DuP_lPo5.js.map} +1 -1
- package/dist/admin/{PurchaseSingleSignOn-CXfANuLY.mjs → PurchaseSingleSignOn-EcMNl-Fp.mjs} +2 -2
- package/dist/admin/{PurchaseSingleSignOn-CXfANuLY.mjs.map → PurchaseSingleSignOn-EcMNl-Fp.mjs.map} +1 -1
- package/dist/admin/{SelectRoles-C1P9kRCc.mjs → SelectRoles-CiXoM32h.mjs} +3 -3
- package/dist/admin/{SelectRoles-C1P9kRCc.mjs.map → SelectRoles-CiXoM32h.mjs.map} +1 -1
- package/dist/admin/{SelectRoles-B_m6wjAi.js → SelectRoles-DLKg2oSV.js} +3 -3
- package/dist/admin/{SelectRoles-B_m6wjAi.js.map → SelectRoles-DLKg2oSV.js.map} +1 -1
- package/dist/admin/{SingleSignOnPage-DQC0_hoG.mjs → SingleSignOnPage-CiDC2Nqn.mjs} +3 -3
- package/dist/admin/{SingleSignOnPage-DQC0_hoG.mjs.map → SingleSignOnPage-CiDC2Nqn.mjs.map} +1 -1
- package/dist/admin/{SingleSignOnPage-CR8Hj4kU.js → SingleSignOnPage-yeUvuSTO.js} +3 -3
- package/dist/admin/{SingleSignOnPage-CR8Hj4kU.js.map → SingleSignOnPage-yeUvuSTO.js.map} +1 -1
- package/dist/admin/{Table-C6ZlhkWY.mjs → Table-kHROpxjl.mjs} +2 -2
- package/dist/admin/{Table-C6ZlhkWY.mjs.map → Table-kHROpxjl.mjs.map} +1 -1
- package/dist/admin/{Table-ROwxxBZR.js → Table-lxKdXhV9.js} +2 -2
- package/dist/admin/{Table-ROwxxBZR.js.map → Table-lxKdXhV9.js.map} +1 -1
- package/dist/admin/Theme-K6zNL3JT.js.map +1 -1
- package/dist/admin/Theme-NAd2H4cV.mjs.map +1 -1
- package/dist/admin/{TokenTypeSelect-Cr8pc-yV.mjs → TokenTypeSelect-B-iJxzXE.mjs} +3 -2
- package/dist/admin/TokenTypeSelect-B-iJxzXE.mjs.map +1 -0
- package/dist/admin/{TokenTypeSelect-D-gZu64Q.js → TokenTypeSelect-By7iQpgJ.js} +3 -2
- package/dist/admin/TokenTypeSelect-By7iQpgJ.js.map +1 -0
- package/dist/admin/{UseCasePage-CdlizGa4.js → UseCasePage-CY0JP2XW.js} +2 -2
- package/dist/admin/{UseCasePage-CdlizGa4.js.map → UseCasePage-CY0JP2XW.js.map} +1 -1
- package/dist/admin/{UseCasePage-Bb-lhRxt.mjs → UseCasePage-x-bVF6tp.mjs} +2 -2
- package/dist/admin/{UseCasePage-Bb-lhRxt.mjs.map → UseCasePage-x-bVF6tp.mjs.map} +1 -1
- package/dist/admin/{constants-oZHZoOiz.mjs → constants-BgfUvQDe.mjs} +2 -2
- package/dist/admin/{constants-oZHZoOiz.mjs.map → constants-BgfUvQDe.mjs.map} +1 -1
- package/dist/admin/{constants-Bt2r8Woi.js → constants-QMVP-ySv.js} +2 -2
- package/dist/admin/{constants-Bt2r8Woi.js.map → constants-QMVP-ySv.js.map} +1 -1
- package/dist/admin/{index-iLKTBveZ.mjs → index-CQ0jOkIC.mjs} +81 -61
- package/dist/admin/index-CQ0jOkIC.mjs.map +1 -0
- package/dist/admin/{index-DLZCh9gO.js → index-D4vvFryW.js} +80 -60
- package/dist/admin/index-D4vvFryW.js.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/admin/src/features/BackButton.d.ts +4 -1
- package/dist/admin/src/features/Tracking.d.ts +1 -1
- package/dist/admin/src/translations/languageNativeNames.d.ts +2 -0
- package/dist/admin/{useAdminRoles-Bd2N7J7A.mjs → useAdminRoles-BlqZHo5X.mjs} +2 -2
- package/dist/admin/{useAdminRoles-Bd2N7J7A.mjs.map → useAdminRoles-BlqZHo5X.mjs.map} +1 -1
- package/dist/admin/{useAdminRoles-BVIUPBaL.js → useAdminRoles-Ck5p_pOt.js} +2 -2
- package/dist/admin/{useAdminRoles-BVIUPBaL.js.map → useAdminRoles-Ck5p_pOt.js.map} +1 -1
- package/dist/admin/{validation-B2aNxnFX.js → validation-CsNKFFCI.js} +2 -2
- package/dist/admin/{validation-B2aNxnFX.js.map → validation-CsNKFFCI.js.map} +1 -1
- package/dist/admin/{validation-DZQHQxC3.mjs → validation-DYzpgGER.mjs} +2 -2
- package/dist/admin/{validation-DZQHQxC3.mjs.map → validation-DYzpgGER.mjs.map} +1 -1
- package/dist/package.json.d.ts +10 -9
- package/package.json +9 -9
- package/dist/admin/AuthenticatedLayout-58SgcXpo.js.map +0 -1
- package/dist/admin/AuthenticatedLayout-D_dJUE6U.mjs.map +0 -1
- package/dist/admin/CreatePage-CwMcqenC.mjs.map +0 -1
- package/dist/admin/CreatePage-DfWI01nN.js.map +0 -1
- package/dist/admin/EditPage-8kVlD727.js.map +0 -1
- package/dist/admin/EditPage-BwtMkeYt.mjs.map +0 -1
- package/dist/admin/EditPage-CN0ZI2gY.js.map +0 -1
- package/dist/admin/EditPage-k2lL4TMh.mjs.map +0 -1
- package/dist/admin/Permissions-DvL1ZCzq.js.map +0 -1
- package/dist/admin/Permissions-p_cREK0b.mjs.map +0 -1
- package/dist/admin/TokenTypeSelect-Cr8pc-yV.mjs.map +0 -1
- package/dist/admin/TokenTypeSelect-D-gZu64Q.js.map +0 -1
- package/dist/admin/index-DLZCh9gO.js.map +0 -1
- package/dist/admin/index-iLKTBveZ.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Theme-K6zNL3JT.js","sources":["../../admin/src/core/apis/rbac.ts","../../admin/src/components/Context.tsx","../../admin/src/core/store/hooks.ts","../../admin/src/features/StrapiApp.tsx","../../admin/src/hooks/useQueryParams.ts","../../admin/src/reducer.ts","../../admin/src/services/auth.ts","../../admin/src/features/Auth.tsx","../../admin/src/features/Notifications.tsx","../../admin/src/utils/getPrefixedId.ts","../../admin/src/utils/normalizeAPIError.ts","../../admin/src/utils/objects.ts","../../admin/src/hooks/useAPIErrorHandler.ts","../../admin/src/components/PageHelpers.tsx","../../admin/src/utils/once.ts","../../admin/src/utils/strings.ts","../../admin/src/hooks/usePrev.ts","../../admin/src/hooks/useRBAC.ts","../../admin/src/features/AppInfo.tsx","../../admin/src/features/Tracking.tsx","../../admin/src/features/Configuration.tsx","../../admin/src/components/GuidedTour/Provider.tsx","../../admin/src/components/LanguageProvider.tsx","../../admin/src/components/Theme.tsx"],"sourcesContent":["import { Location } from 'react-router-dom';\n\nimport type { Permission, User } from '../../features/Auth';\n\ninterface RBACContext extends Pick<Location, 'pathname' | 'search'> {\n /**\n * The current user.\n */\n user?: User;\n /**\n * The permissions of the current user.\n */\n permissions: Permission[];\n}\n\ninterface RBACMiddleware {\n (\n ctx: RBACContext\n ): (\n next: (permissions: Permission[]) => Promise<Permission[]> | Permission[]\n ) => (permissions: Permission[]) => Promise<Permission[]> | Permission[];\n}\n\nclass RBAC {\n private middlewares: RBACMiddleware[] = [];\n\n constructor() {}\n\n use(middleware: RBACMiddleware[]): void;\n use(middleware: RBACMiddleware): void;\n use(middleware: RBACMiddleware | RBACMiddleware[]): void {\n if (Array.isArray(middleware)) {\n this.middlewares.push(...middleware);\n } else {\n this.middlewares.push(middleware);\n }\n }\n\n run = async (ctx: RBACContext, permissions: Permission[]): Promise<Permission[]> => {\n let index = 0;\n\n const middlewaresToRun = this.middlewares.map((middleware) => middleware(ctx));\n\n const next = async (permissions: Permission[]) => {\n if (index < this.middlewares.length) {\n return middlewaresToRun[index++](next)(permissions);\n }\n\n return permissions;\n };\n\n return next(permissions);\n };\n}\n\nexport { RBAC };\nexport type { RBACMiddleware, RBACContext };\n","import * as React from 'react';\n\nimport * as ContextSelector from 'use-context-selector';\n\n/**\n * @experimental\n * @description Create a context provider and a hook to consume the context.\n *\n * @warning this may be removed to the design-system instead of becoming stable.\n */\nfunction createContext<ContextValueType extends object | null>(\n rootComponentName: string,\n defaultContext?: ContextValueType\n) {\n const Context = ContextSelector.createContext<ContextValueType | undefined>(defaultContext);\n\n const Provider = (props: ContextValueType & { children: React.ReactNode }) => {\n const { children, ...context } = props;\n // Only re-memoize when prop values change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const value = React.useMemo(() => context, Object.values(context)) as ContextValueType;\n\n return <Context.Provider value={value}>{children}</Context.Provider>;\n };\n\n const useContext = <Selected,>(\n consumerName: string,\n selector: (value: ContextValueType) => Selected\n ): Selected =>\n ContextSelector.useContextSelector(Context, (ctx) => {\n if (ctx) return selector(ctx);\n // it's a required context.\n throw new Error(`\\`${consumerName}\\` must be used within \\`${rootComponentName}\\``);\n });\n\n Provider.displayName = rootComponentName + 'Provider';\n\n return [Provider, useContext] as const;\n}\n\nexport { createContext };\n","import { createSelector, Selector } from '@reduxjs/toolkit';\nimport { useDispatch, useStore, TypedUseSelectorHook, useSelector } from 'react-redux';\n\nimport type { RootState, Store } from './configure';\n\ntype AppDispatch = Store['dispatch'];\n\nconst useTypedDispatch: () => AppDispatch = useDispatch;\nconst useTypedStore = useStore as () => Store;\nconst useTypedSelector: TypedUseSelectorHook<RootState> = useSelector;\n\nconst createTypedSelector = <TResult>(selector: Selector<RootState, TResult>) =>\n createSelector((state: RootState) => state, selector);\n\nexport { useTypedDispatch, useTypedStore, useTypedSelector, createTypedSelector };\n","import { createContext } from '../components/Context';\nimport { RBAC } from '../core/apis/rbac';\nimport { Router } from '../core/apis/router';\n\nimport type { StrapiApp } from '../StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * StrapiApp\n * -----------------------------------------------------------------------------------------------*/\ninterface StrapiAppContextValue\n extends Pick<\n StrapiApp,\n | 'customFields'\n | 'getPlugin'\n | 'getAdminInjectedComponents'\n | 'plugins'\n | 'runHookParallel'\n | 'runHookSeries'\n >,\n Pick<Router, 'menu' | 'settings'> {\n components: StrapiApp['library']['components'];\n fields: StrapiApp['library']['fields'];\n rbac: RBAC;\n runHookWaterfall: <TData>(\n name: Parameters<StrapiApp['runHookWaterfall']>[0],\n initialValue: TData\n ) => TData;\n}\n\nconst [StrapiAppProvider, useStrapiApp] = createContext<StrapiAppContextValue>('StrapiApp');\n\nexport { StrapiAppProvider, useStrapiApp };\nexport type { StrapiAppContextValue };\n","import { useCallback, useMemo } from 'react';\n\nimport { parse, stringify } from 'qs';\nimport { useNavigate, useLocation } from 'react-router-dom';\n\nconst useQueryParams = <TQuery extends object>(initialParams?: TQuery) => {\n const { search } = useLocation();\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 // @ts-expect-error – this is fine, if you want to fix it, please do.\n delete nextQuery[key];\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","import { createSlice } from '@reduxjs/toolkit';\n\nimport { PermissionMap } from './types/permissions';\n\nimport type { PayloadAction } from '@reduxjs/toolkit';\n\ntype ThemeName = 'light' | 'dark' | 'system';\n\ninterface AppState {\n language: {\n locale: string;\n localeNames: Record<string, string>;\n };\n permissions: Partial<PermissionMap>;\n theme: {\n currentTheme: ThemeName;\n availableThemes: string[];\n };\n token?: string | null;\n}\n\nconst STORAGE_KEYS = {\n TOKEN: 'jwtToken',\n USER: 'userInfo',\n};\n\nconst THEME_LOCAL_STORAGE_KEY = 'STRAPI_THEME';\nconst LANGUAGE_LOCAL_STORAGE_KEY = 'strapi-admin-language';\n\nexport const getStoredToken = (): string | null => {\n const token =\n localStorage.getItem(STORAGE_KEYS.TOKEN) ?? sessionStorage.getItem(STORAGE_KEYS.TOKEN);\n\n if (typeof token === 'string') {\n return JSON.parse(token);\n }\n\n return null;\n};\n\nconst adminSlice = createSlice({\n name: 'admin',\n initialState: () => {\n return {\n language: {\n locale: 'en',\n localeNames: { en: 'English' },\n },\n permissions: {},\n theme: {\n availableThemes: [],\n currentTheme: localStorage.getItem(THEME_LOCAL_STORAGE_KEY) || 'system',\n },\n token: null,\n } as AppState;\n },\n reducers: {\n setAppTheme(state, action: PayloadAction<ThemeName>) {\n state.theme.currentTheme = action.payload;\n window.localStorage.setItem(THEME_LOCAL_STORAGE_KEY, action.payload);\n },\n setAvailableThemes(state, action: PayloadAction<AppState['theme']['availableThemes']>) {\n state.theme.availableThemes = action.payload;\n },\n setLocale(state, action: PayloadAction<string>) {\n state.language.locale = action.payload;\n\n window.localStorage.setItem(LANGUAGE_LOCAL_STORAGE_KEY, action.payload);\n document.documentElement.setAttribute('lang', action.payload);\n },\n setToken(state, action: PayloadAction<string | null>) {\n state.token = action.payload;\n },\n login(state, action: PayloadAction<{ token: string; persist?: boolean }>) {\n const { token, persist } = action.payload;\n\n if (!persist) {\n window.sessionStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token));\n } else {\n window.localStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token));\n }\n\n state.token = token;\n },\n logout(state) {\n state.token = null;\n window.localStorage.removeItem(STORAGE_KEYS.TOKEN);\n window.localStorage.removeItem(STORAGE_KEYS.USER);\n window.sessionStorage.removeItem(STORAGE_KEYS.TOKEN);\n window.sessionStorage.removeItem(STORAGE_KEYS.USER);\n },\n },\n});\n\nconst reducer = adminSlice.reducer;\n\nexport const { setAppTheme, setAvailableThemes, setLocale, setToken, logout, login } =\n adminSlice.actions;\n\nexport { reducer, THEME_LOCAL_STORAGE_KEY, LANGUAGE_LOCAL_STORAGE_KEY };\nexport type { AppState, ThemeName };\n","import { ProvidersOptions } from '../../../shared/contracts/admin';\nimport {\n type RenewToken,\n type Login,\n type ResetPassword,\n type RegisterAdmin,\n type Register,\n type RegistrationInfo,\n ForgotPassword,\n} from '../../../shared/contracts/authentication';\nimport { Check } from '../../../shared/contracts/permissions';\nimport { GetProviders, IsSSOLocked } from '../../../shared/contracts/providers';\nimport { type GetOwnPermissions, type GetMe, type UpdateMe } from '../../../shared/contracts/users';\n\nimport { adminApi } from './api';\n\nconst authService = adminApi\n .enhanceEndpoints({\n addTagTypes: ['User', 'Me', 'ProvidersOptions'],\n })\n .injectEndpoints({\n endpoints: (builder) => ({\n /**\n * ME\n */\n getMe: builder.query<GetMe.Response['data'], void>({\n query: () => ({\n method: 'GET',\n url: '/admin/users/me',\n }),\n transformResponse(res: GetMe.Response) {\n return res.data;\n },\n providesTags: (res) => (res ? ['Me', { type: 'User', id: res.id }] : ['Me']),\n }),\n getMyPermissions: builder.query<GetOwnPermissions.Response['data'], void>({\n query: () => ({\n method: 'GET',\n url: '/admin/users/me/permissions',\n }),\n transformResponse(res: GetOwnPermissions.Response) {\n return res.data;\n },\n }),\n updateMe: builder.mutation<UpdateMe.Response['data'], UpdateMe.Request['body']>({\n query: (body) => ({\n method: 'PUT',\n url: '/admin/users/me',\n data: body,\n }),\n transformResponse(res: UpdateMe.Response) {\n return res.data;\n },\n invalidatesTags: ['Me'],\n }),\n /**\n * Permissions\n */\n checkPermissions: builder.query<Check.Response, Check.Request['body']>({\n query: (permissions) => ({\n method: 'POST',\n url: '/admin/permissions/check',\n data: permissions,\n }),\n }),\n /**\n * Auth methods\n */\n login: builder.mutation<Login.Response['data'], Login.Request['body']>({\n query: (body) => ({\n method: 'POST',\n url: '/admin/login',\n data: body,\n }),\n transformResponse(res: Login.Response) {\n return res.data;\n },\n invalidatesTags: ['Me'],\n }),\n logout: builder.mutation<void, void>({\n query: () => ({\n method: 'POST',\n url: '/admin/logout',\n }),\n }),\n resetPassword: builder.mutation<\n ResetPassword.Response['data'],\n ResetPassword.Request['body']\n >({\n query: (body) => ({\n method: 'POST',\n url: '/admin/reset-password',\n data: body,\n }),\n transformResponse(res: ResetPassword.Response) {\n return res.data;\n },\n }),\n renewToken: builder.mutation<RenewToken.Response['data'], RenewToken.Request['body']>({\n query: (body) => ({\n method: 'POST',\n url: '/admin/renew-token',\n data: body,\n }),\n transformResponse(res: RenewToken.Response) {\n return res.data;\n },\n }),\n getRegistrationInfo: builder.query<\n RegistrationInfo.Response['data'],\n RegistrationInfo.Request['query']['registrationToken']\n >({\n query: (registrationToken) => ({\n url: '/admin/registration-info',\n method: 'GET',\n config: {\n params: {\n registrationToken,\n },\n },\n }),\n transformResponse(res: RegistrationInfo.Response) {\n return res.data;\n },\n }),\n registerAdmin: builder.mutation<\n RegisterAdmin.Response['data'],\n RegisterAdmin.Request['body']\n >({\n query: (body) => ({\n method: 'POST',\n url: '/admin/register-admin',\n data: body,\n }),\n transformResponse(res: RegisterAdmin.Response) {\n return res.data;\n },\n }),\n registerUser: builder.mutation<Register.Response['data'], Register.Request['body']>({\n query: (body) => ({\n method: 'POST',\n url: '/admin/register',\n data: body,\n }),\n transformResponse(res: Register.Response) {\n return res.data;\n },\n }),\n forgotPassword: builder.mutation<ForgotPassword.Response, ForgotPassword.Request['body']>({\n query: (body) => ({\n url: '/admin/forgot-password',\n method: 'POST',\n data: body,\n }),\n }),\n isSSOLocked: builder.query<IsSSOLocked.Response['data'], void>({\n query: () => ({\n url: '/admin/providers/isSSOLocked',\n method: 'GET',\n }),\n transformResponse(res: IsSSOLocked.Response) {\n return res.data;\n },\n }),\n getProviders: builder.query<GetProviders.Response, void>({\n query: () => ({\n url: '/admin/providers',\n method: 'GET',\n }),\n }),\n getProviderOptions: builder.query<ProvidersOptions.Response['data'], void>({\n query: () => ({\n url: '/admin/providers/options',\n method: 'GET',\n }),\n transformResponse(res: ProvidersOptions.Response) {\n return res.data;\n },\n providesTags: ['ProvidersOptions'],\n }),\n updateProviderOptions: builder.mutation<\n ProvidersOptions.Response['data'],\n ProvidersOptions.Request['body']\n >({\n query: (body) => ({\n url: '/admin/providers/options',\n method: 'PUT',\n data: body,\n }),\n transformResponse(res: ProvidersOptions.Response) {\n return res.data;\n },\n invalidatesTags: ['ProvidersOptions'],\n }),\n }),\n overrideExisting: false,\n });\n\nconst {\n useCheckPermissionsQuery,\n useLazyCheckPermissionsQuery,\n useGetMeQuery,\n useLoginMutation,\n useRenewTokenMutation,\n useLogoutMutation,\n useUpdateMeMutation,\n useResetPasswordMutation,\n useRegisterAdminMutation,\n useRegisterUserMutation,\n useGetRegistrationInfoQuery,\n useForgotPasswordMutation,\n useGetMyPermissionsQuery,\n useIsSSOLockedQuery,\n useGetProvidersQuery,\n useGetProviderOptionsQuery,\n useUpdateProviderOptionsMutation,\n} = authService;\n\nexport {\n useCheckPermissionsQuery,\n useLazyCheckPermissionsQuery,\n useGetMeQuery,\n useLoginMutation,\n useRenewTokenMutation,\n useLogoutMutation,\n useUpdateMeMutation,\n useResetPasswordMutation,\n useRegisterAdminMutation,\n useRegisterUserMutation,\n useGetRegistrationInfoQuery,\n useForgotPasswordMutation,\n useGetMyPermissionsQuery,\n useIsSSOLockedQuery,\n useGetProvidersQuery,\n useGetProviderOptionsQuery,\n useUpdateProviderOptionsMutation,\n};\n","import * as React from 'react';\n\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nimport { Login } from '../../../shared/contracts/authentication';\nimport { createContext } from '../components/Context';\nimport { useTypedDispatch, useTypedSelector } from '../core/store/hooks';\nimport { useStrapiApp } from '../features/StrapiApp';\nimport { useQueryParams } from '../hooks/useQueryParams';\nimport { login as loginAction, logout as logoutAction, setLocale } from '../reducer';\nimport { adminApi } from '../services/api';\nimport {\n useGetMeQuery,\n useGetMyPermissionsQuery,\n useLazyCheckPermissionsQuery,\n useLoginMutation,\n useLogoutMutation,\n useRenewTokenMutation,\n} from '../services/auth';\n\nimport type {\n Permission as PermissionContract,\n SanitizedAdminUser,\n} from '../../../shared/contracts/shared';\n\ninterface Permission\n extends Pick<PermissionContract, 'action' | 'subject'>,\n Partial<Omit<PermissionContract, 'action' | 'subject'>> {}\n\ninterface User\n extends Pick<SanitizedAdminUser, 'email' | 'firstname' | 'lastname' | 'username' | 'roles'>,\n Partial<Omit<SanitizedAdminUser, 'email' | 'firstname' | 'lastname' | 'username' | 'roles'>> {}\n\ninterface AuthContextValue {\n login: (\n body: Login.Request['body'] & { rememberMe: boolean }\n ) => Promise<Awaited<ReturnType<ReturnType<typeof useLoginMutation>[0]>>>;\n logout: () => Promise<void>;\n /**\n * @alpha\n * @description given a list of permissions, this function checks\n * those against the current user's permissions or those passed as\n * the second argument, if the user has those permissions the complete\n * permission object form the API is returned. Therefore, if the list is\n * empty, the user does not have any of those permissions.\n */\n checkUserHasPermissions: (\n permissions?: Permission[],\n passedPermissions?: Permission[],\n rawQueryContext?: string\n ) => Promise<Permission[]>;\n isLoading: boolean;\n permissions: Permission[];\n refetchPermissions: () => Promise<void>;\n token: string | null;\n user?: User;\n}\n\nconst [Provider, useAuth] = createContext<AuthContextValue>('Auth');\n\ninterface AuthProviderProps {\n children: React.ReactNode;\n /**\n * @internal could be removed at any time.\n */\n _defaultPermissions?: Permission[];\n\n // NOTE: this is used for testing purposed only\n _disableRenewToken?: boolean;\n}\n\nconst STORAGE_KEYS = {\n TOKEN: 'jwtToken',\n USER: 'userInfo',\n};\n\nconst AuthProvider = ({\n children,\n _defaultPermissions = [],\n _disableRenewToken = false,\n}: AuthProviderProps) => {\n const dispatch = useTypedDispatch();\n const runRbacMiddleware = useStrapiApp('AuthProvider', (state) => state.rbac.run);\n const location = useLocation();\n const [{ rawQuery }] = useQueryParams();\n\n const token = useTypedSelector((state) => state.admin_app.token ?? null);\n\n const { data: user, isLoading: isLoadingUser } = useGetMeQuery(undefined, {\n /**\n * If there's no token, we don't try to fetch\n * the user data because it will fail.\n */\n skip: !token,\n });\n\n const {\n data: userPermissions = _defaultPermissions,\n refetch,\n isUninitialized,\n isLoading: isLoadingPermissions,\n } = useGetMyPermissionsQuery(undefined, {\n skip: !token,\n });\n\n const navigate = useNavigate();\n\n const [loginMutation] = useLoginMutation();\n const [renewTokenMutation] = useRenewTokenMutation();\n const [logoutMutation] = useLogoutMutation();\n\n const clearStateAndLogout = React.useCallback(() => {\n dispatch(adminApi.util.resetApiState());\n dispatch(logoutAction());\n navigate('/auth/login');\n }, [dispatch, navigate]);\n\n /**\n * Fetch data from storages on mount and store it in our state.\n * It's not normally stored in session storage unless the user\n * does click \"remember me\" when they login. We also need to renew the token.\n */\n React.useEffect(() => {\n if (token && !_disableRenewToken) {\n renewTokenMutation({ token }).then((res) => {\n if ('data' in res) {\n dispatch(\n loginAction({\n token: res.data.token,\n })\n );\n } else {\n clearStateAndLogout();\n }\n });\n }\n }, [token, dispatch, renewTokenMutation, clearStateAndLogout, _disableRenewToken]);\n\n React.useEffect(() => {\n if (user) {\n if (user.preferedLanguage) {\n dispatch(setLocale(user.preferedLanguage));\n }\n }\n }, [dispatch, user]);\n\n React.useEffect(() => {\n /**\n * This will log a user out of all tabs if they log out in one tab.\n */\n const handleUserStorageChange = (event: StorageEvent) => {\n if (event.key === STORAGE_KEYS.USER && event.newValue === null) {\n clearStateAndLogout();\n }\n };\n\n window.addEventListener('storage', handleUserStorageChange);\n\n return () => {\n window.removeEventListener('storage', handleUserStorageChange);\n };\n });\n\n const login = React.useCallback<AuthContextValue['login']>(\n async ({ rememberMe, ...body }) => {\n const res = await loginMutation(body);\n\n /**\n * There will always be a `data` key in the response\n * because if something fails, it will throw an error.\n */\n if ('data' in res) {\n const { token } = res.data;\n\n dispatch(\n loginAction({\n token,\n persist: rememberMe,\n })\n );\n }\n\n return res;\n },\n [dispatch, loginMutation]\n );\n\n const logout = React.useCallback(async () => {\n await logoutMutation();\n clearStateAndLogout();\n }, [clearStateAndLogout, logoutMutation]);\n\n const refetchPermissions = React.useCallback(async () => {\n if (!isUninitialized) {\n await refetch();\n }\n }, [isUninitialized, refetch]);\n\n const [checkPermissions] = useLazyCheckPermissionsQuery();\n const checkUserHasPermissions: AuthContextValue['checkUserHasPermissions'] = React.useCallback(\n async (\n permissions,\n passedPermissions,\n // TODO:\n // Here we have parameterised checkUserHasPermissions in order to pass\n // query context from elsewhere in the application.\n // See packages/core/content-manager/admin/src/features/DocumentRBAC.tsx\n\n // This is in order to calculate permissions on accurate query params.\n // We should be able to rely on the query params in this provider\n // If we need to pass additional context to the RBAC middleware\n // we should define a better context type.\n rawQueryContext\n ) => {\n /**\n * If there's no permissions to check, then we allow it to\n * pass to preserve existing behaviours.\n *\n * TODO: should we review this? it feels more dangerous than useful.\n */\n if (!permissions || permissions.length === 0) {\n return [{ action: '', subject: '' }];\n }\n\n /**\n * Given the provided permissions, return the permissions from either passedPermissions\n * or userPermissions as this is expected to be the full permission entity.\n */\n const actualUserPermissions = passedPermissions ?? userPermissions;\n\n const matchingPermissions = actualUserPermissions.filter(\n (permission) =>\n permissions.findIndex(\n (perm) => perm.action === permission.action && perm.subject === permission.subject\n ) >= 0\n );\n\n const middlewaredPermissions = await runRbacMiddleware(\n {\n user,\n permissions: userPermissions,\n pathname: location.pathname,\n search: (rawQueryContext || rawQuery).split('?')[1] ?? '',\n },\n matchingPermissions\n );\n\n const shouldCheckConditions = middlewaredPermissions.some(\n (perm) => Array.isArray(perm.conditions) && perm.conditions.length > 0\n );\n\n if (!shouldCheckConditions) {\n return middlewaredPermissions;\n }\n\n const { data, error } = await checkPermissions({\n permissions: middlewaredPermissions.map((perm) => ({\n action: perm.action,\n subject: perm.subject,\n })),\n });\n\n if (error) {\n throw error;\n } else {\n return middlewaredPermissions.filter((_, index) => data?.data[index] === true);\n }\n },\n [checkPermissions, location.pathname, rawQuery, runRbacMiddleware, user, userPermissions]\n );\n\n const isLoading = isLoadingUser || isLoadingPermissions;\n\n return (\n <Provider\n token={token}\n user={user}\n login={login}\n logout={logout}\n permissions={userPermissions}\n checkUserHasPermissions={checkUserHasPermissions}\n refetchPermissions={refetchPermissions}\n isLoading={isLoading}\n >\n {children}\n </Provider>\n );\n};\n\nexport { AuthProvider, useAuth, STORAGE_KEYS };\nexport type { AuthContextValue, Permission, User };\n","import * as React from 'react';\n\nimport { Alert, AlertVariant, Flex, useCallbackRef, Link } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\ninterface NotificationLink {\n label: string;\n target?: string;\n url: string;\n}\n\ninterface NotificationConfig {\n blockTransition?: boolean;\n link?: NotificationLink;\n message?: string;\n onClose?: () => void;\n timeout?: number;\n title?: string;\n type?: 'info' | 'warning' | 'danger' | 'success';\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\ninterface NotificationsContextValue {\n /**\n * Toggles a notification, wrapped in `useCallback` for a stable identity.\n */\n toggleNotification: (config: NotificationConfig) => void;\n}\n\nconst NotificationsContext = React.createContext<NotificationsContextValue>({\n toggleNotification: () => {},\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface NotificationsProviderProps {\n children: React.ReactNode;\n}\ninterface Notification extends NotificationConfig {\n id: number;\n}\n\n/**\n * @internal\n * @description DO NOT USE. This will be removed before stable release of v5.\n */\nconst NotificationsProvider = ({ children }: NotificationsProviderProps) => {\n const notificationIdRef = React.useRef(0);\n\n const [notifications, setNotifications] = React.useState<Notification[]>([]);\n\n const toggleNotification = React.useCallback(\n ({ type, message, link, timeout, blockTransition, onClose, title }: NotificationConfig) => {\n setNotifications((s) => [\n ...s,\n {\n id: notificationIdRef.current++,\n type,\n message,\n link,\n timeout,\n blockTransition,\n onClose,\n title,\n },\n ]);\n },\n []\n );\n\n const clearNotification = React.useCallback((id: number) => {\n setNotifications((s) => s.filter((n) => n.id !== id));\n }, []);\n\n const value = React.useMemo(() => ({ toggleNotification }), [toggleNotification]);\n\n return (\n <NotificationsContext.Provider value={value}>\n <Flex\n left=\"50%\"\n marginLeft=\"-250px\"\n position=\"fixed\"\n direction=\"column\"\n alignItems=\"stretch\"\n gap={2}\n top={`4.6rem`}\n width={`50rem`}\n zIndex=\"notification\"\n >\n {notifications.map((notification) => {\n return (\n <Notification\n key={notification.id}\n {...notification}\n clearNotification={clearNotification}\n />\n );\n })}\n </Flex>\n {children}\n </NotificationsContext.Provider>\n );\n};\n\ninterface NotificationProps extends Notification {\n clearNotification: (id: number) => void;\n}\n\nconst Notification = ({\n clearNotification,\n blockTransition = false,\n id,\n link,\n message,\n onClose,\n timeout = 2500,\n title,\n type,\n}: NotificationProps) => {\n const { formatMessage } = useIntl();\n /**\n * Chances are `onClose` won't be classed as stabilised,\n * so we use `useCallbackRef` to avoid make it stable.\n */\n const onCloseCallback = useCallbackRef(onClose);\n\n const handleClose = React.useCallback(() => {\n onCloseCallback();\n\n clearNotification(id);\n }, [clearNotification, id, onCloseCallback]);\n\n // eslint-disable-next-line consistent-return\n React.useEffect(() => {\n if (!blockTransition) {\n const timeoutReference = setTimeout(() => {\n handleClose();\n }, timeout);\n\n return () => {\n clearTimeout(timeoutReference);\n };\n }\n }, [blockTransition, handleClose, timeout]);\n\n let variant: AlertVariant;\n let alertTitle: string;\n\n if (type === 'info') {\n variant = 'default';\n alertTitle = formatMessage({\n id: 'notification.default.title',\n defaultMessage: 'Information:',\n });\n } else if (type === 'danger') {\n variant = 'danger';\n alertTitle = formatMessage({\n id: 'notification.warning.title',\n defaultMessage: 'Warning:',\n });\n } else if (type === 'warning') {\n variant = 'warning';\n alertTitle = formatMessage({\n id: 'notification.warning.title',\n defaultMessage: 'Warning:',\n });\n } else {\n variant = 'success';\n alertTitle = formatMessage({\n id: 'notification.success.title',\n defaultMessage: 'Success:',\n });\n }\n\n if (title) {\n alertTitle = title;\n }\n\n return (\n <Alert\n action={\n link ? (\n <Link href={link.url} isExternal>\n {link.label}\n </Link>\n ) : undefined\n }\n onClose={handleClose}\n closeLabel={formatMessage({\n id: 'global.close',\n defaultMessage: 'Close',\n })}\n title={alertTitle}\n variant={variant}\n >\n {message}\n </Alert>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @preserve\n * @description Returns an object to interact with the notification\n * system. The callbacks are wrapped in `useCallback` for a stable\n * identity.\n *\n * @example\n * ```tsx\n * import { useNotification } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { toggleNotification } = useNotification();\n *\n * return <button onClick={() => toggleNotification({ message: 'Hello world!' })}>Click me</button>;\n */\nconst useNotification = () => React.useContext(NotificationsContext);\n\nexport { NotificationsProvider, useNotification };\nexport type { NotificationConfig, NotificationsContextValue };\n","/**\n * Prefix message with 'apiError.'\n */\nexport function getPrefixedId(message: string, callback?: (prefixedMessage: string) => string) {\n const prefixedMessage = `apiError.${message}`;\n\n // if a prefix function has been passed in it is used to\n // prefix the id, e.g. to allow an error message to be\n // set only for a localization namespace\n if (typeof callback === 'function') {\n return callback(prefixedMessage);\n }\n\n return prefixedMessage;\n}\n","import { getPrefixedId } from './getPrefixedId';\n\nimport type { ApiError } from '../hooks/useAPIErrorHandler';\nimport type { FetchError } from '../utils/getFetchClient';\nimport type { errors } from '@strapi/utils';\n\nexport interface NormalizeErrorOptions {\n name?: string;\n intlMessagePrefixCallback?: (id: string) => string;\n}\n\ninterface NormalizeErrorReturn {\n id: string;\n defaultMessage: string;\n name?: string;\n values: Record<'path', string> | Record<string, never>;\n}\n\ninterface YupFormattedError {\n path: string[];\n message: string;\n name: string;\n}\n\nfunction normalizeError(\n error: ApiError | YupFormattedError,\n { name, intlMessagePrefixCallback }: NormalizeErrorOptions\n): NormalizeErrorReturn {\n const { message } = error;\n\n const normalizedError = {\n id: getPrefixedId(message, intlMessagePrefixCallback),\n defaultMessage: message,\n name: error.name ?? name,\n values: {},\n };\n\n if ('path' in error) {\n normalizedError.values = { path: error.path.join('.') };\n }\n\n return normalizedError;\n}\n\nconst validateErrorIsYupValidationError = (\n err: ApiError\n): err is errors.YupValidationError & { details: { errors: YupFormattedError[] } } =>\n typeof err.details === 'object' && err.details !== null && 'errors' in err.details;\n\n/**\n * Normalize the format of `ResponseError`\n * in places where the hook `useAPIErrorHandler` can not called\n * (e.g. outside of a React component).\n */\nexport function normalizeAPIError(\n apiError: FetchError,\n intlMessagePrefixCallback?: NormalizeErrorOptions['intlMessagePrefixCallback']\n):\n | NormalizeErrorReturn\n | { name: string; message: string | null; errors: NormalizeErrorReturn[] }\n | null {\n const error = apiError.response?.data?.error;\n\n if (error) {\n // some errors carry multiple errors (such as ValidationError)\n if (validateErrorIsYupValidationError(error)) {\n return {\n name: error.name,\n message: error?.message || null,\n errors: error.details.errors.map((err) =>\n normalizeError(err, { name: error.name, intlMessagePrefixCallback })\n ),\n };\n }\n return normalizeError(error, { intlMessagePrefixCallback });\n }\n\n return null;\n}\n","import clone from 'lodash/clone';\nimport toPath from 'lodash/toPath';\n\n/**\n * Deeply get a value from an object via its path.\n */\nexport function getIn(obj: any, key: string | string[], def?: any, pathStartIndex: number = 0) {\n const path = toPath(key);\n while (obj && pathStartIndex < path.length) {\n obj = obj[path[pathStartIndex++]];\n }\n\n // check if path is not in the end\n if (pathStartIndex !== path.length && !obj) {\n return def;\n }\n\n return obj === undefined ? def : obj;\n}\n\n/** @internal is the given object an Object? */\nexport const isObject = (obj: any): obj is object =>\n obj !== null && typeof obj === 'object' && !Array.isArray(obj);\n\n/** @internal is the given object an integer? */\nexport const isInteger = (obj: any): boolean => String(Math.floor(Number(obj))) === obj;\n\n/**\n * Deeply set a value from in object via its path. If the value at `path`\n * has changed, return a shallow copy of obj with `value` set at `path`.\n * If `value` has not changed, return the original `obj`.\n *\n * Existing objects / arrays along `path` are also shallow copied. Sibling\n * objects along path retain the same internal js reference. Since new\n * objects / arrays are only created along `path`, we can test if anything\n * changed in a nested structure by comparing the object's reference in\n * the old and new object, similar to how russian doll cache invalidation\n * works.\n *\n * In earlier versions of this function, which used cloneDeep, there were\n * issues whereby settings a nested value would mutate the parent\n * instead of creating a new object. `clone` avoids that bug making a\n * shallow copy of the objects along the update path\n * so no object is mutated in place.\n *\n * Before changing this function, please read through the following\n * discussions.\n *\n * @see https://github.com/developit/linkstate\n * @see https://github.com/jaredpalmer/formik/pull/123\n */\nexport function setIn(obj: any, path: string, value: any): any {\n const res: any = clone(obj); // this keeps inheritance when obj is a class\n let resVal: any = res;\n let i = 0;\n const pathArray = toPath(path);\n\n for (; i < pathArray.length - 1; i++) {\n const currentPath: string = pathArray[i];\n const currentObj: any = getIn(obj, pathArray.slice(0, i + 1));\n\n if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {\n resVal = resVal[currentPath] = clone(currentObj);\n } else {\n const nextPath: string = pathArray[i + 1];\n resVal = resVal[currentPath] = isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {};\n }\n }\n\n // Return original object if new value is the same as current\n if ((i === 0 ? obj : resVal)[pathArray[i]] === value) {\n return obj;\n }\n\n if (value === undefined) {\n delete resVal[pathArray[i]];\n } else {\n resVal[pathArray[i]] = value;\n }\n\n // If the path array has a single element, the loop did not run.\n // Deleting on `resVal` had no effect in this scenario, so we delete on the result instead.\n if (i === 0 && value === undefined) {\n delete res[pathArray[i]];\n }\n\n return res;\n}\n","import * as React from 'react';\n\nimport { IntlFormatters, useIntl } from 'react-intl';\n\nimport { FetchError } from '../utils/getFetchClient';\nimport { getPrefixedId } from '../utils/getPrefixedId';\nimport { NormalizeErrorOptions, normalizeAPIError } from '../utils/normalizeAPIError';\nimport { setIn } from '../utils/objects';\n\nimport type { errors } from '@strapi/utils';\n\ntype ApiError =\n | errors.ApplicationError\n | errors.ForbiddenError\n | errors.NotFoundError\n | errors.NotImplementedError\n | errors.PaginationError\n | errors.PayloadTooLargeError\n | errors.PolicyError\n | errors.RateLimitError\n | errors.UnauthorizedError\n | errors.ValidationError\n | errors.YupValidationError;\n\ninterface UnknownApiError {\n /**\n * The name of the ApiError, is always a static value.\n */\n name: 'UnknownError';\n /**\n * The error message.\n */\n message: string;\n /**\n * The error details.\n */\n details?: unknown;\n /**\n * The HTTP status code of the error.\n */\n status?: number;\n}\n\n/**\n * The last item is the fallback error SerializedError which\n * typically comes from redux-toolkit itself.\n */\ninterface SerializedError {\n /**\n * The name of the error.\n */\n name?: string;\n /**\n * The error message that explains what went wrong.\n */\n message?: string;\n /**\n * The stack trace of the error.\n */\n stack?: string;\n /**\n * A specific error code associated with the error.\n */\n code?: string;\n}\n\n/**\n * These are the types or errors we return\n * from the redux-toolkit data-fetching setup.\n */\ntype BaseQueryError = ApiError | UnknownApiError | SerializedError;\n\ninterface YupFormattedError {\n /**\n * An array representing the path to the field where the validation error occurred.\n */\n path: string[];\n /**\n * The error message describing the validation failure.\n */\n message: string;\n /**\n * The name of the error, typically identifies the type of validation error that occurred.\n */\n name: string;\n}\n\n/**\n * @public\n * @description The purpose of this hook is to offer a unified way to handle errors thrown by API endpoints, regardless of the type of error (`ValidationError`, `ApplicationErrror` ...)\nthat has been thrown.\n * @example\n * ```tsx\n * import * as React from 'react';\n * import { useFetchClient, useAPIErrorHandler, useNotification } from '@strapi/admin/admin';\n *\n * const MyComponent = () => {\n * const { get } = useFetchClient();\n * const { formatAPIError } = useAPIErrorHandler(getTrad);\n * const { toggleNotification } = useNotification();\n *\n * const handleDeleteItem = async () => {\n * try {\n * return await get('/admin');\n * } catch (error) {\n * toggleNotification({\n * type: 'danger',\n * message: formatAPIError(error),\n * });\n * }\n * };\n * return <button onClick={handleDeleteItem}>Delete item</button>;\n * };\n * ```\n */\nexport function useAPIErrorHandler(\n intlMessagePrefixCallback?: FormatAPIErrorOptions['intlMessagePrefixCallback']\n) {\n const { formatMessage } = useIntl();\n\n /**\n * @description This method try to normalize the passed error\n * and then call formatAPIError to stringify the ResponseObject\n * into a string. If it fails it will call formatFetchError and\n * return the error message.\n */\n const formatError = React.useCallback(\n (error: FetchError) => {\n // Try to normalize the passed error first. This will fail for e.g. network\n // errors which are thrown by fetchClient directly.\n try {\n const formattedErr = formatAPIError(error, { intlMessagePrefixCallback, formatMessage });\n\n if (!formattedErr) {\n return formatFetchError(error, { intlMessagePrefixCallback, formatMessage });\n }\n\n return formattedErr;\n } catch (_) {\n throw new Error('formatAPIError: Unknown error:', error);\n }\n },\n [formatMessage, intlMessagePrefixCallback]\n );\n\n return {\n /**\n * @alpha\n * Convert ValidationErrors from the API into an object that can be used by forms.\n */\n _unstableFormatValidationErrors: React.useCallback(\n (error: Extract<BaseQueryError, { name: 'ValidationError' }>): Record<string, string> => {\n if (typeof error.details === 'object' && error.details !== null) {\n if ('errors' in error.details && Array.isArray(error.details.errors)) {\n const validationErrors = error.details.errors as YupFormattedError[];\n\n return validationErrors.reduce((acc, err) => {\n const { path, message } = err;\n\n return setIn(acc, path.join('.'), message);\n }, {});\n } else {\n const details = error.details as Record<string, string[]>;\n\n return Object.keys(details).reduce((acc, key) => {\n const messages = details[key];\n\n return {\n ...acc,\n [key]: messages.join(', '),\n };\n }, {});\n }\n } else {\n return {};\n }\n },\n []\n ),\n /**\n * @alpha\n * This handles the errors given from `redux-toolkit`'s axios based baseQuery function.\n */\n _unstableFormatAPIError: React.useCallback(\n (error: BaseQueryError) => {\n const err = {\n response: {\n data: {\n error,\n },\n },\n } as FetchError;\n\n /**\n * There's a chance with SerializedErrors that the message is not set.\n * In that case we return a generic error message.\n */\n if (!error.message) {\n return 'Unknown error occured.';\n }\n\n return formatError(err);\n },\n [formatError]\n ),\n formatAPIError: formatError,\n };\n}\n\nfunction formatFetchError(\n error: FetchError,\n { intlMessagePrefixCallback, formatMessage }: FormatAPIErrorOptions\n) {\n const { code, message } = error;\n\n return formatMessage(\n {\n id: getPrefixedId(message, intlMessagePrefixCallback),\n defaultMessage: message,\n },\n {\n code,\n }\n );\n}\n\ntype FormatAPIErrorOptions = Partial<Pick<NormalizeErrorOptions, 'intlMessagePrefixCallback'>> &\n Pick<IntlFormatters, 'formatMessage'>;\n\n/**\n * @description This method stringifies the `ResponseObject` into\n * a string. If multiple errors are thrown by the API, which\n * happens e.g.in the case of a `ValidationError`, all errors\n * will bo concatenated into a single string.\n */\nfunction formatAPIError(\n error: FetchError,\n { formatMessage, intlMessagePrefixCallback }: FormatAPIErrorOptions\n) {\n if (!formatMessage) {\n throw new Error('The formatMessage callback is a mandatory argument.');\n }\n\n const normalizedError = normalizeAPIError(error, intlMessagePrefixCallback);\n\n if (!normalizedError) {\n return null;\n }\n\n if ('message' in normalizedError && normalizedError.message !== null) {\n return normalizedError.message;\n }\n\n // stringify multiple errors\n if ('errors' in normalizedError) {\n return normalizedError.errors\n .map(({ id, defaultMessage, values }) => formatMessage({ id, defaultMessage }, values))\n .join('\\n');\n }\n\n return formatMessage(normalizedError);\n}\n\nexport type { ApiError };\n","import * as React from 'react';\n\nimport {\n Box,\n EmptyStateLayout,\n type EmptyStateLayoutProps,\n Flex,\n Loader,\n Main,\n MainProps,\n} from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { EmptyPermissions, EmptyDocuments } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { useAuth, Permission } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport { useCheckPermissionsQuery } from '../services/auth';\n\n/* -------------------------------------------------------------------------------------------------\n * Main\n * -----------------------------------------------------------------------------------------------*/\ninterface PageMainProps extends MainProps {\n children: React.ReactNode;\n}\n\nconst PageMain = ({ children, ...restProps }: PageMainProps) => {\n return <Main {...restProps}>{children}</Main>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Loading\n * -----------------------------------------------------------------------------------------------*/\ninterface LoadingProps {\n /**\n * @default 'Loading content.'\n */\n children?: React.ReactNode;\n}\n\n/**\n * @public\n * @description A loading component that should be rendered as the page\n * whilst you load the content for the aforementioned page.\n */\nconst Loading = ({ children = 'Loading content.' }: LoadingProps) => {\n return (\n <PageMain height=\"100vh\" aria-busy={true}>\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Loader>{children}</Loader>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Error\n * -----------------------------------------------------------------------------------------------*/\ninterface ErrorProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * TODO: should we start passing our errors here so they're persisted on the screen?\n * This could follow something similar to how the global app error works...?\n */\n\n/**\n * @public\n * @description An error component that should be rendered as the page\n * when an error occurs.\n */\nconst Error = (props: ErrorProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <EmptyStateLayout\n icon={<WarningCircle width=\"16rem\" />}\n content={formatMessage({\n id: 'anErrorOccurred',\n defaultMessage: 'Woops! Something went wrong. Please, try again.',\n })}\n {...props}\n />\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoPermissions\n * -----------------------------------------------------------------------------------------------*/\ninterface NoPermissionsProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when the user does not have the permissions to access the content.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoPermissions = (props: NoPermissionsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyPermissions width=\"16rem\" />}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-permissions',\n defaultMessage: \"You don't have the permissions to access that content\",\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoData\n * -----------------------------------------------------------------------------------------------*/\ninterface NoDataProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when there is no data available to display.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoData = (props: NoDataProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\" background=\"neutral100\">\n <Flex alignItems=\"center\" height=\"100%\" width=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyDocuments width=\"16rem\" />}\n action={props.action}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Protect\n * -----------------------------------------------------------------------------------------------*/\nexport interface ProtectProps {\n /**\n * The children to render if the user has the required permissions.\n * If providing a function, it will be called with an object containing\n * the permissions the user has based on the array you passed to the component.\n */\n children: React.ReactNode | ((args: { permissions: Permission[] }) => React.ReactNode);\n /**\n * The permissions the user needs to have to access the content.\n */\n permissions?: Array<Omit<Partial<Permission>, 'action'> & Pick<Permission, 'action'>>;\n}\n\n/**\n * @public\n * @description A wrapper component that should be used to protect a page. It will check the permissions\n * you pass to it and render the children if the user has the required permissions. If a user does not have ALL\n * the required permissions, it will redirect the user to the home page. Whilst these checks happen it will render\n * the loading component and should the check fail it will render the error component with a notification.\n */\nconst Protect = ({ permissions = [], children }: ProtectProps) => {\n const userPermissions = useAuth('Protect', (state) => state.permissions);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const matchingPermissions = userPermissions.filter(\n (permission) =>\n permissions.findIndex(\n (perm) => perm.action === permission.action && perm.subject === permission.subject\n ) >= 0\n );\n\n const shouldCheckConditions = matchingPermissions.some(\n (perm) => Array.isArray(perm.conditions) && perm.conditions.length > 0\n );\n\n const { isLoading, error, data } = useCheckPermissionsQuery(\n {\n permissions: matchingPermissions.map((perm) => ({\n action: perm.action,\n subject: perm.subject,\n })),\n },\n {\n skip: !shouldCheckConditions,\n }\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n if (isLoading) {\n return <Loading />;\n }\n\n if (error) {\n return <Error />;\n }\n\n const { data: permissionsData } = data || {};\n\n const canAccess =\n shouldCheckConditions && permissionsData\n ? !permissionsData.includes(false)\n : matchingPermissions.length > 0;\n\n if (!canAccess) {\n return <NoPermissions />;\n }\n\n return (\n <>\n {typeof children === 'function' ? children({ permissions: matchingPermissions }) : children}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Title\n * -----------------------------------------------------------------------------------------------*/\nexport interface TitleProps {\n children: string;\n}\n\n/**\n * @public\n * @description This component takes the children (must be a string) and sets\n * it as the title of the html.\n */\nconst Title = ({ children: title }: TitleProps) => {\n React.useEffect(() => {\n document.title = `${title} | Strapi`;\n }, [title]);\n\n return null;\n};\n\nconst Page = {\n Error,\n Loading,\n NoPermissions,\n Protect,\n NoData,\n Main: PageMain,\n Title,\n};\n\nexport { Page };\nexport type { ErrorProps, LoadingProps, NoPermissionsProps, PageMainProps as MainProps };\n","export const once = <TFunc extends (...args: any) => any>(fn: TFunc) => {\n const func = fn;\n let called = false;\n\n if (typeof func !== 'function') {\n throw new TypeError(`once requires a function parameter`);\n }\n\n return (...args: any) => {\n if (!called && process.env.NODE_ENV === 'development') {\n func(...args);\n called = true;\n }\n };\n};\n","const capitalise = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1);\n\nexport { capitalise };\n","import { useEffect, useRef } from 'react';\n\nexport const usePrev = <T>(value: T): T | undefined => {\n const ref = useRef<T>();\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref.current;\n};\n","import * as React from 'react';\n\nimport isEqual from 'lodash/isEqual';\n\nimport { useAuth, Permission } from '../features/Auth';\nimport { once } from '../utils/once';\nimport { capitalise } from '../utils/strings';\n\nimport { usePrev } from './usePrev';\n\ntype AllowedActions = Record<string, boolean>;\n\n/**\n * @public\n * @description This hooks takes an object or array of permissions (the latter preferred) and\n * runs through them to match against the current user's permissions as well as the RBAC middleware\n * system checking any conditions that may be present. It returns the filtered permissions as the complete\n * object from the API and a set of actions that can be performed. An action is derived from the last part\n * of the permission action e.g. `admin::roles.create` would be `canCreate`. If there's a hyphen in the action\n * this is removed and capitalised e.g `admin::roles.create-draft` would be `canCreateDraft`.\n * @example\n * ```tsx\n * import { Page, useRBAC } from '@strapi/strapi/admin'\n *\n * const MyProtectedPage = () => {\n * const { allowedActions, isLoading, error, permissions } = useRBAC([{ action: 'admin::roles.create' }])\n *\n * if(isLoading) {\n * return <Page.Loading />\n * }\n *\n * if(error){\n * return <Page.Error />\n * }\n *\n * if(!allowedActions.canCreate) {\n * return null\n * }\n *\n * return <MyPage permissions={permissions} />\n * }\n * ```\n */\nconst useRBAC = (\n permissionsToCheck: Record<string, Permission[]> | Permission[] = [],\n passedPermissions?: Permission[],\n rawQueryContext?: string\n): {\n allowedActions: AllowedActions;\n isLoading: boolean;\n error?: unknown;\n permissions: Permission[];\n} => {\n const isLoadingAuth = useAuth('useRBAC', (state) => state.isLoading);\n const [isLoading, setIsLoading] = React.useState(true);\n const [error, setError] = React.useState<unknown>();\n const [data, setData] = React.useState<Record<string, boolean>>();\n\n const warnOnce = React.useMemo(() => once(console.warn), []);\n\n const actualPermissionsToCheck: Permission[] = React.useMemo(() => {\n if (Array.isArray(permissionsToCheck)) {\n return permissionsToCheck;\n } else {\n warnOnce(\n 'useRBAC: The first argument should be an array of permissions, not an object. This will be deprecated in the future.'\n );\n\n return Object.values(permissionsToCheck).flat();\n }\n }, [permissionsToCheck, warnOnce]);\n\n /**\n * This is the default value we return until the queryResults[i].data\n * are all resolved with data. This preserves the original behaviour.\n */\n const defaultAllowedActions = React.useMemo(() => {\n return actualPermissionsToCheck.reduce<Record<string, boolean>>((acc, permission) => {\n return {\n ...acc,\n [getActionName(permission)]: false,\n };\n }, {});\n }, [actualPermissionsToCheck]);\n\n const checkUserHasPermissions = useAuth('useRBAC', (state) => state.checkUserHasPermissions);\n\n const permssionsChecked = usePrev(actualPermissionsToCheck);\n const contextChecked = usePrev(rawQueryContext);\n\n React.useEffect(() => {\n if (\n !isEqual(permssionsChecked, actualPermissionsToCheck) ||\n // TODO: also run this when the query context changes\n contextChecked !== rawQueryContext\n ) {\n setIsLoading(true);\n setData(undefined);\n setError(undefined);\n\n checkUserHasPermissions(actualPermissionsToCheck, passedPermissions, rawQueryContext)\n .then((res) => {\n if (res) {\n setData(\n res.reduce<Record<string, boolean>>((acc, permission) => {\n return {\n ...acc,\n [getActionName(permission)]: true,\n };\n }, {})\n );\n }\n })\n .catch((err) => {\n setError(err);\n })\n .finally(() => {\n setIsLoading(false);\n });\n }\n }, [\n actualPermissionsToCheck,\n checkUserHasPermissions,\n passedPermissions,\n permissionsToCheck,\n permssionsChecked,\n contextChecked,\n rawQueryContext,\n ]);\n\n /**\n * This hook originally would not return allowedActions\n * until all the checks were complete.\n */\n const allowedActions = Object.entries({\n ...defaultAllowedActions,\n ...data,\n }).reduce((acc, [name, allowed]) => {\n acc[`can${capitalise(name)}`] = allowed;\n\n return acc;\n }, {} as AllowedActions);\n\n return {\n allowedActions,\n permissions: actualPermissionsToCheck,\n isLoading: isLoading || isLoadingAuth,\n error,\n };\n};\n\nconst getActionName = (permission: Permission): string => {\n const [action = ''] = permission.action.split('.').slice(-1);\n return action.split('-').map(capitalise).join('');\n};\n\nexport { useRBAC };\nexport type { AllowedActions };\n","import { createContext } from '../components/Context';\n\ninterface AppInfoContextValue {\n autoReload?: boolean;\n communityEdition?: boolean;\n currentEnvironment?: string;\n dependencies?: Record<string, string>;\n latestStrapiReleaseTag?: string;\n nodeVersion?: string;\n projectId?: string | null;\n shouldUpdateStrapi?: boolean;\n strapiVersion?: string | null;\n useYarn?: boolean;\n userId?: string;\n}\n\nconst [AppInfoProvider, useAppInfo] = createContext<AppInfoContextValue>('AppInfo', {});\n\nexport { AppInfoProvider, useAppInfo };\n\nexport type { AppInfoContextValue };\n","import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch('https://analytics.strapi.io/api/v2/track', {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: { ...data, projectId: uuid },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid]);\n\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\ninterface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAccessAuthenticatedAdministration'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didGoToMarketplace'\n | 'didLaunchGuidedtour'\n | 'didMissMarketplacePlugin'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didPublishEntry'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willPublishEntry'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'willOpenPreview'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease';\n properties?: never;\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n type: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n 'https://analytics.strapi.io/api/v2/track',\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {},\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n","import * as React from 'react';\n\nimport { createContext } from '@radix-ui/react-context';\nimport { useIntl } from 'react-intl';\n\nimport { UpdateProjectSettings } from '../../../shared/contracts/admin';\nimport { Page } from '../components/PageHelpers';\nimport { useTypedSelector } from '../core/store/hooks';\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport { useRBAC } from '../hooks/useRBAC';\nimport {\n ConfigurationLogo,\n useInitQuery,\n useProjectSettingsQuery,\n useUpdateProjectSettingsMutation,\n} from '../services/admin';\n\nimport { useAuth } from './Auth';\nimport { useNotification } from './Notifications';\nimport { useTracking } from './Tracking';\n\nimport type { StrapiApp } from '../StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * Configuration Context\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UpdateProjectSettingsBody {\n authLogo:\n | ((UpdateProjectSettings.Request['body']['authLogo'] | ConfigurationLogo['custom']) & {\n rawFile?: File;\n })\n | null;\n menuLogo:\n | ((UpdateProjectSettings.Request['body']['menuLogo'] | ConfigurationLogo['custom']) & {\n rawFile?: File;\n })\n | null;\n}\n\ninterface ConfigurationContextValue {\n logos: {\n auth: ConfigurationLogo;\n menu: ConfigurationLogo;\n };\n showTutorials: boolean;\n showReleaseNotification: boolean;\n updateProjectSettings: (body: UpdateProjectSettingsBody) => Promise<void>;\n}\n\nconst [ConfigurationContextProvider, useConfiguration] =\n createContext<ConfigurationContextValue>('ConfigurationContext');\n\n/* -------------------------------------------------------------------------------------------------\n * ConfigurationProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ConfigurationProviderProps {\n children: React.ReactNode;\n defaultAuthLogo: StrapiApp['configurations']['authLogo'];\n defaultMenuLogo: StrapiApp['configurations']['menuLogo'];\n showReleaseNotification?: boolean;\n showTutorials?: boolean;\n}\n\nconst ConfigurationProvider = ({\n children,\n defaultAuthLogo,\n defaultMenuLogo,\n showReleaseNotification = false,\n showTutorials = false,\n}: ConfigurationProviderProps) => {\n const { trackUsage } = useTracking();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.['project-settings']\n );\n const token = useAuth('ConfigurationProvider', (state) => state.token);\n\n const {\n allowedActions: { canRead },\n } = useRBAC(permissions);\n\n const {\n data: { authLogo: customAuthLogo, menuLogo: customMenuLogo } = {},\n error,\n isLoading,\n } = useInitQuery();\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'app.containers.App.notification.error.init' }),\n });\n }\n }, [error, formatMessage, toggleNotification]);\n\n const { data, isSuccess } = useProjectSettingsQuery(undefined, {\n skip: !token || !canRead,\n });\n\n const [updateProjectSettingsMutation] = useUpdateProjectSettingsMutation();\n\n const updateProjectSettings = React.useCallback(\n async (body: UpdateProjectSettingsBody) => {\n const formData = new FormData();\n\n /**\n * We either only send files or we send null values.\n * Null removes the logo. If you don't want to effect\n * an existing logo, don't send anything.\n */\n Object.entries(body).forEach(([key, value]) => {\n if (value?.rawFile) {\n formData.append(key, value.rawFile);\n } else if (value === null) {\n formData.append(key, JSON.stringify(value));\n }\n });\n\n const res = await updateProjectSettingsMutation(formData);\n\n if ('data' in res) {\n const updatedMenuLogo = !!res.data.menuLogo && !!body.menuLogo?.rawFile;\n const updatedAuthLogo = !!res.data.authLogo && !!body.authLogo?.rawFile;\n\n if (updatedMenuLogo) {\n trackUsage('didChangeLogo', {\n logo: 'menu',\n });\n }\n\n if (updatedAuthLogo) {\n trackUsage('didChangeLogo', {\n logo: 'auth',\n });\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'app', defaultMessage: 'Saved' }),\n });\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n },\n [formatAPIError, formatMessage, toggleNotification, trackUsage, updateProjectSettingsMutation]\n );\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <ConfigurationContextProvider\n showReleaseNotification={showReleaseNotification}\n showTutorials={showTutorials}\n logos={{\n menu: {\n custom: isSuccess\n ? data?.menuLogo\n : {\n url: customMenuLogo ?? '',\n },\n default: defaultMenuLogo,\n },\n auth: {\n custom: isSuccess\n ? data?.authLogo\n : {\n url: customAuthLogo ?? '',\n },\n default: defaultAuthLogo,\n },\n }}\n updateProjectSettings={updateProjectSettings}\n >\n {children}\n </ConfigurationContextProvider>\n );\n};\n\nexport {\n ConfigurationContextProvider as _internalConfigurationContextProvider,\n ConfigurationProvider,\n useConfiguration,\n};\nexport type {\n ConfigurationProviderProps,\n ConfigurationContextValue,\n ConfigurationLogo,\n UpdateProjectSettingsBody,\n};\n","import * as React from 'react';\n\nimport { produce } from 'immer';\nimport get from 'lodash/get';\nimport set from 'lodash/set';\n\nconst GUIDED_TOUR_COMPLETED_STEPS = 'GUIDED_TOUR_COMPLETED_STEPS';\nconst GUIDED_TOUR_CURRENT_STEP = 'GUIDED_TOUR_CURRENT_STEP';\nconst GUIDED_TOUR_SKIPPED = 'GUIDED_TOUR_SKIPPED';\n\nconst GUIDED_TOUR_KEYS = {\n GUIDED_TOUR_COMPLETED_STEPS,\n GUIDED_TOUR_CURRENT_STEP,\n GUIDED_TOUR_SKIPPED,\n} as const;\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourProvider\n * -----------------------------------------------------------------------------------------------*/\n\nimport { createContext } from '../Context';\n\ntype SectionKey = keyof GuidedTourContextValue['guidedTourState'];\ntype StepKey = keyof GuidedTourContextValue['guidedTourState'][SectionKey];\ntype Step = `${SectionKey}.${StepKey}`;\ninterface GuidedTourContextValue {\n currentStep: Step | null;\n guidedTourState: {\n contentTypeBuilder: {\n create: boolean;\n success: boolean;\n };\n contentManager: {\n create: boolean;\n success: boolean;\n };\n apiTokens: {\n create: boolean;\n success: boolean;\n };\n };\n isGuidedTourVisible: boolean;\n isSkipped: boolean;\n setCurrentStep: (step: Step | null) => void | null;\n setGuidedTourVisibility: (isVisible: boolean) => void;\n setSkipped: (isSkipped: boolean) => void;\n setStepState: (step: Step, state: boolean) => void;\n startSection: (section: SectionKey) => void;\n}\n\nconst [GuidedTourProviderImpl, useGuidedTour] = createContext<GuidedTourContextValue>('GuidedTour');\n\ninterface GuidedTourProviderProps {\n children: React.ReactNode;\n}\n\nconst GuidedTourProvider = ({ children }: GuidedTourProviderProps) => {\n const [{ currentStep, guidedTourState, isGuidedTourVisible, isSkipped }, dispatch] =\n React.useReducer(reducer, initialState, initialiseState);\n\n const setCurrentStep = (step: SetCurrentStepAction['step']) => {\n // if step is null it is intentional, we need to dispatch it\n if (step !== null) {\n const isStepAlreadyDone = get(guidedTourState, step);\n const [sectionName, stepName] = step.split('.') as [SectionKey, StepKey];\n const sectionArray = Object.entries(guidedTourState[sectionName]);\n\n const currentStepIndex = sectionArray.findIndex(([key]) => key === stepName);\n const previousSteps = sectionArray.slice(0, currentStepIndex);\n\n const isStepToShow = previousSteps.every(([, sectionValue]) => sectionValue);\n\n if (isStepAlreadyDone || isSkipped || !isStepToShow) {\n return null;\n }\n }\n\n window.localStorage.setItem(GUIDED_TOUR_CURRENT_STEP, JSON.stringify(null));\n\n return dispatch({\n type: 'SET_CURRENT_STEP',\n step,\n });\n };\n\n const setGuidedTourVisibility = (value: SetGuidedTourVisibilityAction['value']) => {\n dispatch({\n type: 'SET_GUIDED_TOUR_VISIBILITY',\n value,\n });\n };\n\n const setStepState = (currentStep: Step, value: SetStepStateAction['value']) => {\n addCompletedStep(currentStep);\n\n dispatch({\n type: 'SET_STEP_STATE',\n currentStep,\n value,\n });\n };\n\n const startSection = (sectionName: SectionKey) => {\n const sectionSteps = guidedTourState[sectionName];\n\n if (sectionSteps) {\n const guidedTourArray = Object.entries(guidedTourState);\n\n // Find current section position in the guidedTourArray\n // Get only previous sections based on current section position\n const currentSectionIndex = guidedTourArray.findIndex(([key]) => key === sectionName);\n const previousSections = guidedTourArray.slice(0, currentSectionIndex);\n\n // Check if every steps from previous section are done\n const isSectionToShow = previousSections.every(([, sectionValue]) =>\n Object.values(sectionValue).every(Boolean)\n );\n\n const [firstStep] = Object.keys(sectionSteps) as [StepKey];\n const isFirstStepDone = sectionSteps[firstStep];\n\n if (isSectionToShow && !currentStep && !isFirstStepDone) {\n setCurrentStep(`${sectionName}.${firstStep}`);\n }\n }\n };\n\n const setSkipped = (value: SetSkippedAction['value']) => {\n window.localStorage.setItem(GUIDED_TOUR_SKIPPED, JSON.stringify(value));\n\n dispatch({\n type: 'SET_SKIPPED',\n value,\n });\n };\n\n return (\n <GuidedTourProviderImpl\n guidedTourState={guidedTourState}\n currentStep={currentStep}\n setCurrentStep={setCurrentStep}\n setGuidedTourVisibility={setGuidedTourVisibility}\n setSkipped={setSkipped}\n setStepState={setStepState}\n startSection={startSection}\n isGuidedTourVisible={isGuidedTourVisible}\n isSkipped={isSkipped}\n >\n {children}\n </GuidedTourProviderImpl>\n );\n};\n\ntype State = Pick<\n GuidedTourContextValue,\n 'guidedTourState' | 'currentStep' | 'isGuidedTourVisible' | 'isSkipped'\n>;\n\nconst initialState = {\n currentStep: null,\n guidedTourState: {\n contentTypeBuilder: {\n create: false,\n success: false,\n },\n contentManager: {\n create: false,\n success: false,\n },\n apiTokens: {\n create: false,\n success: false,\n },\n },\n isGuidedTourVisible: false,\n isSkipped: false,\n} satisfies State;\n\ninterface SetCurrentStepAction {\n type: 'SET_CURRENT_STEP';\n step: Step | null;\n}\n\ninterface SetStepStateAction {\n type: 'SET_STEP_STATE';\n currentStep: Step;\n value: boolean;\n}\n\ninterface SetSkippedAction {\n type: 'SET_SKIPPED';\n value: boolean;\n}\n\ninterface SetGuidedTourVisibilityAction {\n type: 'SET_GUIDED_TOUR_VISIBILITY';\n value: boolean;\n}\n\ntype Action =\n | SetCurrentStepAction\n | SetStepStateAction\n | SetSkippedAction\n | SetGuidedTourVisibilityAction;\n\nconst reducer: React.Reducer<State, Action> = (state: State = initialState, action: Action) =>\n produce(state, (draftState) => {\n switch (action.type) {\n case 'SET_CURRENT_STEP': {\n draftState.currentStep = action.step;\n break;\n }\n case 'SET_STEP_STATE': {\n const [section, step] = action.currentStep.split('.') as [SectionKey, StepKey];\n draftState.guidedTourState[section][step] = action.value;\n break;\n }\n case 'SET_SKIPPED': {\n draftState.isSkipped = action.value;\n break;\n }\n case 'SET_GUIDED_TOUR_VISIBILITY': {\n draftState.isGuidedTourVisible = action.value;\n break;\n }\n default: {\n return draftState;\n }\n }\n });\n\nconst initialiseState = (initialState: State) => {\n const copyInitialState = { ...initialState };\n const guidedTourLocaleStorage = JSON.parse(\n window.localStorage.getItem(GUIDED_TOUR_COMPLETED_STEPS) ?? '[]'\n );\n const currentStepLocaleStorage = JSON.parse(\n window.localStorage.getItem(GUIDED_TOUR_CURRENT_STEP) ?? 'null'\n );\n const skippedLocaleStorage = JSON.parse(\n window.localStorage.getItem(GUIDED_TOUR_SKIPPED) ?? 'null'\n );\n\n if (Array.isArray(guidedTourLocaleStorage)) {\n guidedTourLocaleStorage.forEach((step) => {\n const [sectionName, stepName] = step.split('.');\n set(copyInitialState, ['guidedTourState', sectionName, stepName], true);\n });\n }\n\n // if current step when initializing mark it as done\n if (currentStepLocaleStorage) {\n const [sectionName, stepName] = currentStepLocaleStorage.split('.') as [SectionKey, StepKey];\n set(copyInitialState, ['guidedTourState', sectionName, stepName], true);\n\n addCompletedStep(currentStepLocaleStorage as Step);\n\n window.localStorage.setItem(GUIDED_TOUR_CURRENT_STEP, JSON.stringify(null));\n }\n\n if (skippedLocaleStorage !== null) {\n set(copyInitialState, 'isSkipped', skippedLocaleStorage);\n }\n\n return copyInitialState;\n};\n\n/**\n * @description Add a completed step to the local storage if it does not already exist.\n */\nconst addCompletedStep = (completedStep: Step) => {\n const currentSteps = JSON.parse(window.localStorage.getItem(GUIDED_TOUR_COMPLETED_STEPS) ?? '[]');\n\n if (!Array.isArray(currentSteps)) {\n return;\n }\n\n const isAlreadyStored = currentSteps.includes(completedStep);\n\n if (isAlreadyStored) {\n return;\n }\n\n window.localStorage.setItem(\n GUIDED_TOUR_COMPLETED_STEPS,\n JSON.stringify([...currentSteps, completedStep])\n );\n};\n\nexport { GuidedTourProvider, useGuidedTour, GuidedTourContextValue, GUIDED_TOUR_KEYS };\n","import * as React from 'react';\n\nimport defaultsDeep from 'lodash/defaultsDeep';\nimport { IntlProvider } from 'react-intl';\n\nimport { useTypedSelector } from '../core/store/hooks';\n\n/* -------------------------------------------------------------------------------------------------\n * LanguageProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LanguageProviderProps {\n children: React.ReactNode;\n messages: Record<string, Record<string, string>>;\n}\n\nconst LanguageProvider = ({ children, messages }: LanguageProviderProps) => {\n const locale = useTypedSelector((state) => state.admin_app.language.locale);\n const appMessages = defaultsDeep(messages[locale], messages.en);\n\n return (\n <IntlProvider locale={locale} defaultLocale=\"en\" messages={appMessages} textComponent=\"span\">\n {children}\n </IntlProvider>\n );\n};\n\nexport { LanguageProvider };\nexport type { LanguageProviderProps };\n","import * as React from 'react';\n\nimport { DesignSystemProvider } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useDispatch } from 'react-redux';\nimport { DefaultTheme, createGlobalStyle } from 'styled-components';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { setAvailableThemes } from '../reducer';\n\ninterface ThemeProps {\n children: React.ReactNode;\n themes: {\n dark: DefaultTheme;\n light: DefaultTheme;\n };\n}\n\nconst Theme = ({ children, themes }: ThemeProps) => {\n const { currentTheme } = useTypedSelector((state) => state.admin_app.theme);\n const [systemTheme, setSystemTheme] = React.useState<'light' | 'dark'>();\n const { locale } = useIntl();\n const dispatch = useDispatch();\n\n // Listen to changes in the system theme\n React.useEffect(() => {\n const themeWatcher = window.matchMedia('(prefers-color-scheme: dark)');\n setSystemTheme(themeWatcher.matches ? 'dark' : 'light');\n\n const listener = (event: MediaQueryListEvent) => {\n setSystemTheme(event.matches ? 'dark' : 'light');\n };\n themeWatcher.addEventListener('change', listener);\n\n // Remove listener on cleanup\n return () => {\n themeWatcher.removeEventListener('change', listener);\n };\n }, []);\n\n React.useEffect(() => {\n dispatch(setAvailableThemes(Object.keys(themes)));\n }, [dispatch, themes]);\n\n const computedThemeName = currentTheme === 'system' ? systemTheme : currentTheme;\n\n return (\n <DesignSystemProvider\n locale={locale}\n /**\n * TODO: could we make this neater i.e. by setting up the context to throw\n * if it can't find it, that way the type is always fully defined and we're\n * not checking it all the time...\n */\n theme={themes?.[computedThemeName || 'light']}\n >\n {children}\n <GlobalStyle />\n </DesignSystemProvider>\n );\n};\n\nconst GlobalStyle = createGlobalStyle`\n body {\n background: ${({ theme }) => theme.colors.neutral100};\n }\n`;\n\nexport { Theme };\nexport type { ThemeProps };\n"],"names":["permissions","ContextSelector","React","jsx","useDispatch","useStore","useSelector","createSelector","useLocation","useNavigate","useMemo","parse","useCallback","stringify","STORAGE_KEYS","createSlice","reducer","adminApi","logoutAction","loginAction","login","token","logout","jsxs","Flex","useIntl","useCallbackRef","Alert","Link","toPath","clone","Main","Loader","Error","EmptyStateLayout","WarningCircle","Box","EmptyPermissions","EmptyDocuments","Fragment","useRef","useEffect","isEqual","useInitQuery","useTelemetryPropertiesQuery","axios","createContext","useProjectSettingsQuery","useUpdateProjectSettingsMutation","get","currentStep","produce","initialState","set","defaultsDeep","IntlProvider","DesignSystemProvider","createGlobalStyle"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Theme-K6zNL3JT.js","sources":["../../admin/src/core/apis/rbac.ts","../../admin/src/components/Context.tsx","../../admin/src/core/store/hooks.ts","../../admin/src/features/StrapiApp.tsx","../../admin/src/hooks/useQueryParams.ts","../../admin/src/reducer.ts","../../admin/src/services/auth.ts","../../admin/src/features/Auth.tsx","../../admin/src/features/Notifications.tsx","../../admin/src/utils/getPrefixedId.ts","../../admin/src/utils/normalizeAPIError.ts","../../admin/src/utils/objects.ts","../../admin/src/hooks/useAPIErrorHandler.ts","../../admin/src/components/PageHelpers.tsx","../../admin/src/utils/once.ts","../../admin/src/utils/strings.ts","../../admin/src/hooks/usePrev.ts","../../admin/src/hooks/useRBAC.ts","../../admin/src/features/AppInfo.tsx","../../admin/src/features/Tracking.tsx","../../admin/src/features/Configuration.tsx","../../admin/src/components/GuidedTour/Provider.tsx","../../admin/src/components/LanguageProvider.tsx","../../admin/src/components/Theme.tsx"],"sourcesContent":["import { Location } from 'react-router-dom';\n\nimport type { Permission, User } from '../../features/Auth';\n\ninterface RBACContext extends Pick<Location, 'pathname' | 'search'> {\n /**\n * The current user.\n */\n user?: User;\n /**\n * The permissions of the current user.\n */\n permissions: Permission[];\n}\n\ninterface RBACMiddleware {\n (\n ctx: RBACContext\n ): (\n next: (permissions: Permission[]) => Promise<Permission[]> | Permission[]\n ) => (permissions: Permission[]) => Promise<Permission[]> | Permission[];\n}\n\nclass RBAC {\n private middlewares: RBACMiddleware[] = [];\n\n constructor() {}\n\n use(middleware: RBACMiddleware[]): void;\n use(middleware: RBACMiddleware): void;\n use(middleware: RBACMiddleware | RBACMiddleware[]): void {\n if (Array.isArray(middleware)) {\n this.middlewares.push(...middleware);\n } else {\n this.middlewares.push(middleware);\n }\n }\n\n run = async (ctx: RBACContext, permissions: Permission[]): Promise<Permission[]> => {\n let index = 0;\n\n const middlewaresToRun = this.middlewares.map((middleware) => middleware(ctx));\n\n const next = async (permissions: Permission[]) => {\n if (index < this.middlewares.length) {\n return middlewaresToRun[index++](next)(permissions);\n }\n\n return permissions;\n };\n\n return next(permissions);\n };\n}\n\nexport { RBAC };\nexport type { RBACMiddleware, RBACContext };\n","import * as React from 'react';\n\nimport * as ContextSelector from 'use-context-selector';\n\n/**\n * @experimental\n * @description Create a context provider and a hook to consume the context.\n *\n * @warning this may be removed to the design-system instead of becoming stable.\n */\nfunction createContext<ContextValueType extends object | null>(\n rootComponentName: string,\n defaultContext?: ContextValueType\n) {\n const Context = ContextSelector.createContext<ContextValueType | undefined>(defaultContext);\n\n const Provider = (props: ContextValueType & { children: React.ReactNode }) => {\n const { children, ...context } = props;\n // Only re-memoize when prop values change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const value = React.useMemo(() => context, Object.values(context)) as ContextValueType;\n\n return <Context.Provider value={value}>{children}</Context.Provider>;\n };\n\n const useContext = <Selected,>(\n consumerName: string,\n selector: (value: ContextValueType) => Selected\n ): Selected =>\n ContextSelector.useContextSelector(Context, (ctx) => {\n if (ctx) return selector(ctx);\n // it's a required context.\n throw new Error(`\\`${consumerName}\\` must be used within \\`${rootComponentName}\\``);\n });\n\n Provider.displayName = rootComponentName + 'Provider';\n\n return [Provider, useContext] as const;\n}\n\nexport { createContext };\n","import { createSelector, Selector } from '@reduxjs/toolkit';\nimport { useDispatch, useStore, TypedUseSelectorHook, useSelector } from 'react-redux';\n\nimport type { RootState, Store } from './configure';\n\ntype AppDispatch = Store['dispatch'];\n\nconst useTypedDispatch: () => AppDispatch = useDispatch;\nconst useTypedStore = useStore as () => Store;\nconst useTypedSelector: TypedUseSelectorHook<RootState> = useSelector;\n\nconst createTypedSelector = <TResult>(selector: Selector<RootState, TResult>) =>\n createSelector((state: RootState) => state, selector);\n\nexport { useTypedDispatch, useTypedStore, useTypedSelector, createTypedSelector };\n","import { createContext } from '../components/Context';\nimport { RBAC } from '../core/apis/rbac';\nimport { Router } from '../core/apis/router';\n\nimport type { StrapiApp } from '../StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * StrapiApp\n * -----------------------------------------------------------------------------------------------*/\ninterface StrapiAppContextValue\n extends Pick<\n StrapiApp,\n | 'customFields'\n | 'getPlugin'\n | 'getAdminInjectedComponents'\n | 'plugins'\n | 'runHookParallel'\n | 'runHookSeries'\n >,\n Pick<Router, 'menu' | 'settings'> {\n components: StrapiApp['library']['components'];\n fields: StrapiApp['library']['fields'];\n rbac: RBAC;\n runHookWaterfall: <TData>(\n name: Parameters<StrapiApp['runHookWaterfall']>[0],\n initialValue: TData\n ) => TData;\n}\n\nconst [StrapiAppProvider, useStrapiApp] = createContext<StrapiAppContextValue>('StrapiApp');\n\nexport { StrapiAppProvider, useStrapiApp };\nexport type { StrapiAppContextValue };\n","import { useCallback, useMemo } from 'react';\n\nimport { parse, stringify } from 'qs';\nimport { useNavigate, useLocation } from 'react-router-dom';\n\nconst useQueryParams = <TQuery extends object>(initialParams?: TQuery) => {\n const { search } = useLocation();\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 // @ts-expect-error – this is fine, if you want to fix it, please do.\n delete nextQuery[key];\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","import { createSlice } from '@reduxjs/toolkit';\n\nimport { PermissionMap } from './types/permissions';\n\nimport type { PayloadAction } from '@reduxjs/toolkit';\n\ntype ThemeName = 'light' | 'dark' | 'system';\n\ninterface AppState {\n language: {\n locale: string;\n localeNames: Record<string, string>;\n };\n permissions: Partial<PermissionMap>;\n theme: {\n currentTheme: ThemeName;\n availableThemes: string[];\n };\n token?: string | null;\n}\n\nconst STORAGE_KEYS = {\n TOKEN: 'jwtToken',\n USER: 'userInfo',\n};\n\nconst THEME_LOCAL_STORAGE_KEY = 'STRAPI_THEME';\nconst LANGUAGE_LOCAL_STORAGE_KEY = 'strapi-admin-language';\n\nexport const getStoredToken = (): string | null => {\n const token =\n localStorage.getItem(STORAGE_KEYS.TOKEN) ?? sessionStorage.getItem(STORAGE_KEYS.TOKEN);\n\n if (typeof token === 'string') {\n return JSON.parse(token);\n }\n\n return null;\n};\n\nconst adminSlice = createSlice({\n name: 'admin',\n initialState: () => {\n return {\n language: {\n locale: 'en',\n localeNames: { en: 'English' },\n },\n permissions: {},\n theme: {\n availableThemes: [],\n currentTheme: localStorage.getItem(THEME_LOCAL_STORAGE_KEY) || 'system',\n },\n token: null,\n } as AppState;\n },\n reducers: {\n setAppTheme(state, action: PayloadAction<ThemeName>) {\n state.theme.currentTheme = action.payload;\n window.localStorage.setItem(THEME_LOCAL_STORAGE_KEY, action.payload);\n },\n setAvailableThemes(state, action: PayloadAction<AppState['theme']['availableThemes']>) {\n state.theme.availableThemes = action.payload;\n },\n setLocale(state, action: PayloadAction<string>) {\n state.language.locale = action.payload;\n\n window.localStorage.setItem(LANGUAGE_LOCAL_STORAGE_KEY, action.payload);\n document.documentElement.setAttribute('lang', action.payload);\n },\n setToken(state, action: PayloadAction<string | null>) {\n state.token = action.payload;\n },\n login(state, action: PayloadAction<{ token: string; persist?: boolean }>) {\n const { token, persist } = action.payload;\n\n if (!persist) {\n window.sessionStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token));\n } else {\n window.localStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token));\n }\n\n state.token = token;\n },\n logout(state) {\n state.token = null;\n window.localStorage.removeItem(STORAGE_KEYS.TOKEN);\n window.localStorage.removeItem(STORAGE_KEYS.USER);\n window.sessionStorage.removeItem(STORAGE_KEYS.TOKEN);\n window.sessionStorage.removeItem(STORAGE_KEYS.USER);\n },\n },\n});\n\nconst reducer = adminSlice.reducer;\n\nexport const { setAppTheme, setAvailableThemes, setLocale, setToken, logout, login } =\n adminSlice.actions;\n\nexport { reducer, THEME_LOCAL_STORAGE_KEY, LANGUAGE_LOCAL_STORAGE_KEY };\nexport type { AppState, ThemeName };\n","import { ProvidersOptions } from '../../../shared/contracts/admin';\nimport {\n type RenewToken,\n type Login,\n type ResetPassword,\n type RegisterAdmin,\n type Register,\n type RegistrationInfo,\n ForgotPassword,\n} from '../../../shared/contracts/authentication';\nimport { Check } from '../../../shared/contracts/permissions';\nimport { GetProviders, IsSSOLocked } from '../../../shared/contracts/providers';\nimport { type GetOwnPermissions, type GetMe, type UpdateMe } from '../../../shared/contracts/users';\n\nimport { adminApi } from './api';\n\nconst authService = adminApi\n .enhanceEndpoints({\n addTagTypes: ['User', 'Me', 'ProvidersOptions'],\n })\n .injectEndpoints({\n endpoints: (builder) => ({\n /**\n * ME\n */\n getMe: builder.query<GetMe.Response['data'], void>({\n query: () => ({\n method: 'GET',\n url: '/admin/users/me',\n }),\n transformResponse(res: GetMe.Response) {\n return res.data;\n },\n providesTags: (res) => (res ? ['Me', { type: 'User', id: res.id }] : ['Me']),\n }),\n getMyPermissions: builder.query<GetOwnPermissions.Response['data'], void>({\n query: () => ({\n method: 'GET',\n url: '/admin/users/me/permissions',\n }),\n transformResponse(res: GetOwnPermissions.Response) {\n return res.data;\n },\n }),\n updateMe: builder.mutation<UpdateMe.Response['data'], UpdateMe.Request['body']>({\n query: (body) => ({\n method: 'PUT',\n url: '/admin/users/me',\n data: body,\n }),\n transformResponse(res: UpdateMe.Response) {\n return res.data;\n },\n invalidatesTags: ['Me'],\n }),\n /**\n * Permissions\n */\n checkPermissions: builder.query<Check.Response, Check.Request['body']>({\n query: (permissions) => ({\n method: 'POST',\n url: '/admin/permissions/check',\n data: permissions,\n }),\n }),\n /**\n * Auth methods\n */\n login: builder.mutation<Login.Response['data'], Login.Request['body']>({\n query: (body) => ({\n method: 'POST',\n url: '/admin/login',\n data: body,\n }),\n transformResponse(res: Login.Response) {\n return res.data;\n },\n invalidatesTags: ['Me'],\n }),\n logout: builder.mutation<void, void>({\n query: () => ({\n method: 'POST',\n url: '/admin/logout',\n }),\n }),\n resetPassword: builder.mutation<\n ResetPassword.Response['data'],\n ResetPassword.Request['body']\n >({\n query: (body) => ({\n method: 'POST',\n url: '/admin/reset-password',\n data: body,\n }),\n transformResponse(res: ResetPassword.Response) {\n return res.data;\n },\n }),\n renewToken: builder.mutation<RenewToken.Response['data'], RenewToken.Request['body']>({\n query: (body) => ({\n method: 'POST',\n url: '/admin/renew-token',\n data: body,\n }),\n transformResponse(res: RenewToken.Response) {\n return res.data;\n },\n }),\n getRegistrationInfo: builder.query<\n RegistrationInfo.Response['data'],\n RegistrationInfo.Request['query']['registrationToken']\n >({\n query: (registrationToken) => ({\n url: '/admin/registration-info',\n method: 'GET',\n config: {\n params: {\n registrationToken,\n },\n },\n }),\n transformResponse(res: RegistrationInfo.Response) {\n return res.data;\n },\n }),\n registerAdmin: builder.mutation<\n RegisterAdmin.Response['data'],\n RegisterAdmin.Request['body']\n >({\n query: (body) => ({\n method: 'POST',\n url: '/admin/register-admin',\n data: body,\n }),\n transformResponse(res: RegisterAdmin.Response) {\n return res.data;\n },\n }),\n registerUser: builder.mutation<Register.Response['data'], Register.Request['body']>({\n query: (body) => ({\n method: 'POST',\n url: '/admin/register',\n data: body,\n }),\n transformResponse(res: Register.Response) {\n return res.data;\n },\n }),\n forgotPassword: builder.mutation<ForgotPassword.Response, ForgotPassword.Request['body']>({\n query: (body) => ({\n url: '/admin/forgot-password',\n method: 'POST',\n data: body,\n }),\n }),\n isSSOLocked: builder.query<IsSSOLocked.Response['data'], void>({\n query: () => ({\n url: '/admin/providers/isSSOLocked',\n method: 'GET',\n }),\n transformResponse(res: IsSSOLocked.Response) {\n return res.data;\n },\n }),\n getProviders: builder.query<GetProviders.Response, void>({\n query: () => ({\n url: '/admin/providers',\n method: 'GET',\n }),\n }),\n getProviderOptions: builder.query<ProvidersOptions.Response['data'], void>({\n query: () => ({\n url: '/admin/providers/options',\n method: 'GET',\n }),\n transformResponse(res: ProvidersOptions.Response) {\n return res.data;\n },\n providesTags: ['ProvidersOptions'],\n }),\n updateProviderOptions: builder.mutation<\n ProvidersOptions.Response['data'],\n ProvidersOptions.Request['body']\n >({\n query: (body) => ({\n url: '/admin/providers/options',\n method: 'PUT',\n data: body,\n }),\n transformResponse(res: ProvidersOptions.Response) {\n return res.data;\n },\n invalidatesTags: ['ProvidersOptions'],\n }),\n }),\n overrideExisting: false,\n });\n\nconst {\n useCheckPermissionsQuery,\n useLazyCheckPermissionsQuery,\n useGetMeQuery,\n useLoginMutation,\n useRenewTokenMutation,\n useLogoutMutation,\n useUpdateMeMutation,\n useResetPasswordMutation,\n useRegisterAdminMutation,\n useRegisterUserMutation,\n useGetRegistrationInfoQuery,\n useForgotPasswordMutation,\n useGetMyPermissionsQuery,\n useIsSSOLockedQuery,\n useGetProvidersQuery,\n useGetProviderOptionsQuery,\n useUpdateProviderOptionsMutation,\n} = authService;\n\nexport {\n useCheckPermissionsQuery,\n useLazyCheckPermissionsQuery,\n useGetMeQuery,\n useLoginMutation,\n useRenewTokenMutation,\n useLogoutMutation,\n useUpdateMeMutation,\n useResetPasswordMutation,\n useRegisterAdminMutation,\n useRegisterUserMutation,\n useGetRegistrationInfoQuery,\n useForgotPasswordMutation,\n useGetMyPermissionsQuery,\n useIsSSOLockedQuery,\n useGetProvidersQuery,\n useGetProviderOptionsQuery,\n useUpdateProviderOptionsMutation,\n};\n","import * as React from 'react';\n\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nimport { Login } from '../../../shared/contracts/authentication';\nimport { createContext } from '../components/Context';\nimport { useTypedDispatch, useTypedSelector } from '../core/store/hooks';\nimport { useStrapiApp } from '../features/StrapiApp';\nimport { useQueryParams } from '../hooks/useQueryParams';\nimport { login as loginAction, logout as logoutAction, setLocale } from '../reducer';\nimport { adminApi } from '../services/api';\nimport {\n useGetMeQuery,\n useGetMyPermissionsQuery,\n useLazyCheckPermissionsQuery,\n useLoginMutation,\n useLogoutMutation,\n useRenewTokenMutation,\n} from '../services/auth';\n\nimport type {\n Permission as PermissionContract,\n SanitizedAdminUser,\n} from '../../../shared/contracts/shared';\n\ninterface Permission\n extends Pick<PermissionContract, 'action' | 'subject'>,\n Partial<Omit<PermissionContract, 'action' | 'subject'>> {}\n\ninterface User\n extends Pick<SanitizedAdminUser, 'email' | 'firstname' | 'lastname' | 'username' | 'roles'>,\n Partial<Omit<SanitizedAdminUser, 'email' | 'firstname' | 'lastname' | 'username' | 'roles'>> {}\n\ninterface AuthContextValue {\n login: (\n body: Login.Request['body'] & { rememberMe: boolean }\n ) => Promise<Awaited<ReturnType<ReturnType<typeof useLoginMutation>[0]>>>;\n logout: () => Promise<void>;\n /**\n * @alpha\n * @description given a list of permissions, this function checks\n * those against the current user's permissions or those passed as\n * the second argument, if the user has those permissions the complete\n * permission object form the API is returned. Therefore, if the list is\n * empty, the user does not have any of those permissions.\n */\n checkUserHasPermissions: (\n permissions?: Permission[],\n passedPermissions?: Permission[],\n rawQueryContext?: string\n ) => Promise<Permission[]>;\n isLoading: boolean;\n permissions: Permission[];\n refetchPermissions: () => Promise<void>;\n token: string | null;\n user?: User;\n}\n\nconst [Provider, useAuth] = createContext<AuthContextValue>('Auth');\n\ninterface AuthProviderProps {\n children: React.ReactNode;\n /**\n * @internal could be removed at any time.\n */\n _defaultPermissions?: Permission[];\n\n // NOTE: this is used for testing purposed only\n _disableRenewToken?: boolean;\n}\n\nconst STORAGE_KEYS = {\n TOKEN: 'jwtToken',\n USER: 'userInfo',\n};\n\nconst AuthProvider = ({\n children,\n _defaultPermissions = [],\n _disableRenewToken = false,\n}: AuthProviderProps) => {\n const dispatch = useTypedDispatch();\n const runRbacMiddleware = useStrapiApp('AuthProvider', (state) => state.rbac.run);\n const location = useLocation();\n const [{ rawQuery }] = useQueryParams();\n\n const token = useTypedSelector((state) => state.admin_app.token ?? null);\n\n const { data: user, isLoading: isLoadingUser } = useGetMeQuery(undefined, {\n /**\n * If there's no token, we don't try to fetch\n * the user data because it will fail.\n */\n skip: !token,\n });\n\n const {\n data: userPermissions = _defaultPermissions,\n refetch,\n isUninitialized,\n isLoading: isLoadingPermissions,\n } = useGetMyPermissionsQuery(undefined, {\n skip: !token,\n });\n\n const navigate = useNavigate();\n\n const [loginMutation] = useLoginMutation();\n const [renewTokenMutation] = useRenewTokenMutation();\n const [logoutMutation] = useLogoutMutation();\n\n const clearStateAndLogout = React.useCallback(() => {\n dispatch(adminApi.util.resetApiState());\n dispatch(logoutAction());\n navigate('/auth/login');\n }, [dispatch, navigate]);\n\n /**\n * Fetch data from storages on mount and store it in our state.\n * It's not normally stored in session storage unless the user\n * does click \"remember me\" when they login. We also need to renew the token.\n */\n React.useEffect(() => {\n if (token && !_disableRenewToken) {\n renewTokenMutation({ token }).then((res) => {\n if ('data' in res) {\n dispatch(\n loginAction({\n token: res.data.token,\n })\n );\n } else {\n clearStateAndLogout();\n }\n });\n }\n }, [token, dispatch, renewTokenMutation, clearStateAndLogout, _disableRenewToken]);\n\n React.useEffect(() => {\n if (user) {\n if (user.preferedLanguage) {\n dispatch(setLocale(user.preferedLanguage));\n }\n }\n }, [dispatch, user]);\n\n React.useEffect(() => {\n /**\n * This will log a user out of all tabs if they log out in one tab.\n */\n const handleUserStorageChange = (event: StorageEvent) => {\n if (event.key === STORAGE_KEYS.USER && event.newValue === null) {\n clearStateAndLogout();\n }\n };\n\n window.addEventListener('storage', handleUserStorageChange);\n\n return () => {\n window.removeEventListener('storage', handleUserStorageChange);\n };\n });\n\n const login = React.useCallback<AuthContextValue['login']>(\n async ({ rememberMe, ...body }) => {\n const res = await loginMutation(body);\n\n /**\n * There will always be a `data` key in the response\n * because if something fails, it will throw an error.\n */\n if ('data' in res) {\n const { token } = res.data;\n\n dispatch(\n loginAction({\n token,\n persist: rememberMe,\n })\n );\n }\n\n return res;\n },\n [dispatch, loginMutation]\n );\n\n const logout = React.useCallback(async () => {\n await logoutMutation();\n clearStateAndLogout();\n }, [clearStateAndLogout, logoutMutation]);\n\n const refetchPermissions = React.useCallback(async () => {\n if (!isUninitialized) {\n await refetch();\n }\n }, [isUninitialized, refetch]);\n\n const [checkPermissions] = useLazyCheckPermissionsQuery();\n const checkUserHasPermissions: AuthContextValue['checkUserHasPermissions'] = React.useCallback(\n async (\n permissions,\n passedPermissions,\n // TODO:\n // Here we have parameterised checkUserHasPermissions in order to pass\n // query context from elsewhere in the application.\n // See packages/core/content-manager/admin/src/features/DocumentRBAC.tsx\n\n // This is in order to calculate permissions on accurate query params.\n // We should be able to rely on the query params in this provider\n // If we need to pass additional context to the RBAC middleware\n // we should define a better context type.\n rawQueryContext\n ) => {\n /**\n * If there's no permissions to check, then we allow it to\n * pass to preserve existing behaviours.\n *\n * TODO: should we review this? it feels more dangerous than useful.\n */\n if (!permissions || permissions.length === 0) {\n return [{ action: '', subject: '' }];\n }\n\n /**\n * Given the provided permissions, return the permissions from either passedPermissions\n * or userPermissions as this is expected to be the full permission entity.\n */\n const actualUserPermissions = passedPermissions ?? userPermissions;\n\n const matchingPermissions = actualUserPermissions.filter(\n (permission) =>\n permissions.findIndex(\n (perm) => perm.action === permission.action && perm.subject === permission.subject\n ) >= 0\n );\n\n const middlewaredPermissions = await runRbacMiddleware(\n {\n user,\n permissions: userPermissions,\n pathname: location.pathname,\n search: (rawQueryContext || rawQuery).split('?')[1] ?? '',\n },\n matchingPermissions\n );\n\n const shouldCheckConditions = middlewaredPermissions.some(\n (perm) => Array.isArray(perm.conditions) && perm.conditions.length > 0\n );\n\n if (!shouldCheckConditions) {\n return middlewaredPermissions;\n }\n\n const { data, error } = await checkPermissions({\n permissions: middlewaredPermissions.map((perm) => ({\n action: perm.action,\n subject: perm.subject,\n })),\n });\n\n if (error) {\n throw error;\n } else {\n return middlewaredPermissions.filter((_, index) => data?.data[index] === true);\n }\n },\n [checkPermissions, location.pathname, rawQuery, runRbacMiddleware, user, userPermissions]\n );\n\n const isLoading = isLoadingUser || isLoadingPermissions;\n\n return (\n <Provider\n token={token}\n user={user}\n login={login}\n logout={logout}\n permissions={userPermissions}\n checkUserHasPermissions={checkUserHasPermissions}\n refetchPermissions={refetchPermissions}\n isLoading={isLoading}\n >\n {children}\n </Provider>\n );\n};\n\nexport { AuthProvider, useAuth, STORAGE_KEYS };\nexport type { AuthContextValue, Permission, User };\n","import * as React from 'react';\n\nimport { Alert, AlertVariant, Flex, useCallbackRef, Link } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\ninterface NotificationLink {\n label: string;\n target?: string;\n url: string;\n}\n\ninterface NotificationConfig {\n blockTransition?: boolean;\n link?: NotificationLink;\n message?: string;\n onClose?: () => void;\n timeout?: number;\n title?: string;\n type?: 'info' | 'warning' | 'danger' | 'success';\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\ninterface NotificationsContextValue {\n /**\n * Toggles a notification, wrapped in `useCallback` for a stable identity.\n */\n toggleNotification: (config: NotificationConfig) => void;\n}\n\nconst NotificationsContext = React.createContext<NotificationsContextValue>({\n toggleNotification: () => {},\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface NotificationsProviderProps {\n children: React.ReactNode;\n}\ninterface Notification extends NotificationConfig {\n id: number;\n}\n\n/**\n * @internal\n * @description DO NOT USE. This will be removed before stable release of v5.\n */\nconst NotificationsProvider = ({ children }: NotificationsProviderProps) => {\n const notificationIdRef = React.useRef(0);\n\n const [notifications, setNotifications] = React.useState<Notification[]>([]);\n\n const toggleNotification = React.useCallback(\n ({ type, message, link, timeout, blockTransition, onClose, title }: NotificationConfig) => {\n setNotifications((s) => [\n ...s,\n {\n id: notificationIdRef.current++,\n type,\n message,\n link,\n timeout,\n blockTransition,\n onClose,\n title,\n },\n ]);\n },\n []\n );\n\n const clearNotification = React.useCallback((id: number) => {\n setNotifications((s) => s.filter((n) => n.id !== id));\n }, []);\n\n const value = React.useMemo(() => ({ toggleNotification }), [toggleNotification]);\n\n return (\n <NotificationsContext.Provider value={value}>\n <Flex\n left=\"50%\"\n marginLeft=\"-250px\"\n position=\"fixed\"\n direction=\"column\"\n alignItems=\"stretch\"\n gap={2}\n top={`4.6rem`}\n width={`50rem`}\n zIndex=\"notification\"\n >\n {notifications.map((notification) => {\n return (\n <Notification\n key={notification.id}\n {...notification}\n clearNotification={clearNotification}\n />\n );\n })}\n </Flex>\n {children}\n </NotificationsContext.Provider>\n );\n};\n\ninterface NotificationProps extends Notification {\n clearNotification: (id: number) => void;\n}\n\nconst Notification = ({\n clearNotification,\n blockTransition = false,\n id,\n link,\n message,\n onClose,\n timeout = 2500,\n title,\n type,\n}: NotificationProps) => {\n const { formatMessage } = useIntl();\n /**\n * Chances are `onClose` won't be classed as stabilised,\n * so we use `useCallbackRef` to avoid make it stable.\n */\n const onCloseCallback = useCallbackRef(onClose);\n\n const handleClose = React.useCallback(() => {\n onCloseCallback();\n\n clearNotification(id);\n }, [clearNotification, id, onCloseCallback]);\n\n // eslint-disable-next-line consistent-return\n React.useEffect(() => {\n if (!blockTransition) {\n const timeoutReference = setTimeout(() => {\n handleClose();\n }, timeout);\n\n return () => {\n clearTimeout(timeoutReference);\n };\n }\n }, [blockTransition, handleClose, timeout]);\n\n let variant: AlertVariant;\n let alertTitle: string;\n\n if (type === 'info') {\n variant = 'default';\n alertTitle = formatMessage({\n id: 'notification.default.title',\n defaultMessage: 'Information:',\n });\n } else if (type === 'danger') {\n variant = 'danger';\n alertTitle = formatMessage({\n id: 'notification.warning.title',\n defaultMessage: 'Warning:',\n });\n } else if (type === 'warning') {\n variant = 'warning';\n alertTitle = formatMessage({\n id: 'notification.warning.title',\n defaultMessage: 'Warning:',\n });\n } else {\n variant = 'success';\n alertTitle = formatMessage({\n id: 'notification.success.title',\n defaultMessage: 'Success:',\n });\n }\n\n if (title) {\n alertTitle = title;\n }\n\n return (\n <Alert\n action={\n link ? (\n <Link href={link.url} isExternal>\n {link.label}\n </Link>\n ) : undefined\n }\n onClose={handleClose}\n closeLabel={formatMessage({\n id: 'global.close',\n defaultMessage: 'Close',\n })}\n title={alertTitle}\n variant={variant}\n >\n {message}\n </Alert>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @preserve\n * @description Returns an object to interact with the notification\n * system. The callbacks are wrapped in `useCallback` for a stable\n * identity.\n *\n * @example\n * ```tsx\n * import { useNotification } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { toggleNotification } = useNotification();\n *\n * return <button onClick={() => toggleNotification({ message: 'Hello world!' })}>Click me</button>;\n */\nconst useNotification = () => React.useContext(NotificationsContext);\n\nexport { NotificationsProvider, useNotification };\nexport type { NotificationConfig, NotificationsContextValue };\n","/**\n * Prefix message with 'apiError.'\n */\nexport function getPrefixedId(message: string, callback?: (prefixedMessage: string) => string) {\n const prefixedMessage = `apiError.${message}`;\n\n // if a prefix function has been passed in it is used to\n // prefix the id, e.g. to allow an error message to be\n // set only for a localization namespace\n if (typeof callback === 'function') {\n return callback(prefixedMessage);\n }\n\n return prefixedMessage;\n}\n","import { getPrefixedId } from './getPrefixedId';\n\nimport type { ApiError } from '../hooks/useAPIErrorHandler';\nimport type { FetchError } from '../utils/getFetchClient';\nimport type { errors } from '@strapi/utils';\n\nexport interface NormalizeErrorOptions {\n name?: string;\n intlMessagePrefixCallback?: (id: string) => string;\n}\n\ninterface NormalizeErrorReturn {\n id: string;\n defaultMessage: string;\n name?: string;\n values: Record<'path', string> | Record<string, never>;\n}\n\ninterface YupFormattedError {\n path: string[];\n message: string;\n name: string;\n}\n\nfunction normalizeError(\n error: ApiError | YupFormattedError,\n { name, intlMessagePrefixCallback }: NormalizeErrorOptions\n): NormalizeErrorReturn {\n const { message } = error;\n\n const normalizedError = {\n id: getPrefixedId(message, intlMessagePrefixCallback),\n defaultMessage: message,\n name: error.name ?? name,\n values: {},\n };\n\n if ('path' in error) {\n normalizedError.values = { path: error.path.join('.') };\n }\n\n return normalizedError;\n}\n\nconst validateErrorIsYupValidationError = (\n err: ApiError\n): err is errors.YupValidationError & { details: { errors: YupFormattedError[] } } =>\n typeof err.details === 'object' && err.details !== null && 'errors' in err.details;\n\n/**\n * Normalize the format of `ResponseError`\n * in places where the hook `useAPIErrorHandler` can not called\n * (e.g. outside of a React component).\n */\nexport function normalizeAPIError(\n apiError: FetchError,\n intlMessagePrefixCallback?: NormalizeErrorOptions['intlMessagePrefixCallback']\n):\n | NormalizeErrorReturn\n | { name: string; message: string | null; errors: NormalizeErrorReturn[] }\n | null {\n const error = apiError.response?.data?.error;\n\n if (error) {\n // some errors carry multiple errors (such as ValidationError)\n if (validateErrorIsYupValidationError(error)) {\n return {\n name: error.name,\n message: error?.message || null,\n errors: error.details.errors.map((err) =>\n normalizeError(err, { name: error.name, intlMessagePrefixCallback })\n ),\n };\n }\n return normalizeError(error, { intlMessagePrefixCallback });\n }\n\n return null;\n}\n","import clone from 'lodash/clone';\nimport toPath from 'lodash/toPath';\n\n/**\n * Deeply get a value from an object via its path.\n */\nexport function getIn(obj: any, key: string | string[], def?: any, pathStartIndex: number = 0) {\n const path = toPath(key);\n while (obj && pathStartIndex < path.length) {\n obj = obj[path[pathStartIndex++]];\n }\n\n // check if path is not in the end\n if (pathStartIndex !== path.length && !obj) {\n return def;\n }\n\n return obj === undefined ? def : obj;\n}\n\n/** @internal is the given object an Object? */\nexport const isObject = (obj: any): obj is object =>\n obj !== null && typeof obj === 'object' && !Array.isArray(obj);\n\n/** @internal is the given object an integer? */\nexport const isInteger = (obj: any): boolean => String(Math.floor(Number(obj))) === obj;\n\n/**\n * Deeply set a value from in object via its path. If the value at `path`\n * has changed, return a shallow copy of obj with `value` set at `path`.\n * If `value` has not changed, return the original `obj`.\n *\n * Existing objects / arrays along `path` are also shallow copied. Sibling\n * objects along path retain the same internal js reference. Since new\n * objects / arrays are only created along `path`, we can test if anything\n * changed in a nested structure by comparing the object's reference in\n * the old and new object, similar to how russian doll cache invalidation\n * works.\n *\n * In earlier versions of this function, which used cloneDeep, there were\n * issues whereby settings a nested value would mutate the parent\n * instead of creating a new object. `clone` avoids that bug making a\n * shallow copy of the objects along the update path\n * so no object is mutated in place.\n *\n * Before changing this function, please read through the following\n * discussions.\n *\n * @see https://github.com/developit/linkstate\n * @see https://github.com/jaredpalmer/formik/pull/123\n */\nexport function setIn(obj: any, path: string, value: any): any {\n const res: any = clone(obj); // this keeps inheritance when obj is a class\n let resVal: any = res;\n let i = 0;\n const pathArray = toPath(path);\n\n for (; i < pathArray.length - 1; i++) {\n const currentPath: string = pathArray[i];\n const currentObj: any = getIn(obj, pathArray.slice(0, i + 1));\n\n if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {\n resVal = resVal[currentPath] = clone(currentObj);\n } else {\n const nextPath: string = pathArray[i + 1];\n resVal = resVal[currentPath] = isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {};\n }\n }\n\n // Return original object if new value is the same as current\n if ((i === 0 ? obj : resVal)[pathArray[i]] === value) {\n return obj;\n }\n\n if (value === undefined) {\n delete resVal[pathArray[i]];\n } else {\n resVal[pathArray[i]] = value;\n }\n\n // If the path array has a single element, the loop did not run.\n // Deleting on `resVal` had no effect in this scenario, so we delete on the result instead.\n if (i === 0 && value === undefined) {\n delete res[pathArray[i]];\n }\n\n return res;\n}\n","import * as React from 'react';\n\nimport { IntlFormatters, useIntl } from 'react-intl';\n\nimport { FetchError } from '../utils/getFetchClient';\nimport { getPrefixedId } from '../utils/getPrefixedId';\nimport { NormalizeErrorOptions, normalizeAPIError } from '../utils/normalizeAPIError';\nimport { setIn } from '../utils/objects';\n\nimport type { errors } from '@strapi/utils';\n\ntype ApiError =\n | errors.ApplicationError\n | errors.ForbiddenError\n | errors.NotFoundError\n | errors.NotImplementedError\n | errors.PaginationError\n | errors.PayloadTooLargeError\n | errors.PolicyError\n | errors.RateLimitError\n | errors.UnauthorizedError\n | errors.ValidationError\n | errors.YupValidationError;\n\ninterface UnknownApiError {\n /**\n * The name of the ApiError, is always a static value.\n */\n name: 'UnknownError';\n /**\n * The error message.\n */\n message: string;\n /**\n * The error details.\n */\n details?: unknown;\n /**\n * The HTTP status code of the error.\n */\n status?: number;\n}\n\n/**\n * The last item is the fallback error SerializedError which\n * typically comes from redux-toolkit itself.\n */\ninterface SerializedError {\n /**\n * The name of the error.\n */\n name?: string;\n /**\n * The error message that explains what went wrong.\n */\n message?: string;\n /**\n * The stack trace of the error.\n */\n stack?: string;\n /**\n * A specific error code associated with the error.\n */\n code?: string;\n}\n\n/**\n * These are the types or errors we return\n * from the redux-toolkit data-fetching setup.\n */\ntype BaseQueryError = ApiError | UnknownApiError | SerializedError;\n\ninterface YupFormattedError {\n /**\n * An array representing the path to the field where the validation error occurred.\n */\n path: string[];\n /**\n * The error message describing the validation failure.\n */\n message: string;\n /**\n * The name of the error, typically identifies the type of validation error that occurred.\n */\n name: string;\n}\n\n/**\n * @public\n * @description The purpose of this hook is to offer a unified way to handle errors thrown by API endpoints, regardless of the type of error (`ValidationError`, `ApplicationErrror` ...)\nthat has been thrown.\n * @example\n * ```tsx\n * import * as React from 'react';\n * import { useFetchClient, useAPIErrorHandler, useNotification } from '@strapi/admin/admin';\n *\n * const MyComponent = () => {\n * const { get } = useFetchClient();\n * const { formatAPIError } = useAPIErrorHandler(getTrad);\n * const { toggleNotification } = useNotification();\n *\n * const handleDeleteItem = async () => {\n * try {\n * return await get('/admin');\n * } catch (error) {\n * toggleNotification({\n * type: 'danger',\n * message: formatAPIError(error),\n * });\n * }\n * };\n * return <button onClick={handleDeleteItem}>Delete item</button>;\n * };\n * ```\n */\nexport function useAPIErrorHandler(\n intlMessagePrefixCallback?: FormatAPIErrorOptions['intlMessagePrefixCallback']\n) {\n const { formatMessage } = useIntl();\n\n /**\n * @description This method try to normalize the passed error\n * and then call formatAPIError to stringify the ResponseObject\n * into a string. If it fails it will call formatFetchError and\n * return the error message.\n */\n const formatError = React.useCallback(\n (error: FetchError) => {\n // Try to normalize the passed error first. This will fail for e.g. network\n // errors which are thrown by fetchClient directly.\n try {\n const formattedErr = formatAPIError(error, { intlMessagePrefixCallback, formatMessage });\n\n if (!formattedErr) {\n return formatFetchError(error, { intlMessagePrefixCallback, formatMessage });\n }\n\n return formattedErr;\n } catch (_) {\n throw new Error('formatAPIError: Unknown error:', error);\n }\n },\n [formatMessage, intlMessagePrefixCallback]\n );\n\n return {\n /**\n * @alpha\n * Convert ValidationErrors from the API into an object that can be used by forms.\n */\n _unstableFormatValidationErrors: React.useCallback(\n (error: Extract<BaseQueryError, { name: 'ValidationError' }>): Record<string, string> => {\n if (typeof error.details === 'object' && error.details !== null) {\n if ('errors' in error.details && Array.isArray(error.details.errors)) {\n const validationErrors = error.details.errors as YupFormattedError[];\n\n return validationErrors.reduce((acc, err) => {\n const { path, message } = err;\n\n return setIn(acc, path.join('.'), message);\n }, {});\n } else {\n const details = error.details as Record<string, string[]>;\n\n return Object.keys(details).reduce((acc, key) => {\n const messages = details[key];\n\n return {\n ...acc,\n [key]: messages.join(', '),\n };\n }, {});\n }\n } else {\n return {};\n }\n },\n []\n ),\n /**\n * @alpha\n * This handles the errors given from `redux-toolkit`'s axios based baseQuery function.\n */\n _unstableFormatAPIError: React.useCallback(\n (error: BaseQueryError) => {\n const err = {\n response: {\n data: {\n error,\n },\n },\n } as FetchError;\n\n /**\n * There's a chance with SerializedErrors that the message is not set.\n * In that case we return a generic error message.\n */\n if (!error.message) {\n return 'Unknown error occured.';\n }\n\n return formatError(err);\n },\n [formatError]\n ),\n formatAPIError: formatError,\n };\n}\n\nfunction formatFetchError(\n error: FetchError,\n { intlMessagePrefixCallback, formatMessage }: FormatAPIErrorOptions\n) {\n const { code, message } = error;\n\n return formatMessage(\n {\n id: getPrefixedId(message, intlMessagePrefixCallback),\n defaultMessage: message,\n },\n {\n code,\n }\n );\n}\n\ntype FormatAPIErrorOptions = Partial<Pick<NormalizeErrorOptions, 'intlMessagePrefixCallback'>> &\n Pick<IntlFormatters, 'formatMessage'>;\n\n/**\n * @description This method stringifies the `ResponseObject` into\n * a string. If multiple errors are thrown by the API, which\n * happens e.g.in the case of a `ValidationError`, all errors\n * will bo concatenated into a single string.\n */\nfunction formatAPIError(\n error: FetchError,\n { formatMessage, intlMessagePrefixCallback }: FormatAPIErrorOptions\n) {\n if (!formatMessage) {\n throw new Error('The formatMessage callback is a mandatory argument.');\n }\n\n const normalizedError = normalizeAPIError(error, intlMessagePrefixCallback);\n\n if (!normalizedError) {\n return null;\n }\n\n if ('message' in normalizedError && normalizedError.message !== null) {\n return normalizedError.message;\n }\n\n // stringify multiple errors\n if ('errors' in normalizedError) {\n return normalizedError.errors\n .map(({ id, defaultMessage, values }) => formatMessage({ id, defaultMessage }, values))\n .join('\\n');\n }\n\n return formatMessage(normalizedError);\n}\n\nexport type { ApiError };\n","import * as React from 'react';\n\nimport {\n Box,\n EmptyStateLayout,\n type EmptyStateLayoutProps,\n Flex,\n Loader,\n Main,\n MainProps,\n} from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { EmptyPermissions, EmptyDocuments } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { useAuth, Permission } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport { useCheckPermissionsQuery } from '../services/auth';\n\n/* -------------------------------------------------------------------------------------------------\n * Main\n * -----------------------------------------------------------------------------------------------*/\ninterface PageMainProps extends MainProps {\n children: React.ReactNode;\n}\n\nconst PageMain = ({ children, ...restProps }: PageMainProps) => {\n return <Main {...restProps}>{children}</Main>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Loading\n * -----------------------------------------------------------------------------------------------*/\ninterface LoadingProps {\n /**\n * @default 'Loading content.'\n */\n children?: React.ReactNode;\n}\n\n/**\n * @public\n * @description A loading component that should be rendered as the page\n * whilst you load the content for the aforementioned page.\n */\nconst Loading = ({ children = 'Loading content.' }: LoadingProps) => {\n return (\n <PageMain height=\"100vh\" aria-busy={true}>\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Loader>{children}</Loader>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Error\n * -----------------------------------------------------------------------------------------------*/\ninterface ErrorProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * TODO: should we start passing our errors here so they're persisted on the screen?\n * This could follow something similar to how the global app error works...?\n */\n\n/**\n * @public\n * @description An error component that should be rendered as the page\n * when an error occurs.\n */\nconst Error = (props: ErrorProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <EmptyStateLayout\n icon={<WarningCircle width=\"16rem\" />}\n content={formatMessage({\n id: 'anErrorOccurred',\n defaultMessage: 'Woops! Something went wrong. Please, try again.',\n })}\n {...props}\n />\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoPermissions\n * -----------------------------------------------------------------------------------------------*/\ninterface NoPermissionsProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when the user does not have the permissions to access the content.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoPermissions = (props: NoPermissionsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyPermissions width=\"16rem\" />}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-permissions',\n defaultMessage: \"You don't have the permissions to access that content\",\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoData\n * -----------------------------------------------------------------------------------------------*/\ninterface NoDataProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when there is no data available to display.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoData = (props: NoDataProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\" background=\"neutral100\">\n <Flex alignItems=\"center\" height=\"100%\" width=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyDocuments width=\"16rem\" />}\n action={props.action}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Protect\n * -----------------------------------------------------------------------------------------------*/\nexport interface ProtectProps {\n /**\n * The children to render if the user has the required permissions.\n * If providing a function, it will be called with an object containing\n * the permissions the user has based on the array you passed to the component.\n */\n children: React.ReactNode | ((args: { permissions: Permission[] }) => React.ReactNode);\n /**\n * The permissions the user needs to have to access the content.\n */\n permissions?: Array<Omit<Partial<Permission>, 'action'> & Pick<Permission, 'action'>>;\n}\n\n/**\n * @public\n * @description A wrapper component that should be used to protect a page. It will check the permissions\n * you pass to it and render the children if the user has the required permissions. If a user does not have ALL\n * the required permissions, it will redirect the user to the home page. Whilst these checks happen it will render\n * the loading component and should the check fail it will render the error component with a notification.\n */\nconst Protect = ({ permissions = [], children }: ProtectProps) => {\n const userPermissions = useAuth('Protect', (state) => state.permissions);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const matchingPermissions = userPermissions.filter(\n (permission) =>\n permissions.findIndex(\n (perm) => perm.action === permission.action && perm.subject === permission.subject\n ) >= 0\n );\n\n const shouldCheckConditions = matchingPermissions.some(\n (perm) => Array.isArray(perm.conditions) && perm.conditions.length > 0\n );\n\n const { isLoading, error, data } = useCheckPermissionsQuery(\n {\n permissions: matchingPermissions.map((perm) => ({\n action: perm.action,\n subject: perm.subject,\n })),\n },\n {\n skip: !shouldCheckConditions,\n }\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n if (isLoading) {\n return <Loading />;\n }\n\n if (error) {\n return <Error />;\n }\n\n const { data: permissionsData } = data || {};\n\n const canAccess =\n shouldCheckConditions && permissionsData\n ? !permissionsData.includes(false)\n : matchingPermissions.length > 0;\n\n if (!canAccess) {\n return <NoPermissions />;\n }\n\n return (\n <>\n {typeof children === 'function' ? children({ permissions: matchingPermissions }) : children}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Title\n * -----------------------------------------------------------------------------------------------*/\nexport interface TitleProps {\n children: string;\n}\n\n/**\n * @public\n * @description This component takes the children (must be a string) and sets\n * it as the title of the html.\n */\nconst Title = ({ children: title }: TitleProps) => {\n React.useEffect(() => {\n document.title = `${title} | Strapi`;\n }, [title]);\n\n return null;\n};\n\nconst Page = {\n Error,\n Loading,\n NoPermissions,\n Protect,\n NoData,\n Main: PageMain,\n Title,\n};\n\nexport { Page };\nexport type { ErrorProps, LoadingProps, NoPermissionsProps, PageMainProps as MainProps };\n","export const once = <TFunc extends (...args: any) => any>(fn: TFunc) => {\n const func = fn;\n let called = false;\n\n if (typeof func !== 'function') {\n throw new TypeError(`once requires a function parameter`);\n }\n\n return (...args: any) => {\n if (!called && process.env.NODE_ENV === 'development') {\n func(...args);\n called = true;\n }\n };\n};\n","const capitalise = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1);\n\nexport { capitalise };\n","import { useEffect, useRef } from 'react';\n\nexport const usePrev = <T>(value: T): T | undefined => {\n const ref = useRef<T>();\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref.current;\n};\n","import * as React from 'react';\n\nimport isEqual from 'lodash/isEqual';\n\nimport { useAuth, Permission } from '../features/Auth';\nimport { once } from '../utils/once';\nimport { capitalise } from '../utils/strings';\n\nimport { usePrev } from './usePrev';\n\ntype AllowedActions = Record<string, boolean>;\n\n/**\n * @public\n * @description This hooks takes an object or array of permissions (the latter preferred) and\n * runs through them to match against the current user's permissions as well as the RBAC middleware\n * system checking any conditions that may be present. It returns the filtered permissions as the complete\n * object from the API and a set of actions that can be performed. An action is derived from the last part\n * of the permission action e.g. `admin::roles.create` would be `canCreate`. If there's a hyphen in the action\n * this is removed and capitalised e.g `admin::roles.create-draft` would be `canCreateDraft`.\n * @example\n * ```tsx\n * import { Page, useRBAC } from '@strapi/strapi/admin'\n *\n * const MyProtectedPage = () => {\n * const { allowedActions, isLoading, error, permissions } = useRBAC([{ action: 'admin::roles.create' }])\n *\n * if(isLoading) {\n * return <Page.Loading />\n * }\n *\n * if(error){\n * return <Page.Error />\n * }\n *\n * if(!allowedActions.canCreate) {\n * return null\n * }\n *\n * return <MyPage permissions={permissions} />\n * }\n * ```\n */\nconst useRBAC = (\n permissionsToCheck: Record<string, Permission[]> | Permission[] = [],\n passedPermissions?: Permission[],\n rawQueryContext?: string\n): {\n allowedActions: AllowedActions;\n isLoading: boolean;\n error?: unknown;\n permissions: Permission[];\n} => {\n const isLoadingAuth = useAuth('useRBAC', (state) => state.isLoading);\n const [isLoading, setIsLoading] = React.useState(true);\n const [error, setError] = React.useState<unknown>();\n const [data, setData] = React.useState<Record<string, boolean>>();\n\n const warnOnce = React.useMemo(() => once(console.warn), []);\n\n const actualPermissionsToCheck: Permission[] = React.useMemo(() => {\n if (Array.isArray(permissionsToCheck)) {\n return permissionsToCheck;\n } else {\n warnOnce(\n 'useRBAC: The first argument should be an array of permissions, not an object. This will be deprecated in the future.'\n );\n\n return Object.values(permissionsToCheck).flat();\n }\n }, [permissionsToCheck, warnOnce]);\n\n /**\n * This is the default value we return until the queryResults[i].data\n * are all resolved with data. This preserves the original behaviour.\n */\n const defaultAllowedActions = React.useMemo(() => {\n return actualPermissionsToCheck.reduce<Record<string, boolean>>((acc, permission) => {\n return {\n ...acc,\n [getActionName(permission)]: false,\n };\n }, {});\n }, [actualPermissionsToCheck]);\n\n const checkUserHasPermissions = useAuth('useRBAC', (state) => state.checkUserHasPermissions);\n\n const permssionsChecked = usePrev(actualPermissionsToCheck);\n const contextChecked = usePrev(rawQueryContext);\n\n React.useEffect(() => {\n if (\n !isEqual(permssionsChecked, actualPermissionsToCheck) ||\n // TODO: also run this when the query context changes\n contextChecked !== rawQueryContext\n ) {\n setIsLoading(true);\n setData(undefined);\n setError(undefined);\n\n checkUserHasPermissions(actualPermissionsToCheck, passedPermissions, rawQueryContext)\n .then((res) => {\n if (res) {\n setData(\n res.reduce<Record<string, boolean>>((acc, permission) => {\n return {\n ...acc,\n [getActionName(permission)]: true,\n };\n }, {})\n );\n }\n })\n .catch((err) => {\n setError(err);\n })\n .finally(() => {\n setIsLoading(false);\n });\n }\n }, [\n actualPermissionsToCheck,\n checkUserHasPermissions,\n passedPermissions,\n permissionsToCheck,\n permssionsChecked,\n contextChecked,\n rawQueryContext,\n ]);\n\n /**\n * This hook originally would not return allowedActions\n * until all the checks were complete.\n */\n const allowedActions = Object.entries({\n ...defaultAllowedActions,\n ...data,\n }).reduce((acc, [name, allowed]) => {\n acc[`can${capitalise(name)}`] = allowed;\n\n return acc;\n }, {} as AllowedActions);\n\n return {\n allowedActions,\n permissions: actualPermissionsToCheck,\n isLoading: isLoading || isLoadingAuth,\n error,\n };\n};\n\nconst getActionName = (permission: Permission): string => {\n const [action = ''] = permission.action.split('.').slice(-1);\n return action.split('-').map(capitalise).join('');\n};\n\nexport { useRBAC };\nexport type { AllowedActions };\n","import { createContext } from '../components/Context';\n\ninterface AppInfoContextValue {\n autoReload?: boolean;\n communityEdition?: boolean;\n currentEnvironment?: string;\n dependencies?: Record<string, string>;\n latestStrapiReleaseTag?: string;\n nodeVersion?: string;\n projectId?: string | null;\n shouldUpdateStrapi?: boolean;\n strapiVersion?: string | null;\n useYarn?: boolean;\n userId?: string;\n}\n\nconst [AppInfoProvider, useAppInfo] = createContext<AppInfoContextValue>('AppInfo', {});\n\nexport { AppInfoProvider, useAppInfo };\n\nexport type { AppInfoContextValue };\n","import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch('https://analytics.strapi.io/api/v2/track', {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: { ...data, projectId: uuid },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid]);\n\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\ninterface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAccessAuthenticatedAdministration'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didNotBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didGoToMarketplace'\n | 'didLaunchGuidedtour'\n | 'didMissMarketplacePlugin'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didPublishEntry'\n | 'didBulkPublishEntries'\n | 'didNotBulkPublishEntries'\n | 'didUnpublishEntry'\n | 'didBulkUnpublishEntries'\n | 'didNotBulkUnpublishEntries'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'didRestoreHistoryVersion'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkPublishEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willPublishEntry'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease';\n properties?: never;\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string | boolean;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n type: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease\n | MediaEvents;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/strapi/admin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n 'https://analytics.strapi.io/api/v2/track',\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {},\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n","import * as React from 'react';\n\nimport { createContext } from '@radix-ui/react-context';\nimport { useIntl } from 'react-intl';\n\nimport { UpdateProjectSettings } from '../../../shared/contracts/admin';\nimport { Page } from '../components/PageHelpers';\nimport { useTypedSelector } from '../core/store/hooks';\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport { useRBAC } from '../hooks/useRBAC';\nimport {\n ConfigurationLogo,\n useInitQuery,\n useProjectSettingsQuery,\n useUpdateProjectSettingsMutation,\n} from '../services/admin';\n\nimport { useAuth } from './Auth';\nimport { useNotification } from './Notifications';\nimport { useTracking } from './Tracking';\n\nimport type { StrapiApp } from '../StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * Configuration Context\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UpdateProjectSettingsBody {\n authLogo:\n | ((UpdateProjectSettings.Request['body']['authLogo'] | ConfigurationLogo['custom']) & {\n rawFile?: File;\n })\n | null;\n menuLogo:\n | ((UpdateProjectSettings.Request['body']['menuLogo'] | ConfigurationLogo['custom']) & {\n rawFile?: File;\n })\n | null;\n}\n\ninterface ConfigurationContextValue {\n logos: {\n auth: ConfigurationLogo;\n menu: ConfigurationLogo;\n };\n showTutorials: boolean;\n showReleaseNotification: boolean;\n updateProjectSettings: (body: UpdateProjectSettingsBody) => Promise<void>;\n}\n\nconst [ConfigurationContextProvider, useConfiguration] =\n createContext<ConfigurationContextValue>('ConfigurationContext');\n\n/* -------------------------------------------------------------------------------------------------\n * ConfigurationProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ConfigurationProviderProps {\n children: React.ReactNode;\n defaultAuthLogo: StrapiApp['configurations']['authLogo'];\n defaultMenuLogo: StrapiApp['configurations']['menuLogo'];\n showReleaseNotification?: boolean;\n showTutorials?: boolean;\n}\n\nconst ConfigurationProvider = ({\n children,\n defaultAuthLogo,\n defaultMenuLogo,\n showReleaseNotification = false,\n showTutorials = false,\n}: ConfigurationProviderProps) => {\n const { trackUsage } = useTracking();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.['project-settings']\n );\n const token = useAuth('ConfigurationProvider', (state) => state.token);\n\n const {\n allowedActions: { canRead },\n } = useRBAC(permissions);\n\n const {\n data: { authLogo: customAuthLogo, menuLogo: customMenuLogo } = {},\n error,\n isLoading,\n } = useInitQuery();\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'app.containers.App.notification.error.init' }),\n });\n }\n }, [error, formatMessage, toggleNotification]);\n\n const { data, isSuccess } = useProjectSettingsQuery(undefined, {\n skip: !token || !canRead,\n });\n\n const [updateProjectSettingsMutation] = useUpdateProjectSettingsMutation();\n\n const updateProjectSettings = React.useCallback(\n async (body: UpdateProjectSettingsBody) => {\n const formData = new FormData();\n\n /**\n * We either only send files or we send null values.\n * Null removes the logo. If you don't want to effect\n * an existing logo, don't send anything.\n */\n Object.entries(body).forEach(([key, value]) => {\n if (value?.rawFile) {\n formData.append(key, value.rawFile);\n } else if (value === null) {\n formData.append(key, JSON.stringify(value));\n }\n });\n\n const res = await updateProjectSettingsMutation(formData);\n\n if ('data' in res) {\n const updatedMenuLogo = !!res.data.menuLogo && !!body.menuLogo?.rawFile;\n const updatedAuthLogo = !!res.data.authLogo && !!body.authLogo?.rawFile;\n\n if (updatedMenuLogo) {\n trackUsage('didChangeLogo', {\n logo: 'menu',\n });\n }\n\n if (updatedAuthLogo) {\n trackUsage('didChangeLogo', {\n logo: 'auth',\n });\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'app', defaultMessage: 'Saved' }),\n });\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n },\n [formatAPIError, formatMessage, toggleNotification, trackUsage, updateProjectSettingsMutation]\n );\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <ConfigurationContextProvider\n showReleaseNotification={showReleaseNotification}\n showTutorials={showTutorials}\n logos={{\n menu: {\n custom: isSuccess\n ? data?.menuLogo\n : {\n url: customMenuLogo ?? '',\n },\n default: defaultMenuLogo,\n },\n auth: {\n custom: isSuccess\n ? data?.authLogo\n : {\n url: customAuthLogo ?? '',\n },\n default: defaultAuthLogo,\n },\n }}\n updateProjectSettings={updateProjectSettings}\n >\n {children}\n </ConfigurationContextProvider>\n );\n};\n\nexport {\n ConfigurationContextProvider as _internalConfigurationContextProvider,\n ConfigurationProvider,\n useConfiguration,\n};\nexport type {\n ConfigurationProviderProps,\n ConfigurationContextValue,\n ConfigurationLogo,\n UpdateProjectSettingsBody,\n};\n","import * as React from 'react';\n\nimport { produce } from 'immer';\nimport get from 'lodash/get';\nimport set from 'lodash/set';\n\nconst GUIDED_TOUR_COMPLETED_STEPS = 'GUIDED_TOUR_COMPLETED_STEPS';\nconst GUIDED_TOUR_CURRENT_STEP = 'GUIDED_TOUR_CURRENT_STEP';\nconst GUIDED_TOUR_SKIPPED = 'GUIDED_TOUR_SKIPPED';\n\nconst GUIDED_TOUR_KEYS = {\n GUIDED_TOUR_COMPLETED_STEPS,\n GUIDED_TOUR_CURRENT_STEP,\n GUIDED_TOUR_SKIPPED,\n} as const;\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourProvider\n * -----------------------------------------------------------------------------------------------*/\n\nimport { createContext } from '../Context';\n\ntype SectionKey = keyof GuidedTourContextValue['guidedTourState'];\ntype StepKey = keyof GuidedTourContextValue['guidedTourState'][SectionKey];\ntype Step = `${SectionKey}.${StepKey}`;\ninterface GuidedTourContextValue {\n currentStep: Step | null;\n guidedTourState: {\n contentTypeBuilder: {\n create: boolean;\n success: boolean;\n };\n contentManager: {\n create: boolean;\n success: boolean;\n };\n apiTokens: {\n create: boolean;\n success: boolean;\n };\n };\n isGuidedTourVisible: boolean;\n isSkipped: boolean;\n setCurrentStep: (step: Step | null) => void | null;\n setGuidedTourVisibility: (isVisible: boolean) => void;\n setSkipped: (isSkipped: boolean) => void;\n setStepState: (step: Step, state: boolean) => void;\n startSection: (section: SectionKey) => void;\n}\n\nconst [GuidedTourProviderImpl, useGuidedTour] = createContext<GuidedTourContextValue>('GuidedTour');\n\ninterface GuidedTourProviderProps {\n children: React.ReactNode;\n}\n\nconst GuidedTourProvider = ({ children }: GuidedTourProviderProps) => {\n const [{ currentStep, guidedTourState, isGuidedTourVisible, isSkipped }, dispatch] =\n React.useReducer(reducer, initialState, initialiseState);\n\n const setCurrentStep = (step: SetCurrentStepAction['step']) => {\n // if step is null it is intentional, we need to dispatch it\n if (step !== null) {\n const isStepAlreadyDone = get(guidedTourState, step);\n const [sectionName, stepName] = step.split('.') as [SectionKey, StepKey];\n const sectionArray = Object.entries(guidedTourState[sectionName]);\n\n const currentStepIndex = sectionArray.findIndex(([key]) => key === stepName);\n const previousSteps = sectionArray.slice(0, currentStepIndex);\n\n const isStepToShow = previousSteps.every(([, sectionValue]) => sectionValue);\n\n if (isStepAlreadyDone || isSkipped || !isStepToShow) {\n return null;\n }\n }\n\n window.localStorage.setItem(GUIDED_TOUR_CURRENT_STEP, JSON.stringify(null));\n\n return dispatch({\n type: 'SET_CURRENT_STEP',\n step,\n });\n };\n\n const setGuidedTourVisibility = (value: SetGuidedTourVisibilityAction['value']) => {\n dispatch({\n type: 'SET_GUIDED_TOUR_VISIBILITY',\n value,\n });\n };\n\n const setStepState = (currentStep: Step, value: SetStepStateAction['value']) => {\n addCompletedStep(currentStep);\n\n dispatch({\n type: 'SET_STEP_STATE',\n currentStep,\n value,\n });\n };\n\n const startSection = (sectionName: SectionKey) => {\n const sectionSteps = guidedTourState[sectionName];\n\n if (sectionSteps) {\n const guidedTourArray = Object.entries(guidedTourState);\n\n // Find current section position in the guidedTourArray\n // Get only previous sections based on current section position\n const currentSectionIndex = guidedTourArray.findIndex(([key]) => key === sectionName);\n const previousSections = guidedTourArray.slice(0, currentSectionIndex);\n\n // Check if every steps from previous section are done\n const isSectionToShow = previousSections.every(([, sectionValue]) =>\n Object.values(sectionValue).every(Boolean)\n );\n\n const [firstStep] = Object.keys(sectionSteps) as [StepKey];\n const isFirstStepDone = sectionSteps[firstStep];\n\n if (isSectionToShow && !currentStep && !isFirstStepDone) {\n setCurrentStep(`${sectionName}.${firstStep}`);\n }\n }\n };\n\n const setSkipped = (value: SetSkippedAction['value']) => {\n window.localStorage.setItem(GUIDED_TOUR_SKIPPED, JSON.stringify(value));\n\n dispatch({\n type: 'SET_SKIPPED',\n value,\n });\n };\n\n return (\n <GuidedTourProviderImpl\n guidedTourState={guidedTourState}\n currentStep={currentStep}\n setCurrentStep={setCurrentStep}\n setGuidedTourVisibility={setGuidedTourVisibility}\n setSkipped={setSkipped}\n setStepState={setStepState}\n startSection={startSection}\n isGuidedTourVisible={isGuidedTourVisible}\n isSkipped={isSkipped}\n >\n {children}\n </GuidedTourProviderImpl>\n );\n};\n\ntype State = Pick<\n GuidedTourContextValue,\n 'guidedTourState' | 'currentStep' | 'isGuidedTourVisible' | 'isSkipped'\n>;\n\nconst initialState = {\n currentStep: null,\n guidedTourState: {\n contentTypeBuilder: {\n create: false,\n success: false,\n },\n contentManager: {\n create: false,\n success: false,\n },\n apiTokens: {\n create: false,\n success: false,\n },\n },\n isGuidedTourVisible: false,\n isSkipped: false,\n} satisfies State;\n\ninterface SetCurrentStepAction {\n type: 'SET_CURRENT_STEP';\n step: Step | null;\n}\n\ninterface SetStepStateAction {\n type: 'SET_STEP_STATE';\n currentStep: Step;\n value: boolean;\n}\n\ninterface SetSkippedAction {\n type: 'SET_SKIPPED';\n value: boolean;\n}\n\ninterface SetGuidedTourVisibilityAction {\n type: 'SET_GUIDED_TOUR_VISIBILITY';\n value: boolean;\n}\n\ntype Action =\n | SetCurrentStepAction\n | SetStepStateAction\n | SetSkippedAction\n | SetGuidedTourVisibilityAction;\n\nconst reducer: React.Reducer<State, Action> = (state: State = initialState, action: Action) =>\n produce(state, (draftState) => {\n switch (action.type) {\n case 'SET_CURRENT_STEP': {\n draftState.currentStep = action.step;\n break;\n }\n case 'SET_STEP_STATE': {\n const [section, step] = action.currentStep.split('.') as [SectionKey, StepKey];\n draftState.guidedTourState[section][step] = action.value;\n break;\n }\n case 'SET_SKIPPED': {\n draftState.isSkipped = action.value;\n break;\n }\n case 'SET_GUIDED_TOUR_VISIBILITY': {\n draftState.isGuidedTourVisible = action.value;\n break;\n }\n default: {\n return draftState;\n }\n }\n });\n\nconst initialiseState = (initialState: State) => {\n const copyInitialState = { ...initialState };\n const guidedTourLocaleStorage = JSON.parse(\n window.localStorage.getItem(GUIDED_TOUR_COMPLETED_STEPS) ?? '[]'\n );\n const currentStepLocaleStorage = JSON.parse(\n window.localStorage.getItem(GUIDED_TOUR_CURRENT_STEP) ?? 'null'\n );\n const skippedLocaleStorage = JSON.parse(\n window.localStorage.getItem(GUIDED_TOUR_SKIPPED) ?? 'null'\n );\n\n if (Array.isArray(guidedTourLocaleStorage)) {\n guidedTourLocaleStorage.forEach((step) => {\n const [sectionName, stepName] = step.split('.');\n set(copyInitialState, ['guidedTourState', sectionName, stepName], true);\n });\n }\n\n // if current step when initializing mark it as done\n if (currentStepLocaleStorage) {\n const [sectionName, stepName] = currentStepLocaleStorage.split('.') as [SectionKey, StepKey];\n set(copyInitialState, ['guidedTourState', sectionName, stepName], true);\n\n addCompletedStep(currentStepLocaleStorage as Step);\n\n window.localStorage.setItem(GUIDED_TOUR_CURRENT_STEP, JSON.stringify(null));\n }\n\n if (skippedLocaleStorage !== null) {\n set(copyInitialState, 'isSkipped', skippedLocaleStorage);\n }\n\n return copyInitialState;\n};\n\n/**\n * @description Add a completed step to the local storage if it does not already exist.\n */\nconst addCompletedStep = (completedStep: Step) => {\n const currentSteps = JSON.parse(window.localStorage.getItem(GUIDED_TOUR_COMPLETED_STEPS) ?? '[]');\n\n if (!Array.isArray(currentSteps)) {\n return;\n }\n\n const isAlreadyStored = currentSteps.includes(completedStep);\n\n if (isAlreadyStored) {\n return;\n }\n\n window.localStorage.setItem(\n GUIDED_TOUR_COMPLETED_STEPS,\n JSON.stringify([...currentSteps, completedStep])\n );\n};\n\nexport { GuidedTourProvider, useGuidedTour, GuidedTourContextValue, GUIDED_TOUR_KEYS };\n","import * as React from 'react';\n\nimport defaultsDeep from 'lodash/defaultsDeep';\nimport { IntlProvider } from 'react-intl';\n\nimport { useTypedSelector } from '../core/store/hooks';\n\n/* -------------------------------------------------------------------------------------------------\n * LanguageProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LanguageProviderProps {\n children: React.ReactNode;\n messages: Record<string, Record<string, string>>;\n}\n\nconst LanguageProvider = ({ children, messages }: LanguageProviderProps) => {\n const locale = useTypedSelector((state) => state.admin_app.language.locale);\n const appMessages = defaultsDeep(messages[locale], messages.en);\n\n return (\n <IntlProvider locale={locale} defaultLocale=\"en\" messages={appMessages} textComponent=\"span\">\n {children}\n </IntlProvider>\n );\n};\n\nexport { LanguageProvider };\nexport type { LanguageProviderProps };\n","import * as React from 'react';\n\nimport { DesignSystemProvider } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useDispatch } from 'react-redux';\nimport { DefaultTheme, createGlobalStyle } from 'styled-components';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { setAvailableThemes } from '../reducer';\n\ninterface ThemeProps {\n children: React.ReactNode;\n themes: {\n dark: DefaultTheme;\n light: DefaultTheme;\n };\n}\n\nconst Theme = ({ children, themes }: ThemeProps) => {\n const { currentTheme } = useTypedSelector((state) => state.admin_app.theme);\n const [systemTheme, setSystemTheme] = React.useState<'light' | 'dark'>();\n const { locale } = useIntl();\n const dispatch = useDispatch();\n\n // Listen to changes in the system theme\n React.useEffect(() => {\n const themeWatcher = window.matchMedia('(prefers-color-scheme: dark)');\n setSystemTheme(themeWatcher.matches ? 'dark' : 'light');\n\n const listener = (event: MediaQueryListEvent) => {\n setSystemTheme(event.matches ? 'dark' : 'light');\n };\n themeWatcher.addEventListener('change', listener);\n\n // Remove listener on cleanup\n return () => {\n themeWatcher.removeEventListener('change', listener);\n };\n }, []);\n\n React.useEffect(() => {\n dispatch(setAvailableThemes(Object.keys(themes)));\n }, [dispatch, themes]);\n\n const computedThemeName = currentTheme === 'system' ? systemTheme : currentTheme;\n\n return (\n <DesignSystemProvider\n locale={locale}\n /**\n * TODO: could we make this neater i.e. by setting up the context to throw\n * if it can't find it, that way the type is always fully defined and we're\n * not checking it all the time...\n */\n theme={themes?.[computedThemeName || 'light']}\n >\n {children}\n <GlobalStyle />\n </DesignSystemProvider>\n );\n};\n\nconst GlobalStyle = createGlobalStyle`\n body {\n background: ${({ theme }) => theme.colors.neutral100};\n }\n`;\n\nexport { Theme };\nexport type { ThemeProps };\n"],"names":["permissions","ContextSelector","React","jsx","useDispatch","useStore","useSelector","createSelector","useLocation","useNavigate","useMemo","parse","useCallback","stringify","STORAGE_KEYS","createSlice","reducer","adminApi","logoutAction","loginAction","login","token","logout","jsxs","Flex","useIntl","useCallbackRef","Alert","Link","toPath","clone","Main","Loader","Error","EmptyStateLayout","WarningCircle","Box","EmptyPermissions","EmptyDocuments","Fragment","useRef","useEffect","isEqual","useInitQuery","useTelemetryPropertiesQuery","axios","createContext","useProjectSettingsQuery","useUpdateProjectSettingsMutation","get","currentStep","produce","initialState","set","defaultsDeep","IntlProvider","DesignSystemProvider","createGlobalStyle"],"mappings":"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"}
|