@strapi/admin 4.16.1 → 4.16.2

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.
Files changed (183) hide show
  1. package/dist/_chunks/{AuthenticatedApp-7e646400.js → AuthenticatedApp-342bf22f.js} +21 -21
  2. package/dist/_chunks/{AuthenticatedApp-7e646400.js.map → AuthenticatedApp-342bf22f.js.map} +1 -1
  3. package/dist/_chunks/{AuthenticatedApp-722b2e84.mjs → AuthenticatedApp-bb31f306.mjs} +21 -21
  4. package/dist/_chunks/{AuthenticatedApp-722b2e84.mjs.map → AuthenticatedApp-bb31f306.mjs.map} +1 -1
  5. package/dist/_chunks/{HomePage-8c98b31f.mjs → HomePage-0c7717c0.mjs} +4 -4
  6. package/dist/_chunks/{HomePage-8c98b31f.mjs.map → HomePage-0c7717c0.mjs.map} +1 -1
  7. package/dist/_chunks/{HomePage-0e0dc215.js → HomePage-175f79c7.js} +4 -4
  8. package/dist/_chunks/{HomePage-0e0dc215.js.map → HomePage-175f79c7.js.map} +1 -1
  9. package/dist/_chunks/{HomePage-76bcd0cd.mjs → HomePage-246cc590.mjs} +4 -4
  10. package/dist/_chunks/{HomePage-76bcd0cd.mjs.map → HomePage-246cc590.mjs.map} +1 -1
  11. package/dist/_chunks/{HomePage-ef787733.js → HomePage-6ff9e578.js} +4 -4
  12. package/dist/_chunks/{HomePage-ef787733.js.map → HomePage-6ff9e578.js.map} +1 -1
  13. package/dist/_chunks/{InstalledPluginsPage-67b5f9c2.mjs → InstalledPluginsPage-170aff77.mjs} +3 -3
  14. package/dist/_chunks/{InstalledPluginsPage-67b5f9c2.mjs.map → InstalledPluginsPage-170aff77.mjs.map} +1 -1
  15. package/dist/_chunks/{InstalledPluginsPage-6f0897e8.js → InstalledPluginsPage-3ae5dbb6.js} +3 -3
  16. package/dist/_chunks/{InstalledPluginsPage-6f0897e8.js.map → InstalledPluginsPage-3ae5dbb6.js.map} +1 -1
  17. package/dist/_chunks/{Login-5b447dd2.js → Login-576bbc11.js} +2 -2
  18. package/dist/_chunks/{Login-5b447dd2.js.map → Login-576bbc11.js.map} +1 -1
  19. package/dist/_chunks/{Login-8ade15b8.mjs → Login-d627bb0a.mjs} +2 -2
  20. package/dist/_chunks/{Login-8ade15b8.mjs.map → Login-d627bb0a.mjs.map} +1 -1
  21. package/dist/_chunks/{MarketplacePage-58fc8a9a.mjs → MarketplacePage-1cbfa8fd.mjs} +3 -3
  22. package/dist/_chunks/{MarketplacePage-58fc8a9a.mjs.map → MarketplacePage-1cbfa8fd.mjs.map} +1 -1
  23. package/dist/_chunks/{MarketplacePage-1c954f9d.js → MarketplacePage-e7cd973b.js} +3 -3
  24. package/dist/_chunks/{MarketplacePage-1c954f9d.js.map → MarketplacePage-e7cd973b.js.map} +1 -1
  25. package/dist/_chunks/{ProfilePage-a68483d3.js → ProfilePage-52844daa.js} +3 -3
  26. package/dist/_chunks/{ProfilePage-a68483d3.js.map → ProfilePage-52844daa.js.map} +1 -1
  27. package/dist/_chunks/{ProfilePage-a2f0366d.mjs → ProfilePage-ef400907.mjs} +3 -3
  28. package/dist/_chunks/{ProfilePage-a2f0366d.mjs.map → ProfilePage-ef400907.mjs.map} +1 -1
  29. package/dist/_chunks/{constants-155022af.js → constants-4aca55b6.js} +3 -3
  30. package/dist/_chunks/{constants-155022af.js.map → constants-4aca55b6.js.map} +1 -1
  31. package/dist/_chunks/{constants-3967338c.js → constants-6c68e9a0.js} +5 -5
  32. package/dist/_chunks/{constants-3967338c.js.map → constants-6c68e9a0.js.map} +1 -1
  33. package/dist/_chunks/{constants-da1ff847.mjs → constants-74b8a935.mjs} +6 -6
  34. package/dist/_chunks/{constants-da1ff847.mjs.map → constants-74b8a935.mjs.map} +1 -1
  35. package/dist/_chunks/{constants-ecad1e20.mjs → constants-a6fd64fc.mjs} +2 -2
  36. package/dist/_chunks/{constants-ecad1e20.mjs.map → constants-a6fd64fc.mjs.map} +1 -1
  37. package/dist/_chunks/{constants-6bf1c3c2.mjs → constants-ae0b83df.mjs} +5 -5
  38. package/dist/_chunks/{constants-6bf1c3c2.mjs.map → constants-ae0b83df.mjs.map} +1 -1
  39. package/dist/_chunks/{constants-32d352b6.mjs → constants-c1f1f698.mjs} +3 -3
  40. package/dist/_chunks/{constants-32d352b6.mjs.map → constants-c1f1f698.mjs.map} +1 -1
  41. package/dist/_chunks/{constants-eb77e47a.js → constants-ddd2d586.js} +2 -2
  42. package/dist/_chunks/{constants-eb77e47a.js.map → constants-ddd2d586.js.map} +1 -1
  43. package/dist/_chunks/{constants-d097f266.js → constants-e05f06d4.js} +6 -6
  44. package/dist/_chunks/{constants-d097f266.js.map → constants-e05f06d4.js.map} +1 -1
  45. package/dist/_chunks/{index-d47fc57d.mjs → index-10a05917.mjs} +4 -4
  46. package/dist/_chunks/{index-d47fc57d.mjs.map → index-10a05917.mjs.map} +1 -1
  47. package/dist/_chunks/{index-be9a9d91.mjs → index-115d317b.mjs} +3 -3
  48. package/dist/_chunks/{index-be9a9d91.mjs.map → index-115d317b.mjs.map} +1 -1
  49. package/dist/_chunks/{index-19bd1210.js → index-171715e4.js} +6 -6
  50. package/dist/_chunks/{index-19bd1210.js.map → index-171715e4.js.map} +1 -1
  51. package/dist/_chunks/{index-b3ad6e5f.js → index-1bac5263.js} +3 -3
  52. package/dist/_chunks/{index-b3ad6e5f.js.map → index-1bac5263.js.map} +1 -1
  53. package/dist/_chunks/{index-2064cfaf.js → index-200c5a6a.js} +3 -3
  54. package/dist/_chunks/{index-2064cfaf.js.map → index-200c5a6a.js.map} +1 -1
  55. package/dist/_chunks/{index-cc38421b.mjs → index-215b5421.mjs} +5 -5
  56. package/dist/_chunks/{index-cc38421b.mjs.map → index-215b5421.mjs.map} +1 -1
  57. package/dist/_chunks/{index-d9aae905.js → index-23401c29.js} +5 -5
  58. package/dist/_chunks/{index-d9aae905.js.map → index-23401c29.js.map} +1 -1
  59. package/dist/_chunks/{index-ceacb143.js → index-242c859c.js} +5 -5
  60. package/dist/_chunks/{index-ceacb143.js.map → index-242c859c.js.map} +1 -1
  61. package/dist/_chunks/{index-061947f1.mjs → index-26fcb3ca.mjs} +20 -20
  62. package/dist/_chunks/{index-061947f1.mjs.map → index-26fcb3ca.mjs.map} +1 -1
  63. package/dist/_chunks/{index-391891ba.mjs → index-28dd9303.mjs} +3 -3
  64. package/dist/_chunks/{index-391891ba.mjs.map → index-28dd9303.mjs.map} +1 -1
  65. package/dist/_chunks/{index-d844fbda.mjs → index-296c14bf.mjs} +3 -3
  66. package/dist/_chunks/{index-d844fbda.mjs.map → index-296c14bf.mjs.map} +1 -1
  67. package/dist/_chunks/{index-819443df.js → index-2de06c32.js} +4 -4
  68. package/dist/_chunks/{index-819443df.js.map → index-2de06c32.js.map} +1 -1
  69. package/dist/_chunks/{index-aad003e4.mjs → index-2eb69b5d.mjs} +5 -5
  70. package/dist/_chunks/{index-aad003e4.mjs.map → index-2eb69b5d.mjs.map} +1 -1
  71. package/dist/_chunks/{index-b6b2a306.js → index-2f61e3ae.js} +3 -3
  72. package/dist/_chunks/{index-b6b2a306.js.map → index-2f61e3ae.js.map} +1 -1
  73. package/dist/_chunks/{index-707e89df.mjs → index-308b73ba.mjs} +3 -3
  74. package/dist/_chunks/{index-707e89df.mjs.map → index-308b73ba.mjs.map} +1 -1
  75. package/dist/_chunks/{index-c6c83bb3.js → index-34e41e15.js} +2 -2
  76. package/dist/_chunks/{index-c6c83bb3.js.map → index-34e41e15.js.map} +1 -1
  77. package/dist/_chunks/{index-97c03ee2.mjs → index-383efae4.mjs} +4 -4
  78. package/dist/_chunks/{index-97c03ee2.mjs.map → index-383efae4.mjs.map} +1 -1
  79. package/dist/_chunks/{index-c8b6afca.js → index-3b426575.js} +4 -4
  80. package/dist/_chunks/{index-c8b6afca.js.map → index-3b426575.js.map} +1 -1
  81. package/dist/_chunks/{index-ecfaf6c1.js → index-47af1603.js} +3 -3
  82. package/dist/_chunks/{index-ecfaf6c1.js.map → index-47af1603.js.map} +1 -1
  83. package/dist/_chunks/{index-ad0512f0.js → index-4d9b2cb9.js} +4 -4
  84. package/dist/_chunks/{index-ad0512f0.js.map → index-4d9b2cb9.js.map} +1 -1
  85. package/dist/_chunks/{index-8f8eaed6.js → index-4de70b5d.js} +4 -4
  86. package/dist/_chunks/{index-8f8eaed6.js.map → index-4de70b5d.js.map} +1 -1
  87. package/dist/_chunks/{index-cdcf1a78.js → index-59b1f604.js} +5 -5
  88. package/dist/_chunks/{index-cdcf1a78.js.map → index-59b1f604.js.map} +1 -1
  89. package/dist/_chunks/{index-209cca35.mjs → index-5a5217e0.mjs} +3 -3
  90. package/dist/_chunks/{index-209cca35.mjs.map → index-5a5217e0.mjs.map} +1 -1
  91. package/dist/_chunks/{index-b5eec5e2.js → index-5da07c41.js} +5 -5
  92. package/dist/_chunks/{index-b5eec5e2.js.map → index-5da07c41.js.map} +1 -1
  93. package/dist/_chunks/{index-6731bae9.js → index-600cb5dd.js} +5 -5
  94. package/dist/_chunks/{index-6731bae9.js.map → index-600cb5dd.js.map} +1 -1
  95. package/dist/_chunks/{index-82fca9fd.mjs → index-608d8d10.mjs} +3 -3
  96. package/dist/_chunks/{index-82fca9fd.mjs.map → index-608d8d10.mjs.map} +1 -1
  97. package/dist/_chunks/{index-73971882.js → index-7d578921.js} +3 -3
  98. package/dist/_chunks/{index-73971882.js.map → index-7d578921.js.map} +1 -1
  99. package/dist/_chunks/{index-3aab6b0f.mjs → index-8109fa91.mjs} +6 -6
  100. package/dist/_chunks/{index-3aab6b0f.mjs.map → index-8109fa91.mjs.map} +1 -1
  101. package/dist/_chunks/{index-57f9a06f.js → index-82c7a120.js} +8 -8
  102. package/dist/_chunks/{index-57f9a06f.js.map → index-82c7a120.js.map} +1 -1
  103. package/dist/_chunks/{index-91726188.js → index-83d53962.js} +3 -3
  104. package/dist/_chunks/{index-91726188.js.map → index-83d53962.js.map} +1 -1
  105. package/dist/_chunks/{index-3c67c00b.mjs → index-8933483b.mjs} +4 -4
  106. package/dist/_chunks/{index-3c67c00b.mjs.map → index-8933483b.mjs.map} +1 -1
  107. package/dist/_chunks/{index-24c2627d.mjs → index-91df57b1.mjs} +3 -3
  108. package/dist/_chunks/{index-24c2627d.mjs.map → index-91df57b1.mjs.map} +1 -1
  109. package/dist/_chunks/{index-d1219a93.mjs → index-989bbeec.mjs} +3 -3
  110. package/dist/_chunks/{index-d1219a93.mjs.map → index-989bbeec.mjs.map} +1 -1
  111. package/dist/_chunks/{index-ec2d87cb.js → index-9910dda4.js} +4 -4
  112. package/dist/_chunks/{index-ec2d87cb.js.map → index-9910dda4.js.map} +1 -1
  113. package/dist/_chunks/{index-78f4851e.js → index-9afb163a.js} +3 -3
  114. package/dist/_chunks/{index-78f4851e.js.map → index-9afb163a.js.map} +1 -1
  115. package/dist/_chunks/{index-1502dedd.js → index-9f61bef8.js} +4 -4
  116. package/dist/_chunks/{index-1502dedd.js.map → index-9f61bef8.js.map} +1 -1
  117. package/dist/_chunks/{index-86a4fbbf.mjs → index-ab31623a.mjs} +3 -3
  118. package/dist/_chunks/{index-86a4fbbf.mjs.map → index-ab31623a.mjs.map} +1 -1
  119. package/dist/_chunks/{index-cea88049.mjs → index-ac85118a.mjs} +4 -4
  120. package/dist/_chunks/{index-cea88049.mjs.map → index-ac85118a.mjs.map} +1 -1
  121. package/dist/_chunks/{index-55155d83.mjs → index-ad8e55c0.mjs} +2 -2
  122. package/dist/_chunks/{index-55155d83.mjs.map → index-ad8e55c0.mjs.map} +1 -1
  123. package/dist/_chunks/{index-6a8a1f1d.js → index-aedeaf5a.js} +3 -3
  124. package/dist/_chunks/{index-6a8a1f1d.js.map → index-aedeaf5a.js.map} +1 -1
  125. package/dist/_chunks/{index-724169b2.js → index-bbac142a.js} +3 -3
  126. package/dist/_chunks/{index-724169b2.js.map → index-bbac142a.js.map} +1 -1
  127. package/dist/_chunks/{index-8609fab4.mjs → index-bd18f803.mjs} +8 -8
  128. package/dist/_chunks/{index-8609fab4.mjs.map → index-bd18f803.mjs.map} +1 -1
  129. package/dist/_chunks/{index-06e97c47.mjs → index-c8b8a2ee.mjs} +5 -5
  130. package/dist/_chunks/{index-06e97c47.mjs.map → index-c8b8a2ee.mjs.map} +1 -1
  131. package/dist/_chunks/{index-7b174d49.js → index-c97f5820.js} +20 -20
  132. package/dist/_chunks/{index-7b174d49.js.map → index-c97f5820.js.map} +1 -1
  133. package/dist/_chunks/{index-c5fa9006.mjs → index-cb6a72d2.mjs} +5 -5
  134. package/dist/_chunks/{index-c5fa9006.mjs.map → index-cb6a72d2.mjs.map} +1 -1
  135. package/dist/_chunks/{index-6685e5a8.js → index-cbc7c054.js} +3 -3
  136. package/dist/_chunks/{index-6685e5a8.js.map → index-cbc7c054.js.map} +1 -1
  137. package/dist/_chunks/{index-9b2501ca.mjs → index-ce5995cd.mjs} +2 -2
  138. package/dist/_chunks/{index-9b2501ca.mjs.map → index-ce5995cd.mjs.map} +1 -1
  139. package/dist/_chunks/{index-b247e702.js → index-d1152896.js} +3 -3
  140. package/dist/_chunks/{index-b247e702.js.map → index-d1152896.js.map} +1 -1
  141. package/dist/_chunks/{index-272d8fb9.js → index-d1dd825b.js} +3 -3
  142. package/dist/_chunks/{index-272d8fb9.js.map → index-d1dd825b.js.map} +1 -1
  143. package/dist/_chunks/{index-2cf8d1f6.mjs → index-d2d9df41.mjs} +3 -3
  144. package/dist/_chunks/{index-2cf8d1f6.mjs.map → index-d2d9df41.mjs.map} +1 -1
  145. package/dist/_chunks/{index-61852c7a.mjs → index-d4517ac4.mjs} +3 -3
  146. package/dist/_chunks/{index-61852c7a.mjs.map → index-d4517ac4.mjs.map} +1 -1
  147. package/dist/_chunks/{index-caab4b20.js → index-d49fa655.js} +2 -2
  148. package/dist/_chunks/{index-caab4b20.js.map → index-d49fa655.js.map} +1 -1
  149. package/dist/_chunks/{index-dd897afb.mjs → index-d6694cab.mjs} +3 -3
  150. package/dist/_chunks/{index-dd897afb.mjs.map → index-d6694cab.mjs.map} +1 -1
  151. package/dist/_chunks/{index-3939f07e.mjs → index-e117c643.mjs} +4 -4
  152. package/dist/_chunks/{index-3939f07e.mjs.map → index-e117c643.mjs.map} +1 -1
  153. package/dist/_chunks/{index-48c35356.mjs → index-e1b90981.mjs} +5 -5
  154. package/dist/_chunks/{index-48c35356.mjs.map → index-e1b90981.mjs.map} +1 -1
  155. package/dist/_chunks/{index-1482f542.js → index-e24df0bf.js} +2 -2
  156. package/dist/_chunks/{index-1482f542.js.map → index-e24df0bf.js.map} +1 -1
  157. package/dist/_chunks/{index-7a797b0f.mjs → index-e2d2f58e.mjs} +4 -4
  158. package/dist/_chunks/{index-7a797b0f.mjs.map → index-e2d2f58e.mjs.map} +1 -1
  159. package/dist/_chunks/{index-674778e2.mjs → index-e369d741.mjs} +2 -2
  160. package/dist/_chunks/{index-674778e2.mjs.map → index-e369d741.mjs.map} +1 -1
  161. package/dist/_chunks/{index-14887b9d.mjs → index-e79b2b9e.mjs} +3 -3
  162. package/dist/_chunks/{index-14887b9d.mjs.map → index-e79b2b9e.mjs.map} +1 -1
  163. package/dist/_chunks/{index-35c3f9f1.mjs → index-ea18ff22.mjs} +4 -4
  164. package/dist/_chunks/{index-35c3f9f1.mjs.map → index-ea18ff22.mjs.map} +1 -1
  165. package/dist/_chunks/{index-4a019067.js → index-ed3696ec.js} +3 -3
  166. package/dist/_chunks/{index-4a019067.js.map → index-ed3696ec.js.map} +1 -1
  167. package/dist/_chunks/{index-24d1e175.js → index-ee1ea38b.js} +5 -5
  168. package/dist/_chunks/{index-24d1e175.js.map → index-ee1ea38b.js.map} +1 -1
  169. package/dist/_chunks/{index-dab453d2.js → index-efc967f5.js} +4 -4
  170. package/dist/_chunks/{index-dab453d2.js.map → index-efc967f5.js.map} +1 -1
  171. package/dist/_chunks/{index-ff4fb44c.mjs → index-fd4e5616.mjs} +5 -5
  172. package/dist/_chunks/{index-ff4fb44c.mjs.map → index-fd4e5616.mjs.map} +1 -1
  173. package/dist/_chunks/{schema-336f4dd6.js → schema-260fec28.js} +2 -2
  174. package/dist/_chunks/{schema-336f4dd6.js.map → schema-260fec28.js.map} +1 -1
  175. package/dist/_chunks/{schema-60d9880c.mjs → schema-6bd8bd85.mjs} +2 -2
  176. package/dist/_chunks/{schema-60d9880c.mjs.map → schema-6bd8bd85.mjs.map} +1 -1
  177. package/dist/_chunks/{validateWorkflow-7f76e43f.js → validateWorkflow-5693ea2d.js} +3 -3
  178. package/dist/_chunks/{validateWorkflow-7f76e43f.js.map → validateWorkflow-5693ea2d.js.map} +1 -1
  179. package/dist/_chunks/{validateWorkflow-022b5005.mjs → validateWorkflow-7a2b6ab8.mjs} +3 -3
  180. package/dist/_chunks/{validateWorkflow-022b5005.mjs.map → validateWorkflow-7a2b6ab8.mjs.map} +1 -1
  181. package/dist/admin/index.js +1 -1
  182. package/dist/admin/index.mjs +1 -1
  183. package/package.json +12 -12
