@rebasepro/app 0.0.1-canary.4829d6e

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 (268) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +174 -0
  3. package/dist/auth/api.d.ts +66 -0
  4. package/dist/auth/index.d.ts +13 -0
  5. package/dist/auth/types.d.ts +127 -0
  6. package/dist/auth/useRebaseAuthController.d.ts +13 -0
  7. package/dist/components/AIIcon.d.ts +17 -0
  8. package/dist/components/AuthSimulationMenu.d.ts +0 -0
  9. package/dist/components/ConfirmationDialog.d.ts +9 -0
  10. package/dist/components/Debug/UIReferenceView.d.ts +13 -0
  11. package/dist/components/Debug/UIStyleGuide.d.ts +2 -0
  12. package/dist/components/Debug/collection-views/CardViewDemo.d.ts +2 -0
  13. package/dist/components/Debug/collection-views/CollectionTableDemo.d.ts +2 -0
  14. package/dist/components/Debug/collection-views/KanbanBoardDemo.d.ts +2 -0
  15. package/dist/components/Debug/collection-views/index.d.ts +3 -0
  16. package/dist/components/Debug/collection-views/sample_data.d.ts +23 -0
  17. package/dist/components/Debug/crm-dashboard/CalendarWidget.d.ts +22 -0
  18. package/dist/components/Debug/crm-dashboard/CrmDashboardDemo.d.ts +2 -0
  19. package/dist/components/Debug/crm-dashboard/DashboardMetrics.d.ts +15 -0
  20. package/dist/components/Debug/crm-dashboard/PipelineOverview.d.ts +34 -0
  21. package/dist/components/Debug/crm-dashboard/RecentActivity.d.ts +19 -0
  22. package/dist/components/Debug/crm-dashboard/TaskFilters.d.ts +30 -0
  23. package/dist/components/Debug/crm-dashboard/TaskTable.d.ts +50 -0
  24. package/dist/components/Debug/crm-dashboard/TasksView.d.ts +41 -0
  25. package/dist/components/ErrorTooltip.d.ts +3 -0
  26. package/dist/components/ErrorView.d.ts +21 -0
  27. package/dist/components/LanguageToggle.d.ts +2 -0
  28. package/dist/components/LoginView/LoginView.d.ts +113 -0
  29. package/dist/components/LoginView/index.d.ts +2 -0
  30. package/dist/components/NotFoundPage.d.ts +2 -0
  31. package/dist/components/RebaseAuth.d.ts +10 -0
  32. package/dist/components/RebaseLogo.d.ts +7 -0
  33. package/dist/components/SchemaDriftBanner.d.ts +27 -0
  34. package/dist/components/UnsavedChangesDialog.d.ts +9 -0
  35. package/dist/components/UserDisplay.d.ts +7 -0
  36. package/dist/components/UserSelectPopover.d.ts +63 -0
  37. package/dist/components/UserSettingsView.d.ts +2 -0
  38. package/dist/components/common/index.d.ts +6 -0
  39. package/dist/components/common/table_height.d.ts +5 -0
  40. package/dist/components/common/types.d.ts +66 -0
  41. package/dist/components/common/useColumnsIds.d.ts +9 -0
  42. package/dist/components/common/useDataTableController.d.ts +45 -0
  43. package/dist/components/common/useDebouncedData.d.ts +9 -0
  44. package/dist/components/common/useScrollRestoration.d.ts +14 -0
  45. package/dist/components/index.d.ts +18 -0
  46. package/dist/contexts/AdminModeController.d.ts +4 -0
  47. package/dist/contexts/AnalyticsContext.d.ts +3 -0
  48. package/dist/contexts/AuthControllerContext.d.ts +3 -0
  49. package/dist/contexts/CollectionScopeContext.d.ts +50 -0
  50. package/dist/contexts/ComponentOverrideContext.d.ts +42 -0
  51. package/dist/contexts/CustomizationControllerContext.d.ts +3 -0
  52. package/dist/contexts/DataDriverContext.d.ts +3 -0
  53. package/dist/contexts/DataSourcesContext.d.ts +31 -0
  54. package/dist/contexts/DatabaseAdminContext.d.ts +3 -0
  55. package/dist/contexts/DialogsProvider.d.ts +4 -0
  56. package/dist/contexts/EffectiveRoleController.d.ts +4 -0
  57. package/dist/contexts/ModeController.d.ts +4 -0
  58. package/dist/contexts/RebaseClientInstanceContext.d.ts +6 -0
  59. package/dist/contexts/RebaseDataContext.d.ts +3 -0
  60. package/dist/contexts/SnackbarProvider.d.ts +2 -0
  61. package/dist/contexts/StorageSourceContext.d.ts +3 -0
  62. package/dist/contexts/StorageSourcesContext.d.ts +25 -0
  63. package/dist/contexts/UserConfigurationPersistenceContext.d.ts +3 -0
  64. package/dist/contexts/index.d.ts +17 -0
  65. package/dist/core/PluginLifecycleManager.d.ts +17 -0
  66. package/dist/core/PluginProviderStack.d.ts +21 -0
  67. package/dist/core/Rebase.d.ts +15 -0
  68. package/dist/core/RebaseProps.d.ts +291 -0
  69. package/dist/core/RebaseRouter.d.ts +4 -0
  70. package/dist/core/RebaseRoutes.d.ts +17 -0
  71. package/dist/core/index.d.ts +4 -0
  72. package/dist/hooks/ApiConfigContext.d.ts +24 -0
  73. package/dist/hooks/data/delete.d.ts +33 -0
  74. package/dist/hooks/data/save.d.ts +40 -0
  75. package/dist/hooks/data/useCollection.d.ts +62 -0
  76. package/dist/hooks/data/useData.d.ts +13 -0
  77. package/dist/hooks/data/useDataOrder.d.ts +12 -0
  78. package/dist/hooks/data/useFetch.d.ts +43 -0
  79. package/dist/hooks/data/useRelationSelector.d.ts +52 -0
  80. package/dist/hooks/index.d.ts +36 -0
  81. package/dist/hooks/useAdminModeController.d.ts +19 -0
  82. package/dist/hooks/useAnalyticsController.d.ts +5 -0
  83. package/dist/hooks/useAuthController.d.ts +11 -0
  84. package/dist/hooks/useAuthSubscription.d.ts +2 -0
  85. package/dist/hooks/useBackendStorageSource.d.ts +30 -0
  86. package/dist/hooks/useBridgeRegistration.d.ts +18 -0
  87. package/dist/hooks/useBrowserTitleAndIcon.d.ts +6 -0
  88. package/dist/hooks/useBuildAdminModeController.d.ts +6 -0
  89. package/dist/hooks/useBuildEffectiveRoleController.d.ts +8 -0
  90. package/dist/hooks/useBuildLocalConfigurationPersistence.d.ts +2 -0
  91. package/dist/hooks/useBuildModeController.d.ts +6 -0
  92. package/dist/hooks/useClipboard.d.ts +57 -0
  93. package/dist/hooks/useCollapsedGroups.d.ts +27 -0
  94. package/dist/hooks/useComponentOverride.d.ts +32 -0
  95. package/dist/hooks/useCustomizationController.d.ts +11 -0
  96. package/dist/hooks/useDialogsController.d.ts +11 -0
  97. package/dist/hooks/useEffectiveRoleController.d.ts +7 -0
  98. package/dist/hooks/useLargeLayout.d.ts +1 -0
  99. package/dist/hooks/useModeController.d.ts +19 -0
  100. package/dist/hooks/usePermissions.d.ts +12 -0
  101. package/dist/hooks/useRebaseClient.d.ts +5 -0
  102. package/dist/hooks/useRebaseContext.d.ts +11 -0
  103. package/dist/hooks/useRebaseRegistry.d.ts +34 -0
  104. package/dist/hooks/useResolvedComponent.d.ts +47 -0
  105. package/dist/hooks/useSlot.d.ts +18 -0
  106. package/dist/hooks/useSnackbarController.d.ts +20 -0
  107. package/dist/hooks/useStorageSource.d.ts +6 -0
  108. package/dist/hooks/useStudioBridge.d.ts +79 -0
  109. package/dist/hooks/useTranslation.d.ts +17 -0
  110. package/dist/hooks/useUnsavedChangesDialog.d.ts +12 -0
  111. package/dist/hooks/useUserConfigurationPersistence.d.ts +8 -0
  112. package/dist/i18n/RebaseI18nProvider.d.ts +33 -0
  113. package/dist/index.d.ts +16 -0
  114. package/dist/index.es.js +16843 -0
  115. package/dist/index.es.js.map +1 -0
  116. package/dist/index.umd.js +17021 -0
  117. package/dist/index.umd.js.map +1 -0
  118. package/dist/internal/common.d.ts +14 -0
  119. package/dist/internal/useRestoreScroll.d.ts +15 -0
  120. package/dist/locales/de.d.ts +2 -0
  121. package/dist/locales/en.d.ts +10 -0
  122. package/dist/locales/es.d.ts +10 -0
  123. package/dist/locales/fr.d.ts +2 -0
  124. package/dist/locales/hi.d.ts +2 -0
  125. package/dist/locales/it.d.ts +2 -0
  126. package/dist/locales/pt.d.ts +7 -0
  127. package/dist/util/constants.d.ts +1 -0
  128. package/dist/util/createFormexStub.d.ts +2 -0
  129. package/dist/util/entity_cache.d.ts +22 -0
  130. package/dist/util/enums.d.ts +5 -0
  131. package/dist/util/icon_list.d.ts +5 -0
  132. package/dist/util/icons.d.ts +20 -0
  133. package/dist/util/index.d.ts +8 -0
  134. package/dist/util/previews.d.ts +4 -0
  135. package/dist/util/useStorageUploadController.d.ts +44 -0
  136. package/dist/vitePlugin.d.ts +60 -0
  137. package/dist/vitePlugin.js +113 -0
  138. package/package.json +145 -0
  139. package/src/auth/api.ts +148 -0
  140. package/src/auth/index.ts +25 -0
  141. package/src/auth/types.ts +115 -0
  142. package/src/auth/useRebaseAuthController.ts +328 -0
  143. package/src/components/AIIcon.tsx +47 -0
  144. package/src/components/AuthSimulationMenu.tsx +0 -0
  145. package/src/components/ConfirmationDialog.tsx +48 -0
  146. package/src/components/Debug/UIReferenceView.tsx +958 -0
  147. package/src/components/Debug/UIStyleGuide.tsx +156 -0
  148. package/src/components/Debug/collection-views/CardViewDemo.tsx +85 -0
  149. package/src/components/Debug/collection-views/CollectionTableDemo.tsx +107 -0
  150. package/src/components/Debug/collection-views/KanbanBoardDemo.tsx +90 -0
  151. package/src/components/Debug/collection-views/index.ts +3 -0
  152. package/src/components/Debug/collection-views/sample_data.ts +42 -0
  153. package/src/components/Debug/crm-dashboard/CalendarWidget.tsx +389 -0
  154. package/src/components/Debug/crm-dashboard/CrmDashboardDemo.tsx +1102 -0
  155. package/src/components/Debug/crm-dashboard/DashboardMetrics.tsx +133 -0
  156. package/src/components/Debug/crm-dashboard/PipelineOverview.tsx +290 -0
  157. package/src/components/Debug/crm-dashboard/RecentActivity.tsx +215 -0
  158. package/src/components/Debug/crm-dashboard/TaskFilters.tsx +184 -0
  159. package/src/components/Debug/crm-dashboard/TaskTable.tsx +427 -0
  160. package/src/components/Debug/crm-dashboard/TasksView.tsx +234 -0
  161. package/src/components/ErrorTooltip.tsx +12 -0
  162. package/src/components/ErrorView.tsx +94 -0
  163. package/src/components/LanguageToggle.tsx +59 -0
  164. package/src/components/LoginView/LoginView.tsx +932 -0
  165. package/src/components/LoginView/index.ts +2 -0
  166. package/src/components/NotFoundPage.tsx +27 -0
  167. package/src/components/RebaseAuth.tsx +27 -0
  168. package/src/components/RebaseLogo.tsx +29 -0
  169. package/src/components/SchemaDriftBanner.tsx +102 -0
  170. package/src/components/UnsavedChangesDialog.tsx +46 -0
  171. package/src/components/UserDisplay.tsx +54 -0
  172. package/src/components/UserSelectPopover.tsx +399 -0
  173. package/src/components/UserSettingsView.tsx +318 -0
  174. package/src/components/common/index.ts +6 -0
  175. package/src/components/common/table_height.tsx +21 -0
  176. package/src/components/common/types.tsx +66 -0
  177. package/src/components/common/useColumnsIds.tsx +222 -0
  178. package/src/components/common/useDataTableController.tsx +514 -0
  179. package/src/components/common/useDebouncedData.ts +49 -0
  180. package/src/components/common/useScrollRestoration.tsx +68 -0
  181. package/src/components/index.tsx +26 -0
  182. package/src/contexts/AdminModeController.tsx +11 -0
  183. package/src/contexts/AnalyticsContext.tsx +4 -0
  184. package/src/contexts/AuthControllerContext.tsx +4 -0
  185. package/src/contexts/CollectionScopeContext.tsx +67 -0
  186. package/src/contexts/ComponentOverrideContext.tsx +81 -0
  187. package/src/contexts/CustomizationControllerContext.tsx +4 -0
  188. package/src/contexts/DataDriverContext.tsx +4 -0
  189. package/src/contexts/DataSourcesContext.tsx +36 -0
  190. package/src/contexts/DatabaseAdminContext.tsx +4 -0
  191. package/src/contexts/DialogsProvider.tsx +56 -0
  192. package/src/contexts/EffectiveRoleController.tsx +12 -0
  193. package/src/contexts/ModeController.tsx +11 -0
  194. package/src/contexts/RebaseClientInstanceContext.tsx +7 -0
  195. package/src/contexts/RebaseDataContext.tsx +4 -0
  196. package/src/contexts/SnackbarProvider.tsx +15 -0
  197. package/src/contexts/StorageSourceContext.tsx +4 -0
  198. package/src/contexts/StorageSourcesContext.tsx +30 -0
  199. package/src/contexts/UserConfigurationPersistenceContext.tsx +4 -0
  200. package/src/contexts/index.ts +17 -0
  201. package/src/core/PluginLifecycleManager.tsx +95 -0
  202. package/src/core/PluginProviderStack.tsx +40 -0
  203. package/src/core/Rebase.tsx +439 -0
  204. package/src/core/RebaseProps.tsx +320 -0
  205. package/src/core/RebaseRouter.tsx +17 -0
  206. package/src/core/RebaseRoutes.tsx +24 -0
  207. package/src/core/index.tsx +5 -0
  208. package/src/hooks/ApiConfigContext.tsx +41 -0
  209. package/src/hooks/data/delete.ts +55 -0
  210. package/src/hooks/data/save.ts +77 -0
  211. package/src/hooks/data/useCollection.tsx +176 -0
  212. package/src/hooks/data/useData.tsx +18 -0
  213. package/src/hooks/data/useDataOrder.ts +26 -0
  214. package/src/hooks/data/useFetch.tsx +140 -0
  215. package/src/hooks/data/useRelationSelector.tsx +234 -0
  216. package/src/hooks/index.tsx +45 -0
  217. package/src/hooks/useAdminModeController.tsx +23 -0
  218. package/src/hooks/useAnalyticsController.tsx +8 -0
  219. package/src/hooks/useAuthController.tsx +14 -0
  220. package/src/hooks/useAuthSubscription.ts +87 -0
  221. package/src/hooks/useBackendStorageSource.ts +288 -0
  222. package/src/hooks/useBridgeRegistration.tsx +32 -0
  223. package/src/hooks/useBrowserTitleAndIcon.tsx +23 -0
  224. package/src/hooks/useBuildAdminModeController.tsx +24 -0
  225. package/src/hooks/useBuildEffectiveRoleController.tsx +31 -0
  226. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +75 -0
  227. package/src/hooks/useBuildModeController.tsx +71 -0
  228. package/src/hooks/useClipboard.tsx +158 -0
  229. package/src/hooks/useCollapsedGroups.ts +116 -0
  230. package/src/hooks/useComponentOverride.tsx +59 -0
  231. package/src/hooks/useCustomizationController.tsx +14 -0
  232. package/src/hooks/useDialogsController.tsx +15 -0
  233. package/src/hooks/useEffectiveRoleController.tsx +10 -0
  234. package/src/hooks/useLargeLayout.tsx +65 -0
  235. package/src/hooks/useModeController.tsx +23 -0
  236. package/src/hooks/usePermissions.ts +44 -0
  237. package/src/hooks/useRebaseClient.tsx +10 -0
  238. package/src/hooks/useRebaseContext.tsx +83 -0
  239. package/src/hooks/useRebaseRegistry.tsx +91 -0
  240. package/src/hooks/useResolvedComponent.tsx +159 -0
  241. package/src/hooks/useSlot.tsx +64 -0
  242. package/src/hooks/useSnackbarController.tsx +52 -0
  243. package/src/hooks/useStorageSource.tsx +11 -0
  244. package/src/hooks/useStudioBridge.tsx +209 -0
  245. package/src/hooks/useTranslation.ts +33 -0
  246. package/src/hooks/useUnsavedChangesDialog.tsx +64 -0
  247. package/src/hooks/useUserConfigurationPersistence.tsx +11 -0
  248. package/src/i18n/RebaseI18nProvider.tsx +160 -0
  249. package/src/index.ts +25 -0
  250. package/src/internal/common.tsx +16 -0
  251. package/src/internal/useRestoreScroll.tsx +69 -0
  252. package/src/locales/de.ts +902 -0
  253. package/src/locales/en.ts +980 -0
  254. package/src/locales/es.ts +922 -0
  255. package/src/locales/fr.ts +901 -0
  256. package/src/locales/hi.ts +901 -0
  257. package/src/locales/it.ts +901 -0
  258. package/src/locales/pt.ts +909 -0
  259. package/src/util/constants.ts +7 -0
  260. package/src/util/createFormexStub.tsx +66 -0
  261. package/src/util/entity_cache.ts +239 -0
  262. package/src/util/enums.ts +32 -0
  263. package/src/util/icon_list.ts +22 -0
  264. package/src/util/icons.tsx +149 -0
  265. package/src/util/index.ts +12 -0
  266. package/src/util/previews.ts +105 -0
  267. package/src/util/useStorageUploadController.tsx +350 -0
  268. package/src/vitePlugin.ts +196 -0
