@firecms/core 3.0.0-canary.16 → 3.0.0-canary.161

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 (329) hide show
  1. package/README.md +3 -3
  2. package/dist/app/AppBar.d.ts +12 -0
  3. package/dist/app/Drawer.d.ts +16 -0
  4. package/dist/app/Scaffold.d.ts +30 -0
  5. package/dist/app/index.d.ts +4 -0
  6. package/dist/app/useApp.d.ts +16 -0
  7. package/dist/components/ArrayContainer.d.ts +19 -6
  8. package/dist/components/CircularProgressCenter.d.ts +1 -1
  9. package/dist/components/ClearFilterSortButton.d.ts +5 -0
  10. package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
  11. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +11 -12
  12. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +1 -1
  13. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +7 -5
  14. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
  15. package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
  16. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
  17. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  18. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  19. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +7 -4
  20. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +12 -2
  21. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  22. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  23. package/dist/components/EntityPreview.d.ts +7 -6
  24. package/dist/components/ErrorView.d.ts +1 -1
  25. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  26. package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
  27. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  28. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  29. package/dist/components/ReferenceWidget.d.ts +3 -1
  30. package/dist/components/SelectableTable/SelectableTable.d.ts +1 -1
  31. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  32. package/dist/components/VirtualTable/VirtualTableProps.d.ts +15 -12
  33. package/dist/components/VirtualTable/types.d.ts +3 -3
  34. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -1
  35. package/dist/components/common/index.d.ts +1 -0
  36. package/dist/components/common/table_height.d.ts +5 -0
  37. package/dist/components/common/types.d.ts +4 -6
  38. package/dist/components/common/useColumnsIds.d.ts +2 -1
  39. package/dist/components/common/useDataSourceEntityCollectionTableController.d.ts +4 -1
  40. package/dist/components/index.d.ts +4 -2
  41. package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
  42. package/dist/core/DefaultDrawer.d.ts +19 -0
  43. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  44. package/dist/core/EntityEditView.d.ts +18 -4
  45. package/dist/core/FireCMS.d.ts +2 -2
  46. package/dist/core/NavigationRoutes.d.ts +3 -3
  47. package/dist/core/index.d.ts +3 -4
  48. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  49. package/dist/form/components/ErrorFocus.d.ts +1 -1
  50. package/dist/form/components/FieldHelperText.d.ts +3 -3
  51. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  52. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  53. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  54. package/dist/form/components/index.d.ts +1 -1
  55. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  56. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  57. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  58. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  59. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  60. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  61. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  62. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  63. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  64. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  65. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  66. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
  67. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  68. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  69. package/dist/form/index.d.ts +3 -5
  70. package/dist/form/useClearRestoreValue.d.ts +2 -2
  71. package/dist/hooks/data/delete.d.ts +4 -4
  72. package/dist/hooks/data/save.d.ts +4 -5
  73. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  74. package/dist/hooks/data/useEntityFetch.d.ts +3 -3
  75. package/dist/hooks/index.d.ts +1 -0
  76. package/dist/hooks/useAuthController.d.ts +1 -1
  77. package/dist/hooks/useBuildNavigationController.d.ts +3 -4
  78. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  79. package/dist/hooks/useProjectLog.d.ts +8 -2
  80. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  81. package/dist/hooks/useValidateAuthenticator.d.ts +5 -9
  82. package/dist/index.d.ts +1 -0
  83. package/dist/index.es.js +20199 -14111
  84. package/dist/index.es.js.map +1 -1
  85. package/dist/index.umd.js +22769 -588
  86. package/dist/index.umd.js.map +1 -1
  87. package/dist/internal/useBuildDataSource.d.ts +1 -16
  88. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  89. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  90. package/dist/preview/components/ReferencePreview.d.ts +3 -2
  91. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  92. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  93. package/dist/preview/util.d.ts +3 -3
  94. package/dist/types/auth.d.ts +8 -10
  95. package/dist/types/collections.d.ts +53 -18
  96. package/dist/types/datasource.d.ts +51 -35
  97. package/dist/types/entities.d.ts +6 -1
  98. package/dist/types/entity_actions.d.ts +18 -4
  99. package/dist/types/entity_callbacks.d.ts +16 -16
  100. package/dist/types/entity_overrides.d.ts +2 -2
  101. package/dist/types/export_import.d.ts +4 -4
  102. package/dist/types/fields.d.ts +63 -41
  103. package/dist/types/firecms.d.ts +6 -2
  104. package/dist/types/firecms_context.d.ts +1 -1
  105. package/dist/types/index.d.ts +0 -1
  106. package/dist/types/navigation.d.ts +6 -5
  107. package/dist/types/permissions.d.ts +4 -4
  108. package/dist/types/plugins.d.ts +22 -12
  109. package/dist/types/properties.d.ts +34 -21
  110. package/dist/types/property_config.d.ts +0 -2
  111. package/dist/types/side_dialogs_controller.d.ts +10 -0
  112. package/dist/types/storage.d.ts +86 -3
  113. package/dist/types/user.d.ts +1 -0
  114. package/dist/util/builders.d.ts +2 -2
  115. package/dist/util/entities.d.ts +2 -2
  116. package/dist/util/icon_list.d.ts +5 -1
  117. package/dist/util/icon_synonyms.d.ts +1 -98
  118. package/dist/util/icons.d.ts +6 -3
  119. package/dist/util/index.d.ts +1 -0
  120. package/dist/util/navigation_utils.d.ts +2 -2
  121. package/dist/util/objects.d.ts +2 -1
  122. package/dist/util/permissions.d.ts +4 -4
  123. package/dist/util/plurals.d.ts +0 -2
  124. package/dist/util/property_utils.d.ts +3 -3
  125. package/dist/util/resolutions.d.ts +30 -16
  126. package/dist/util/storage.d.ts +23 -2
  127. package/dist/util/useStorageUploadController.d.ts +3 -3
  128. package/package.json +59 -44
  129. package/src/app/AppBar.tsx +18 -0
  130. package/src/app/Drawer.tsx +24 -0
  131. package/src/app/Scaffold.tsx +243 -0
  132. package/src/app/index.ts +4 -0
  133. package/src/app/useApp.tsx +32 -0
  134. package/src/components/ArrayContainer.tsx +92 -25
  135. package/src/components/CircularProgressCenter.tsx +2 -2
  136. package/src/components/ClearFilterSortButton.tsx +41 -0
  137. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +3 -3
  138. package/src/components/DeleteEntityDialog.tsx +9 -18
  139. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +13 -20
  140. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +28 -25
  141. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +12 -8
  142. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -39
  143. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  144. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +31 -17
  145. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +19 -17
  146. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +30 -35
  147. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
  148. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +20 -8
  149. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +84 -77
  150. package/src/components/EntityCollectionView/EntityCollectionView.tsx +139 -87
  151. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  152. package/src/components/EntityCollectionView/useSelectionController.tsx +19 -7
  153. package/src/components/EntityCollectionView/utils.ts +19 -0
  154. package/src/components/EntityPreview.tsx +60 -51
  155. package/src/components/EntityView.tsx +10 -10
  156. package/src/components/ErrorView.tsx +4 -4
  157. package/src/components/HomePage/DefaultHomePage.tsx +26 -19
  158. package/src/components/HomePage/FavouritesView.tsx +6 -11
  159. package/src/components/HomePage/NavigationCard.tsx +4 -4
  160. package/src/components/HomePage/NavigationCardBinding.tsx +5 -10
  161. package/src/components/HomePage/NavigationGroup.tsx +2 -2
  162. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  163. package/src/components/PropertyConfigBadge.tsx +9 -3
  164. package/src/components/PropertyIdCopyTooltip.tsx +48 -0
  165. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +8 -7
  166. package/src/components/ReferenceWidget.tsx +22 -12
  167. package/src/components/SearchIconsView.tsx +10 -7
  168. package/src/components/SelectableTable/SelectableTable.tsx +9 -9
  169. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  170. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
  171. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +30 -6
  172. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +92 -23
  173. package/src/components/VirtualTable/VirtualTable.tsx +77 -46
  174. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  175. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  176. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  177. package/src/components/VirtualTable/VirtualTableProps.tsx +18 -14
  178. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  179. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  180. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -1
  181. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  182. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  183. package/src/components/VirtualTable/types.tsx +2 -3
  184. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +8 -4
  185. package/src/components/common/index.ts +1 -0
  186. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  187. package/src/components/common/types.tsx +4 -6
  188. package/src/components/common/useColumnsIds.tsx +23 -2
  189. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +25 -14
  190. package/src/components/common/useTableSearchHelper.ts +53 -12
  191. package/src/components/index.tsx +4 -2
  192. package/src/contexts/DialogsProvider.tsx +2 -2
  193. package/src/contexts/SnackbarProvider.tsx +2 -0
  194. package/src/core/DefaultAppBar.tsx +178 -0
  195. package/src/core/DefaultDrawer.tsx +184 -0
  196. package/src/core/DrawerNavigationItem.tsx +66 -0
  197. package/src/core/EntityEditView.tsx +721 -156
  198. package/src/core/EntitySidePanel.tsx +1 -2
  199. package/src/core/FireCMS.tsx +57 -53
  200. package/src/core/NavigationRoutes.tsx +7 -8
  201. package/src/core/SideDialogs.tsx +2 -1
  202. package/src/core/field_configs.tsx +11 -12
  203. package/src/core/index.tsx +3 -4
  204. package/src/form/PropertyFieldBinding.tsx +74 -35
  205. package/src/form/components/CustomIdField.tsx +6 -2
  206. package/src/form/components/FieldHelperText.tsx +4 -4
  207. package/src/form/components/LabelWithIcon.tsx +27 -19
  208. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  209. package/src/form/components/StorageItemPreview.tsx +22 -12
  210. package/src/form/components/StorageUploadProgress.tsx +3 -4
  211. package/src/form/components/index.tsx +1 -1
  212. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +29 -17
  213. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +45 -35
  214. package/src/form/field_bindings/BlockFieldBinding.tsx +53 -33
  215. package/src/form/field_bindings/DateTimeFieldBinding.tsx +17 -14
  216. package/src/form/field_bindings/KeyValueFieldBinding.tsx +60 -51
  217. package/src/form/field_bindings/MapFieldBinding.tsx +67 -48
  218. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +150 -0
  219. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
  220. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  221. package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
  222. package/src/form/field_bindings/RepeatFieldBinding.tsx +52 -34
  223. package/src/form/field_bindings/SelectFieldBinding.tsx +22 -14
  224. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +37 -47
  225. package/src/form/field_bindings/SwitchFieldBinding.tsx +28 -24
  226. package/src/form/field_bindings/TextFieldBinding.tsx +27 -24
  227. package/src/form/index.tsx +4 -9
  228. package/src/form/useClearRestoreValue.tsx +2 -2
  229. package/src/form/validation.ts +1 -17
  230. package/src/hooks/data/delete.ts +6 -5
  231. package/src/hooks/data/save.ts +12 -8
  232. package/src/hooks/data/useCollectionFetch.tsx +2 -2
  233. package/src/hooks/data/useDataSource.tsx +11 -3
  234. package/src/hooks/data/useEntityFetch.tsx +5 -5
  235. package/src/hooks/index.tsx +1 -0
  236. package/src/hooks/useAuthController.tsx +1 -1
  237. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  238. package/src/hooks/useBuildModeController.tsx +11 -5
  239. package/src/hooks/useBuildNavigationController.tsx +93 -34
  240. package/src/hooks/useFireCMSContext.tsx +5 -5
  241. package/src/hooks/useProjectLog.tsx +32 -10
  242. package/src/hooks/useResolvedNavigationFrom.tsx +6 -6
  243. package/src/hooks/useValidateAuthenticator.tsx +21 -41
  244. package/src/index.ts +1 -0
  245. package/src/internal/useBuildDataSource.ts +72 -82
  246. package/src/internal/useBuildSideDialogsController.tsx +1 -0
  247. package/src/internal/useBuildSideEntityController.tsx +102 -22
  248. package/src/internal/useUnsavedChangesDialog.tsx +5 -3
  249. package/src/preview/PropertyPreview.tsx +11 -18
  250. package/src/preview/PropertyPreviewProps.tsx +7 -1
  251. package/src/preview/components/BooleanPreview.tsx +2 -2
  252. package/src/preview/components/EmptyValue.tsx +1 -1
  253. package/src/preview/components/EnumValuesChip.tsx +2 -2
  254. package/src/preview/components/ImagePreview.tsx +25 -36
  255. package/src/preview/components/ReferencePreview.tsx +23 -34
  256. package/src/preview/components/StorageThumbnail.tsx +5 -1
  257. package/src/preview/components/UrlComponentPreview.tsx +44 -11
  258. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
  259. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
  260. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
  261. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
  262. package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
  263. package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
  264. package/src/preview/property_previews/MapPropertyPreview.tsx +9 -9
  265. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
  266. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  267. package/src/preview/util.ts +10 -10
  268. package/src/types/auth.tsx +9 -13
  269. package/src/types/collections.ts +62 -20
  270. package/src/types/customization_controller.tsx +0 -1
  271. package/src/types/datasource.ts +60 -43
  272. package/src/types/entities.ts +11 -1
  273. package/src/types/entity_actions.tsx +20 -7
  274. package/src/types/entity_callbacks.ts +18 -18
  275. package/src/types/entity_overrides.tsx +2 -2
  276. package/src/types/export_import.ts +4 -4
  277. package/src/types/fields.tsx +69 -45
  278. package/src/types/firecms.tsx +7 -2
  279. package/src/types/firecms_context.tsx +1 -1
  280. package/src/types/index.ts +0 -1
  281. package/src/types/navigation.ts +7 -7
  282. package/src/types/permissions.ts +5 -5
  283. package/src/types/plugins.tsx +24 -14
  284. package/src/types/properties.ts +39 -22
  285. package/src/types/property_config.tsx +0 -2
  286. package/src/types/side_dialogs_controller.tsx +13 -0
  287. package/src/types/storage.ts +94 -3
  288. package/src/types/user.ts +2 -0
  289. package/src/util/builders.ts +6 -6
  290. package/src/util/entities.ts +6 -5
  291. package/src/util/enums.ts +1 -1
  292. package/src/util/icon_list.ts +16 -10
  293. package/src/util/icon_synonyms.ts +3 -100
  294. package/src/util/icons.tsx +17 -7
  295. package/src/util/index.ts +1 -0
  296. package/src/util/make_properties_editable.ts +13 -5
  297. package/src/util/navigation_utils.ts +6 -6
  298. package/src/util/objects.ts +45 -28
  299. package/src/util/permissions.ts +9 -8
  300. package/src/util/plurals.ts +0 -2
  301. package/src/util/property_utils.tsx +11 -4
  302. package/src/util/references.ts +11 -2
  303. package/src/util/resolutions.ts +79 -46
  304. package/src/util/storage.ts +79 -21
  305. package/src/util/strings.ts +2 -2
  306. package/src/util/useStorageUploadController.tsx +34 -8
  307. package/src/util/useTraceUpdate.tsx +1 -0
  308. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  309. package/dist/components/VirtualTable/common.d.ts +0 -2
  310. package/dist/core/Drawer.d.ts +0 -23
  311. package/dist/core/Scaffold.d.ts +0 -55
  312. package/dist/core/SideEntityView.d.ts +0 -7
  313. package/dist/form/EntityForm.d.ts +0 -77
  314. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  315. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  316. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  317. package/dist/internal/useLocaleConfig.d.ts +0 -1
  318. package/dist/types/appcheck.d.ts +0 -26
  319. package/src/components/FireCMSAppBar.tsx +0 -165
  320. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  321. package/src/core/Drawer.tsx +0 -191
  322. package/src/core/Scaffold.tsx +0 -281
  323. package/src/core/SideEntityView.tsx +0 -38
  324. package/src/form/EntityForm.tsx +0 -728
  325. package/src/form/components/FormikArrayContainer.tsx +0 -44
  326. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  327. package/src/internal/useBuildCustomizationController.tsx +0 -5
  328. package/src/internal/useLocaleConfig.tsx +0 -18
  329. package/src/types/appcheck.ts +0 -29