@@ -1 +1 @@
1
- {"version":3,"file":"MarketplacePage-1c954f9d.js","sources":["../../admin/src/pages/Marketplace/components/NpmPackagesFilters.tsx","../../admin/src/pages/Marketplace/components/NpmPackageCard.tsx","../../admin/src/pages/Marketplace/components/NpmPackagesGrid.tsx","../../admin/src/pages/Marketplace/components/PageHeader.tsx","../../admin/src/pages/Marketplace/components/OfflineLayout.tsx","../../admin/src/pages/Marketplace/components/SortSelect.tsx","../../admin/src/pages/Marketplace/hooks/useMarketplaceData.ts","../../admin/src/pages/Marketplace/hooks/useNavigatorOnline.ts","../../admin/src/pages/Marketplace/MarketplacePage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Button,\n Tag,\n MultiSelect,\n MultiSelectOption,\n MultiSelectProps,\n Popover,\n Flex,\n} from '@strapi/design-system';\nimport { Cross, Filter } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport type { Categories, Collections, FilterTypes } from '../hooks/useMarketplaceData';\nimport type { NpmPackageType, MarketplacePageQuery } from '../MarketplacePage';\n\ninterface NpmPackagesFiltersProps {\n handleSelectClear: (type: FilterTypes) => void;\n handleSelectChange: (update: Partial<MarketplacePageQuery>) => void;\n npmPackageType: NpmPackageType;\n possibleCategories: Partial<Record<Categories, number>>;\n possibleCollections: Partial<Record<Collections, number>>;\n query: MarketplacePageQuery;\n}\n\nconst NpmPackagesFilters = ({\n handleSelectClear,\n handleSelectChange,\n npmPackageType,\n possibleCategories,\n possibleCollections,\n query,\n}: NpmPackagesFiltersProps) => {\n const [isVisible, setIsVisible] = React.useState(false);\n const buttonRef = React.useRef<HTMLButtonElement>(null!);\n const { formatMessage } = useIntl();\n\n const handleToggle = () => setIsVisible((prev) => !prev);\n\n const handleTagRemove = (tagToRemove: string, filterType: FilterTypes) => {\n const update = {\n [filterType]: (query[filterType] ?? []).filter((previousTag) => previousTag !== tagToRemove),\n };\n\n handleSelectChange(update);\n };\n\n return (\n <>\n <Box paddingTop={1} paddingBottom={1}>\n <ButtonToggle\n variant=\"tertiary\"\n ref={buttonRef}\n startIcon={<Filter />}\n onClick={handleToggle}\n size=\"S\"\n >\n {formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </ButtonToggle>\n {isVisible && (\n <Popover source={buttonRef} onDismiss={handleToggle} padding={3} spacing={4}>\n <FiltersFlex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <FilterSelect\n message={formatMessage({\n id: 'admin.pages.MarketPlacePage.filters.collections',\n defaultMessage: 'Collections',\n })}\n value={query?.collections || []}\n onChange={(newCollections) => {\n const update = { collections: newCollections };\n handleSelectChange(update);\n }}\n onClear={() => handleSelectClear('collections')}\n possibleFilters={possibleCollections}\n customizeContent={(values) =>\n formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.filters.collectionsSelected',\n defaultMessage:\n '{count, plural, =0 {No collections} one {# collection} other {# collections}} selected',\n },\n { count: values?.length ?? 0 }\n )\n }\n />\n {npmPackageType === 'plugin' && (\n <FilterSelect\n message={formatMessage({\n id: 'admin.pages.MarketPlacePage.filters.categories',\n defaultMessage: 'Categories',\n })}\n value={query?.categories || []}\n onChange={(newCategories) => {\n const update = { categories: newCategories };\n handleSelectChange(update);\n }}\n onClear={() => handleSelectClear('categories')}\n possibleFilters={possibleCategories}\n customizeContent={(values) =>\n formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.filters.categoriesSelected',\n defaultMessage:\n '{count, plural, =0 {No categories} one {# category} other {# categories}} selected',\n },\n { count: values?.length ?? 0 }\n )\n }\n />\n )}\n </FiltersFlex>\n </Popover>\n )}\n </Box>\n {query.collections?.map((collection) => (\n <Box key={collection} padding={1}>\n <Tag icon={<Cross />} onClick={() => handleTagRemove(collection, 'collections')}>\n {collection}\n </Tag>\n </Box>\n ))}\n {npmPackageType === 'plugin' &&\n query.categories?.map((category) => (\n <Box key={category} padding={1}>\n <Tag icon={<Cross />} onClick={() => handleTagRemove(category, 'categories')}>\n {category}\n </Tag>\n </Box>\n ))}\n </>\n );\n};\n\nconst ButtonToggle = styled(Button)`\n height: ${({ theme }) => theme.sizes.input.S};\n`;\n\nconst FiltersFlex = styled(Flex)`\n /* Hide the label, every input needs a label. */\n label {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FilterSelect\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FilterSelectProps\n extends Pick<MultiSelectProps, 'customizeContent' | 'onClear' | 'onChange' | 'value'> {\n message: string;\n possibleFilters:\n | NpmPackagesFiltersProps['possibleCategories']\n | NpmPackagesFiltersProps['possibleCollections'];\n}\n\nconst FilterSelect = ({\n message,\n value,\n onChange,\n possibleFilters,\n onClear,\n customizeContent,\n}: FilterSelectProps) => {\n return (\n <MultiSelect\n data-testid={`${message}-button`}\n label={message}\n placeholder={message}\n size=\"M\"\n onChange={onChange}\n onClear={onClear}\n value={value}\n customizeContent={customizeContent}\n >\n {Object.entries(possibleFilters).map(([filterName, count]) => {\n return (\n <MultiSelectOption\n data-testid={`${filterName}-${count}`}\n key={filterName}\n value={filterName}\n >\n {`${filterName} (${count})`}\n </MultiSelectOption>\n );\n })}\n </MultiSelect>\n );\n};\n\nexport { NpmPackagesFilters };\nexport type { NpmPackagesFiltersProps };\n","import { Box, Flex, Icon, Tooltip, Typography, Divider, Button } from '@strapi/design-system';\nimport { LinkButton } from '@strapi/design-system/v2';\nimport {\n useTracking,\n pxToRem,\n AppInfoContextValue,\n useNotification,\n useClipboard,\n} from '@strapi/helper-plugin';\nimport { CheckCircle, ExternalLink, Download, Github, Star, Check, Duplicate } from '@strapi/icons';\nimport pluralize from 'pluralize';\nimport { useIntl } from 'react-intl';\nimport * as semver from 'semver';\nimport styled from 'styled-components';\n\nimport StrapiLogo from '../../../assets/images/logo-strapi-2022.svg';\n\nimport type { Plugin, Provider } from '../hooks/useMarketplaceData';\nimport type { NpmPackageType } from '../MarketplacePage';\n\n// Custom component to have an ellipsis after the 2nd line\nconst EllipsisText = styled(Typography)`\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n overflow: hidden;\n`;\n\ninterface NpmPackageCardProps extends Pick<AppInfoContextValue, 'useYarn'> {\n npmPackage: Plugin | Provider;\n isInstalled: boolean;\n isInDevelopmentMode: AppInfoContextValue['autoReload'];\n npmPackageType: NpmPackageType;\n strapiAppVersion: AppInfoContextValue['strapiVersion'];\n}\n\nconst NpmPackageCard = ({\n npmPackage,\n isInstalled,\n useYarn,\n isInDevelopmentMode,\n npmPackageType,\n strapiAppVersion,\n}: NpmPackageCardProps) => {\n const { attributes } = npmPackage;\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const commandToCopy = useYarn\n ? `yarn add ${attributes.npmPackageName}`\n : `npm install ${attributes.npmPackageName}`;\n\n const madeByStrapiMessage = formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.tooltip.madeByStrapi',\n defaultMessage: 'Made by Strapi',\n });\n\n const npmPackageHref = `https://market.strapi.io/${pluralize.plural(npmPackageType)}/${\n attributes.slug\n }`;\n\n return (\n <Flex\n direction=\"column\"\n justifyContent=\"space-between\"\n paddingTop={4}\n paddingRight={4}\n paddingBottom={4}\n paddingLeft={4}\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n height=\"100%\"\n alignItems=\"normal\"\n data-testid=\"npm-package-card\"\n >\n <Box>\n <Flex direction=\"row\" justifyContent=\"space-between\" alignItems=\"flex-start\">\n <Box\n as=\"img\"\n src={attributes.logo.url}\n alt={`${attributes.name} logo`}\n hasRadius\n width={11}\n height={11}\n />\n <PackageStats\n githubStars={attributes.githubStars}\n npmDownloads={attributes.npmDownloads}\n npmPackageType={npmPackageType}\n />\n </Flex>\n <Box paddingTop={4}>\n <Typography as=\"h3\" variant=\"delta\">\n <Flex alignItems=\"center\">\n {attributes.name}\n {attributes.validated && !attributes.madeByStrapi && (\n <Tooltip\n description={formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.tooltip.verified',\n defaultMessage: 'Plugin verified by Strapi',\n })}\n >\n <Flex>\n <Icon as={CheckCircle} marginLeft={2} color=\"success600\" />\n </Flex>\n </Tooltip>\n )}\n {attributes.madeByStrapi && (\n <Tooltip description={madeByStrapiMessage}>\n <Flex>\n <Box\n as=\"img\"\n src={StrapiLogo}\n alt={madeByStrapiMessage}\n marginLeft={1}\n width={6}\n height=\"auto\"\n />\n </Flex>\n </Tooltip>\n )}\n </Flex>\n </Typography>\n </Box>\n <Box paddingTop={2}>\n <EllipsisText as=\"p\" variant=\"omega\" textColor=\"neutral600\">\n {attributes.description}\n </EllipsisText>\n </Box>\n </Box>\n\n <Flex gap={2} style={{ alignSelf: 'flex-end' }} paddingTop={6}>\n <LinkButton\n size=\"S\"\n href={npmPackageHref}\n isExternal\n endIcon={<ExternalLink />}\n aria-label={formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.plugin.info.label',\n defaultMessage: 'Learn more about {pluginName}',\n },\n { pluginName: attributes.name }\n )}\n variant=\"tertiary\"\n onClick={() => trackUsage('didPluginLearnMore')}\n >\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.info.text',\n defaultMessage: 'More',\n })}\n </LinkButton>\n <InstallPluginButton\n isInstalled={isInstalled}\n isInDevelopmentMode={isInDevelopmentMode}\n commandToCopy={commandToCopy}\n strapiAppVersion={strapiAppVersion}\n strapiPeerDepVersion={attributes.strapiVersion}\n pluginName={attributes.name}\n />\n </Flex>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * InstallPluginButton\n * -----------------------------------------------------------------------------------------------*/\n\ninterface InstallPluginButtonProps\n extends Pick<NpmPackageCardProps, 'isInstalled' | 'isInDevelopmentMode' | 'strapiAppVersion'> {\n commandToCopy: string;\n pluginName: string;\n strapiPeerDepVersion?: string;\n}\n\nconst InstallPluginButton = ({\n isInstalled,\n isInDevelopmentMode,\n commandToCopy,\n strapiAppVersion,\n strapiPeerDepVersion,\n pluginName,\n}: InstallPluginButtonProps) => {\n const toggleNotification = useNotification();\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { copy } = useClipboard();\n\n const handleCopy = async () => {\n const didCopy = await copy(commandToCopy);\n\n if (didCopy) {\n trackUsage('willInstallPlugin');\n toggleNotification({\n type: 'success',\n message: { id: 'admin.pages.MarketPlacePage.plugin.copy.success' },\n });\n }\n };\n\n // Already installed\n if (isInstalled) {\n return (\n <Box paddingLeft={4}>\n <Icon as={Check} marginRight={2} width={12} height={12} color=\"success600\" />\n <Typography variant=\"omega\" textColor=\"success600\" fontWeight=\"bold\">\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.installed',\n defaultMessage: 'Installed',\n })}\n </Typography>\n </Box>\n );\n }\n\n // In development, show install button\n if (isInDevelopmentMode) {\n return (\n <CardButton\n strapiAppVersion={strapiAppVersion}\n strapiPeerDepVersion={strapiPeerDepVersion}\n handleCopy={handleCopy}\n pluginName={pluginName}\n />\n );\n }\n\n // Not in development and plugin not installed already. Show nothing\n return null;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CardButton\n * -----------------------------------------------------------------------------------------------*/\n\ninterface CardButtonProps\n extends Pick<NpmPackageCardProps, 'strapiAppVersion'>,\n Pick<InstallPluginButtonProps, 'strapiPeerDepVersion' | 'pluginName'> {\n handleCopy: () => void;\n}\n\nconst CardButton = ({\n strapiPeerDepVersion,\n strapiAppVersion,\n handleCopy,\n pluginName,\n}: CardButtonProps) => {\n const { formatMessage } = useIntl();\n const versionRange = semver.validRange(strapiPeerDepVersion);\n const isCompatible = semver.satisfies(strapiAppVersion ?? '', versionRange ?? '');\n\n const installMessage = formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.copy',\n defaultMessage: 'Copy install command',\n });\n\n // Only plugins receive a strapiAppVersion\n if (strapiAppVersion) {\n if (!versionRange || !isCompatible) {\n return (\n <Tooltip\n data-testid={`tooltip-${pluginName}`}\n description={\n !versionRange\n ? formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.plugin.version.null',\n defaultMessage:\n 'Unable to verify compatibility with your Strapi version: \"{strapiAppVersion}\"',\n },\n { strapiAppVersion }\n )\n : formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.plugin.version',\n defaultMessage:\n 'Update your Strapi version: \"{strapiAppVersion}\" to: \"{versionRange}\"',\n },\n {\n strapiAppVersion,\n versionRange,\n }\n )\n }\n >\n <Button\n size=\"S\"\n startIcon={<Duplicate />}\n variant=\"secondary\"\n onClick={handleCopy}\n disabled={!isCompatible}\n >\n {installMessage}\n </Button>\n </Tooltip>\n );\n }\n }\n\n return (\n <Button size=\"S\" startIcon={<Duplicate />} variant=\"secondary\" onClick={handleCopy}>\n {installMessage}\n </Button>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PackageStats\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PackageStatsProps {\n githubStars?: number;\n npmDownloads?: number;\n npmPackageType: NpmPackageType;\n}\n\nconst PackageStats = ({ githubStars = 0, npmDownloads = 0, npmPackageType }: PackageStatsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex gap={1}>\n {!!githubStars && (\n <>\n <Icon as={Github} height={pxToRem(12)} width={pxToRem(12)} aria-hidden />\n <Icon as={Star} height={pxToRem(12)} width={pxToRem(12)} color=\"warning500\" aria-hidden />\n <p\n aria-label={formatMessage(\n {\n id: `admin.pages.MarketPlacePage.${npmPackageType}.githubStars`,\n defaultMessage: `This {package} was starred {starsCount} on GitHub`,\n },\n {\n starsCount: githubStars,\n package: npmPackageType,\n }\n )}\n >\n <Typography variant=\"pi\" textColor=\"neutral800\">\n {githubStars}\n </Typography>\n </p>\n <VerticalDivider unsetMargin={false} />\n </>\n )}\n <Icon as={Download} height={pxToRem(12)} width={pxToRem(12)} aria-hidden />\n <p\n aria-label={formatMessage(\n {\n id: `admin.pages.MarketPlacePage.${npmPackageType}.downloads`,\n defaultMessage: `This {package} has {downloadsCount} weekly downloads`,\n },\n {\n downloadsCount: npmDownloads,\n package: npmPackageType,\n }\n )}\n >\n <Typography variant=\"pi\" textColor=\"neutral800\">\n {npmDownloads}\n </Typography>\n </p>\n </Flex>\n );\n};\n\nconst VerticalDivider = styled(Divider)`\n width: ${pxToRem(12)};\n transform: rotate(90deg);\n`;\n\nexport { NpmPackageCard };\nexport type { NpmPackageCardProps };\n","import {\n Box,\n Flex,\n Grid,\n GridItem,\n GridLayout,\n Icon,\n Loader,\n Typography,\n} from '@strapi/design-system';\nimport { AnErrorOccurred, AppInfoContextValue } from '@strapi/helper-plugin';\nimport { EmptyDocuments } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport { NpmPackageCard, NpmPackageCardProps } from './NpmPackageCard';\n\nimport type { Plugin, Provider } from '../hooks/useMarketplaceData';\n\ninterface NpmPackagesGridProps extends Pick<NpmPackageCardProps, 'npmPackageType' | 'useYarn'> {\n debouncedSearch: string;\n installedPackageNames: string[];\n isInDevelopmentMode: AppInfoContextValue['autoReload'];\n npmPackages?: Array<Plugin | Provider>;\n status: 'idle' | 'loading' | 'error' | 'success';\n strapiAppVersion?: NpmPackageCardProps['strapiAppVersion'];\n}\n\nconst NpmPackagesGrid = ({\n status,\n npmPackages = [],\n installedPackageNames = [],\n useYarn,\n isInDevelopmentMode,\n npmPackageType,\n strapiAppVersion,\n debouncedSearch,\n}: NpmPackagesGridProps) => {\n const { formatMessage } = useIntl();\n\n if (status === 'error') {\n return (\n <Flex paddingTop={8}>\n <AnErrorOccurred />\n </Flex>\n );\n }\n\n if (status === 'loading') {\n return (\n <Flex justifyContent=\"center\" paddingTop={8}>\n <Loader>Loading content...</Loader>\n </Flex>\n );\n }\n\n const emptySearchMessage = formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.search.empty',\n defaultMessage: 'No result for \"{target}\"',\n },\n { target: debouncedSearch }\n );\n\n if (npmPackages.length === 0) {\n return (\n <Box position=\"relative\">\n <GridLayout>\n {Array(12)\n .fill(null)\n .map((_, idx) => (\n <EmptyPluginCard key={idx} height=\"234px\" hasRadius />\n ))}\n </GridLayout>\n <Box position=\"absolute\" top={11} width=\"100%\">\n <Flex alignItems=\"center\" justifyContent=\"center\" direction=\"column\">\n <Icon as={EmptyDocuments} color={undefined} width=\"160px\" height=\"88px\" />\n <Box paddingTop={6}>\n <Typography variant=\"delta\" as=\"p\" textColor=\"neutral600\">\n {emptySearchMessage}\n </Typography>\n </Box>\n </Flex>\n </Box>\n </Box>\n );\n }\n\n return (\n <Grid gap={4}>\n {npmPackages.map((npmPackage) => (\n <GridItem col={4} s={6} xs={12} style={{ height: '100%' }} key={npmPackage.id}>\n <NpmPackageCard\n npmPackage={npmPackage}\n isInstalled={installedPackageNames.includes(npmPackage.attributes.npmPackageName)}\n useYarn={useYarn}\n isInDevelopmentMode={isInDevelopmentMode}\n npmPackageType={npmPackageType}\n strapiAppVersion={strapiAppVersion}\n />\n </GridItem>\n ))}\n </Grid>\n );\n};\n\nconst EmptyPluginCard = styled(Box)`\n background: ${({ theme }) =>\n `linear-gradient(180deg, rgba(234, 234, 239, 0) 0%, ${theme.colors.neutral150} 100%)`};\n opacity: 0.33;\n`;\n\nexport { NpmPackagesGrid };\n","import { HeaderLayout } from '@strapi/design-system';\nimport { LinkButton } from '@strapi/design-system/v2';\nimport { useTracking } from '@strapi/helper-plugin';\nimport { Upload } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport type { NpmPackageType } from '../MarketplacePage';\n\ninterface PageHeaderProps {\n isOnline?: boolean;\n npmPackageType?: NpmPackageType;\n}\n\nconst PageHeader = ({ isOnline, npmPackageType = 'plugin' }: PageHeaderProps) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const tracking = npmPackageType === 'provider' ? 'didSubmitProvider' : 'didSubmitPlugin';\n\n return (\n <HeaderLayout\n title={formatMessage({\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n })}\n subtitle={formatMessage({\n id: 'admin.pages.MarketPlacePage.subtitle',\n defaultMessage: 'Get more out of Strapi',\n })}\n primaryAction={\n isOnline && (\n <LinkButton\n startIcon={<Upload />}\n variant=\"tertiary\"\n href={`https://market.strapi.io/submit-${npmPackageType}`}\n onClick={() => trackUsage(tracking)}\n isExternal\n >\n {formatMessage({\n id: `admin.pages.MarketPlacePage.submit.${npmPackageType}.link`,\n defaultMessage: `Submit ${npmPackageType}`,\n })}\n </LinkButton>\n )\n }\n />\n );\n};\n\nexport { PageHeader };\nexport type { PageHeaderProps };\n","import { Box, Flex, Layout, Main, Typography } from '@strapi/design-system';\nimport { pxToRem } from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\n\nimport { PageHeader } from './PageHeader';\n\nconst OfflineLayout = () => {\n const { formatMessage } = useIntl();\n\n return (\n <Layout>\n <Main>\n <PageHeader />\n <Flex\n width=\"100%\"\n direction=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n paddingTop={pxToRem(120)}\n >\n <Box paddingBottom={2}>\n <Typography textColor=\"neutral700\" variant=\"alpha\">\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.offline.title',\n defaultMessage: 'You are offline',\n })}\n </Typography>\n </Box>\n <Box paddingBottom={6}>\n <Typography textColor=\"neutral700\" variant=\"epsilon\">\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.offline.subtitle',\n defaultMessage: 'You need to be connected to the Internet to access Strapi Market.',\n })}\n </Typography>\n </Box>\n <svg\n width=\"88\"\n height=\"88\"\n viewBox=\"0 0 88 88\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\".5\" y=\".5\" width=\"87\" height=\"87\" rx=\"43.5\" fill=\"#F0F0FF\" />\n <path\n d=\"M34 39.3h-4c-2.6 0-4.7 1-6.6 2.8a9 9 0 0 0-2.7 6.6 9 9 0 0 0 2.7 6.6A9 9 0 0 0 30 58h22.8L34 39.3Zm-11-11 3-3 39 39-3 3-4.7-4.6H30a13.8 13.8 0 0 1-14-14c0-3.8 1.3-7 4-9.7 2.6-2.7 5.7-4.2 9.5-4.3L23 28.2Zm38.2 11.1c3 .2 5.5 1.5 7.6 3.7A11 11 0 0 1 72 51c0 4-1.6 7.2-5 9.5l-3.3-3.4a6.5 6.5 0 0 0 3.6-6.1c0-1.9-.7-3.5-2-5-1.5-1.3-3.1-2-5-2h-3.5v-1.2c0-3.6-1.2-6.6-3.7-9a13 13 0 0 0-15-2.3L34.6 28a17 17 0 0 1 20.3 1.5c3.5 2.7 5.5 6 6.3 10Z\"\n fill=\"#4945FF\"\n />\n <rect x=\".5\" y=\".5\" width=\"87\" height=\"87\" rx=\"43.5\" stroke=\"#D9D8FF\" />\n </svg>\n </Flex>\n </Main>\n </Layout>\n );\n};\n\nexport { OfflineLayout };\n","import { Box, SingleSelectOption, SingleSelect } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nconst SORT_TYPES = {\n 'name:asc': {\n selected: {\n id: 'admin.pages.MarketPlacePage.sort.alphabetical.selected',\n defaultMessage: 'Sort by alphabetical order',\n },\n option: {\n id: 'admin.pages.MarketPlacePage.sort.alphabetical',\n defaultMessage: 'Alphabetical order',\n },\n },\n 'submissionDate:desc': {\n selected: {\n id: 'admin.pages.MarketPlacePage.sort.newest.selected',\n defaultMessage: 'Sort by newest',\n },\n option: {\n id: 'admin.pages.MarketPlacePage.sort.newest',\n defaultMessage: 'Newest',\n },\n },\n 'githubStars:desc': {\n selected: {\n id: 'admin.pages.MarketPlacePage.sort.githubStars.selected',\n defaultMessage: 'Sort by GitHub stars',\n },\n option: {\n id: 'admin.pages.MarketPlacePage.sort.githubStars',\n defaultMessage: 'Number of GitHub stars',\n },\n },\n 'npmDownloads:desc': {\n selected: {\n id: 'admin.pages.MarketPlacePage.sort.npmDownloads.selected',\n defaultMessage: 'Sort by npm downloads',\n },\n option: {\n id: 'admin.pages.MarketPlacePage.sort.npmDownloads',\n defaultMessage: 'Number of downloads',\n },\n },\n} as const;\n\ninterface SortSelectProps {\n sortQuery: keyof typeof SORT_TYPES;\n handleSelectChange: (payload: { sort: string }) => void;\n}\n\nconst SortSelect = ({ sortQuery, handleSelectChange }: SortSelectProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <SelectWrapper>\n <SingleSelect\n size=\"S\"\n id=\"sort-by-select\"\n value={sortQuery}\n customizeContent={() => formatMessage(SORT_TYPES[sortQuery].selected)}\n onChange={(sortName) => {\n // @ts-expect-error – in V2 design-system we'll only ever return strings.\n handleSelectChange({ sort: sortName });\n }}\n label={formatMessage({\n id: 'admin.pages.MarketPlacePage.sort.label',\n defaultMessage: 'Sort by',\n })}\n >\n {Object.entries(SORT_TYPES).map(([sortName, messages]) => {\n return (\n <SingleSelectOption key={sortName} value={sortName}>\n {formatMessage(messages.option)}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled(Box)`\n font-weight: ${({ theme }) => theme.fontWeights.semiBold};\n\n span {\n font-size: ${({ theme }) => theme.fontSizes[1]};\n }\n\n /* Hide the label, every input needs a label. */\n label {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n }\n`;\n\nexport { SortSelect };\nexport type { SortSelectProps };\n","import { useNotifyAT } from '@strapi/design-system';\nimport { useNotification } from '@strapi/helper-plugin';\nimport * as qs from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport type { MarketplacePageQuery, NpmPackageType, TabQuery } from '../MarketplacePage';\n\nconst MARKETPLACE_API_URL = 'https://market-api.strapi.io';\n\ninterface UseMarketplaceDataParams {\n npmPackageType: NpmPackageType;\n debouncedSearch: string;\n query?: MarketplacePageQuery;\n tabQuery: TabQuery;\n}\n\ntype Collections =\n | 'Verified'\n | 'Made by the community'\n | 'Made by Strapi'\n | 'Made by official partners';\n\ntype Categories = 'Custom fields' | 'Deployment' | 'Monitoring';\n\ntype FilterTypes = 'categories' | 'collections';\n\ninterface Plugin {\n id: string;\n attributes: {\n name: string;\n description: string;\n slug: string;\n npmPackageName: string;\n npmPackageUrl: string;\n npmDownloads: number;\n repositoryUrl: string;\n githubStars: number;\n logo: {\n url: string;\n };\n developerName: string;\n validated: boolean;\n madeByStrapi: boolean;\n strapiCompatibility: string;\n submissionDate: string;\n collections: Collections[];\n categories: Categories[];\n strapiVersion: string;\n screenshots: Array<{\n url: string;\n }>;\n };\n}\n\ninterface Provider {\n id: string;\n attributes: {\n name: string;\n description: string;\n slug: string;\n npmPackageName: string;\n npmPackageUrl: string;\n npmDownloads: number;\n repositoryUrl: string;\n githubStars: number;\n pluginName: string;\n logo: {\n url: string;\n };\n developerName: string;\n validated: boolean;\n madeByStrapi: boolean;\n strapiCompatibility: string;\n strapiVersion?: never;\n submissionDate: string;\n collections: Collections[];\n };\n}\n\ninterface MarketplaceMeta {\n collections: Record<Collections, number>;\n pagination: {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n };\n}\n\ninterface MarketplaceResponse<TData extends Plugin | Provider> {\n data: TData[];\n meta: TData extends Provider\n ? MarketplaceMeta\n : MarketplaceMeta & { categories: Record<Categories, number> };\n}\n\nfunction useMarketplaceData({\n npmPackageType,\n debouncedSearch,\n query,\n tabQuery,\n}: UseMarketplaceDataParams) {\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const toggleNotification = useNotification();\n const marketplaceTitle = formatMessage({\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n });\n\n const notifyMarketplaceLoad = () => {\n notifyStatus(\n formatMessage(\n {\n id: 'app.utils.notify.data-loaded',\n defaultMessage: 'The {target} has loaded',\n },\n { target: marketplaceTitle }\n )\n );\n };\n\n const paginationParams = {\n page: query?.page || 1,\n pageSize: query?.pageSize || 24,\n };\n\n const pluginParams = {\n ...tabQuery.plugin,\n pagination: paginationParams,\n search: debouncedSearch,\n };\n\n const { data: pluginsResponse, status: pluginsStatus } = useQuery(\n ['marketplace', 'plugins', pluginParams],\n async () => {\n try {\n const queryString = qs.stringify(pluginParams);\n const res = await fetch(`${MARKETPLACE_API_URL}/plugins?${queryString}`);\n\n if (!res.ok) {\n throw new Error('Failed to fetch marketplace plugins.');\n }\n\n const data = (await res.json()) as MarketplaceResponse<Plugin>;\n\n return data;\n } catch (error) {\n // silence\n }\n\n return null;\n },\n {\n onSuccess() {\n notifyMarketplaceLoad();\n },\n onError() {\n toggleNotification({\n type: 'warning',\n message: { id: 'notification.error', defaultMessage: 'An error occured' },\n });\n },\n }\n );\n\n const providerParams = {\n ...tabQuery.provider,\n pagination: paginationParams,\n search: debouncedSearch,\n };\n\n const { data: providersResponse, status: providersStatus } = useQuery(\n ['marketplace', 'providers', providerParams],\n async () => {\n const queryString = qs.stringify(providerParams);\n const res = await fetch(`${MARKETPLACE_API_URL}/providers?${queryString}`);\n\n if (!res.ok) {\n throw new Error('Failed to fetch marketplace providers.');\n }\n\n const data = (await res.json()) as MarketplaceResponse<Provider>;\n\n return data;\n },\n {\n onSuccess() {\n notifyMarketplaceLoad();\n },\n onError() {\n toggleNotification({\n type: 'warning',\n message: { id: 'notification.error', defaultMessage: 'An error occured' },\n });\n },\n }\n );\n\n const npmPackageTypeResponse = npmPackageType === 'plugin' ? pluginsResponse : providersResponse;\n\n const possibleCollections = npmPackageTypeResponse?.meta.collections ?? {};\n const possibleCategories = pluginsResponse?.meta.categories ?? {};\n\n const { pagination } = npmPackageTypeResponse?.meta ?? {};\n\n return {\n pluginsResponse,\n providersResponse,\n pluginsStatus,\n providersStatus,\n possibleCollections,\n possibleCategories,\n pagination,\n };\n}\n\nexport { useMarketplaceData };\nexport type {\n MarketplaceResponse,\n Plugin,\n Provider,\n MarketplaceMeta,\n Collections,\n Categories,\n FilterTypes,\n UseMarketplaceDataParams,\n};\n","import * as React from 'react';\n\n/**\n * For more details about this hook see:\n * https://www.30secondsofcode.org/react/s/use-navigator-on-line\n */\nexport const useNavigatorOnline = (): boolean => {\n const onlineStatus =\n typeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean'\n ? navigator.onLine\n : true;\n\n const [isOnline, setIsOnline] = React.useState(onlineStatus);\n\n const setOnline = () => setIsOnline(true);\n const setOffline = () => setIsOnline(false);\n\n React.useEffect(() => {\n window.addEventListener('online', setOnline);\n window.addEventListener('offline', setOffline);\n\n return () => {\n window.removeEventListener('online', setOnline);\n window.removeEventListener('offline', setOffline);\n };\n }, []);\n\n return isOnline;\n};\n","import * as React from 'react';\n\nimport {\n Box,\n ContentLayout,\n Flex,\n Icon,\n Layout,\n Main,\n Searchbar,\n Tab,\n TabGroup,\n TabPanel,\n TabPanels,\n Tabs,\n} from '@strapi/design-system';\nimport {\n CheckPagePermissions,\n ContentBox,\n PageSizeURLQuery,\n PaginationURLQuery,\n useAppInfo,\n useFocusWhenNavigate,\n useNotification,\n useQueryParams,\n useTracking,\n} from '@strapi/helper-plugin';\nimport { ExternalLink, GlassesSquare } from '@strapi/icons';\nimport { Helmet } from 'react-helmet';\nimport { useIntl } from 'react-intl';\nimport { useSelector } from 'react-redux';\n\nimport { useDebounce } from '../../hooks/useDebounce';\nimport { selectAdminPermissions } from '../../selectors';\n\nimport { NpmPackagesFilters } from './components/NpmPackagesFilters';\nimport { NpmPackagesGrid } from './components/NpmPackagesGrid';\nimport { OfflineLayout } from './components/OfflineLayout';\nimport { PageHeader } from './components/PageHeader';\nimport { SortSelect, SortSelectProps } from './components/SortSelect';\nimport { FilterTypes, useMarketplaceData } from './hooks/useMarketplaceData';\nimport { useNavigatorOnline } from './hooks/useNavigatorOnline';\n\ntype NpmPackageType = 'plugin' | 'provider';\n\ninterface MarketplacePageQuery {\n collections?: string[];\n categories?: string[];\n npmPackageType?: NpmPackageType;\n page?: number;\n pageSize?: number;\n search?: string;\n sort?: SortSelectProps['sortQuery'];\n}\n\ninterface TabQuery {\n plugin: MarketplacePageQuery;\n provider: MarketplacePageQuery;\n}\n\nconst MarketplacePage = () => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const toggleNotification = useNotification();\n const [{ query }, setQuery] = useQueryParams<MarketplacePageQuery>();\n const debouncedSearch = useDebounce(query?.search, 500) || '';\n\n const { autoReload: isInDevelopmentMode, dependencies, useYarn, strapiVersion } = useAppInfo();\n const isOnline = useNavigatorOnline();\n\n const npmPackageType = query?.npmPackageType || 'plugin';\n\n const [tabQuery, setTabQuery] = React.useState<TabQuery>({\n plugin: npmPackageType === 'plugin' ? { ...query } : {},\n provider: npmPackageType === 'provider' ? { ...query } : {},\n });\n\n useFocusWhenNavigate();\n\n React.useEffect(() => {\n trackUsage('didGoToMarketplace');\n }, [trackUsage]);\n\n React.useEffect(() => {\n if (!isInDevelopmentMode) {\n toggleNotification({\n type: 'info',\n message: {\n id: 'admin.pages.MarketPlacePage.production',\n defaultMessage: 'Manage plugins from the development environment',\n },\n });\n }\n }, [toggleNotification, isInDevelopmentMode]);\n\n const {\n pluginsResponse,\n providersResponse,\n pluginsStatus,\n providersStatus,\n possibleCollections,\n possibleCategories,\n pagination,\n } = useMarketplaceData({ npmPackageType, debouncedSearch, query, tabQuery });\n\n if (!isOnline) {\n return <OfflineLayout />;\n }\n\n const handleTabChange = (selected: number) => {\n const selectedTab = selected === 0 ? 'plugin' : 'provider';\n const hasTabQuery = tabQuery[selectedTab] && Object.keys(tabQuery[selectedTab]).length;\n\n if (hasTabQuery) {\n setQuery({\n // Keep filters and search\n ...tabQuery[selectedTab],\n search: query?.search || '',\n // Set tab and reset page\n npmPackageType: selectedTab,\n page: 1,\n });\n } else {\n setQuery({\n // Set tab\n npmPackageType: selectedTab,\n // Clear filters\n collections: [],\n categories: [],\n sort: 'name:asc',\n page: 1,\n // Keep search\n search: query?.search || '',\n });\n }\n };\n\n const handleSelectChange = (update: Partial<MarketplacePageQuery>) => {\n setQuery({ ...update, page: 1 });\n setTabQuery((prev) => ({\n ...prev,\n [npmPackageType]: { ...prev[npmPackageType], ...update },\n }));\n };\n\n const handleSelectClear = (filterType: FilterTypes) => {\n setQuery({ [filterType]: [], page: undefined }, 'remove');\n setTabQuery((prev) => ({ ...prev, [npmPackageType]: {} }));\n };\n\n const handleSortSelectChange: SortSelectProps['handleSelectChange'] = ({ sort }) =>\n // @ts-expect-error - this is a narrowing issue.\n handleSelectChange({ sort });\n\n // Check if plugins and providers are installed already\n const installedPackageNames = Object.keys(dependencies ?? {});\n\n return (\n <Layout>\n <Main>\n <Helmet\n title={formatMessage({\n id: 'admin.pages.MarketPlacePage.helmet',\n defaultMessage: 'Marketplace - Plugins',\n })}\n />\n <PageHeader isOnline={isOnline} npmPackageType={npmPackageType} />\n <ContentLayout>\n <TabGroup\n label={formatMessage({\n id: 'admin.pages.MarketPlacePage.tab-group.label',\n defaultMessage: 'Plugins and Providers for Strapi',\n })}\n id=\"tabs\"\n variant=\"simple\"\n initialSelectedTabIndex={['plugin', 'provider'].indexOf(npmPackageType)}\n onTabChange={handleTabChange}\n >\n <Flex justifyContent=\"space-between\" paddingBottom={4}>\n <Tabs>\n <Tab>\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.plugins',\n defaultMessage: 'Plugins',\n })}{' '}\n {pluginsResponse ? `(${pluginsResponse.meta.pagination.total})` : '...'}\n </Tab>\n <Tab>\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.providers',\n defaultMessage: 'Providers',\n })}{' '}\n {providersResponse ? `(${providersResponse.meta.pagination.total})` : '...'}\n </Tab>\n </Tabs>\n <Box width=\"25%\">\n <Searchbar\n name=\"searchbar\"\n onClear={() => setQuery({ search: '', page: 1 })}\n value={query?.search}\n onChange={(e) => setQuery({ search: e.target.value, page: 1 })}\n clearLabel={formatMessage({\n id: 'admin.pages.MarketPlacePage.search.clear',\n defaultMessage: 'Clear the search',\n })}\n placeholder={formatMessage({\n id: 'admin.pages.MarketPlacePage.search.placeholder',\n defaultMessage: 'Search',\n })}\n >\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.search.placeholder',\n defaultMessage: 'Search',\n })}\n </Searchbar>\n </Box>\n </Flex>\n <Flex paddingBottom={4} gap={2}>\n <SortSelect\n sortQuery={query?.sort || 'name:asc'}\n handleSelectChange={handleSortSelectChange}\n />\n <NpmPackagesFilters\n npmPackageType={npmPackageType}\n possibleCollections={possibleCollections}\n possibleCategories={possibleCategories}\n query={query || {}}\n handleSelectChange={handleSelectChange}\n handleSelectClear={handleSelectClear}\n />\n </Flex>\n\n <TabPanels>\n {/* Plugins panel */}\n <TabPanel>\n <NpmPackagesGrid\n npmPackages={pluginsResponse?.data}\n status={pluginsStatus}\n installedPackageNames={installedPackageNames}\n useYarn={useYarn}\n isInDevelopmentMode={isInDevelopmentMode}\n npmPackageType=\"plugin\"\n strapiAppVersion={strapiVersion}\n debouncedSearch={debouncedSearch}\n />\n </TabPanel>\n {/* Providers panel */}\n <TabPanel>\n <NpmPackagesGrid\n npmPackages={providersResponse?.data}\n status={providersStatus}\n installedPackageNames={installedPackageNames}\n useYarn={useYarn}\n isInDevelopmentMode={isInDevelopmentMode}\n npmPackageType=\"provider\"\n debouncedSearch={debouncedSearch}\n />\n </TabPanel>\n </TabPanels>\n </TabGroup>\n {pagination ? (\n <Box paddingTop={4}>\n <Flex alignItems=\"flex-end\" justifyContent=\"space-between\">\n <PageSizeURLQuery options={['12', '24', '50', '100']} defaultValue=\"24\" />\n <PaginationURLQuery pagination={pagination} />\n </Flex>\n </Box>\n ) : null}\n <Box paddingTop={8}>\n <a\n href=\"https://strapi.canny.io/plugin-requests\"\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n style={{ textDecoration: 'none' }}\n onClick={() => trackUsage('didMissMarketplacePlugin')}\n >\n <ContentBox\n title={formatMessage({\n id: 'admin.pages.MarketPlacePage.missingPlugin.title',\n defaultMessage: 'Documentation',\n })}\n subtitle={formatMessage({\n id: 'admin.pages.MarketPlacePage.missingPlugin.description',\n defaultMessage:\n \"Tell us what plugin you are looking for and we'll let our community plugin developers know in case they are in search for inspiration!\",\n })}\n icon={<GlassesSquare />}\n iconBackground=\"alternative100\"\n endAction={\n <Icon as={ExternalLink} color=\"neutral600\" width={3} height={3} marginLeft={2} />\n }\n />\n </a>\n </Box>\n </ContentLayout>\n </Main>\n </Layout>\n );\n};\n\nconst ProtectedMarketplacePage = () => {\n const permissions = useSelector(selectAdminPermissions);\n\n return (\n // @ts-expect-error – the selector is not typed.\n <CheckPagePermissions permissions={permissions.marketplace.main}>\n <MarketplacePage />\n </CheckPagePermissions>\n );\n};\n\nexport { MarketplacePage, ProtectedMarketplacePage };\nexport type { NpmPackageType, MarketplacePageQuery, TabQuery };\n"],"names":["React","useIntl","jsxs","Fragment","Box","jsx","Filter","Popover","Tag","Cross","styled","Button","Flex","MultiSelect","MultiSelectOption","Typography","useTracking","pluralize","Tooltip","Icon","CheckCircle","StrapiLogo","LinkButton","ExternalLink","useNotification","useClipboard","Check","semver","Duplicate","Github","pxToRem","Star","Download","Divider","AnErrorOccurred","Loader","GridLayout","EmptyDocuments","Grid","GridItem","HeaderLayout","Upload","Layout","Main","SingleSelect","SingleSelectOption","useNotifyAT","useQuery","qs","useQueryParams","useDebounce","useAppInfo","useFocusWhenNavigate","Helmet","ContentLayout","TabGroup","Tabs","Tab","Searchbar","TabPanels","TabPanel","PageSizeURLQuery","PaginationURLQuery","ContentBox","GlassesSquare","useSelector","selectAdminPermissions","CheckPagePermissions"],"mappings":"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"}
1
+ {"version":3,"file":"MarketplacePage-e7cd973b.js","sources":["../../admin/src/pages/Marketplace/components/NpmPackagesFilters.tsx","../../admin/src/pages/Marketplace/components/NpmPackageCard.tsx","../../admin/src/pages/Marketplace/components/NpmPackagesGrid.tsx","../../admin/src/pages/Marketplace/components/PageHeader.tsx","../../admin/src/pages/Marketplace/components/OfflineLayout.tsx","../../admin/src/pages/Marketplace/components/SortSelect.tsx","../../admin/src/pages/Marketplace/hooks/useMarketplaceData.ts","../../admin/src/pages/Marketplace/hooks/useNavigatorOnline.ts","../../admin/src/pages/Marketplace/MarketplacePage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Button,\n Tag,\n MultiSelect,\n MultiSelectOption,\n MultiSelectProps,\n Popover,\n Flex,\n} from '@strapi/design-system';\nimport { Cross, Filter } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport type { Categories, Collections, FilterTypes } from '../hooks/useMarketplaceData';\nimport type { NpmPackageType, MarketplacePageQuery } from '../MarketplacePage';\n\ninterface NpmPackagesFiltersProps {\n handleSelectClear: (type: FilterTypes) => void;\n handleSelectChange: (update: Partial<MarketplacePageQuery>) => void;\n npmPackageType: NpmPackageType;\n possibleCategories: Partial<Record<Categories, number>>;\n possibleCollections: Partial<Record<Collections, number>>;\n query: MarketplacePageQuery;\n}\n\nconst NpmPackagesFilters = ({\n handleSelectClear,\n handleSelectChange,\n npmPackageType,\n possibleCategories,\n possibleCollections,\n query,\n}: NpmPackagesFiltersProps) => {\n const [isVisible, setIsVisible] = React.useState(false);\n const buttonRef = React.useRef<HTMLButtonElement>(null!);\n const { formatMessage } = useIntl();\n\n const handleToggle = () => setIsVisible((prev) => !prev);\n\n const handleTagRemove = (tagToRemove: string, filterType: FilterTypes) => {\n const update = {\n [filterType]: (query[filterType] ?? []).filter((previousTag) => previousTag !== tagToRemove),\n };\n\n handleSelectChange(update);\n };\n\n return (\n <>\n <Box paddingTop={1} paddingBottom={1}>\n <ButtonToggle\n variant=\"tertiary\"\n ref={buttonRef}\n startIcon={<Filter />}\n onClick={handleToggle}\n size=\"S\"\n >\n {formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </ButtonToggle>\n {isVisible && (\n <Popover source={buttonRef} onDismiss={handleToggle} padding={3} spacing={4}>\n <FiltersFlex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <FilterSelect\n message={formatMessage({\n id: 'admin.pages.MarketPlacePage.filters.collections',\n defaultMessage: 'Collections',\n })}\n value={query?.collections || []}\n onChange={(newCollections) => {\n const update = { collections: newCollections };\n handleSelectChange(update);\n }}\n onClear={() => handleSelectClear('collections')}\n possibleFilters={possibleCollections}\n customizeContent={(values) =>\n formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.filters.collectionsSelected',\n defaultMessage:\n '{count, plural, =0 {No collections} one {# collection} other {# collections}} selected',\n },\n { count: values?.length ?? 0 }\n )\n }\n />\n {npmPackageType === 'plugin' && (\n <FilterSelect\n message={formatMessage({\n id: 'admin.pages.MarketPlacePage.filters.categories',\n defaultMessage: 'Categories',\n })}\n value={query?.categories || []}\n onChange={(newCategories) => {\n const update = { categories: newCategories };\n handleSelectChange(update);\n }}\n onClear={() => handleSelectClear('categories')}\n possibleFilters={possibleCategories}\n customizeContent={(values) =>\n formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.filters.categoriesSelected',\n defaultMessage:\n '{count, plural, =0 {No categories} one {# category} other {# categories}} selected',\n },\n { count: values?.length ?? 0 }\n )\n }\n />\n )}\n </FiltersFlex>\n </Popover>\n )}\n </Box>\n {query.collections?.map((collection) => (\n <Box key={collection} padding={1}>\n <Tag icon={<Cross />} onClick={() => handleTagRemove(collection, 'collections')}>\n {collection}\n </Tag>\n </Box>\n ))}\n {npmPackageType === 'plugin' &&\n query.categories?.map((category) => (\n <Box key={category} padding={1}>\n <Tag icon={<Cross />} onClick={() => handleTagRemove(category, 'categories')}>\n {category}\n </Tag>\n </Box>\n ))}\n </>\n );\n};\n\nconst ButtonToggle = styled(Button)`\n height: ${({ theme }) => theme.sizes.input.S};\n`;\n\nconst FiltersFlex = styled(Flex)`\n /* Hide the label, every input needs a label. */\n label {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FilterSelect\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FilterSelectProps\n extends Pick<MultiSelectProps, 'customizeContent' | 'onClear' | 'onChange' | 'value'> {\n message: string;\n possibleFilters:\n | NpmPackagesFiltersProps['possibleCategories']\n | NpmPackagesFiltersProps['possibleCollections'];\n}\n\nconst FilterSelect = ({\n message,\n value,\n onChange,\n possibleFilters,\n onClear,\n customizeContent,\n}: FilterSelectProps) => {\n return (\n <MultiSelect\n data-testid={`${message}-button`}\n label={message}\n placeholder={message}\n size=\"M\"\n onChange={onChange}\n onClear={onClear}\n value={value}\n customizeContent={customizeContent}\n >\n {Object.entries(possibleFilters).map(([filterName, count]) => {\n return (\n <MultiSelectOption\n data-testid={`${filterName}-${count}`}\n key={filterName}\n value={filterName}\n >\n {`${filterName} (${count})`}\n </MultiSelectOption>\n );\n })}\n </MultiSelect>\n );\n};\n\nexport { NpmPackagesFilters };\nexport type { NpmPackagesFiltersProps };\n","import { Box, Flex, Icon, Tooltip, Typography, Divider, Button } from '@strapi/design-system';\nimport { LinkButton } from '@strapi/design-system/v2';\nimport {\n useTracking,\n pxToRem,\n AppInfoContextValue,\n useNotification,\n useClipboard,\n} from '@strapi/helper-plugin';\nimport { CheckCircle, ExternalLink, Download, Github, Star, Check, Duplicate } from '@strapi/icons';\nimport pluralize from 'pluralize';\nimport { useIntl } from 'react-intl';\nimport * as semver from 'semver';\nimport styled from 'styled-components';\n\nimport StrapiLogo from '../../../assets/images/logo-strapi-2022.svg';\n\nimport type { Plugin, Provider } from '../hooks/useMarketplaceData';\nimport type { NpmPackageType } from '../MarketplacePage';\n\n// Custom component to have an ellipsis after the 2nd line\nconst EllipsisText = styled(Typography)`\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n overflow: hidden;\n`;\n\ninterface NpmPackageCardProps extends Pick<AppInfoContextValue, 'useYarn'> {\n npmPackage: Plugin | Provider;\n isInstalled: boolean;\n isInDevelopmentMode: AppInfoContextValue['autoReload'];\n npmPackageType: NpmPackageType;\n strapiAppVersion: AppInfoContextValue['strapiVersion'];\n}\n\nconst NpmPackageCard = ({\n npmPackage,\n isInstalled,\n useYarn,\n isInDevelopmentMode,\n npmPackageType,\n strapiAppVersion,\n}: NpmPackageCardProps) => {\n const { attributes } = npmPackage;\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const commandToCopy = useYarn\n ? `yarn add ${attributes.npmPackageName}`\n : `npm install ${attributes.npmPackageName}`;\n\n const madeByStrapiMessage = formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.tooltip.madeByStrapi',\n defaultMessage: 'Made by Strapi',\n });\n\n const npmPackageHref = `https://market.strapi.io/${pluralize.plural(npmPackageType)}/${\n attributes.slug\n }`;\n\n return (\n <Flex\n direction=\"column\"\n justifyContent=\"space-between\"\n paddingTop={4}\n paddingRight={4}\n paddingBottom={4}\n paddingLeft={4}\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n height=\"100%\"\n alignItems=\"normal\"\n data-testid=\"npm-package-card\"\n >\n <Box>\n <Flex direction=\"row\" justifyContent=\"space-between\" alignItems=\"flex-start\">\n <Box\n as=\"img\"\n src={attributes.logo.url}\n alt={`${attributes.name} logo`}\n hasRadius\n width={11}\n height={11}\n />\n <PackageStats\n githubStars={attributes.githubStars}\n npmDownloads={attributes.npmDownloads}\n npmPackageType={npmPackageType}\n />\n </Flex>\n <Box paddingTop={4}>\n <Typography as=\"h3\" variant=\"delta\">\n <Flex alignItems=\"center\">\n {attributes.name}\n {attributes.validated && !attributes.madeByStrapi && (\n <Tooltip\n description={formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.tooltip.verified',\n defaultMessage: 'Plugin verified by Strapi',\n })}\n >\n <Flex>\n <Icon as={CheckCircle} marginLeft={2} color=\"success600\" />\n </Flex>\n </Tooltip>\n )}\n {attributes.madeByStrapi && (\n <Tooltip description={madeByStrapiMessage}>\n <Flex>\n <Box\n as=\"img\"\n src={StrapiLogo}\n alt={madeByStrapiMessage}\n marginLeft={1}\n width={6}\n height=\"auto\"\n />\n </Flex>\n </Tooltip>\n )}\n </Flex>\n </Typography>\n </Box>\n <Box paddingTop={2}>\n <EllipsisText as=\"p\" variant=\"omega\" textColor=\"neutral600\">\n {attributes.description}\n </EllipsisText>\n </Box>\n </Box>\n\n <Flex gap={2} style={{ alignSelf: 'flex-end' }} paddingTop={6}>\n <LinkButton\n size=\"S\"\n href={npmPackageHref}\n isExternal\n endIcon={<ExternalLink />}\n aria-label={formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.plugin.info.label',\n defaultMessage: 'Learn more about {pluginName}',\n },\n { pluginName: attributes.name }\n )}\n variant=\"tertiary\"\n onClick={() => trackUsage('didPluginLearnMore')}\n >\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.info.text',\n defaultMessage: 'More',\n })}\n </LinkButton>\n <InstallPluginButton\n isInstalled={isInstalled}\n isInDevelopmentMode={isInDevelopmentMode}\n commandToCopy={commandToCopy}\n strapiAppVersion={strapiAppVersion}\n strapiPeerDepVersion={attributes.strapiVersion}\n pluginName={attributes.name}\n />\n </Flex>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * InstallPluginButton\n * -----------------------------------------------------------------------------------------------*/\n\ninterface InstallPluginButtonProps\n extends Pick<NpmPackageCardProps, 'isInstalled' | 'isInDevelopmentMode' | 'strapiAppVersion'> {\n commandToCopy: string;\n pluginName: string;\n strapiPeerDepVersion?: string;\n}\n\nconst InstallPluginButton = ({\n isInstalled,\n isInDevelopmentMode,\n commandToCopy,\n strapiAppVersion,\n strapiPeerDepVersion,\n pluginName,\n}: InstallPluginButtonProps) => {\n const toggleNotification = useNotification();\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { copy } = useClipboard();\n\n const handleCopy = async () => {\n const didCopy = await copy(commandToCopy);\n\n if (didCopy) {\n trackUsage('willInstallPlugin');\n toggleNotification({\n type: 'success',\n message: { id: 'admin.pages.MarketPlacePage.plugin.copy.success' },\n });\n }\n };\n\n // Already installed\n if (isInstalled) {\n return (\n <Box paddingLeft={4}>\n <Icon as={Check} marginRight={2} width={12} height={12} color=\"success600\" />\n <Typography variant=\"omega\" textColor=\"success600\" fontWeight=\"bold\">\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.installed',\n defaultMessage: 'Installed',\n })}\n </Typography>\n </Box>\n );\n }\n\n // In development, show install button\n if (isInDevelopmentMode) {\n return (\n <CardButton\n strapiAppVersion={strapiAppVersion}\n strapiPeerDepVersion={strapiPeerDepVersion}\n handleCopy={handleCopy}\n pluginName={pluginName}\n />\n );\n }\n\n // Not in development and plugin not installed already. Show nothing\n return null;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CardButton\n * -----------------------------------------------------------------------------------------------*/\n\ninterface CardButtonProps\n extends Pick<NpmPackageCardProps, 'strapiAppVersion'>,\n Pick<InstallPluginButtonProps, 'strapiPeerDepVersion' | 'pluginName'> {\n handleCopy: () => void;\n}\n\nconst CardButton = ({\n strapiPeerDepVersion,\n strapiAppVersion,\n handleCopy,\n pluginName,\n}: CardButtonProps) => {\n const { formatMessage } = useIntl();\n const versionRange = semver.validRange(strapiPeerDepVersion);\n const isCompatible = semver.satisfies(strapiAppVersion ?? '', versionRange ?? '');\n\n const installMessage = formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.copy',\n defaultMessage: 'Copy install command',\n });\n\n // Only plugins receive a strapiAppVersion\n if (strapiAppVersion) {\n if (!versionRange || !isCompatible) {\n return (\n <Tooltip\n data-testid={`tooltip-${pluginName}`}\n description={\n !versionRange\n ? formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.plugin.version.null',\n defaultMessage:\n 'Unable to verify compatibility with your Strapi version: \"{strapiAppVersion}\"',\n },\n { strapiAppVersion }\n )\n : formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.plugin.version',\n defaultMessage:\n 'Update your Strapi version: \"{strapiAppVersion}\" to: \"{versionRange}\"',\n },\n {\n strapiAppVersion,\n versionRange,\n }\n )\n }\n >\n <Button\n size=\"S\"\n startIcon={<Duplicate />}\n variant=\"secondary\"\n onClick={handleCopy}\n disabled={!isCompatible}\n >\n {installMessage}\n </Button>\n </Tooltip>\n );\n }\n }\n\n return (\n <Button size=\"S\" startIcon={<Duplicate />} variant=\"secondary\" onClick={handleCopy}>\n {installMessage}\n </Button>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PackageStats\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PackageStatsProps {\n githubStars?: number;\n npmDownloads?: number;\n npmPackageType: NpmPackageType;\n}\n\nconst PackageStats = ({ githubStars = 0, npmDownloads = 0, npmPackageType }: PackageStatsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex gap={1}>\n {!!githubStars && (\n <>\n <Icon as={Github} height={pxToRem(12)} width={pxToRem(12)} aria-hidden />\n <Icon as={Star} height={pxToRem(12)} width={pxToRem(12)} color=\"warning500\" aria-hidden />\n <p\n aria-label={formatMessage(\n {\n id: `admin.pages.MarketPlacePage.${npmPackageType}.githubStars`,\n defaultMessage: `This {package} was starred {starsCount} on GitHub`,\n },\n {\n starsCount: githubStars,\n package: npmPackageType,\n }\n )}\n >\n <Typography variant=\"pi\" textColor=\"neutral800\">\n {githubStars}\n </Typography>\n </p>\n <VerticalDivider unsetMargin={false} />\n </>\n )}\n <Icon as={Download} height={pxToRem(12)} width={pxToRem(12)} aria-hidden />\n <p\n aria-label={formatMessage(\n {\n id: `admin.pages.MarketPlacePage.${npmPackageType}.downloads`,\n defaultMessage: `This {package} has {downloadsCount} weekly downloads`,\n },\n {\n downloadsCount: npmDownloads,\n package: npmPackageType,\n }\n )}\n >\n <Typography variant=\"pi\" textColor=\"neutral800\">\n {npmDownloads}\n </Typography>\n </p>\n </Flex>\n );\n};\n\nconst VerticalDivider = styled(Divider)`\n width: ${pxToRem(12)};\n transform: rotate(90deg);\n`;\n\nexport { NpmPackageCard };\nexport type { NpmPackageCardProps };\n","import {\n Box,\n Flex,\n Grid,\n GridItem,\n GridLayout,\n Icon,\n Loader,\n Typography,\n} from '@strapi/design-system';\nimport { AnErrorOccurred, AppInfoContextValue } from '@strapi/helper-plugin';\nimport { EmptyDocuments } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport { NpmPackageCard, NpmPackageCardProps } from './NpmPackageCard';\n\nimport type { Plugin, Provider } from '../hooks/useMarketplaceData';\n\ninterface NpmPackagesGridProps extends Pick<NpmPackageCardProps, 'npmPackageType' | 'useYarn'> {\n debouncedSearch: string;\n installedPackageNames: string[];\n isInDevelopmentMode: AppInfoContextValue['autoReload'];\n npmPackages?: Array<Plugin | Provider>;\n status: 'idle' | 'loading' | 'error' | 'success';\n strapiAppVersion?: NpmPackageCardProps['strapiAppVersion'];\n}\n\nconst NpmPackagesGrid = ({\n status,\n npmPackages = [],\n installedPackageNames = [],\n useYarn,\n isInDevelopmentMode,\n npmPackageType,\n strapiAppVersion,\n debouncedSearch,\n}: NpmPackagesGridProps) => {\n const { formatMessage } = useIntl();\n\n if (status === 'error') {\n return (\n <Flex paddingTop={8}>\n <AnErrorOccurred />\n </Flex>\n );\n }\n\n if (status === 'loading') {\n return (\n <Flex justifyContent=\"center\" paddingTop={8}>\n <Loader>Loading content...</Loader>\n </Flex>\n );\n }\n\n const emptySearchMessage = formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.search.empty',\n defaultMessage: 'No result for \"{target}\"',\n },\n { target: debouncedSearch }\n );\n\n if (npmPackages.length === 0) {\n return (\n <Box position=\"relative\">\n <GridLayout>\n {Array(12)\n .fill(null)\n .map((_, idx) => (\n <EmptyPluginCard key={idx} height=\"234px\" hasRadius />\n ))}\n </GridLayout>\n <Box position=\"absolute\" top={11} width=\"100%\">\n <Flex alignItems=\"center\" justifyContent=\"center\" direction=\"column\">\n <Icon as={EmptyDocuments} color={undefined} width=\"160px\" height=\"88px\" />\n <Box paddingTop={6}>\n <Typography variant=\"delta\" as=\"p\" textColor=\"neutral600\">\n {emptySearchMessage}\n </Typography>\n </Box>\n </Flex>\n </Box>\n </Box>\n );\n }\n\n return (\n <Grid gap={4}>\n {npmPackages.map((npmPackage) => (\n <GridItem col={4} s={6} xs={12} style={{ height: '100%' }} key={npmPackage.id}>\n <NpmPackageCard\n npmPackage={npmPackage}\n isInstalled={installedPackageNames.includes(npmPackage.attributes.npmPackageName)}\n useYarn={useYarn}\n isInDevelopmentMode={isInDevelopmentMode}\n npmPackageType={npmPackageType}\n strapiAppVersion={strapiAppVersion}\n />\n </GridItem>\n ))}\n </Grid>\n );\n};\n\nconst EmptyPluginCard = styled(Box)`\n background: ${({ theme }) =>\n `linear-gradient(180deg, rgba(234, 234, 239, 0) 0%, ${theme.colors.neutral150} 100%)`};\n opacity: 0.33;\n`;\n\nexport { NpmPackagesGrid };\n","import { HeaderLayout } from '@strapi/design-system';\nimport { LinkButton } from '@strapi/design-system/v2';\nimport { useTracking } from '@strapi/helper-plugin';\nimport { Upload } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport type { NpmPackageType } from '../MarketplacePage';\n\ninterface PageHeaderProps {\n isOnline?: boolean;\n npmPackageType?: NpmPackageType;\n}\n\nconst PageHeader = ({ isOnline, npmPackageType = 'plugin' }: PageHeaderProps) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const tracking = npmPackageType === 'provider' ? 'didSubmitProvider' : 'didSubmitPlugin';\n\n return (\n <HeaderLayout\n title={formatMessage({\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n })}\n subtitle={formatMessage({\n id: 'admin.pages.MarketPlacePage.subtitle',\n defaultMessage: 'Get more out of Strapi',\n })}\n primaryAction={\n isOnline && (\n <LinkButton\n startIcon={<Upload />}\n variant=\"tertiary\"\n href={`https://market.strapi.io/submit-${npmPackageType}`}\n onClick={() => trackUsage(tracking)}\n isExternal\n >\n {formatMessage({\n id: `admin.pages.MarketPlacePage.submit.${npmPackageType}.link`,\n defaultMessage: `Submit ${npmPackageType}`,\n })}\n </LinkButton>\n )\n }\n />\n );\n};\n\nexport { PageHeader };\nexport type { PageHeaderProps };\n","import { Box, Flex, Layout, Main, Typography } from '@strapi/design-system';\nimport { pxToRem } from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\n\nimport { PageHeader } from './PageHeader';\n\nconst OfflineLayout = () => {\n const { formatMessage } = useIntl();\n\n return (\n <Layout>\n <Main>\n <PageHeader />\n <Flex\n width=\"100%\"\n direction=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n paddingTop={pxToRem(120)}\n >\n <Box paddingBottom={2}>\n <Typography textColor=\"neutral700\" variant=\"alpha\">\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.offline.title',\n defaultMessage: 'You are offline',\n })}\n </Typography>\n </Box>\n <Box paddingBottom={6}>\n <Typography textColor=\"neutral700\" variant=\"epsilon\">\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.offline.subtitle',\n defaultMessage: 'You need to be connected to the Internet to access Strapi Market.',\n })}\n </Typography>\n </Box>\n <svg\n width=\"88\"\n height=\"88\"\n viewBox=\"0 0 88 88\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\".5\" y=\".5\" width=\"87\" height=\"87\" rx=\"43.5\" fill=\"#F0F0FF\" />\n <path\n d=\"M34 39.3h-4c-2.6 0-4.7 1-6.6 2.8a9 9 0 0 0-2.7 6.6 9 9 0 0 0 2.7 6.6A9 9 0 0 0 30 58h22.8L34 39.3Zm-11-11 3-3 39 39-3 3-4.7-4.6H30a13.8 13.8 0 0 1-14-14c0-3.8 1.3-7 4-9.7 2.6-2.7 5.7-4.2 9.5-4.3L23 28.2Zm38.2 11.1c3 .2 5.5 1.5 7.6 3.7A11 11 0 0 1 72 51c0 4-1.6 7.2-5 9.5l-3.3-3.4a6.5 6.5 0 0 0 3.6-6.1c0-1.9-.7-3.5-2-5-1.5-1.3-3.1-2-5-2h-3.5v-1.2c0-3.6-1.2-6.6-3.7-9a13 13 0 0 0-15-2.3L34.6 28a17 17 0 0 1 20.3 1.5c3.5 2.7 5.5 6 6.3 10Z\"\n fill=\"#4945FF\"\n />\n <rect x=\".5\" y=\".5\" width=\"87\" height=\"87\" rx=\"43.5\" stroke=\"#D9D8FF\" />\n </svg>\n </Flex>\n </Main>\n </Layout>\n );\n};\n\nexport { OfflineLayout };\n","import { Box, SingleSelectOption, SingleSelect } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nconst SORT_TYPES = {\n 'name:asc': {\n selected: {\n id: 'admin.pages.MarketPlacePage.sort.alphabetical.selected',\n defaultMessage: 'Sort by alphabetical order',\n },\n option: {\n id: 'admin.pages.MarketPlacePage.sort.alphabetical',\n defaultMessage: 'Alphabetical order',\n },\n },\n 'submissionDate:desc': {\n selected: {\n id: 'admin.pages.MarketPlacePage.sort.newest.selected',\n defaultMessage: 'Sort by newest',\n },\n option: {\n id: 'admin.pages.MarketPlacePage.sort.newest',\n defaultMessage: 'Newest',\n },\n },\n 'githubStars:desc': {\n selected: {\n id: 'admin.pages.MarketPlacePage.sort.githubStars.selected',\n defaultMessage: 'Sort by GitHub stars',\n },\n option: {\n id: 'admin.pages.MarketPlacePage.sort.githubStars',\n defaultMessage: 'Number of GitHub stars',\n },\n },\n 'npmDownloads:desc': {\n selected: {\n id: 'admin.pages.MarketPlacePage.sort.npmDownloads.selected',\n defaultMessage: 'Sort by npm downloads',\n },\n option: {\n id: 'admin.pages.MarketPlacePage.sort.npmDownloads',\n defaultMessage: 'Number of downloads',\n },\n },\n} as const;\n\ninterface SortSelectProps {\n sortQuery: keyof typeof SORT_TYPES;\n handleSelectChange: (payload: { sort: string }) => void;\n}\n\nconst SortSelect = ({ sortQuery, handleSelectChange }: SortSelectProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <SelectWrapper>\n <SingleSelect\n size=\"S\"\n id=\"sort-by-select\"\n value={sortQuery}\n customizeContent={() => formatMessage(SORT_TYPES[sortQuery].selected)}\n onChange={(sortName) => {\n // @ts-expect-error – in V2 design-system we'll only ever return strings.\n handleSelectChange({ sort: sortName });\n }}\n label={formatMessage({\n id: 'admin.pages.MarketPlacePage.sort.label',\n defaultMessage: 'Sort by',\n })}\n >\n {Object.entries(SORT_TYPES).map(([sortName, messages]) => {\n return (\n <SingleSelectOption key={sortName} value={sortName}>\n {formatMessage(messages.option)}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled(Box)`\n font-weight: ${({ theme }) => theme.fontWeights.semiBold};\n\n span {\n font-size: ${({ theme }) => theme.fontSizes[1]};\n }\n\n /* Hide the label, every input needs a label. */\n label {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n }\n`;\n\nexport { SortSelect };\nexport type { SortSelectProps };\n","import { useNotifyAT } from '@strapi/design-system';\nimport { useNotification } from '@strapi/helper-plugin';\nimport * as qs from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport type { MarketplacePageQuery, NpmPackageType, TabQuery } from '../MarketplacePage';\n\nconst MARKETPLACE_API_URL = 'https://market-api.strapi.io';\n\ninterface UseMarketplaceDataParams {\n npmPackageType: NpmPackageType;\n debouncedSearch: string;\n query?: MarketplacePageQuery;\n tabQuery: TabQuery;\n}\n\ntype Collections =\n | 'Verified'\n | 'Made by the community'\n | 'Made by Strapi'\n | 'Made by official partners';\n\ntype Categories = 'Custom fields' | 'Deployment' | 'Monitoring';\n\ntype FilterTypes = 'categories' | 'collections';\n\ninterface Plugin {\n id: string;\n attributes: {\n name: string;\n description: string;\n slug: string;\n npmPackageName: string;\n npmPackageUrl: string;\n npmDownloads: number;\n repositoryUrl: string;\n githubStars: number;\n logo: {\n url: string;\n };\n developerName: string;\n validated: boolean;\n madeByStrapi: boolean;\n strapiCompatibility: string;\n submissionDate: string;\n collections: Collections[];\n categories: Categories[];\n strapiVersion: string;\n screenshots: Array<{\n url: string;\n }>;\n };\n}\n\ninterface Provider {\n id: string;\n attributes: {\n name: string;\n description: string;\n slug: string;\n npmPackageName: string;\n npmPackageUrl: string;\n npmDownloads: number;\n repositoryUrl: string;\n githubStars: number;\n pluginName: string;\n logo: {\n url: string;\n };\n developerName: string;\n validated: boolean;\n madeByStrapi: boolean;\n strapiCompatibility: string;\n strapiVersion?: never;\n submissionDate: string;\n collections: Collections[];\n };\n}\n\ninterface MarketplaceMeta {\n collections: Record<Collections, number>;\n pagination: {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n };\n}\n\ninterface MarketplaceResponse<TData extends Plugin | Provider> {\n data: TData[];\n meta: TData extends Provider\n ? MarketplaceMeta\n : MarketplaceMeta & { categories: Record<Categories, number> };\n}\n\nfunction useMarketplaceData({\n npmPackageType,\n debouncedSearch,\n query,\n tabQuery,\n}: UseMarketplaceDataParams) {\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const toggleNotification = useNotification();\n const marketplaceTitle = formatMessage({\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n });\n\n const notifyMarketplaceLoad = () => {\n notifyStatus(\n formatMessage(\n {\n id: 'app.utils.notify.data-loaded',\n defaultMessage: 'The {target} has loaded',\n },\n { target: marketplaceTitle }\n )\n );\n };\n\n const paginationParams = {\n page: query?.page || 1,\n pageSize: query?.pageSize || 24,\n };\n\n const pluginParams = {\n ...tabQuery.plugin,\n pagination: paginationParams,\n search: debouncedSearch,\n };\n\n const { data: pluginsResponse, status: pluginsStatus } = useQuery(\n ['marketplace', 'plugins', pluginParams],\n async () => {\n try {\n const queryString = qs.stringify(pluginParams);\n const res = await fetch(`${MARKETPLACE_API_URL}/plugins?${queryString}`);\n\n if (!res.ok) {\n throw new Error('Failed to fetch marketplace plugins.');\n }\n\n const data = (await res.json()) as MarketplaceResponse<Plugin>;\n\n return data;\n } catch (error) {\n // silence\n }\n\n return null;\n },\n {\n onSuccess() {\n notifyMarketplaceLoad();\n },\n onError() {\n toggleNotification({\n type: 'warning',\n message: { id: 'notification.error', defaultMessage: 'An error occured' },\n });\n },\n }\n );\n\n const providerParams = {\n ...tabQuery.provider,\n pagination: paginationParams,\n search: debouncedSearch,\n };\n\n const { data: providersResponse, status: providersStatus } = useQuery(\n ['marketplace', 'providers', providerParams],\n async () => {\n const queryString = qs.stringify(providerParams);\n const res = await fetch(`${MARKETPLACE_API_URL}/providers?${queryString}`);\n\n if (!res.ok) {\n throw new Error('Failed to fetch marketplace providers.');\n }\n\n const data = (await res.json()) as MarketplaceResponse<Provider>;\n\n return data;\n },\n {\n onSuccess() {\n notifyMarketplaceLoad();\n },\n onError() {\n toggleNotification({\n type: 'warning',\n message: { id: 'notification.error', defaultMessage: 'An error occured' },\n });\n },\n }\n );\n\n const npmPackageTypeResponse = npmPackageType === 'plugin' ? pluginsResponse : providersResponse;\n\n const possibleCollections = npmPackageTypeResponse?.meta.collections ?? {};\n const possibleCategories = pluginsResponse?.meta.categories ?? {};\n\n const { pagination } = npmPackageTypeResponse?.meta ?? {};\n\n return {\n pluginsResponse,\n providersResponse,\n pluginsStatus,\n providersStatus,\n possibleCollections,\n possibleCategories,\n pagination,\n };\n}\n\nexport { useMarketplaceData };\nexport type {\n MarketplaceResponse,\n Plugin,\n Provider,\n MarketplaceMeta,\n Collections,\n Categories,\n FilterTypes,\n UseMarketplaceDataParams,\n};\n","import * as React from 'react';\n\n/**\n * For more details about this hook see:\n * https://www.30secondsofcode.org/react/s/use-navigator-on-line\n */\nexport const useNavigatorOnline = (): boolean => {\n const onlineStatus =\n typeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean'\n ? navigator.onLine\n : true;\n\n const [isOnline, setIsOnline] = React.useState(onlineStatus);\n\n const setOnline = () => setIsOnline(true);\n const setOffline = () => setIsOnline(false);\n\n React.useEffect(() => {\n window.addEventListener('online', setOnline);\n window.addEventListener('offline', setOffline);\n\n return () => {\n window.removeEventListener('online', setOnline);\n window.removeEventListener('offline', setOffline);\n };\n }, []);\n\n return isOnline;\n};\n","import * as React from 'react';\n\nimport {\n Box,\n ContentLayout,\n Flex,\n Icon,\n Layout,\n Main,\n Searchbar,\n Tab,\n TabGroup,\n TabPanel,\n TabPanels,\n Tabs,\n} from '@strapi/design-system';\nimport {\n CheckPagePermissions,\n ContentBox,\n PageSizeURLQuery,\n PaginationURLQuery,\n useAppInfo,\n useFocusWhenNavigate,\n useNotification,\n useQueryParams,\n useTracking,\n} from '@strapi/helper-plugin';\nimport { ExternalLink, GlassesSquare } from '@strapi/icons';\nimport { Helmet } from 'react-helmet';\nimport { useIntl } from 'react-intl';\nimport { useSelector } from 'react-redux';\n\nimport { useDebounce } from '../../hooks/useDebounce';\nimport { selectAdminPermissions } from '../../selectors';\n\nimport { NpmPackagesFilters } from './components/NpmPackagesFilters';\nimport { NpmPackagesGrid } from './components/NpmPackagesGrid';\nimport { OfflineLayout } from './components/OfflineLayout';\nimport { PageHeader } from './components/PageHeader';\nimport { SortSelect, SortSelectProps } from './components/SortSelect';\nimport { FilterTypes, useMarketplaceData } from './hooks/useMarketplaceData';\nimport { useNavigatorOnline } from './hooks/useNavigatorOnline';\n\ntype NpmPackageType = 'plugin' | 'provider';\n\ninterface MarketplacePageQuery {\n collections?: string[];\n categories?: string[];\n npmPackageType?: NpmPackageType;\n page?: number;\n pageSize?: number;\n search?: string;\n sort?: SortSelectProps['sortQuery'];\n}\n\ninterface TabQuery {\n plugin: MarketplacePageQuery;\n provider: MarketplacePageQuery;\n}\n\nconst MarketplacePage = () => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const toggleNotification = useNotification();\n const [{ query }, setQuery] = useQueryParams<MarketplacePageQuery>();\n const debouncedSearch = useDebounce(query?.search, 500) || '';\n\n const { autoReload: isInDevelopmentMode, dependencies, useYarn, strapiVersion } = useAppInfo();\n const isOnline = useNavigatorOnline();\n\n const npmPackageType = query?.npmPackageType || 'plugin';\n\n const [tabQuery, setTabQuery] = React.useState<TabQuery>({\n plugin: npmPackageType === 'plugin' ? { ...query } : {},\n provider: npmPackageType === 'provider' ? { ...query } : {},\n });\n\n useFocusWhenNavigate();\n\n React.useEffect(() => {\n trackUsage('didGoToMarketplace');\n }, [trackUsage]);\n\n React.useEffect(() => {\n if (!isInDevelopmentMode) {\n toggleNotification({\n type: 'info',\n message: {\n id: 'admin.pages.MarketPlacePage.production',\n defaultMessage: 'Manage plugins from the development environment',\n },\n });\n }\n }, [toggleNotification, isInDevelopmentMode]);\n\n const {\n pluginsResponse,\n providersResponse,\n pluginsStatus,\n providersStatus,\n possibleCollections,\n possibleCategories,\n pagination,\n } = useMarketplaceData({ npmPackageType, debouncedSearch, query, tabQuery });\n\n if (!isOnline) {\n return <OfflineLayout />;\n }\n\n const handleTabChange = (selected: number) => {\n const selectedTab = selected === 0 ? 'plugin' : 'provider';\n const hasTabQuery = tabQuery[selectedTab] && Object.keys(tabQuery[selectedTab]).length;\n\n if (hasTabQuery) {\n setQuery({\n // Keep filters and search\n ...tabQuery[selectedTab],\n search: query?.search || '',\n // Set tab and reset page\n npmPackageType: selectedTab,\n page: 1,\n });\n } else {\n setQuery({\n // Set tab\n npmPackageType: selectedTab,\n // Clear filters\n collections: [],\n categories: [],\n sort: 'name:asc',\n page: 1,\n // Keep search\n search: query?.search || '',\n });\n }\n };\n\n const handleSelectChange = (update: Partial<MarketplacePageQuery>) => {\n setQuery({ ...update, page: 1 });\n setTabQuery((prev) => ({\n ...prev,\n [npmPackageType]: { ...prev[npmPackageType], ...update },\n }));\n };\n\n const handleSelectClear = (filterType: FilterTypes) => {\n setQuery({ [filterType]: [], page: undefined }, 'remove');\n setTabQuery((prev) => ({ ...prev, [npmPackageType]: {} }));\n };\n\n const handleSortSelectChange: SortSelectProps['handleSelectChange'] = ({ sort }) =>\n // @ts-expect-error - this is a narrowing issue.\n handleSelectChange({ sort });\n\n // Check if plugins and providers are installed already\n const installedPackageNames = Object.keys(dependencies ?? {});\n\n return (\n <Layout>\n <Main>\n <Helmet\n title={formatMessage({\n id: 'admin.pages.MarketPlacePage.helmet',\n defaultMessage: 'Marketplace - Plugins',\n })}\n />\n <PageHeader isOnline={isOnline} npmPackageType={npmPackageType} />\n <ContentLayout>\n <TabGroup\n label={formatMessage({\n id: 'admin.pages.MarketPlacePage.tab-group.label',\n defaultMessage: 'Plugins and Providers for Strapi',\n })}\n id=\"tabs\"\n variant=\"simple\"\n initialSelectedTabIndex={['plugin', 'provider'].indexOf(npmPackageType)}\n onTabChange={handleTabChange}\n >\n <Flex justifyContent=\"space-between\" paddingBottom={4}>\n <Tabs>\n <Tab>\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.plugins',\n defaultMessage: 'Plugins',\n })}{' '}\n {pluginsResponse ? `(${pluginsResponse.meta.pagination.total})` : '...'}\n </Tab>\n <Tab>\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.providers',\n defaultMessage: 'Providers',\n })}{' '}\n {providersResponse ? `(${providersResponse.meta.pagination.total})` : '...'}\n </Tab>\n </Tabs>\n <Box width=\"25%\">\n <Searchbar\n name=\"searchbar\"\n onClear={() => setQuery({ search: '', page: 1 })}\n value={query?.search}\n onChange={(e) => setQuery({ search: e.target.value, page: 1 })}\n clearLabel={formatMessage({\n id: 'admin.pages.MarketPlacePage.search.clear',\n defaultMessage: 'Clear the search',\n })}\n placeholder={formatMessage({\n id: 'admin.pages.MarketPlacePage.search.placeholder',\n defaultMessage: 'Search',\n })}\n >\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.search.placeholder',\n defaultMessage: 'Search',\n })}\n </Searchbar>\n </Box>\n </Flex>\n <Flex paddingBottom={4} gap={2}>\n <SortSelect\n sortQuery={query?.sort || 'name:asc'}\n handleSelectChange={handleSortSelectChange}\n />\n <NpmPackagesFilters\n npmPackageType={npmPackageType}\n possibleCollections={possibleCollections}\n possibleCategories={possibleCategories}\n query={query || {}}\n handleSelectChange={handleSelectChange}\n handleSelectClear={handleSelectClear}\n />\n </Flex>\n\n <TabPanels>\n {/* Plugins panel */}\n <TabPanel>\n <NpmPackagesGrid\n npmPackages={pluginsResponse?.data}\n status={pluginsStatus}\n installedPackageNames={installedPackageNames}\n useYarn={useYarn}\n isInDevelopmentMode={isInDevelopmentMode}\n npmPackageType=\"plugin\"\n strapiAppVersion={strapiVersion}\n debouncedSearch={debouncedSearch}\n />\n </TabPanel>\n {/* Providers panel */}\n <TabPanel>\n <NpmPackagesGrid\n npmPackages={providersResponse?.data}\n status={providersStatus}\n installedPackageNames={installedPackageNames}\n useYarn={useYarn}\n isInDevelopmentMode={isInDevelopmentMode}\n npmPackageType=\"provider\"\n debouncedSearch={debouncedSearch}\n />\n </TabPanel>\n </TabPanels>\n </TabGroup>\n {pagination ? (\n <Box paddingTop={4}>\n <Flex alignItems=\"flex-end\" justifyContent=\"space-between\">\n <PageSizeURLQuery options={['12', '24', '50', '100']} defaultValue=\"24\" />\n <PaginationURLQuery pagination={pagination} />\n </Flex>\n </Box>\n ) : null}\n <Box paddingTop={8}>\n <a\n href=\"https://strapi.canny.io/plugin-requests\"\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n style={{ textDecoration: 'none' }}\n onClick={() => trackUsage('didMissMarketplacePlugin')}\n >\n <ContentBox\n title={formatMessage({\n id: 'admin.pages.MarketPlacePage.missingPlugin.title',\n defaultMessage: 'Documentation',\n })}\n subtitle={formatMessage({\n id: 'admin.pages.MarketPlacePage.missingPlugin.description',\n defaultMessage:\n \"Tell us what plugin you are looking for and we'll let our community plugin developers know in case they are in search for inspiration!\",\n })}\n icon={<GlassesSquare />}\n iconBackground=\"alternative100\"\n endAction={\n <Icon as={ExternalLink} color=\"neutral600\" width={3} height={3} marginLeft={2} />\n }\n />\n </a>\n </Box>\n </ContentLayout>\n </Main>\n </Layout>\n );\n};\n\nconst ProtectedMarketplacePage = () => {\n const permissions = useSelector(selectAdminPermissions);\n\n return (\n // @ts-expect-error – the selector is not typed.\n <CheckPagePermissions permissions={permissions.marketplace.main}>\n <MarketplacePage />\n </CheckPagePermissions>\n );\n};\n\nexport { MarketplacePage, ProtectedMarketplacePage };\nexport type { NpmPackageType, MarketplacePageQuery, TabQuery };\n"],"names":["React","useIntl","jsxs","Fragment","Box","jsx","Filter","Popover","Tag","Cross","styled","Button","Flex","MultiSelect","MultiSelectOption","Typography","useTracking","pluralize","Tooltip","Icon","CheckCircle","StrapiLogo","LinkButton","ExternalLink","useNotification","useClipboard","Check","semver","Duplicate","Github","pxToRem","Star","Download","Divider","AnErrorOccurred","Loader","GridLayout","EmptyDocuments","Grid","GridItem","HeaderLayout","Upload","Layout","Main","SingleSelect","SingleSelectOption","useNotifyAT","useQuery","qs","useQueryParams","useDebounce","useAppInfo","useFocusWhenNavigate","Helmet","ContentLayout","TabGroup","Tabs","Tab","Searchbar","TabPanels","TabPanel","PageSizeURLQuery","PaginationURLQuery","ContentBox","GlassesSquare","useSelector","selectAdminPermissions","CheckPagePermissions"],"mappings":"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"}
@@ -12,8 +12,8 @@ const reactIntl = require("react-intl");
12
12
  const reactQuery = require("react-query");