@@ -0,0 +1,67 @@
1
+ import React, { createContext, useContext } from "react";
2
+ import type { CollectionConfig } from "@rebasepro/types";
3
+ import { CollectionComponentOverrideProvider } from "./ComponentOverrideContext";
4
+
5
+ /**
6
+ * Carries the collection a UI subtree is currently bound to.
7
+ *
8
+ * Mounted by every collection binding (main collection views, entity
9
+ * edit/detail views, side panels, reference-selection dialogs, import
10
+ * previews) via {@link CollectionScopeProvider}. Leaf components read it with
11
+ * {@link useCollectionScope} to derive collection-dependent behavior — e.g.
12
+ * filter fields resolve the engine's supported operators from
13
+ * `collection.engine` — without every intermediate component threading
14
+ * collection props.
15
+ *
16
+ * @internal
17
+ */
18
+ export const CollectionScopeContext = createContext<CollectionConfig | undefined>(undefined);
19
+
20
+ /**
21
+ * Read the collection the current subtree is bound to, or `undefined` when
22
+ * rendered outside any collection scope (e.g. a fully standalone table).
23
+ *
24
+ * @group Hooks
25
+ */
26
+ export function useCollectionScope(): CollectionConfig | undefined {
27
+ return useContext(CollectionScopeContext);
28
+ }
29
+
30
+ /**
31
+ * Scopes a UI subtree to a collection.
32
+ *
33
+ * Provides two things at once:
34
+ * 1. The collection itself — readable via {@link useCollectionScope} —
35
+ * so leaf components (filter fields, previews, …) can derive
36
+ * collection-dependent behavior such as engine capabilities.
37
+ * 2. The collection's component overrides (`collection.components`),
38
+ * by mounting {@link CollectionComponentOverrideProvider}.
39
+ *
40
+ * Mount this wherever a subtree is bound to a specific collection. If you
41
+ * build a custom view around `SelectableTable` / `CollectionTableBinding`,
42
+ * wrap it in this provider to get engine-aware filters and collection-scoped
43
+ * component overrides for free:
44
+ *
45
+ * ```tsx
46
+ * <CollectionScopeProvider collection={myCollection}>
47
+ * <CollectionTableBinding ... />
48
+ * </CollectionScopeProvider>
49
+ * ```
50
+ *
51
+ * @group Components
52
+ */
53
+ export function CollectionScopeProvider({
54
+ collection,
55
+ children
56
+ }: {
57
+ collection: CollectionConfig<any> | undefined;
58
+ children: React.ReactNode;
59
+ }) {
60
+ return (
61
+ <CollectionScopeContext.Provider value={collection as CollectionConfig | undefined}>
62
+ <CollectionComponentOverrideProvider overrides={collection?.components}>
63
+ {children}
64
+ </CollectionComponentOverrideProvider>
65
+ </CollectionScopeContext.Provider>
66
+ );
67
+ }
@@ -0,0 +1,81 @@
1
+ import React, { createContext, useContext, useMemo } from "react";
2
+ import type { ComponentOverrideMap } from "@rebasepro/types";
3
+
4
+ /** Stable empty reference to avoid re-creating context values on every render. */
5
+ const EMPTY_OVERRIDES: ComponentOverrideMap = {};
6
+
7
+ /**
8
+ * Internal state for the component override resolution chain.
9
+ * Holds both global overrides (set on `<Rebase>`) and collection-scoped
10
+ * overrides (set on individual collections).
11
+ *
12
+ * Resolution priority: collection > global > default.
13
+ *
14
+ * @internal
15
+ */
16
+ interface ComponentOverrideState {
17
+ globalOverrides: ComponentOverrideMap;
18
+ collectionOverrides: ComponentOverrideMap;
19
+ }
20
+
21
+ export const ComponentOverrideContext = createContext<ComponentOverrideState>({
22
+ globalOverrides: EMPTY_OVERRIDES,
23
+ collectionOverrides: EMPTY_OVERRIDES
24
+ });
25
+
26
+ /**
27
+ * Provider set at the `<Rebase>` root level to supply global component overrides.
28
+ *
29
+ * @internal — Used by the Rebase component. End users set overrides via
30
+ * the `components` prop on `<Rebase>`.
31
+ */
32
+ export function GlobalComponentOverrideProvider({
33
+ overrides,
34
+ children
35
+ }: {
36
+ overrides?: ComponentOverrideMap;
37
+ children: React.ReactNode;
38
+ }) {
39
+ const value = useMemo<ComponentOverrideState>(() => ({
40
+ globalOverrides: overrides ?? EMPTY_OVERRIDES,
41
+ collectionOverrides: EMPTY_OVERRIDES
42
+ }), [overrides]);
43
+
44
+ return (
45
+ <ComponentOverrideContext.Provider value={value}>
46
+ {children}
47
+ </ComponentOverrideContext.Provider>
48
+ );
49
+ }
50
+
51
+ /**
52
+ * Provider set at the collection level to layer collection-scoped overrides
53
+ * on top of global overrides.
54
+ *
55
+ * When a collection defines `components`, this provider is mounted
56
+ * around the collection's view subtree. Components within the subtree
57
+ * will resolve overrides in order: collection → global → default.
58
+ *
59
+ * @internal — Used by DataCollectionView when a collection has
60
+ * `components` defined.
61
+ */
62
+ export function CollectionComponentOverrideProvider({
63
+ overrides,
64
+ children
65
+ }: {
66
+ overrides?: ComponentOverrideMap;
67
+ children: React.ReactNode;
68
+ }) {
69
+ const parent = useContext(ComponentOverrideContext);
70
+
71
+ const value = useMemo<ComponentOverrideState>(() => ({
72
+ globalOverrides: parent.globalOverrides,
73
+ collectionOverrides: overrides ?? EMPTY_OVERRIDES
74
+ }), [parent.globalOverrides, overrides]);
75
+
76
+ return (
77
+ <ComponentOverrideContext.Provider value={value}>
78
+ {children}
79
+ </ComponentOverrideContext.Provider>
80
+ );
81
+ }
@@ -0,0 +1,4 @@
1
+ import type { CustomizationController } from "@rebasepro/types";
2
+ import React from "react";
3
+
4
+ export const CustomizationControllerContext = React.createContext<CustomizationController>({} as CustomizationController);
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { DataDriver } from "@rebasepro/types";
3
+
4
+ export const DataDriverContext = React.createContext<DataDriver>({} as DataDriver);
@@ -0,0 +1,36 @@
1
+ import React from "react";
2
+ import { DataSourceDefinition, RebaseData } from "@rebasepro/types";
3
+
4
+ /**
5
+ * The data-source configuration provided to `<Rebase>`: the declared
6
+ * definitions plus the built {@link RebaseData} instances for direct/custom
7
+ * transports.
8
+ *
9
+ * The actual path-based routing is assembled by the navigation layer (which
10
+ * has the collection registry) via `resolveDataSource` + `buildRoutedRebaseData`
11
+ * and re-provided through `RebaseDataContext`.
12
+ *
13
+ * @internal
14
+ */
15
+ export interface DataSourcesContextValue {
16
+ /** All declared data sources, keyed by data-source key. */
17
+ registry: Record<string, DataSourceDefinition>;
18
+ /**
19
+ * Built {@link RebaseData} for direct/custom data sources, keyed by
20
+ * data-source key. Server-mediated sources are absent (they ride the
21
+ * default client).
22
+ */
23
+ sources: Record<string, RebaseData>;
24
+ }
25
+
26
+ const EMPTY: DataSourcesContextValue = { registry: {}, sources: {} };
27
+
28
+ /** @internal */
29
+ export const DataSourcesContext = React.createContext<DataSourcesContextValue>(EMPTY);
30
+
31
+ /**
32
+ * Access the data-source configuration provided to `<Rebase>` via the
33
+ * `dataSources` prop.
34
+ * @internal
35
+ */
36
+ export const useDataSources = (): DataSourcesContextValue => React.useContext(DataSourcesContext);
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { DatabaseAdmin } from "@rebasepro/types";
3
+
4
+ export const DatabaseAdminContext = React.createContext<DatabaseAdmin | undefined>(undefined);
@@ -0,0 +1,56 @@
1
+ import type { DialogControllerEntryProps, DialogsController } from "@rebasepro/types";
2
+ import React, { PropsWithChildren, useCallback, useRef, useState, useMemo } from "react";
3
+ ;
4
+
5
+ export const DialogsControllerContext = React.createContext<DialogsController>({} as DialogsController);
6
+
7
+ export const DialogsProvider: React.FC<PropsWithChildren> = ({ children }) => {
8
+
9
+ const [dialogEntries, setDialogEntries] = useState<DialogControllerEntryProps[]>([]);
10
+ const dialogEntriesRef = useRef<DialogControllerEntryProps[]>(dialogEntries);
11
+
12
+ const updateDialogEntries = (newPanels: DialogControllerEntryProps<any>[]) => {
13
+ dialogEntriesRef.current = newPanels;
14
+ setDialogEntries(newPanels);
15
+ };
16
+
17
+ const close = useCallback(() => {
18
+
19
+ if (dialogEntries.length === 0)
20
+ return;
21
+
22
+ const updatedPanels = [...dialogEntriesRef.current.slice(0, -1)];
23
+ updateDialogEntries(updatedPanels);
24
+
25
+ }, [dialogEntries]);
26
+
27
+ const open = useCallback(<T extends object = object>(dialogEntry: DialogControllerEntryProps<T>) => {
28
+
29
+ const updatedPanels = [...dialogEntriesRef.current, dialogEntry];
30
+ updateDialogEntries(updatedPanels);
31
+
32
+ return {
33
+ closeDialog: () => {
34
+ const updatedPanels = dialogEntriesRef.current.filter(e => e.key !== dialogEntry.key);
35
+ updateDialogEntries(updatedPanels);
36
+ }
37
+ }
38
+ }, [dialogEntries]);
39
+
40
+ const dialogsController = useMemo(() => ({
41
+ open,
42
+ close
43
+ }), [open, close]);
44
+
45
+ return (
46
+ <DialogsControllerContext.Provider value={dialogsController}>
47
+ {children}
48
+ {dialogEntries.map((entry, i) => <entry.Component
49
+ key={`dialog_${i}`}
50
+ open={true}
51
+ closeDialog={close}
52
+ {...entry.props}
53
+ />)}
54
+ </DialogsControllerContext.Provider>
55
+ );
56
+ };
@@ -0,0 +1,12 @@
1
+ import type { EffectiveRoleController } from "@rebasepro/types";
2
+ import React from "react";
3
+ ;
4
+
5
+ const DEFAULT_EFFECTIVE_ROLE_STATE: EffectiveRoleController = {
6
+ effectiveRole: null,
7
+ setEffectiveRole: (_role: string | null) => {
8
+ }
9
+ };
10
+ export const EffectiveRoleControllerContext = React.createContext<EffectiveRoleController>(DEFAULT_EFFECTIVE_ROLE_STATE);
11
+
12
+ export const EffectiveRoleControllerProvider = EffectiveRoleControllerContext.Provider;
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ import { ModeController } from "../hooks";
3
+
4
+ const DEFAULT_MODE_STATE: ModeController = {
5
+ mode: "light",
6
+ setMode: (mode: "light" | "dark" | "system") => {
7
+ }
8
+ };
9
+ export const ModeControllerContext = React.createContext<ModeController>(DEFAULT_MODE_STATE);
10
+
11
+ export const ModeControllerProvider = ModeControllerContext.Provider;
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+
3
+ /**
4
+ * Context that exposes the full RebaseClient instance.
5
+ * Used by the JS Editor to give developer scripts access to `client.data`, `client.auth`, etc.
6
+ */
7
+ export const RebaseClientInstanceContext = React.createContext<any>(undefined);
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { RebaseData } from "@rebasepro/types";
3
+
4
+ export const RebaseDataContext = React.createContext<RebaseData>({} as RebaseData);
@@ -0,0 +1,15 @@
1
+ "use client";
2
+
3
+ import React, { PropsWithChildren } from "react";
4
+ import { SnackbarProvider as NotistackSnackbarProvider } from "notistack";
5
+
6
+ export const SnackbarProvider: React.FC<PropsWithChildren> = ({ children }) => {
7
+
8
+ return (
9
+ <NotistackSnackbarProvider maxSnack={3}
10
+ preventDuplicate={true}
11
+ autoHideDuration={3500}>
12
+ {children}
13
+ </NotistackSnackbarProvider>
14
+ );
15
+ };
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { StorageSource } from "@rebasepro/types";
3
+
4
+ export const StorageSourceContext = React.createContext<StorageSource>({} as StorageSource);
@@ -0,0 +1,30 @@
1
+ import React from "react";
2
+ import type { StorageSource, StorageSourceDefinition, StorageSourceRegistry } from "@rebasepro/types";
3
+
4
+ /**
5
+ * The storage-source configuration provided to `<Rebase>`: the declared
6
+ * definitions and the built {@link StorageSource} instances, wrapped in a
7
+ * {@link StorageSourceRegistry} for fast key-based lookup.
8
+ *
9
+ * Mirrors the {@link DataSourcesContext} pattern used for databases.
10
+ *
11
+ * @internal
12
+ */
13
+ export interface StorageSourcesContextValue {
14
+ /** All declared storage sources, keyed by storage-source key. */
15
+ registry: Record<string, StorageSourceDefinition>;
16
+ /** Built {@link StorageSource} for direct sources, keyed by key. */
17
+ sources: Record<string, StorageSource>;
18
+ }
19
+
20
+ const EMPTY: StorageSourcesContextValue = { registry: {}, sources: {} };
21
+
22
+ /** @internal */
23
+ export const StorageSourcesContext = React.createContext<StorageSourcesContextValue>(EMPTY);
24
+
25
+ /**
26
+ * Access the storage-source configuration provided to `<Rebase>` via the
27
+ * `storageSources` prop.
28
+ * @internal
29
+ */
30
+ export const useStorageSources = (): StorageSourcesContextValue => React.useContext(StorageSourcesContext);
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { UserConfigurationPersistence } from "@rebasepro/types";
3
+
4
+ export const UserConfigurationPersistenceContext = React.createContext<UserConfigurationPersistence | undefined>(undefined);
@@ -0,0 +1,17 @@
1
+ export * from "./SnackbarProvider";
2
+ export * from "./ModeController";
3
+ export * from "./AdminModeController";
4
+ export * from "./EffectiveRoleController";
5
+ export * from "./AuthControllerContext";
6
+ export * from "./DataDriverContext";
7
+ export * from "./DataSourcesContext";
8
+ export * from "./RebaseDataContext";
9
+ export * from "./AnalyticsContext";
10
+ export * from "./StorageSourceContext";
11
+ export * from "./StorageSourcesContext";
12
+ export * from "./UserConfigurationPersistenceContext";
13
+ export * from "./DialogsProvider";
14
+ export * from "./RebaseClientInstanceContext";
15
+ export * from "./CustomizationControllerContext";
16
+ export * from "./ComponentOverrideContext";
17
+ export * from "./CollectionScopeContext";
@@ -0,0 +1,95 @@
1
+
2
+ import { useEffect, useRef } from "react";
3
+ import type { RebasePlugin, RebaseContext, User } from "@rebasepro/types";
4
+
5
+ /**
6
+ * Render-less component that manages plugin lifecycle hooks.
7
+ *
8
+ * - Calls `lifecycle.onMount(context)` when plugins mount.
9
+ * - Calls `lifecycle.onUnmount()` when plugins unmount.
10
+ * - Subscribes to auth state changes and calls `lifecycle.onAuthStateChange`.
11
+ *
12
+ * Mount this component inside the Rebase tree, below PluginProviderStack,
13
+ * so that the RebaseContext is fully available.
14
+ *
15
+ * @internal
16
+ */
17
+ export function PluginLifecycleManager({
18
+ plugins,
19
+ context
20
+ }: {
21
+ plugins: RebasePlugin[];
22
+ context: RebaseContext;
23
+ }) {
24
+ const mountedRef = useRef(false);
25
+ const prevUserRef = useRef<User | null | undefined>(undefined);
26
+
27
+ // ── Mount / Unmount lifecycle ────────────────────────────────────
28
+ useEffect(() => {
29
+ // Prevent double-fire in StrictMode
30
+ if (mountedRef.current) return;
31
+ mountedRef.current = true;
32
+
33
+ for (const plugin of plugins) {
34
+ if (plugin.lifecycle?.onMount) {
35
+ try {
36
+ const result = plugin.lifecycle.onMount(context);
37
+ if (result instanceof Promise) {
38
+ result.catch((err) =>
39
+ console.error(`[Rebase] Plugin "${plugin.key}" onMount error:`, err)
40
+ );
41
+ }
42
+ } catch (err) {
43
+ console.error(`[Rebase] Plugin "${plugin.key}" onMount error:`, err);
44
+ }
45
+ }
46
+ }
47
+
48
+ return () => {
49
+ mountedRef.current = false;
50
+ for (const plugin of plugins) {
51
+ if (plugin.lifecycle?.onUnmount) {
52
+ try {
53
+ plugin.lifecycle.onUnmount();
54
+ } catch (err) {
55
+ console.error(`[Rebase] Plugin "${plugin.key}" onUnmount error:`, err);
56
+ }
57
+ }
58
+ }
59
+ };
60
+ // Only run on mount/unmount — plugins array identity should be stable
61
+ }, []);
62
+
63
+ // ── Auth state change lifecycle ──────────────────────────────────
64
+ const currentUser = context.authController?.user ?? null;
65
+
66
+ useEffect(() => {
67
+ // Skip the initial call — onMount handles that
68
+ if (prevUserRef.current === undefined) {
69
+ prevUserRef.current = currentUser;
70
+ return;
71
+ }
72
+
73
+ // Only fire when the user identity actually changes
74
+ const prevUid = prevUserRef.current?.uid;
75
+ const currUid = currentUser?.uid;
76
+ if (prevUid === currUid) return;
77
+
78
+ prevUserRef.current = currentUser;
79
+
80
+ for (const plugin of plugins) {
81
+ if (plugin.lifecycle?.onAuthStateChange) {
82
+ try {
83
+ plugin.lifecycle.onAuthStateChange(currentUser);
84
+ } catch (err) {
85
+ console.error(
86
+ `[Rebase] Plugin "${plugin.key}" onAuthStateChange error:`,
87
+ err
88
+ );
89
+ }
90
+ }
91
+ }
92
+ }, [currentUser, plugins]);
93
+
94
+ return null;
95
+ }
@@ -0,0 +1,40 @@
1
+ import type { RebasePlugin } from "@rebasepro/types";
2
+ import React from "react";
3
+ ;
4
+
5
+ /**
6
+ * Wraps children with all provider components from plugins that match the given scope.
7
+ *
8
+ * Replaces the 3 copy-pasted `plugins.forEach(plugin => { if (plugin.form?.provider) ... })` patterns
9
+ * in Rebase.tsx, EditViewBinding.tsx, and PopupFormField.tsx.
10
+ *
11
+ * @param plugins - Array of plugins to extract providers from.
12
+ * @param scope - `"root"` or `"form"` — which providers to apply.
13
+ * @param scopeProps - Additional props passed to each provider component.
14
+ * @param children - The content to wrap.
15
+ *
16
+ * @group Core
17
+ */
18
+ export function PluginProviderStack({
19
+ plugins,
20
+ scope,
21
+ scopeProps,
22
+ children
23
+ }: {
24
+ plugins: RebasePlugin[];
25
+ scope: "root" | "form";
26
+ scopeProps?: Record<string, unknown>;
27
+ children: React.ReactNode;
28
+ }) {
29
+ const providers = plugins.flatMap(p => p.providers ?? [])
30
+ .filter(p => p.scope === scope);
31
+
32
+ return providers.reduceRight<React.ReactNode>(
33
+ (acc, provider) => (
34
+ <provider.Component {...provider.props} {...scopeProps}>
35
+ {acc}
36
+ </provider.Component>
37
+ ),
38
+ children
39
+ );
40
+ }