@@ -60,7 +60,7 @@ export interface CollectionFetchResult<M extends Record<string, any>> {
60
60
  * @param searchString
61
61
  * @group Hooks and utilities
62
62
  */
63
- export function useCollectionFetch<M extends Record<string, any>, UserType extends User>(
63
+ export function useCollectionFetch<M extends Record<string, any>, USER extends User>(
64
64
  {
65
65
  path: inputPath,
66
66
  collection,
@@ -78,7 +78,7 @@ export function useCollectionFetch<M extends Record<string, any>, UserType exten
78
78
  const sortByProperty = sortBy ? sortBy[0] : undefined;
79
79
  const currentSort = sortBy ? sortBy[1] : undefined;
80
80
 
81
- const context: FireCMSContext<UserType> = useFireCMSContext();
81
+ const context: FireCMSContext<USER> = useFireCMSContext();
82
82
 
83
83
  const [data, setData] = useState<Entity<M>[]>([]);
84
84
 
@@ -1,4 +1,4 @@
1
- import { useContext, useMemo } from "react";
1
+ import { useContext } from "react";
2
2
  import { DataSource, EntityCollection } from "../../types";
3
3
  import { DataSourceContext } from "../../contexts/DataSourceContext";
4
4
 
@@ -7,8 +7,16 @@ import { DataSourceContext } from "../../contexts/DataSourceContext";
7
7
  * @group Hooks and utilities
8
8
  */
9
9
  export const useDataSource = (collection?: EntityCollection<any, any>): DataSource => {
10
+ // const customizationController = useCustomizationController();
11
+ // const navigationController = useNavigationController();
10
12
  const defaultDataSource = useContext(DataSourceContext);
11
- if (collection?.overrides?.dataSource)
12
- return collection?.overrides.dataSource;
13
+ // if (collection?.overrides?.dataSourceDelegate) {
14
+ // console.trace("Using custom data source for collection " + collection.id);
15
+ // return useBuildDataSource({
16
+ // delegate: collection.overrides.dataSourceDelegate,
17
+ // propertyConfigs: customizationController?.propertyConfigs,
18
+ // navigationController: navigationController
19
+ // });
20
+ // }
13
21
  return defaultDataSource;
14
22
  };
@@ -7,10 +7,10 @@ import { useFireCMSContext } from "../useFireCMSContext";
7
7
  /**
8
8
  * @group Hooks and utilities
9
9
  */
10
- export interface EntityFetchProps<M extends Record<string, any>, UserType extends User = User> {
10
+ export interface EntityFetchProps<M extends Record<string, any>, USER extends User = User> {
11
11
  path: string;
12
12
  entityId?: string;
13
- collection: EntityCollection<M, UserType>;
13
+ collection: EntityCollection<M, USER>;
14
14
  useCache?: boolean;
15
15
  }
16
16
 
@@ -35,20 +35,20 @@ const CACHE: Record<string, Entity<any> | undefined> = {};
35
35
  * @group Hooks and utilities
36
36
  */
37
37
 
38
- export function useEntityFetch<M extends Record<string, any>, UserType extends User>(
38
+ export function useEntityFetch<M extends Record<string, any>, USER extends User>(
39
39
  {
40
40
  path: inputPath,
41
41
  entityId,
42
42
  collection,
43
43
  useCache = false
44
- }: EntityFetchProps<M, UserType>): EntityFetchResult<M> {
44
+ }: EntityFetchProps<M, USER>): EntityFetchResult<M> {
45
45
 
46
46
  const dataSource = useDataSource(collection);
47
47
  const navigationController = useNavigationController();
48
48
 
49
49
  const path = navigationController.resolveAliasesFrom(inputPath);
50
50
 
51
- const context: FireCMSContext<UserType> = useFireCMSContext();
51
+ const context: FireCMSContext<USER> = useFireCMSContext();
52
52
 
53
53
  const [entity, setEntity] = useState<Entity<M> | undefined>();
54
54
  const [dataLoading, setDataLoading] = useState<boolean>(true);
@@ -10,6 +10,7 @@ export * from "./useResolvedNavigationFrom";
10
10
 
11
11
  export * from "./useStorageSource";
12
12
  export * from "./useAuthController";
13
+ export * from "./useDialogsController";
13
14
  export * from "./useSideDialogsController";
14
15
  export * from "./useSideEntityController";
15
16
  export * from "./useFireCMSContext";
@@ -11,4 +11,4 @@ import { AuthControllerContext } from "../contexts/AuthControllerContext";
11
11
  * @see AuthController
12
12
  * @group Hooks and utilities
13
13
  */
14
- export const useAuthController = <UserType extends User = User, AuthControllerType extends AuthController<UserType> = AuthController<UserType>>(): AuthControllerType => useContext(AuthControllerContext) as AuthControllerType;
14
+ export const useAuthController = <USER extends User = User, AuthControllerType extends AuthController<USER> = AuthController<USER>>(): AuthControllerType => useContext(AuthControllerContext) as AuthControllerType;
@@ -1,10 +1,10 @@
1
- import { useCallback, useEffect, useState } from "react";
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
2
  import { PartialEntityCollection, UserConfigurationPersistence } from "../types";
3
3
  import { mergeDeep, stripCollectionPath } from "../util";
4
4
 
5
5
  export function useBuildLocalConfigurationPersistence(): UserConfigurationPersistence {
6
6
 
7
- const [configCache, setConfigCache] = useState<Record<string, PartialEntityCollection>>({});
7
+ const configCache = useRef<Record<string, PartialEntityCollection>>({});
8
8
 
9
9
  const getCollectionFromStorage = useCallback((storageKey: string) => {
10
10
  const item = localStorage.getItem(storageKey);
@@ -13,20 +13,18 @@ export function useBuildLocalConfigurationPersistence(): UserConfigurationPersis
13
13
 
14
14
  const getCollectionConfig = useCallback(<M extends Record<string, any>>(path: string): PartialEntityCollection<M> => {
15
15
  const storageKey = `collection_config::${stripCollectionPath(path)}`;
16
- if (configCache[storageKey]) {
17
- return configCache[storageKey] as PartialEntityCollection<M>;
16
+ if (configCache.current[storageKey]) {
17
+ return configCache.current[storageKey] as PartialEntityCollection<M>;
18
18
  }
19
19
  return getCollectionFromStorage(storageKey);
20
- }, [configCache, getCollectionFromStorage]);
20
+ }, [getCollectionFromStorage]);
21
21
 
22
22
  const onCollectionModified = useCallback(<M extends Record<string, any>>(path: string, data: PartialEntityCollection<M>) => {
23
23
  const storageKey = `collection_config::${stripCollectionPath(path)}`;
24
24
  localStorage.setItem(storageKey, JSON.stringify(data));
25
- setConfigCache((currentCache) => {
26
- const cachedConfig = currentCache[storageKey];
27
- const newConfig = mergeDeep(cachedConfig ?? getCollectionFromStorage(path), data);
28
- return (mergeDeep(currentCache, newConfig));
29
- });
25
+ const cachedConfig = configCache.current[storageKey];
26
+ const newConfig = mergeDeep(cachedConfig ?? getCollectionFromStorage(path), data);
27
+ configCache.current[storageKey] = mergeDeep(configCache.current[storageKey], newConfig);
30
28
  }, [getCollectionFromStorage]);
31
29
 
32
30
  const [recentlyVisitedPaths, _setRecentlyVisitedPaths] = useState<string[]>([]);
@@ -8,8 +8,13 @@ import { ModeController } from "./index";
8
8
  */
9
9
  export function useBuildModeController(): ModeController {
10
10
 
11
- const prefersDarkModeQuery = typeof window !== "undefined" &&
12
- window.matchMedia("(prefers-color-scheme: dark)");
11
+ const prefersDarkModeQuery = useCallback((): boolean => {
12
+ if (typeof window === "undefined")
13
+ return false;
14
+ const mediaQueryList = window.matchMedia("(prefers-color-scheme: dark)");
15
+ return mediaQueryList.matches;
16
+ }, []);
17
+
13
18
  const prefersDarkModeStorage: boolean | null = localStorage.getItem("prefers-dark-mode") != null ? localStorage.getItem("prefers-dark-mode") === "true" : null;
14
19
  const prefersDarkMode = prefersDarkModeStorage ?? prefersDarkModeQuery;
15
20
  const [mode, setMode] = useState<"light" | "dark">(prefersDarkMode ? "dark" : "light");
@@ -23,7 +28,7 @@ export function useBuildModeController(): ModeController {
23
28
  const setDarkMode = useCallback(() => {
24
29
  setMode("dark");
25
30
  setDocumentMode("dark");
26
- }, [prefersDarkModeQuery]);
31
+ }, []);
27
32
 
28
33
  const setLightMode = useCallback(() => {
29
34
  setMode("light");
@@ -37,14 +42,15 @@ export function useBuildModeController(): ModeController {
37
42
 
38
43
  const toggleMode = useCallback(() => {
39
44
 
45
+ const prefersDarkModeQueryResult = prefersDarkModeQuery();
40
46
  if (mode === "light") {
41
- if (!prefersDarkModeQuery)
47
+ if (!prefersDarkModeQueryResult)
42
48
  localStorage.setItem("prefers-dark-mode", "true");
43
49
  else
44
50
  localStorage.removeItem("prefers-dark-mode");
45
51
  setDarkMode();
46
52
  } else {
47
- if (prefersDarkModeQuery)
53
+ if (prefersDarkModeQueryResult)
48
54
  localStorage.setItem("prefers-dark-mode", "false");
49
55
  else
50
56
  localStorage.removeItem("prefers-dark-mode");
@@ -20,6 +20,7 @@ import {
20
20
  applyPermissionsFunctionIfEmpty,
21
21
  getCollectionByPathOrId,
22
22
  mergeDeep,
23
+ removeFunctions,
23
24
  removeInitialAndTrailingSlashes,
24
25
  resolveCollectionPathIds,
25
26
  resolvePermissions
@@ -29,10 +30,10 @@ import { getParentReferencesFromPath } from "../util/parent_references_from_path
29
30
  const DEFAULT_BASE_PATH = "/";
30
31
  const DEFAULT_COLLECTION_PATH = "/c";
31
32
 
32
- type BuildNavigationContextProps<EC extends EntityCollection, UserType extends User> = {
33
+ export type BuildNavigationContextProps<EC extends EntityCollection, USER extends User> = {
33
34
  basePath?: string,
34
35
  baseCollectionPath?: string,
35
- authController: AuthController<UserType>;
36
+ authController: AuthController<USER>;
36
37
  collections?: EC[] | EntityCollectionsBuilder<EC>;
37
38
  collectionPermissions?: PermissionsBuilder;
38
39
  views?: CMSView[] | CMSViewsBuilder;
@@ -50,7 +51,7 @@ type BuildNavigationContextProps<EC extends EntityCollection, UserType extends U
50
51
  injectCollections?: (collections: EntityCollection[]) => EntityCollection[];
51
52
  };
52
53
 
53
- export function useBuildNavigationController<EC extends EntityCollection, UserType extends User>(props: BuildNavigationContextProps<EC, UserType>): NavigationController {
54
+ export function useBuildNavigationController<EC extends EntityCollection, USER extends User>(props: BuildNavigationContextProps<EC, USER>): NavigationController {
54
55
  const {
55
56
  basePath = DEFAULT_BASE_PATH,
56
57
  baseCollectionPath = DEFAULT_COLLECTION_PATH,
@@ -130,6 +131,30 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
130
131
  .filter(Boolean) as TopNavigationEntry[]
131
132
  ];
132
133
 
134
+ // Sort by group, entries with group "Admin" will go last, and second to last will be the group "Views"
135
+ navigationEntries = navigationEntries.sort((a, b) => {
136
+ if (a.group !== "Views" && a.group !== "Admin" && (b.group === "Views" || b.group === "Admin")) {
137
+ return -1;
138
+ }
139
+ if (b.group !== "Views" && b.group !== "Admin" && (a.group === "Views" || a.group === "Admin")) {
140
+ return 1;
141
+ }
142
+ if (a.group === "Admin" && b.group !== "Admin") {
143
+ return 1;
144
+ }
145
+ if (a.group !== "Admin" && b.group === "Admin") {
146
+ return -1;
147
+ }
148
+ if (a.group === "Views" && b.group !== "Views") {
149
+ return -1;
150
+ }
151
+ if (a.group !== "Views" && b.group === "Views") {
152
+ return 1;
153
+ }
154
+ return 0;
155
+
156
+ });
157
+
133
158
  if (viewsOrder) {
134
159
  navigationEntries = navigationEntries.sort((a, b) => {
135
160
  const aIndex = viewsOrder.indexOf(a.path);
@@ -163,32 +188,49 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
163
188
  if (authController.initialLoading)
164
189
  return;
165
190
 
191
+ console.debug("Refreshing navigation");
192
+
166
193
  try {
167
- console.debug("Refreshing navigation")
194
+
168
195
  const [resolvedCollections = [], resolvedViews, resolvedAdminViews = []] = await Promise.all([
169
196
  resolveCollections(collectionsProp, collectionPermissions, authController, dataSourceDelegate, injectCollections),
170
197
  resolveCMSViews(viewsProp, authController, dataSourceDelegate),
171
198
  resolveCMSViews(adminViewsProp, authController, dataSourceDelegate)
172
199
  ]
173
200
  );
174
- if (
175
- !equal(collectionsRef.current, resolvedCollections) ||
176
- !equal(viewsRef.current, resolvedViews) ||
177
- !equal(adminViewsRef.current, resolvedAdminViews) ||
178
- !equal(topLevelNavigation, computeTopNavigation(resolvedCollections, resolvedViews, resolvedAdminViews, viewsOrder))
179
- ) {
201
+
202
+ let shouldUpdateTopLevelNav = false;
203
+ if (!areCollectionListsEqual(collectionsRef.current ?? [], resolvedCollections)) {
180
204
  collectionsRef.current = resolvedCollections;
205
+ console.log("Collections have changed", resolvedCollections);
206
+ shouldUpdateTopLevelNav = true;
207
+ }
208
+ if (collectionsRef.current === undefined) {
209
+ collectionsRef.current = resolvedCollections;
210
+ shouldUpdateTopLevelNav = true;
211
+ }
212
+ if (!equal(viewsRef.current, resolvedViews)) {
181
213
  viewsRef.current = resolvedViews;
214
+ shouldUpdateTopLevelNav = true;
215
+ }
216
+ if (!equal(adminViewsRef.current, resolvedAdminViews)) {
182
217
  adminViewsRef.current = resolvedAdminViews;
183
- setTopLevelNavigation(computeTopNavigation(resolvedCollections ?? [], resolvedViews, resolvedAdminViews, viewsOrder));
218
+ shouldUpdateTopLevelNav = true;
219
+ }
220
+
221
+ const computedTopLevelNav = computeTopNavigation(resolvedCollections, resolvedViews, resolvedAdminViews, viewsOrder);
222
+ if (shouldUpdateTopLevelNav && !equal(topLevelNavigation, computedTopLevelNav)) {
223
+ setTopLevelNavigation(computedTopLevelNav);
184
224
  }
185
225
  } catch (e) {
186
226
  console.error(e);
187
227
  setNavigationLoadingError(e as any);
188
228
  }
189
229
 
190
- setNavigationLoading(false);
191
- setInitialised(true);
230
+ if (navigationLoading)
231
+ setNavigationLoading(false);
232
+ if (!initialised)
233
+ setInitialised(true);
192
234
 
193
235
  }, [
194
236
  collectionsProp,
@@ -205,9 +247,8 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
205
247
  refreshNavigation();
206
248
  }, [refreshNavigation]);
207
249
 
208
- const getCollection = useCallback(<EC extends EntityCollection>(
250
+ const getCollection = useCallback((
209
251
  idOrPath: string,
210
- entityId?: string,
211
252
  includeUserOverride = false
212
253
  ): EC | undefined => {
213
254
  const collections = collectionsRef.current;
@@ -217,8 +258,7 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
217
258
  const baseCollection = getCollectionByPathOrId(removeInitialAndTrailingSlashes(idOrPath), collections);
218
259
 
219
260
  const userOverride = includeUserOverride ? userConfigPersistence?.getCollectionConfig(idOrPath) : undefined;
220
-
221
- const overriddenCollection = baseCollection ? mergeDeep(baseCollection, userOverride) : undefined;
261
+ const overriddenCollection = baseCollection ? mergeDeep(baseCollection, userOverride ?? {}) : undefined;
222
262
 
223
263
  let result: Partial<EntityCollection> | undefined = overriddenCollection;
224
264
 
@@ -238,17 +278,14 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
238
278
 
239
279
  return { ...overriddenCollection, ...result } as EC;
240
280
 
241
- }, [
242
- basePath,
243
- baseCollectionPath,
244
- ]);
281
+ }, [userConfigPersistence]);
245
282
 
246
283
  const getCollectionFromPaths = useCallback(<EC extends EntityCollection>(pathSegments: string[]): EC | undefined => {
247
284
 
248
285
  const collections = collectionsRef.current;
286
+ if (collections === undefined)
287
+ throw Error("getCollectionFromPaths: Collections have not been initialised yet");
249
288
  let currentCollections: EntityCollection[] | undefined = [...(collections ?? [])];
250
- if (!currentCollections)
251
- throw Error("Collections have not been initialised yet");
252
289
 
253
290
  for (let i = 0; i < pathSegments.length; i++) {
254
291
  const pathSegment = pathSegments[i];
@@ -267,9 +304,9 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
267
304
  const getCollectionFromIds = useCallback(<EC extends EntityCollection>(ids: string[]): EC | undefined => {
268
305
 
269
306
  const collections = collectionsRef.current;
307
+ if (collections === undefined)
308
+ throw Error("getCollectionFromIds: Collections have not been initialised yet");
270
309
  let currentCollections: EntityCollection[] | undefined = [...(collections ?? [])];
271
- if (!currentCollections)
272
- throw Error("Collections have not been initialised yet");
273
310
 
274
311
  for (let i = 0; i < ids.length; i++) {
275
312
  const id = ids[i];
@@ -305,9 +342,7 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
305
342
  []);
306
343
 
307
344
  const resolveAliasesFrom = useCallback((path: string): string => {
308
- const collections = collectionsRef.current;
309
- if (!collections)
310
- throw Error("Collections have not been initialised yet");
345
+ const collections = collectionsRef.current ?? [];
311
346
  return resolveCollectionPathIds(path, collections);
312
347
  }, []);
313
348
 
@@ -394,7 +429,7 @@ function filterOutNotAllowedCollections(resolvedCollections: EntityCollection[],
394
429
  return resolvedCollections
395
430
  .filter((c) => {
396
431
  if (!c.permissions) return true;
397
- const resolvedPermissions = resolvePermissions(c, authController, c.path, null)
432
+ const resolvedPermissions = resolvePermissions(c, authController, c.path, null);
398
433
  return resolvedPermissions?.read !== false;
399
434
  })
400
435
  .map((c) => {
@@ -410,7 +445,7 @@ async function resolveCollections(collections: undefined | EntityCollection[] |
410
445
  collectionPermissions: PermissionsBuilder | undefined,
411
446
  authController: AuthController,
412
447
  dataSource: DataSourceDelegate,
413
- injectCollections?: (collections: EntityCollection[]) => EntityCollection[]) {
448
+ injectCollections?: (collections: EntityCollection[]) => EntityCollection[]): Promise<EntityCollection[]> {
414
449
  let resolvedCollections: EntityCollection[] = [];
415
450
  if (typeof collections === "function") {
416
451
  resolvedCollections = await collections({
@@ -422,14 +457,12 @@ async function resolveCollections(collections: undefined | EntityCollection[] |
422
457
  resolvedCollections = collections;
423
458
  }
424
459
 
425
- resolvedCollections = applyPermissionsFunctionIfEmpty(resolvedCollections, collectionPermissions);
426
-
427
- resolvedCollections = filterOutNotAllowedCollections(resolvedCollections, authController);
428
-
429
460
  if (injectCollections) {
430
461
  resolvedCollections = injectCollections(resolvedCollections ?? []);
431
462
  }
432
463
 
464
+ resolvedCollections = applyPermissionsFunctionIfEmpty(resolvedCollections, collectionPermissions);
465
+ resolvedCollections = filterOutNotAllowedCollections(resolvedCollections, authController);
433
466
  return resolvedCollections;
434
467
  }
435
468
 
@@ -454,3 +487,29 @@ function getGroup(collectionOrView: EntityCollection<any, any> | CMSView) {
454
487
  }
455
488
  return trimmed ?? "Views";
456
489
  }
490
+
491
+ function areCollectionListsEqual(a: EntityCollection[], b: EntityCollection[]) {
492
+ if (a.length !== b.length) {
493
+ return false;
494
+ }
495
+ const aCopy = [...a];
496
+ const bCopy = [...b];
497
+ const aSorted = aCopy.sort((x, y) => x.id.localeCompare(y.id));
498
+ const bSorted = bCopy.sort((x, y) => x.id.localeCompare(y.id));
499
+ return aSorted.every((value, index) => areCollectionsEqual(value, bSorted[index]));
500
+ }
501
+
502
+ function areCollectionsEqual(a: EntityCollection, b: EntityCollection) {
503
+ const {
504
+ subcollections: subcollectionsA,
505
+ ...restA
506
+ } = a;
507
+ const {
508
+ subcollections: subcollectionsB,
509
+ ...restB
510
+ } = b;
511
+ if (!areCollectionListsEqual(subcollectionsA ?? [], subcollectionsB ?? [])) {
512
+ return false;
513
+ }
514
+ return equal(removeFunctions(restA), removeFunctions(restB));
515
+ }
@@ -21,9 +21,9 @@ import React, { useEffect } from "react";
21
21
  * @see FireCMSContext
22
22
  * @group Hooks and utilities
23
23
  */
24
- export const useFireCMSContext = <UserType extends User = User, AuthControllerType extends AuthController<UserType> = AuthController<UserType>>(): FireCMSContext<UserType, AuthControllerType> => {
24
+ export const useFireCMSContext = <USER extends User = User, AuthControllerType extends AuthController<USER> = AuthController<USER>>(): FireCMSContext<USER, AuthControllerType> => {
25
25
 
26
- const authController = useAuthController<UserType, AuthControllerType>();
26
+ const authController = useAuthController<USER, AuthControllerType>();
27
27
  const sideDialogsController = useSideDialogsController();
28
28
  const sideEntityController = useSideEntityController();
29
29
  const navigation = useNavigationController();
@@ -35,7 +35,7 @@ export const useFireCMSContext = <UserType extends User = User, AuthControllerTy
35
35
  const customizationController = useCustomizationController();
36
36
  const analyticsController = useAnalyticsController();
37
37
 
38
- const fireCMSContextRef = React.useRef<FireCMSContext<UserType, AuthControllerType>>({
38
+ const fireCMSContextRef = React.useRef<FireCMSContext<USER, AuthControllerType>>({
39
39
  authController,
40
40
  sideDialogsController,
41
41
  sideEntityController,
@@ -68,9 +68,9 @@ export const useFireCMSContext = <UserType extends User = User, AuthControllerTy
68
68
  return fireCMSContextRef.current;
69
69
  }
70
70
 
71
- // export const useFireCMSContext = <UserType extends User = User, AuthControllerType extends AuthController<UserType> = AuthController<UserType>>(): FireCMSContext<UserType, AuthControllerType> => {
71
+ // export const useFireCMSContext = <USER extends User = User, AuthControllerType extends AuthController<USER> = AuthController<USER>>(): FireCMSContext<USER, AuthControllerType> => {
72
72
  //
73
- // const authController = useAuthController<UserType, AuthControllerType>();
73
+ // const authController = useAuthController<USER, AuthControllerType>();
74
74
  // const sideDialogsController = useSideDialogsController();
75
75
  // const sideEntityController = useSideEntityController();
76
76
  // const navigation = useNavigationController();
@@ -1,5 +1,5 @@
1
1
  import { useEffect, useRef, useState } from "react";
2
- import { AuthController, FireCMSPlugin } from "../types";
2
+ import { AuthController, DataSourceDelegate, FireCMSPlugin } from "../types";
3
3
 
4
4
  export const DEFAULT_SERVER_DEV = "https://api-kdoe6pj3qq-ey.a.run.app";
5
5
  export const DEFAULT_SERVER = "https://api-drplyi3b6q-ey.a.run.app";
@@ -9,33 +9,55 @@ export type AccessResponse = {
9
9
  message?: string;
10
10
  }
11
11
 
12
- async function makeRequest(authController: AuthController, pluginKeys: string | undefined) {
13
- const firebaseToken = await authController.getAuthToken();
12
+ async function makeRequest(authController: AuthController, dataSourceKey: string, pluginKeys: string[] | undefined, apiKey?: string): Promise<AccessResponse> {
13
+ let idToken: string | null;
14
+ try {
15
+ idToken = await authController.getAuthToken();
16
+ } catch (e) {
17
+ idToken = null;
18
+ }
14
19
  return fetch(DEFAULT_SERVER + "/access_log",
15
20
  {
16
21
  // mode: "no-cors",
17
22
  method: "POST",
18
23
  headers: {
19
24
  "Content-Type": "application/json",
20
- Authorization: `Basic ${firebaseToken}`,
25
+ Authorization: `Basic ${idToken}`
21
26
  },
22
- body: JSON.stringify({ plugins: pluginKeys })
27
+ body: JSON.stringify({
28
+ apiKey,
29
+ email: authController.user?.email ?? null,
30
+ datasource: dataSourceKey,
31
+ plugins: pluginKeys
32
+ })
23
33
  })
24
34
  .then(async (res) => {
25
35
  return res.json();
26
36
  });
27
37
  }
28
38
 
29
- export function useProjectLog(authController: AuthController,
30
- plugins?: FireCMSPlugin<any, any, any>[]): AccessResponse | null {
39
+ export interface UseProjectLogParams {
40
+ apiKey?: string;
41
+ authController: AuthController;
42
+ dataSourceDelegate: DataSourceDelegate;
43
+ plugins?: FireCMSPlugin<any, any, any>[];
44
+ }
45
+
46
+ export function useProjectLog({
47
+ authController,
48
+ dataSourceDelegate,
49
+ plugins,
50
+ apiKey
51
+ }: UseProjectLogParams): AccessResponse | null {
31
52
  const [accessResponse, setAccessResponse] = useState<AccessResponse | null>(null);
32
53
  const accessedUserRef = useRef<string | null>(null);
33
- const pluginKeys = plugins?.map(plugin => plugin.key).join(",");
54
+ const dataSourceKey = dataSourceDelegate.key;
55
+ const pluginKeys = plugins?.map(plugin => plugin.key);
34
56
  useEffect(() => {
35
57
  if (authController.user && authController.user.uid !== accessedUserRef.current && !authController.initialLoading) {
36
- makeRequest(authController, pluginKeys).then(setAccessResponse);
58
+ makeRequest(authController, dataSourceKey, pluginKeys, apiKey).then(setAccessResponse);
37
59
  accessedUserRef.current = authController.user.uid;
38
60
  }
39
- }, [authController]);
61
+ }, [authController, dataSourceKey, pluginKeys]);
40
62
  return accessResponse;
41
63
  }
@@ -55,12 +55,12 @@ interface ResolvedNavigationEntityCustom<M extends Record<string, any>> {
55
55
  * @param context
56
56
  * @group Hooks and utilities
57
57
  */
58
- export function resolveNavigationFrom<M extends Record<string, any>, UserType extends User>({
58
+ export function resolveNavigationFrom<M extends Record<string, any>, USER extends User>({
59
59
  path,
60
60
  context
61
61
  }: {
62
62
  path: string,
63
- context: FireCMSContext<UserType>
63
+ context: FireCMSContext<USER>
64
64
  }): Promise<ResolvedNavigationEntry<M>[]> {
65
65
 
66
66
  const dataSource = context.dataSource;
@@ -80,7 +80,7 @@ export function resolveNavigationFrom<M extends Record<string, any>, UserType ex
80
80
  if (entry.type === "collection") {
81
81
  return Promise.resolve(entry);
82
82
  } else if (entry.type === "entity") {
83
- const collection = navigation.getCollection(entry.path, entry.entityId);
83
+ const collection = navigation.getCollection(entry.path);
84
84
  if (!collection) {
85
85
  throw Error(`No collection defined in the navigation for the entity with path ${entry.path}`);
86
86
  }
@@ -126,12 +126,12 @@ export interface NavigationFrom<M extends Record<string, any>> {
126
126
  * in any React component that lives under `FireCMS`
127
127
  * @group Hooks and utilities
128
128
  */
129
- export function useResolvedNavigationFrom<M extends Record<string, any>, UserType extends User>(
129
+ export function useResolvedNavigationFrom<M extends Record<string, any>, USER extends User>(
130
130
  {
131
131
  path
132
132
  }: NavigationFromProps): NavigationFrom<M> {
133
133
 
134
- const context: FireCMSContext<UserType> = useFireCMSContext();
134
+ const context: FireCMSContext<USER> = useFireCMSContext();
135
135
 
136
136
  const [data, setData] = useState<ResolvedNavigationEntry<M>[] | undefined>();
137
137
  const [dataLoading, setDataLoading] = useState<boolean>(false);
@@ -142,7 +142,7 @@ export function useResolvedNavigationFrom<M extends Record<string, any>, UserTyp
142
142
  if (navigation) {
143
143
  setDataLoading(true);
144
144
  setDataLoadingError(undefined);
145
- resolveNavigationFrom<M, UserType>({ path, context })
145
+ resolveNavigationFrom<M, USER>({ path, context })
146
146
  .then((res) => {
147
147
  setData(res);
148
148
  })