13
13
  const styled = require("styled-components");
14
14
  const yup = require("yup");
15
- const index = require("./index-8f8eaed6.js");
16
- const AuthenticatedApp = require("./AuthenticatedApp-7e646400.js");
15
+ const index = require("./index-4de70b5d.js");
16
+ const AuthenticatedApp = require("./AuthenticatedApp-342bf22f.js");
17
17
  const edit = require("./edit-29bdf5d6.js");
18
18
  require("react-dom/client");
19
19
  require("invariant");
@@ -662,4 +662,4 @@ const UserInfoSection = ({ errors, onChange, values }) => {
662
662
  );
663
663
  };
664
664
  exports.ProfilePage = ProfilePage;
665
- //# sourceMappingURL=ProfilePage-a68483d3.js.map
665
+ //# sourceMappingURL=ProfilePage-52844daa.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProfilePage-a68483d3.js","sources":["../../admin/src/pages/ProfilePage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Button,\n ContentLayout,\n Flex,\n HeaderLayout,\n Main,\n useNotifyAT,\n Grid,\n GridItem,\n Typography,\n SingleSelect,\n SingleSelectOption,\n TextInput,\n FieldAction,\n} from '@strapi/design-system';\nimport {\n auth,\n Form,\n GenericInput,\n GenericInputProps,\n LoadingIndicatorPage,\n pxToRem,\n useAppInfo,\n useFetchClient,\n useFocusWhenNavigate,\n useNotification,\n useOverlayBlocker,\n useTracking,\n} from '@strapi/helper-plugin';\nimport { Check, Eye, EyeStriked } from '@strapi/icons';\nimport { AxiosError } from 'axios';\nimport { Formik, FormikHelpers } from 'formik';\nimport upperFirst from 'lodash/upperFirst';\nimport { Helmet } from 'react-helmet';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQuery } from 'react-query';\nimport styled from 'styled-components';\nimport * as yup from 'yup';\n\nimport { useLocales } from '../components/LanguageProvider';\nimport { useThemeToggle, ThemeName, ThemeToggleContextContextValue } from '../contexts/themeToggle';\nimport { getFullName } from '../utils/getFullName';\n\n// @ts-expect-error – no types available\nimport { profileValidation } from './SettingsPage/pages/Users/utils/validations/users';\n\nimport type { IsSSOLocked } from '../../../shared/contracts/providers';\nimport type { GetMe, UpdateMe } from '../../../shared/contracts/users';\n\nconst schema = yup.object().shape(profileValidation);\n\n/* -------------------------------------------------------------------------------------------------\n * ProfilePage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProfilePage = () => {\n const { changeLocale, localeNames } = useLocales();\n const { setUserDisplayName } = useAppInfo();\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const toggleNotification = useNotification();\n const { lockApp, unlockApp } = useOverlayBlocker();\n const { notifyStatus } = useNotifyAT();\n const { currentTheme, themes: allApplicationThemes, onChangeTheme } = useThemeToggle();\n const { get, put } = useFetchClient();\n\n useFocusWhenNavigate();\n\n const {\n isLoading: isLoadingUser,\n data,\n refetch,\n } = useQuery(\n 'user',\n async () => {\n const { data } = await get<GetMe.Response>('/admin/users/me');\n\n return data.data;\n },\n {\n onSuccess() {\n notifyStatus(\n formatMessage({\n id: 'Settings.profile.form.notify.data.loaded',\n defaultMessage: 'Your profile data has been loaded',\n })\n );\n },\n onError() {\n toggleNotification({\n type: 'warning',\n message: { id: 'notification.error', defaultMessage: 'An error occured' },\n });\n },\n }\n );\n\n const { isLoading: isLoadingSSO, data: dataSSO } = useQuery(\n ['providers', 'isSSOLocked'],\n async () => {\n const {\n data: { data },\n } = await get<IsSSOLocked.Response>('/admin/providers/isSSOLocked');\n\n return data;\n },\n {\n enabled: window.strapi.isEE && window.strapi.features.isEnabled('sso'),\n onError() {\n toggleNotification({\n type: 'warning',\n message: { id: 'Settings.permissions.users.sso.provider.error' },\n });\n },\n }\n );\n\n const isLoading = isLoadingUser || isLoadingSSO;\n\n type UpdateUsersMeBody = UpdateMe.Request['body'] & {\n confirmPassword: string;\n currentTheme: ThemeName;\n };\n\n const submitMutation = useMutation<\n UpdateMe.Response['data'] & { currentTheme: ThemeName },\n AxiosError<UpdateMe.Response>,\n UpdateUsersMeBody\n >(\n async (body) => {\n const { confirmPassword: _confirmPassword, currentTheme, ...bodyRest } = body;\n let dataToSend = bodyRest;\n\n const isPasswordRequestBody = (\n data: UpdateMe.Request['body']\n ): data is UpdateMe.PasswordRequestBody => {\n return 'password' in data;\n };\n\n // The password fields are optional. If the user didn't touch them, don't send any password\n // to the API, because an empty string would throw a validation error\n if (isPasswordRequestBody(dataToSend) && dataToSend.password === '') {\n const {\n password: _password,\n currentPassword: _currentPassword,\n ...passwordRequestBodyRest\n } = dataToSend;\n dataToSend = passwordRequestBodyRest;\n }\n\n const { data } = await put<UpdateMe.Response>('/admin/users/me', dataToSend);\n\n return { ...data.data, currentTheme };\n },\n {\n async onSuccess(data) {\n await refetch();\n const { email, firstname, lastname, username, preferedLanguage } = data;\n auth.setUserInfo({ email, firstname, lastname, username, preferedLanguage });\n const userDisplayName = data.username || getFullName(data.firstname ?? '', data.lastname);\n setUserDisplayName(userDisplayName);\n\n if (data.preferedLanguage) {\n changeLocale(data.preferedLanguage);\n }\n\n // @ts-expect-error – we're going to implement a context assertion to avoid this\n onChangeTheme(data.currentTheme);\n\n trackUsage('didChangeMode', { newMode: data.currentTheme });\n\n toggleNotification({\n type: 'success',\n message: { id: 'notification.success.saved', defaultMessage: 'Saved' },\n });\n },\n async onSettled() {\n // @ts-expect-error – we're going to implement a context assertion to avoid this\n unlockApp();\n },\n }\n );\n\n const { isLoading: isSubmittingForm } = submitMutation;\n\n const handleSubmit = async (\n body: UpdateUsersMeBody,\n { setErrors }: FormikHelpers<UpdateUsersMeBody>\n ) => {\n // @ts-expect-error – we're going to implement a context assertion to avoid this\n lockApp();\n\n const username = body.username;\n submitMutation.mutate(\n { ...body, username },\n {\n onError(error) {\n const res = error?.response?.data;\n\n if (res?.data) {\n return setErrors(res.data);\n }\n\n return toggleNotification({\n type: 'warning',\n message: { id: 'notification.error', defaultMessage: 'An error occured' },\n });\n },\n }\n );\n };\n\n if (isLoading || !data) {\n return (\n <Main aria-busy=\"true\">\n <Helmet\n title={formatMessage({\n id: 'Settings.profile.form.section.helmet.title',\n defaultMessage: 'User profile',\n })}\n />\n <HeaderLayout\n title={formatMessage({\n id: 'Settings.profile.form.section.profile.page.title',\n defaultMessage: 'Profile page',\n })}\n />\n <ContentLayout>\n <LoadingIndicatorPage />\n </ContentLayout>\n </Main>\n );\n }\n\n const hasLockedRole = dataSSO?.isSSOLocked ?? false;\n const { email, firstname, lastname, username, preferedLanguage } = data;\n const initialData = {\n email,\n firstname,\n lastname,\n username,\n preferedLanguage,\n currentTheme,\n confirmPassword: '',\n password: '',\n };\n\n return (\n <Main aria-busy={isSubmittingForm}>\n <Helmet\n title={formatMessage({\n id: 'Settings.profile.form.section.helmet.title',\n defaultMessage: 'User profile',\n })}\n />\n <Formik\n onSubmit={handleSubmit}\n // @ts-expect-error – currentTheme could be undefined because we don't have context assertion yet.\n initialValues={initialData}\n validateOnChange={false}\n validationSchema={schema}\n enableReinitialize\n >\n {({\n errors,\n values: {\n email,\n firstname,\n lastname,\n username,\n preferedLanguage,\n currentTheme,\n ...passwordValues\n },\n handleChange,\n isSubmitting,\n dirty,\n }) => {\n return (\n <Form>\n <HeaderLayout\n title={data.username || getFullName(data.firstname ?? '', data.lastname)}\n primaryAction={\n <Button\n startIcon={<Check />}\n loading={isSubmitting}\n type=\"submit\"\n disabled={!dirty}\n >\n {formatMessage({ id: 'global.save', defaultMessage: 'Save' })}\n </Button>\n }\n />\n <Box paddingBottom={10}>\n <ContentLayout>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n <UserInfoSection\n errors={errors}\n onChange={handleChange}\n values={{\n firstname,\n lastname,\n username,\n email,\n }}\n />\n {!hasLockedRole && (\n <PasswordSection\n errors={errors}\n onChange={handleChange}\n values={passwordValues}\n />\n )}\n <PreferencesSection\n allApplicationThemes={allApplicationThemes}\n onChange={handleChange}\n values={{\n preferedLanguage,\n currentTheme,\n }}\n localeNames={localeNames}\n />\n </Flex>\n </ContentLayout>\n </Box>\n </Form>\n );\n }}\n </Formik>\n </Main>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PasswordSection\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PasswordSectionProps {\n errors: { currentPassword?: string; password?: string; confirmPassword?: string };\n onChange: React.ChangeEventHandler<HTMLInputElement>;\n values: {\n currentPassword?: string;\n password?: string;\n confirmPassword?: string;\n };\n}\n\nconst PasswordSection = ({ errors, onChange, values }: PasswordSectionProps) => {\n const { formatMessage } = useIntl();\n const [currentPasswordShown, setCurrentPasswordShown] = React.useState(false);\n const [passwordShown, setPasswordShown] = React.useState(false);\n const [passwordConfirmShown, setPasswordConfirmShown] = React.useState(false);\n\n return (\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" as=\"h2\">\n {formatMessage({\n id: 'global.change-password',\n defaultMessage: 'Change password',\n })}\n </Typography>\n <Grid gap={5}>\n <GridItem s={12} col={6}>\n <TextInput\n error={\n errors.currentPassword\n ? formatMessage({\n id: errors.currentPassword,\n defaultMessage: errors.currentPassword,\n })\n : ''\n }\n onChange={onChange}\n value={values.currentPassword}\n label={formatMessage({\n id: 'Auth.form.currentPassword.label',\n defaultMessage: 'Current Password',\n })}\n name=\"currentPassword\"\n type={currentPasswordShown ? 'text' : 'password'}\n endAction={\n <FieldActionWrapper\n onClick={(e) => {\n e.stopPropagation();\n setCurrentPasswordShown((prev) => !prev);\n }}\n label={formatMessage(\n currentPasswordShown\n ? {\n id: 'Auth.form.password.show-password',\n defaultMessage: 'Show password',\n }\n : {\n id: 'Auth.form.password.hide-password',\n defaultMessage: 'Hide password',\n }\n )}\n >\n {currentPasswordShown ? <Eye /> : <EyeStriked />}\n </FieldActionWrapper>\n }\n />\n </GridItem>\n </Grid>\n <Grid gap={5}>\n <GridItem s={12} col={6}>\n <PasswordInput\n error={\n errors.password\n ? formatMessage({\n id: errors.password,\n defaultMessage: errors.password,\n })\n : ''\n }\n onChange={onChange}\n value={values.password}\n label={formatMessage({\n id: 'global.password',\n defaultMessage: 'Password',\n })}\n name=\"password\"\n type={passwordShown ? 'text' : 'password'}\n autoComplete=\"new-password\"\n endAction={\n <FieldActionWrapper\n onClick={(e) => {\n e.stopPropagation();\n setPasswordShown((prev) => !prev);\n }}\n label={formatMessage(\n passwordShown\n ? {\n id: 'Auth.form.password.show-password',\n defaultMessage: 'Show password',\n }\n : {\n id: 'Auth.form.password.hide-password',\n defaultMessage: 'Hide password',\n }\n )}\n >\n {passwordShown ? <Eye /> : <EyeStriked />}\n </FieldActionWrapper>\n }\n />\n </GridItem>\n <GridItem s={12} col={6}>\n <PasswordInput\n error={\n errors.confirmPassword\n ? formatMessage({\n id: errors.confirmPassword,\n defaultMessage: errors.confirmPassword,\n })\n : ''\n }\n onChange={onChange}\n value={values.confirmPassword}\n label={formatMessage({\n id: 'Auth.form.confirmPassword.label',\n defaultMessage: 'Confirm Password',\n })}\n name=\"confirmPassword\"\n type={passwordConfirmShown ? 'text' : 'password'}\n autoComplete=\"new-password\"\n endAction={\n <FieldActionWrapper\n onClick={(e) => {\n e.stopPropagation();\n setPasswordConfirmShown((prev) => !prev);\n }}\n label={formatMessage(\n passwordConfirmShown\n ? {\n id: 'Auth.form.password.show-password',\n defaultMessage: 'Show password',\n }\n : {\n id: 'Auth.form.password.hide-password',\n defaultMessage: 'Hide password',\n }\n )}\n >\n {passwordConfirmShown ? <Eye /> : <EyeStriked />}\n </FieldActionWrapper>\n }\n />\n </GridItem>\n </Grid>\n </Flex>\n </Box>\n );\n};\n\nconst PasswordInput = styled(TextInput)`\n ::-ms-reveal {\n display: none;\n }\n`;\n\n// Wrapper of the Eye Icon able to show or hide the Password inside the field\nconst FieldActionWrapper = styled(FieldAction)`\n svg {\n height: ${pxToRem(16)};\n width: ${pxToRem(16)};\n path {\n fill: ${({ theme }) => theme.colors.neutral600};\n }\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * PreferencesSection\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PreferencesSectionProps extends Pick<GenericInputProps, 'onChange'> {\n values: {\n preferedLanguage?: string;\n currentTheme?: string;\n };\n localeNames: Record<string, string>;\n allApplicationThemes?: Partial<ThemeToggleContextContextValue['themes']>;\n}\n\nconst PreferencesSection = ({\n onChange,\n values,\n localeNames,\n allApplicationThemes = {},\n}: PreferencesSectionProps) => {\n const { formatMessage } = useIntl();\n const themesToDisplay = Object.keys(allApplicationThemes).filter(\n (themeName) => allApplicationThemes[themeName as keyof ThemeToggleContextContextValue['themes']]\n );\n\n return (\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Typography variant=\"delta\" as=\"h2\">\n {formatMessage({\n id: 'Settings.profile.form.section.experience.title',\n defaultMessage: 'Experience',\n })}\n </Typography>\n <Typography>\n {formatMessage(\n {\n id: 'Settings.profile.form.section.experience.interfaceLanguageHelp',\n defaultMessage:\n 'Preference changes will apply only to you. More information is available {here}.',\n },\n {\n here: (\n <Box\n as=\"a\"\n color=\"primary600\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n href=\"https://docs.strapi.io/developer-docs/latest/development/admin-customization.html#locales\"\n >\n {formatMessage({\n id: 'Settings.profile.form.section.experience.here',\n defaultMessage: 'here',\n })}\n </Box>\n ),\n }\n )}\n </Typography>\n </Flex>\n <Grid gap={5}>\n <GridItem s={12} col={6}>\n <SingleSelect\n label={formatMessage({\n id: 'Settings.profile.form.section.experience.interfaceLanguage',\n defaultMessage: 'Interface language',\n })}\n placeholder={formatMessage({\n id: 'global.select',\n defaultMessage: 'Select',\n })}\n hint={formatMessage({\n id: 'Settings.profile.form.section.experience.interfaceLanguage.hint',\n defaultMessage: 'This will only display your own interface in the chosen language.',\n })}\n onClear={() => {\n onChange({\n target: { name: 'preferedLanguage', value: null },\n });\n }}\n clearLabel={formatMessage({\n id: 'Settings.profile.form.section.experience.clear.select',\n defaultMessage: 'Clear the interface language selected',\n })}\n value={values.preferedLanguage}\n onChange={(e) => {\n onChange({\n target: { name: 'preferedLanguage', value: e },\n });\n }}\n >\n {Object.entries(localeNames).map(([language, langName]) => (\n <SingleSelectOption value={language} key={language}>\n {langName}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </GridItem>\n <GridItem s={12} col={6}>\n <SingleSelect\n label={formatMessage({\n id: 'Settings.profile.form.section.experience.mode.label',\n defaultMessage: 'Interface mode',\n })}\n placeholder={formatMessage({\n id: 'components.Select.placeholder',\n defaultMessage: 'Select',\n })}\n hint={formatMessage({\n id: 'Settings.profile.form.section.experience.mode.hint',\n defaultMessage: 'Displays your interface in the chosen mode.',\n })}\n value={values.currentTheme}\n onChange={(e) => {\n onChange({\n target: { name: 'currentTheme', value: e },\n });\n }}\n >\n <SingleSelectOption value=\"system\">\n {formatMessage({\n id: 'Settings.profile.form.section.experience.mode.option-system-label',\n defaultMessage: 'Use system settings',\n })}\n </SingleSelectOption>\n {themesToDisplay.map((theme) => (\n <SingleSelectOption value={theme} key={theme}>\n {formatMessage(\n {\n id: 'Settings.profile.form.section.experience.mode.option-label',\n defaultMessage: '{name} mode',\n },\n {\n name: formatMessage({\n id: theme,\n defaultMessage: upperFirst(theme),\n }),\n }\n )}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </GridItem>\n </Grid>\n </Flex>\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * UserInfoSection\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UserInfoSectionProps extends Pick<GenericInputProps, 'onChange'> {\n errors: { firstname?: string; lastname?: string; username?: string; email?: string };\n values: {\n firstname?: string;\n lastname?: string;\n username?: string;\n email?: string;\n };\n}\n\nconst UserInfoSection = ({ errors, onChange, values }: UserInfoSectionProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" as=\"h2\">\n {formatMessage({\n id: 'global.profile',\n defaultMessage: 'Profile',\n })}\n </Typography>\n <Grid gap={5}>\n <GridItem s={12} col={6}>\n <GenericInput\n intlLabel={{\n id: 'Auth.form.firstname.label',\n defaultMessage: 'First name',\n }}\n error={errors.firstname}\n onChange={onChange}\n value={values.firstname}\n type=\"text\"\n name=\"firstname\"\n required\n />\n </GridItem>\n <GridItem s={12} col={6}>\n <GenericInput\n intlLabel={{\n id: 'Auth.form.lastname.label',\n defaultMessage: 'Last name',\n }}\n error={errors.lastname}\n onChange={onChange}\n value={values.lastname}\n type=\"text\"\n name=\"lastname\"\n />\n </GridItem>\n <GridItem s={12} col={6}>\n <GenericInput\n intlLabel={{ id: 'Auth.form.email.label', defaultMessage: 'Email' }}\n error={errors.email}\n onChange={onChange}\n value={values.email}\n type=\"email\"\n name=\"email\"\n required\n />\n </GridItem>\n <GridItem s={12} col={6}>\n <GenericInput\n intlLabel={{\n id: 'Auth.form.username.label',\n defaultMessage: 'Username',\n }}\n error={errors.username}\n onChange={onChange}\n value={values.username}\n type=\"text\"\n name=\"username\"\n />\n </GridItem>\n </Grid>\n </Flex>\n </Box>\n );\n};\n\nexport { ProfilePage };\n"],"names":["yup","profileValidation","useLocales","useAppInfo","useIntl","useTracking","useNotification","useOverlayBlocker","useNotifyAT","useThemeToggle","useFetchClient","useFocusWhenNavigate","useQuery","data","useMutation","currentTheme","email","firstname","lastname","username","preferedLanguage","auth","getFullName","jsxs","Main","jsx","Helmet","HeaderLayout","ContentLayout","LoadingIndicatorPage","Formik","Form","Button","Check","Box","Flex","React","Typography","Grid","GridItem","TextInput","Eye","EyeStriked","styled","FieldAction","pxToRem","SingleSelect","SingleSelectOption","upperFirst","GenericInput"],"mappings":"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"}
1
+ {"version":3,"file":"ProfilePage-52844daa.js","sources":["../../admin/src/pages/ProfilePage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Button,\n ContentLayout,\n Flex,\n HeaderLayout,\n Main,\n useNotifyAT,\n Grid,\n GridItem,\n Typography,\n SingleSelect,\n SingleSelectOption,\n TextInput,\n FieldAction,\n} from '@strapi/design-system';\nimport {\n auth,\n Form,\n GenericInput,\n GenericInputProps,\n LoadingIndicatorPage,\n pxToRem,\n useAppInfo,\n useFetchClient,\n useFocusWhenNavigate,\n useNotification,\n useOverlayBlocker,\n useTracking,\n} from '@strapi/helper-plugin';\nimport { Check, Eye, EyeStriked } from '@strapi/icons';\nimport { AxiosError } from 'axios';\nimport { Formik, FormikHelpers } from 'formik';\nimport upperFirst from 'lodash/upperFirst';\nimport { Helmet } from 'react-helmet';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQuery } from 'react-query';\nimport styled from 'styled-components';\nimport * as yup from 'yup';\n\nimport { useLocales } from '../components/LanguageProvider';\nimport { useThemeToggle, ThemeName, ThemeToggleContextContextValue } from '../contexts/themeToggle';\nimport { getFullName } from '../utils/getFullName';\n\n// @ts-expect-error – no types available\nimport { profileValidation } from './SettingsPage/pages/Users/utils/validations/users';\n\nimport type { IsSSOLocked } from '../../../shared/contracts/providers';\nimport type { GetMe, UpdateMe } from '../../../shared/contracts/users';\n\nconst schema = yup.object().shape(profileValidation);\n\n/* -------------------------------------------------------------------------------------------------\n * ProfilePage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProfilePage = () => {\n const { changeLocale, localeNames } = useLocales();\n const { setUserDisplayName } = useAppInfo();\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const toggleNotification = useNotification();\n const { lockApp, unlockApp } = useOverlayBlocker();\n const { notifyStatus } = useNotifyAT();\n const { currentTheme, themes: allApplicationThemes, onChangeTheme } = useThemeToggle();\n const { get, put } = useFetchClient();\n\n useFocusWhenNavigate();\n\n const {\n isLoading: isLoadingUser,\n data,\n refetch,\n } = useQuery(\n 'user',\n async () => {\n const { data } = await get<GetMe.Response>('/admin/users/me');\n\n return data.data;\n },\n {\n onSuccess() {\n notifyStatus(\n formatMessage({\n id: 'Settings.profile.form.notify.data.loaded',\n defaultMessage: 'Your profile data has been loaded',\n })\n );\n },\n onError() {\n toggleNotification({\n type: 'warning',\n message: { id: 'notification.error', defaultMessage: 'An error occured' },\n });\n },\n }\n );\n\n const { isLoading: isLoadingSSO, data: dataSSO } = useQuery(\n ['providers', 'isSSOLocked'],\n async () => {\n const {\n data: { data },\n } = await get<IsSSOLocked.Response>('/admin/providers/isSSOLocked');\n\n return data;\n },\n {\n enabled: window.strapi.isEE && window.strapi.features.isEnabled('sso'),\n onError() {\n toggleNotification({\n type: 'warning',\n message: { id: 'Settings.permissions.users.sso.provider.error' },\n });\n },\n }\n );\n\n const isLoading = isLoadingUser || isLoadingSSO;\n\n type UpdateUsersMeBody = UpdateMe.Request['body'] & {\n confirmPassword: string;\n currentTheme: ThemeName;\n };\n\n const submitMutation = useMutation<\n UpdateMe.Response['data'] & { currentTheme: ThemeName },\n AxiosError<UpdateMe.Response>,\n UpdateUsersMeBody\n >(\n async (body) => {\n const { confirmPassword: _confirmPassword, currentTheme, ...bodyRest } = body;\n let dataToSend = bodyRest;\n\n const isPasswordRequestBody = (\n data: UpdateMe.Request['body']\n ): data is UpdateMe.PasswordRequestBody => {\n return 'password' in data;\n };\n\n // The password fields are optional. If the user didn't touch them, don't send any password\n // to the API, because an empty string would throw a validation error\n if (isPasswordRequestBody(dataToSend) && dataToSend.password === '') {\n const {\n password: _password,\n currentPassword: _currentPassword,\n ...passwordRequestBodyRest\n } = dataToSend;\n dataToSend = passwordRequestBodyRest;\n }\n\n const { data } = await put<UpdateMe.Response>('/admin/users/me', dataToSend);\n\n return { ...data.data, currentTheme };\n },\n {\n async onSuccess(data) {\n await refetch();\n const { email, firstname, lastname, username, preferedLanguage } = data;\n auth.setUserInfo({ email, firstname, lastname, username, preferedLanguage });\n const userDisplayName = data.username || getFullName(data.firstname ?? '', data.lastname);\n setUserDisplayName(userDisplayName);\n\n if (data.preferedLanguage) {\n changeLocale(data.preferedLanguage);\n }\n\n // @ts-expect-error – we're going to implement a context assertion to avoid this\n onChangeTheme(data.currentTheme);\n\n trackUsage('didChangeMode', { newMode: data.currentTheme });\n\n toggleNotification({\n type: 'success',\n message: { id: 'notification.success.saved', defaultMessage: 'Saved' },\n });\n },\n async onSettled() {\n // @ts-expect-error – we're going to implement a context assertion to avoid this\n unlockApp();\n },\n }\n );\n\n const { isLoading: isSubmittingForm } = submitMutation;\n\n const handleSubmit = async (\n body: UpdateUsersMeBody,\n { setErrors }: FormikHelpers<UpdateUsersMeBody>\n ) => {\n // @ts-expect-error – we're going to implement a context assertion to avoid this\n lockApp();\n\n const username = body.username;\n submitMutation.mutate(\n { ...body, username },\n {\n onError(error) {\n const res = error?.response?.data;\n\n if (res?.data) {\n return setErrors(res.data);\n }\n\n return toggleNotification({\n type: 'warning',\n message: { id: 'notification.error', defaultMessage: 'An error occured' },\n });\n },\n }\n );\n };\n\n if (isLoading || !data) {\n return (\n <Main aria-busy=\"true\">\n <Helmet\n title={formatMessage({\n id: 'Settings.profile.form.section.helmet.title',\n defaultMessage: 'User profile',\n })}\n />\n <HeaderLayout\n title={formatMessage({\n id: 'Settings.profile.form.section.profile.page.title',\n defaultMessage: 'Profile page',\n })}\n />\n <ContentLayout>\n <LoadingIndicatorPage />\n </ContentLayout>\n </Main>\n );\n }\n\n const hasLockedRole = dataSSO?.isSSOLocked ?? false;\n const { email, firstname, lastname, username, preferedLanguage } = data;\n const initialData = {\n email,\n firstname,\n lastname,\n username,\n preferedLanguage,\n currentTheme,\n confirmPassword: '',\n password: '',\n };\n\n return (\n <Main aria-busy={isSubmittingForm}>\n <Helmet\n title={formatMessage({\n id: 'Settings.profile.form.section.helmet.title',\n defaultMessage: 'User profile',\n })}\n />\n <Formik\n onSubmit={handleSubmit}\n // @ts-expect-error – currentTheme could be undefined because we don't have context assertion yet.\n initialValues={initialData}\n validateOnChange={false}\n validationSchema={schema}\n enableReinitialize\n >\n {({\n errors,\n values: {\n email,\n firstname,\n lastname,\n username,\n preferedLanguage,\n currentTheme,\n ...passwordValues\n },\n handleChange,\n isSubmitting,\n dirty,\n }) => {\n return (\n <Form>\n <HeaderLayout\n title={data.username || getFullName(data.firstname ?? '', data.lastname)}\n primaryAction={\n <Button\n startIcon={<Check />}\n loading={isSubmitting}\n type=\"submit\"\n disabled={!dirty}\n >\n {formatMessage({ id: 'global.save', defaultMessage: 'Save' })}\n </Button>\n }\n />\n <Box paddingBottom={10}>\n <ContentLayout>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n <UserInfoSection\n errors={errors}\n onChange={handleChange}\n values={{\n firstname,\n lastname,\n username,\n email,\n }}\n />\n {!hasLockedRole && (\n <PasswordSection\n errors={errors}\n onChange={handleChange}\n values={passwordValues}\n />\n )}\n <PreferencesSection\n allApplicationThemes={allApplicationThemes}\n onChange={handleChange}\n values={{\n preferedLanguage,\n currentTheme,\n }}\n localeNames={localeNames}\n />\n </Flex>\n </ContentLayout>\n </Box>\n </Form>\n );\n }}\n </Formik>\n </Main>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PasswordSection\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PasswordSectionProps {\n errors: { currentPassword?: string; password?: string; confirmPassword?: string };\n onChange: React.ChangeEventHandler<HTMLInputElement>;\n values: {\n currentPassword?: string;\n password?: string;\n confirmPassword?: string;\n };\n}\n\nconst PasswordSection = ({ errors, onChange, values }: PasswordSectionProps) => {\n const { formatMessage } = useIntl();\n const [currentPasswordShown, setCurrentPasswordShown] = React.useState(false);\n const [passwordShown, setPasswordShown] = React.useState(false);\n const [passwordConfirmShown, setPasswordConfirmShown] = React.useState(false);\n\n return (\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" as=\"h2\">\n {formatMessage({\n id: 'global.change-password',\n defaultMessage: 'Change password',\n })}\n </Typography>\n <Grid gap={5}>\n <GridItem s={12} col={6}>\n <TextInput\n error={\n errors.currentPassword\n ? formatMessage({\n id: errors.currentPassword,\n defaultMessage: errors.currentPassword,\n })\n : ''\n }\n onChange={onChange}\n value={values.currentPassword}\n label={formatMessage({\n id: 'Auth.form.currentPassword.label',\n defaultMessage: 'Current Password',\n })}\n name=\"currentPassword\"\n type={currentPasswordShown ? 'text' : 'password'}\n endAction={\n <FieldActionWrapper\n onClick={(e) => {\n e.stopPropagation();\n setCurrentPasswordShown((prev) => !prev);\n }}\n label={formatMessage(\n currentPasswordShown\n ? {\n id: 'Auth.form.password.show-password',\n defaultMessage: 'Show password',\n }\n : {\n id: 'Auth.form.password.hide-password',\n defaultMessage: 'Hide password',\n }\n )}\n >\n {currentPasswordShown ? <Eye /> : <EyeStriked />}\n </FieldActionWrapper>\n }\n />\n </GridItem>\n </Grid>\n <Grid gap={5}>\n <GridItem s={12} col={6}>\n <PasswordInput\n error={\n errors.password\n ? formatMessage({\n id: errors.password,\n defaultMessage: errors.password,\n })\n : ''\n }\n onChange={onChange}\n value={values.password}\n label={formatMessage({\n id: 'global.password',\n defaultMessage: 'Password',\n })}\n name=\"password\"\n type={passwordShown ? 'text' : 'password'}\n autoComplete=\"new-password\"\n endAction={\n <FieldActionWrapper\n onClick={(e) => {\n e.stopPropagation();\n setPasswordShown((prev) => !prev);\n }}\n label={formatMessage(\n passwordShown\n ? {\n id: 'Auth.form.password.show-password',\n defaultMessage: 'Show password',\n }\n : {\n id: 'Auth.form.password.hide-password',\n defaultMessage: 'Hide password',\n }\n )}\n >\n {passwordShown ? <Eye /> : <EyeStriked />}\n </FieldActionWrapper>\n }\n />\n </GridItem>\n <GridItem s={12} col={6}>\n <PasswordInput\n error={\n errors.confirmPassword\n ? formatMessage({\n id: errors.confirmPassword,\n defaultMessage: errors.confirmPassword,\n })\n : ''\n }\n onChange={onChange}\n value={values.confirmPassword}\n label={formatMessage({\n id: 'Auth.form.confirmPassword.label',\n defaultMessage: 'Confirm Password',\n })}\n name=\"confirmPassword\"\n type={passwordConfirmShown ? 'text' : 'password'}\n autoComplete=\"new-password\"\n endAction={\n <FieldActionWrapper\n onClick={(e) => {\n e.stopPropagation();\n setPasswordConfirmShown((prev) => !prev);\n }}\n label={formatMessage(\n passwordConfirmShown\n ? {\n id: 'Auth.form.password.show-password',\n defaultMessage: 'Show password',\n }\n : {\n id: 'Auth.form.password.hide-password',\n defaultMessage: 'Hide password',\n }\n )}\n >\n {passwordConfirmShown ? <Eye /> : <EyeStriked />}\n </FieldActionWrapper>\n }\n />\n </GridItem>\n </Grid>\n </Flex>\n </Box>\n );\n};\n\nconst PasswordInput = styled(TextInput)`\n ::-ms-reveal {\n display: none;\n }\n`;\n\n// Wrapper of the Eye Icon able to show or hide the Password inside the field\nconst FieldActionWrapper = styled(FieldAction)`\n svg {\n height: ${pxToRem(16)};\n width: ${pxToRem(16)};\n path {\n fill: ${({ theme }) => theme.colors.neutral600};\n }\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * PreferencesSection\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PreferencesSectionProps extends Pick<GenericInputProps, 'onChange'> {\n values: {\n preferedLanguage?: string;\n currentTheme?: string;\n };\n localeNames: Record<string, string>;\n allApplicationThemes?: Partial<ThemeToggleContextContextValue['themes']>;\n}\n\nconst PreferencesSection = ({\n onChange,\n values,\n localeNames,\n allApplicationThemes = {},\n}: PreferencesSectionProps) => {\n const { formatMessage } = useIntl();\n const themesToDisplay = Object.keys(allApplicationThemes).filter(\n (themeName) => allApplicationThemes[themeName as keyof ThemeToggleContextContextValue['themes']]\n );\n\n return (\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Typography variant=\"delta\" as=\"h2\">\n {formatMessage({\n id: 'Settings.profile.form.section.experience.title',\n defaultMessage: 'Experience',\n })}\n </Typography>\n <Typography>\n {formatMessage(\n {\n id: 'Settings.profile.form.section.experience.interfaceLanguageHelp',\n defaultMessage:\n 'Preference changes will apply only to you. More information is available {here}.',\n },\n {\n here: (\n <Box\n as=\"a\"\n color=\"primary600\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n href=\"https://docs.strapi.io/developer-docs/latest/development/admin-customization.html#locales\"\n >\n {formatMessage({\n id: 'Settings.profile.form.section.experience.here',\n defaultMessage: 'here',\n })}\n </Box>\n ),\n }\n )}\n </Typography>\n </Flex>\n <Grid gap={5}>\n <GridItem s={12} col={6}>\n <SingleSelect\n label={formatMessage({\n id: 'Settings.profile.form.section.experience.interfaceLanguage',\n defaultMessage: 'Interface language',\n })}\n placeholder={formatMessage({\n id: 'global.select',\n defaultMessage: 'Select',\n })}\n hint={formatMessage({\n id: 'Settings.profile.form.section.experience.interfaceLanguage.hint',\n defaultMessage: 'This will only display your own interface in the chosen language.',\n })}\n onClear={() => {\n onChange({\n target: { name: 'preferedLanguage', value: null },\n });\n }}\n clearLabel={formatMessage({\n id: 'Settings.profile.form.section.experience.clear.select',\n defaultMessage: 'Clear the interface language selected',\n })}\n value={values.preferedLanguage}\n onChange={(e) => {\n onChange({\n target: { name: 'preferedLanguage', value: e },\n });\n }}\n >\n {Object.entries(localeNames).map(([language, langName]) => (\n <SingleSelectOption value={language} key={language}>\n {langName}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </GridItem>\n <GridItem s={12} col={6}>\n <SingleSelect\n label={formatMessage({\n id: 'Settings.profile.form.section.experience.mode.label',\n defaultMessage: 'Interface mode',\n })}\n placeholder={formatMessage({\n id: 'components.Select.placeholder',\n defaultMessage: 'Select',\n })}\n hint={formatMessage({\n id: 'Settings.profile.form.section.experience.mode.hint',\n defaultMessage: 'Displays your interface in the chosen mode.',\n })}\n value={values.currentTheme}\n onChange={(e) => {\n onChange({\n target: { name: 'currentTheme', value: e },\n });\n }}\n >\n <SingleSelectOption value=\"system\">\n {formatMessage({\n id: 'Settings.profile.form.section.experience.mode.option-system-label',\n defaultMessage: 'Use system settings',\n })}\n </SingleSelectOption>\n {themesToDisplay.map((theme) => (\n <SingleSelectOption value={theme} key={theme}>\n {formatMessage(\n {\n id: 'Settings.profile.form.section.experience.mode.option-label',\n defaultMessage: '{name} mode',\n },\n {\n name: formatMessage({\n id: theme,\n defaultMessage: upperFirst(theme),\n }),\n }\n )}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </GridItem>\n </Grid>\n </Flex>\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * UserInfoSection\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UserInfoSectionProps extends Pick<GenericInputProps, 'onChange'> {\n errors: { firstname?: string; lastname?: string; username?: string; email?: string };\n values: {\n firstname?: string;\n lastname?: string;\n username?: string;\n email?: string;\n };\n}\n\nconst UserInfoSection = ({ errors, onChange, values }: UserInfoSectionProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" as=\"h2\">\n {formatMessage({\n id: 'global.profile',\n defaultMessage: 'Profile',\n })}\n </Typography>\n <Grid gap={5}>\n <GridItem s={12} col={6}>\n <GenericInput\n intlLabel={{\n id: 'Auth.form.firstname.label',\n defaultMessage: 'First name',\n }}\n error={errors.firstname}\n onChange={onChange}\n value={values.firstname}\n type=\"text\"\n name=\"firstname\"\n required\n />\n </GridItem>\n <GridItem s={12} col={6}>\n <GenericInput\n intlLabel={{\n id: 'Auth.form.lastname.label',\n defaultMessage: 'Last name',\n }}\n error={errors.lastname}\n onChange={onChange}\n value={values.lastname}\n type=\"text\"\n name=\"lastname\"\n />\n </GridItem>\n <GridItem s={12} col={6}>\n <GenericInput\n intlLabel={{ id: 'Auth.form.email.label', defaultMessage: 'Email' }}\n error={errors.email}\n onChange={onChange}\n value={values.email}\n type=\"email\"\n name=\"email\"\n required\n />\n </GridItem>\n <GridItem s={12} col={6}>\n <GenericInput\n intlLabel={{\n id: 'Auth.form.username.label',\n defaultMessage: 'Username',\n }}\n error={errors.username}\n onChange={onChange}\n value={values.username}\n type=\"text\"\n name=\"username\"\n />\n </GridItem>\n </Grid>\n </Flex>\n </Box>\n );\n};\n\nexport { ProfilePage };\n"],"names":["yup","profileValidation","useLocales","useAppInfo","useIntl","useTracking","useNotification","useOverlayBlocker","useNotifyAT","useThemeToggle","useFetchClient","useFocusWhenNavigate","useQuery","data","useMutation","currentTheme","email","firstname","lastname","username","preferedLanguage","auth","getFullName","jsxs","Main","jsx","Helmet","HeaderLayout","ContentLayout","LoadingIndicatorPage","Formik","Form","Button","Check","Box","Flex","React","Typography","Grid","GridItem","TextInput","Eye","EyeStriked","styled","FieldAction","pxToRem","SingleSelect","SingleSelectOption","upperFirst","GenericInput"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,MAAM,SAASA,eAAI,OAAO,EAAE,MAAMC,KAAiB,MAAA;AAMnD,MAAM,cAAc,MAAM;AACxB,QAAM,EAAE,cAAc,YAAY,IAAIC,MAAW,WAAA;AAC3C,QAAA,EAAE,uBAAuBC,aAAAA;AACzB,QAAA,EAAE,kBAAkBC,UAAAA;AACpB,QAAA,EAAE,eAAeC,aAAAA;AACvB,QAAM,qBAAqBC,aAAAA;AAC3B,QAAM,EAAE,SAAS,UAAU,IAAIC,aAAkB,kBAAA;AAC3C,QAAA,EAAE,iBAAiBC,aAAAA;AACzB,QAAM,EAAE,cAAc,QAAQ,sBAAsB,cAAA,IAAkBC,MAAAA;AACtE,QAAM,EAAE,KAAK,IAAI,IAAIC,aAAe,eAAA;AAEfC,eAAAA;AAEf,QAAA;AAAA,IACJ,WAAW;AAAA,IACX;AAAA,IACA;AAAA,EAAA,IACEC,WAAA;AAAA,IACF;AAAA,IACA,YAAY;AACV,YAAM,EAAE,MAAAC,MAAAA,IAAS,MAAM,IAAoB,iBAAiB;AAE5D,aAAOA,MAAK;AAAA,IACd;AAAA,IACA;AAAA,MACE,YAAY;AACV;AAAA,UACE,cAAc;AAAA,YACZ,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAAA,CACjB;AAAA,QAAA;AAAA,MAEL;AAAA,MACA,UAAU;AACW,2BAAA;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,EAAE,IAAI,sBAAsB,gBAAgB,mBAAmB;AAAA,QAAA,CACzE;AAAA,MACH;AAAA,IACF;AAAA,EAAA;AAGF,QAAM,EAAE,WAAW,cAAc,MAAM,QAAY,IAAAD,WAAA;AAAA,IACjD,CAAC,aAAa,aAAa;AAAA,IAC3B,YAAY;AACJ,YAAA;AAAA,QACJ,MAAM,EAAE,MAAAC,MAAK;AAAA,MAAA,IACX,MAAM,IAA0B,8BAA8B;AAE3DA,aAAAA;AAAAA,IACT;AAAA,IACA;AAAA,MACE,SAAS,OAAO,OAAO,QAAQ,OAAO,OAAO,SAAS,UAAU,KAAK;AAAA,MACrE,UAAU;AACW,2BAAA;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,EAAE,IAAI,gDAAgD;AAAA,QAAA,CAChE;AAAA,MACH;AAAA,IACF;AAAA,EAAA;AAGF,QAAM,YAAY,iBAAiB;AAOnC,QAAM,iBAAiBC,WAAA;AAAA,IAKrB,OAAO,SAAS;AACd,YAAM,EAAE,iBAAiB,kBAAkB,cAAAC,eAAc,GAAG,SAAa,IAAA;AACzE,UAAI,aAAa;AAEX,YAAA,wBAAwB,CAC5BF,UACyC;AACzC,eAAO,cAAcA;AAAAA,MAAA;AAKvB,UAAI,sBAAsB,UAAU,KAAK,WAAW,aAAa,IAAI;AAC7D,cAAA;AAAA,UACJ,UAAU;AAAA,UACV,iBAAiB;AAAA,UACjB,GAAG;AAAA,QACD,IAAA;AACS,qBAAA;AAAA,MACf;AAEA,YAAM,EAAE,MAAAA,UAAS,MAAM,IAAuB,mBAAmB,UAAU;AAE3E,aAAO,EAAE,GAAGA,MAAK,MAAM,cAAAE,cAAa;AAAA,IACtC;AAAA,IACA;AAAA,MACE,MAAM,UAAUF,OAAM;AACpB,cAAM,QAAQ;AACR,cAAA,EAAE,OAAAG,QAAO,WAAAC,YAAW,UAAAC,WAAU,UAAAC,WAAU,kBAAAC,kBAAAA,IAAqBP;AACnEQ,qBAAAA,KAAK,YAAY,EAAE,OAAAL,QAAO,WAAAC,YAAW,UAAAC,WAAU,UAAAC,WAAU,kBAAAC,kBAAkB,CAAA;AACrE,cAAA,kBAAkBP,MAAK,YAAYS,iBAAA,YAAYT,MAAK,aAAa,IAAIA,MAAK,QAAQ;AACxF,2BAAmB,eAAe;AAElC,YAAIA,MAAK,kBAAkB;AACzB,uBAAaA,MAAK,gBAAgB;AAAA,QACpC;AAGA,sBAAcA,MAAK,YAAY;AAE/B,mBAAW,iBAAiB,EAAE,SAASA,MAAK,aAAc,CAAA;AAEvC,2BAAA;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,EAAE,IAAI,8BAA8B,gBAAgB,QAAQ;AAAA,QAAA,CACtE;AAAA,MACH;AAAA,MACA,MAAM,YAAY;AAEN;MACZ;AAAA,IACF;AAAA,EAAA;AAGI,QAAA,EAAE,WAAW,iBAAqB,IAAA;AAExC,QAAM,eAAe,OACnB,MACA,EAAE,gBACC;AAEK;AAER,UAAMM,YAAW,KAAK;AACP,mBAAA;AAAA,MACb,EAAE,GAAG,MAAM,UAAAA,UAAS;AAAA,MACpB;AAAA,QACE,QAAQ,OAAO;AACP,gBAAA,MAAM,OAAO,UAAU;AAE7B,cAAI,KAAK,MAAM;AACN,mBAAA,UAAU,IAAI,IAAI;AAAA,UAC3B;AAEA,iBAAO,mBAAmB;AAAA,YACxB,MAAM;AAAA,YACN,SAAS,EAAE,IAAI,sBAAsB,gBAAgB,mBAAmB;AAAA,UAAA,CACzE;AAAA,QACH;AAAA,MACF;AAAA,IAAA;AAAA,EACF;AAGE,MAAA,aAAa,CAAC,MAAM;AAEpB,WAAAI,2BAAA,KAACC,aAAK,MAAA,EAAA,aAAU,QACd,UAAA;AAAA,MAAAC,2BAAA;AAAA,QAACC,YAAA;AAAA,QAAA;AAAA,UACC,OAAO,cAAc;AAAA,YACnB,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAAA,CACjB;AAAA,QAAA;AAAA,MACH;AAAA,MACAD,2BAAA;AAAA,QAACE,aAAA;AAAA,QAAA;AAAA,UACC,OAAO,cAAc;AAAA,YACnB,IAAI;AAAA,YACJ,gBAAgB;AAAA,UAAA,CACjB;AAAA,QAAA;AAAA,MACH;AAAA,MACCF,2BAAA,IAAAG,aAAA,eAAA,EACC,UAACH,2BAAA,IAAAI,aAAA,sBAAA,CAAqB,CAAA,GACxB;AAAA,IACF,EAAA,CAAA;AAAA,EAEJ;AAEM,QAAA,gBAAgB,SAAS,eAAe;AAC9C,QAAM,EAAE,OAAO,WAAW,UAAU,UAAU,iBAAqB,IAAA;AACnE,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,UAAU;AAAA,EAAA;AAIV,SAAAN,2BAAA,KAACC,aAAK,MAAA,EAAA,aAAW,kBACf,UAAA;AAAA,IAAAC,2BAAA;AAAA,MAACC,YAAA;AAAA,MAAA;AAAA,QACC,OAAO,cAAc;AAAA,UACnB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,MAAA;AAAA,IACH;AAAA,IACAD,2BAAA;AAAA,MAACK,OAAA;AAAA,MAAA;AAAA,QACC,UAAU;AAAA,QAEV,eAAe;AAAA,QACf,kBAAkB;AAAA,QAClB,kBAAkB;AAAA,QAClB,oBAAkB;AAAA,QAEjB,UAAC,CAAA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,YACN,OAAAd;AAAAA,YACA,WAAAC;AAAAA,YACA,UAAAC;AAAAA,YACA,UAAAC;AAAAA,YACA,kBAAAC;AAAAA,YACA,cAAAL;AAAAA,YACA,GAAG;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,MACI;AACJ,iDACGgB,mBACC,EAAA,UAAA;AAAA,YAAAN,2BAAA;AAAA,cAACE,aAAA;AAAA,cAAA;AAAA,gBACC,OAAO,KAAK,YAAYL,iBAAA,YAAY,KAAK,aAAa,IAAI,KAAK,QAAQ;AAAA,gBACvE,eACEG,2BAAA;AAAA,kBAACO,aAAA;AAAA,kBAAA;AAAA,oBACC,0CAAYC,MAAM,OAAA,EAAA;AAAA,oBAClB,SAAS;AAAA,oBACT,MAAK;AAAA,oBACL,UAAU,CAAC;AAAA,oBAEV,wBAAc,EAAE,IAAI,eAAe,gBAAgB,QAAQ;AAAA,kBAAA;AAAA,gBAC9D;AAAA,cAAA;AAAA,YAEJ;AAAA,YACCR,+BAAAS,aAAAA,KAAA,EAAI,eAAe,IAClB,UAACT,2BAAA,IAAAG,aAAA,eAAA,EACC,UAACL,2BAAA,KAAAY,mBAAA,EAAK,WAAU,UAAS,YAAW,WAAU,KAAK,GACjD,UAAA;AAAA,cAAAV,2BAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC;AAAA,kBACA,UAAU;AAAA,kBACV,QAAQ;AAAA,oBACN,WAAAR;AAAAA,oBACA,UAAAC;AAAAA,oBACA,UAAAC;AAAAA,oBACA,OAAAH;AAAAA,kBACF;AAAA,gBAAA;AAAA,cACF;AAAA,cACC,CAAC,iBACAS,2BAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC;AAAA,kBACA,UAAU;AAAA,kBACV,QAAQ;AAAA,gBAAA;AAAA,cACV;AAAA,cAEFA,2BAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC;AAAA,kBACA,UAAU;AAAA,kBACV,QAAQ;AAAA,oBACN,kBAAAL;AAAAA,oBACA,cAAAL;AAAAA,kBACF;AAAA,kBACA;AAAA,gBAAA;AAAA,cACF;AAAA,YAAA,EACF,CAAA,EACF,CAAA,GACF;AAAA,UACF,EAAA,CAAA;AAAA,QAEJ;AAAA,MAAA;AAAA,IACF;AAAA,EACF,EAAA,CAAA;AAEJ;AAgBA,MAAM,kBAAkB,CAAC,EAAE,QAAQ,UAAU,aAAmC;AACxE,QAAA,EAAE,kBAAkBX,UAAAA;AAC1B,QAAM,CAAC,sBAAsB,uBAAuB,IAAIgC,iBAAM,SAAS,KAAK;AAC5E,QAAM,CAAC,eAAe,gBAAgB,IAAIA,iBAAM,SAAS,KAAK;AAC9D,QAAM,CAAC,sBAAsB,uBAAuB,IAAIA,iBAAM,SAAS,KAAK;AAG1E,SAAAX,2BAAA;AAAA,IAACS,aAAA;AAAA,IAAA;AAAA,MACC,YAAW;AAAA,MACX,WAAS;AAAA,MACT,QAAO;AAAA,MACP,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,aAAa;AAAA,MACb,cAAc;AAAA,MAEd,0CAACC,mBAAK,EAAA,WAAU,UAAS,YAAW,WAAU,KAAK,GACjD,UAAA;AAAA,QAAAV,+BAACY,aAAAA,YAAW,EAAA,SAAQ,SAAQ,IAAG,MAC5B,UAAc,cAAA;AAAA,UACb,IAAI;AAAA,UACJ,gBAAgB;AAAA,QACjB,CAAA,GACH;AAAA,QACAZ,2BAAAA,IAACa,aAAAA,QAAK,KAAK,GACT,yCAACC,uBAAS,EAAA,GAAG,IAAI,KAAK,GACpB,UAAAd,2BAAA;AAAA,UAACe,aAAA;AAAA,UAAA;AAAA,YACC,OACE,OAAO,kBACH,cAAc;AAAA,cACZ,IAAI,OAAO;AAAA,cACX,gBAAgB,OAAO;AAAA,YACxB,CAAA,IACD;AAAA,YAEN;AAAA,YACA,OAAO,OAAO;AAAA,YACd,OAAO,cAAc;AAAA,cACnB,IAAI;AAAA,cACJ,gBAAgB;AAAA,YAAA,CACjB;AAAA,YACD,MAAK;AAAA,YACL,MAAM,uBAAuB,SAAS;AAAA,YACtC,WACEf,2BAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAgB;AACM,0CAAA,CAAC,SAAS,CAAC,IAAI;AAAA,gBACzC;AAAA,gBACA,OAAO;AAAA,kBACL,uBACI;AAAA,oBACE,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAAA,IAElB;AAAA,oBACE,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAClB;AAAA,gBACN;AAAA,gBAEC,UAAuB,uBAAAA,2BAAAA,IAACgB,MAAI,KAAA,CAAA,CAAA,mCAAMC,MAAW,YAAA,EAAA;AAAA,cAAA;AAAA,YAChD;AAAA,UAAA;AAAA,WAGN,EACF,CAAA;AAAA,QACAnB,2BAAAA,KAACe,aAAAA,MAAK,EAAA,KAAK,GACT,UAAA;AAAA,UAAAb,2BAAA,IAACc,aAAS,UAAA,EAAA,GAAG,IAAI,KAAK,GACpB,UAAAd,2BAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OACE,OAAO,WACH,cAAc;AAAA,gBACZ,IAAI,OAAO;AAAA,gBACX,gBAAgB,OAAO;AAAA,cACxB,CAAA,IACD;AAAA,cAEN;AAAA,cACA,OAAO,OAAO;AAAA,cACd,OAAO,cAAc;AAAA,gBACnB,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAAA,CACjB;AAAA,cACD,MAAK;AAAA,cACL,MAAM,gBAAgB,SAAS;AAAA,cAC/B,cAAa;AAAA,cACb,WACEA,2BAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,SAAS,CAAC,MAAM;AACd,sBAAE,gBAAgB;AACD,qCAAA,CAAC,SAAS,CAAC,IAAI;AAAA,kBAClC;AAAA,kBACA,OAAO;AAAA,oBACL,gBACI;AAAA,sBACE,IAAI;AAAA,sBACJ,gBAAgB;AAAA,oBAAA,IAElB;AAAA,sBACE,IAAI;AAAA,sBACJ,gBAAgB;AAAA,oBAClB;AAAA,kBACN;AAAA,kBAEC,UAAgB,gBAAAA,2BAAAA,IAACgB,MAAI,KAAA,CAAA,CAAA,mCAAMC,MAAW,YAAA,EAAA;AAAA,gBAAA;AAAA,cACzC;AAAA,YAAA;AAAA,UAAA,GAGN;AAAA,UACCjB,2BAAA,IAAAc,aAAA,UAAA,EAAS,GAAG,IAAI,KAAK,GACpB,UAAAd,2BAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OACE,OAAO,kBACH,cAAc;AAAA,gBACZ,IAAI,OAAO;AAAA,gBACX,gBAAgB,OAAO;AAAA,cACxB,CAAA,IACD;AAAA,cAEN;AAAA,cACA,OAAO,OAAO;AAAA,cACd,OAAO,cAAc;AAAA,gBACnB,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAAA,CACjB;AAAA,cACD,MAAK;AAAA,cACL,MAAM,uBAAuB,SAAS;AAAA,cACtC,cAAa;AAAA,cACb,WACEA,2BAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,SAAS,CAAC,MAAM;AACd,sBAAE,gBAAgB;AACM,4CAAA,CAAC,SAAS,CAAC,IAAI;AAAA,kBACzC;AAAA,kBACA,OAAO;AAAA,oBACL,uBACI;AAAA,sBACE,IAAI;AAAA,sBACJ,gBAAgB;AAAA,oBAAA,IAElB;AAAA,sBACE,IAAI;AAAA,sBACJ,gBAAgB;AAAA,oBAClB;AAAA,kBACN;AAAA,kBAEC,UAAuB,uBAAAA,2BAAAA,IAACgB,MAAI,KAAA,CAAA,CAAA,mCAAMC,MAAW,YAAA,EAAA;AAAA,gBAAA;AAAA,cAChD;AAAA,YAAA;AAAA,UAAA,GAGN;AAAA,QAAA,GACF;AAAA,MAAA,GACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,MAAM,gBAAgBC,gBAAAA,QAAOH,aAAAA,SAAS;AAAA;AAAA;AAAA;AAAA;AAOtC,MAAM,qBAAqBG,gBAAAA,QAAOC,aAAAA,WAAW;AAAA;AAAA,cAE/BC,aAAAA,QAAQ,EAAE,CAAC;AAAA,aACZA,aAAAA,QAAQ,EAAE,CAAC;AAAA;AAAA,cAEV,CAAC,EAAE,MAAA,MAAY,MAAM,OAAO,UAAU;AAAA;AAAA;AAAA;AAkBpD,MAAM,qBAAqB,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB,CAAC;AAC1B,MAA+B;AACvB,QAAA,EAAE,kBAAkBzC,UAAAA;AAC1B,QAAM,kBAAkB,OAAO,KAAK,oBAAoB,EAAE;AAAA,IACxD,CAAC,cAAc,qBAAqB,SAA2D;AAAA,EAAA;AAI/F,SAAAqB,2BAAA;AAAA,IAACS,aAAA;AAAA,IAAA;AAAA,MACC,YAAW;AAAA,MACX,WAAS;AAAA,MACT,QAAO;AAAA,MACP,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,aAAa;AAAA,MACb,cAAc;AAAA,MAEd,0CAACC,mBAAK,EAAA,WAAU,UAAS,YAAW,WAAU,KAAK,GACjD,UAAA;AAAA,QAAAZ,gCAACY,aAAAA,QAAK,WAAU,UAAS,YAAW,WAAU,KAAK,GACjD,UAAA;AAAA,UAAAV,+BAACY,aAAAA,YAAW,EAAA,SAAQ,SAAQ,IAAG,MAC5B,UAAc,cAAA;AAAA,YACb,IAAI;AAAA,YACJ,gBAAgB;AAAA,UACjB,CAAA,GACH;AAAA,yCACCA,aAAAA,YACE,EAAA,UAAA;AAAA,YACC;AAAA,cACE,IAAI;AAAA,cACJ,gBACE;AAAA,YACJ;AAAA,YACA;AAAA,cACE,MACEZ,2BAAA;AAAA,gBAACS,aAAA;AAAA,gBAAA;AAAA,kBACC,IAAG;AAAA,kBACH,OAAM;AAAA,kBACN,QAAO;AAAA,kBACP,KAAI;AAAA,kBACJ,MAAK;AAAA,kBAEJ,UAAc,cAAA;AAAA,oBACb,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAAA,CACjB;AAAA,gBAAA;AAAA,cACH;AAAA,YAEJ;AAAA,UAAA,GAEJ;AAAA,QAAA,GACF;AAAA,QACAX,2BAAAA,KAACe,aAAAA,MAAK,EAAA,KAAK,GACT,UAAA;AAAA,UAAAb,2BAAA,IAACc,aAAS,UAAA,EAAA,GAAG,IAAI,KAAK,GACpB,UAAAd,2BAAA;AAAA,YAACqB,aAAA;AAAA,YAAA;AAAA,cACC,OAAO,cAAc;AAAA,gBACnB,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAAA,CACjB;AAAA,cACD,aAAa,cAAc;AAAA,gBACzB,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAAA,CACjB;AAAA,cACD,MAAM,cAAc;AAAA,gBAClB,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAAA,CACjB;AAAA,cACD,SAAS,MAAM;AACJ,yBAAA;AAAA,kBACP,QAAQ,EAAE,MAAM,oBAAoB,OAAO,KAAK;AAAA,gBAAA,CACjD;AAAA,cACH;AAAA,cACA,YAAY,cAAc;AAAA,gBACxB,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAAA,CACjB;AAAA,cACD,OAAO,OAAO;AAAA,cACd,UAAU,CAAC,MAAM;AACN,yBAAA;AAAA,kBACP,QAAQ,EAAE,MAAM,oBAAoB,OAAO,EAAE;AAAA,gBAAA,CAC9C;AAAA,cACH;AAAA,cAEC,iBAAO,QAAQ,WAAW,EAAE,IAAI,CAAC,CAAC,UAAU,QAAQ,qCAClDC,aAAAA,oBAAmB,EAAA,OAAO,UACxB,UAAA,SAAA,GADuC,QAE1C,CACD;AAAA,YAAA;AAAA,UAAA,GAEL;AAAA,UACCtB,2BAAA,IAAAc,aAAA,UAAA,EAAS,GAAG,IAAI,KAAK,GACpB,UAAAhB,2BAAA;AAAA,YAACuB,aAAA;AAAA,YAAA;AAAA,cACC,OAAO,cAAc;AAAA,gBACnB,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAAA,CACjB;AAAA,cACD,aAAa,cAAc;AAAA,gBACzB,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAAA,CACjB;AAAA,cACD,MAAM,cAAc;AAAA,gBAClB,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAAA,CACjB;AAAA,cACD,OAAO,OAAO;AAAA,cACd,UAAU,CAAC,MAAM;AACN,yBAAA;AAAA,kBACP,QAAQ,EAAE,MAAM,gBAAgB,OAAO,EAAE;AAAA,gBAAA,CAC1C;AAAA,cACH;AAAA,cAEA,UAAA;AAAA,gBAACrB,2BAAA,IAAAsB,aAAA,oBAAA,EAAmB,OAAM,UACvB,UAAc,cAAA;AAAA,kBACb,IAAI;AAAA,kBACJ,gBAAgB;AAAA,gBACjB,CAAA,GACH;AAAA,gBACC,gBAAgB,IAAI,CAAC,UACnBtB,2BAAA,IAAAsB,aAAA,oBAAA,EAAmB,OAAO,OACxB,UAAA;AAAA,kBACC;AAAA,oBACE,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAClB;AAAA,kBACA;AAAA,oBACE,MAAM,cAAc;AAAA,sBAClB,IAAI;AAAA,sBACJ,gBAAgBC,4BAAW,KAAK;AAAA,oBAAA,CACjC;AAAA,kBACH;AAAA,gBAAA,EACF,GAZqC,KAavC,CACD;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA,GAEL;AAAA,QAAA,GACF;AAAA,MAAA,GACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAgBA,MAAM,kBAAkB,CAAC,EAAE,QAAQ,UAAU,aAAmC;AACxE,QAAA,EAAE,kBAAkB5C,UAAAA;AAGxB,SAAAqB,2BAAA;AAAA,IAACS,aAAA;AAAA,IAAA;AAAA,MACC,YAAW;AAAA,MACX,WAAS;AAAA,MACT,QAAO;AAAA,MACP,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,aAAa;AAAA,MACb,cAAc;AAAA,MAEd,0CAACC,mBAAK,EAAA,WAAU,UAAS,YAAW,WAAU,KAAK,GACjD,UAAA;AAAA,QAAAV,+BAACY,aAAAA,YAAW,EAAA,SAAQ,SAAQ,IAAG,MAC5B,UAAc,cAAA;AAAA,UACb,IAAI;AAAA,UACJ,gBAAgB;AAAA,QACjB,CAAA,GACH;AAAA,QACAd,2BAAAA,KAACe,aAAAA,MAAK,EAAA,KAAK,GACT,UAAA;AAAA,UAAAb,2BAAA,IAACc,aAAS,UAAA,EAAA,GAAG,IAAI,KAAK,GACpB,UAAAd,2BAAA;AAAA,YAACwB,aAAA;AAAA,YAAA;AAAA,cACC,WAAW;AAAA,gBACT,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAClB;AAAA,cACA,OAAO,OAAO;AAAA,cACd;AAAA,cACA,OAAO,OAAO;AAAA,cACd,MAAK;AAAA,cACL,MAAK;AAAA,cACL,UAAQ;AAAA,YAAA;AAAA,UAAA,GAEZ;AAAA,UACCxB,2BAAA,IAAAc,aAAA,UAAA,EAAS,GAAG,IAAI,KAAK,GACpB,UAAAd,2BAAA;AAAA,YAACwB,aAAA;AAAA,YAAA;AAAA,cACC,WAAW;AAAA,gBACT,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAClB;AAAA,cACA,OAAO,OAAO;AAAA,cACd;AAAA,cACA,OAAO,OAAO;AAAA,cACd,MAAK;AAAA,cACL,MAAK;AAAA,YAAA;AAAA,UAAA,GAET;AAAA,UACCxB,2BAAA,IAAAc,aAAA,UAAA,EAAS,GAAG,IAAI,KAAK,GACpB,UAAAd,2BAAA;AAAA,YAACwB,aAAA;AAAA,YAAA;AAAA,cACC,WAAW,EAAE,IAAI,yBAAyB,gBAAgB,QAAQ;AAAA,cAClE,OAAO,OAAO;AAAA,cACd;AAAA,cACA,OAAO,OAAO;AAAA,cACd,MAAK;AAAA,cACL,MAAK;AAAA,cACL,UAAQ;AAAA,YAAA;AAAA,UAAA,GAEZ;AAAA,UACCxB,2BAAA,IAAAc,aAAA,UAAA,EAAS,GAAG,IAAI,KAAK,GACpB,UAAAd,2BAAA;AAAA,YAACwB,aAAA;AAAA,YAAA;AAAA,cACC,WAAW;AAAA,gBACT,IAAI;AAAA,gBACJ,gBAAgB;AAAA,cAClB;AAAA,cACA,OAAO,OAAO;AAAA,cACd;AAAA,cACA,OAAO,OAAO;AAAA,cACd,MAAK;AAAA,cACL,MAAK;AAAA,YAAA;AAAA,UAAA,GAET;AAAA,QAAA,GACF;AAAA,MAAA,GACF;AAAA,IAAA;AAAA,EAAA;AAGN;;"}
@@ -10,8 +10,8 @@ import { useIntl } from "react-intl";
10
10
  import { useQuery, useMutation } from "react-query";
11
11
  import styled from "styled-components";
12
12
  import * as yup from "yup";
13
- import { M as useLocales, P as useThemeToggle } from "./index-3c67c00b.mjs";
14
- import { g as getFullName } from "./AuthenticatedApp-722b2e84.mjs";
13
+ import { M as useLocales, P as useThemeToggle } from "./index-8933483b.mjs";
14
+ import { g as getFullName } from "./AuthenticatedApp-bb31f306.mjs";
15
15
  import { s as schema$1 } from "./edit-923cefa0.mjs";
16
16
  import "react-dom/client";
17
17
  import "invariant";
@@ -639,4 +639,4 @@ const UserInfoSection = ({ errors, onChange, values }) => {
639
639
  export {
640
640
  ProfilePage
641
641
  };
642
- //# sourceMappingURL=ProfilePage-a2f0366d.mjs.map
642
+ //# sourceMappingURL=ProfilePage-ef400907.mjs.map