@rebasepro/client-firebase 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +97 -3
- package/dist/hooks/useBuildUserManagement.d.ts +6 -1
- package/dist/hooks/useFirebaseAuthController.d.ts +2 -2
- package/dist/index.es.js +9 -11
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +9 -11
- package/dist/index.umd.js.map +1 -1
- package/dist/types/auth.d.ts +2 -2
- package/package.json +7 -7
- package/src/hooks/useBuildUserManagement.tsx +11 -6
- package/src/hooks/useFirebaseAuthController.ts +6 -8
- package/src/types/auth.tsx +2 -2
- package/src/utils/collections_firestore.ts +4 -2
- package/src/utils/rebase_search_controller.ts +2 -2
- package/dist/social_icons.d.ts +0 -6
- package/src/social_icons.tsx +0 -135
package/README.md
CHANGED
|
@@ -1,4 +1,98 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @rebasepro/client-firebase
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
Firebase client adapter for Rebase — connects the Rebase admin panel to Firebase (Firestore, Auth, Storage).
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @rebasepro/client-firebase
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Peer dependencies:** `firebase ^10.12.2 || ^11.0.0 || ^12.0.0`, `react >= 19.0.0`, `react-dom >= 19.0.0`, `typesense ^1.8.0` (optional)
|
|
12
|
+
|
|
13
|
+
## What This Package Does
|
|
14
|
+
|
|
15
|
+
This package provides the full Firebase integration layer for Rebase. It includes:
|
|
16
|
+
|
|
17
|
+
- A top-level `RebaseFirebaseApp` component that wires up Firebase Auth, Firestore, and Storage into a complete admin app with login, routing, and data management.
|
|
18
|
+
- React hooks for each Firebase service (auth, Firestore, storage, App Check, user management).
|
|
19
|
+
- Text search adapters (Algolia, Pinecone, Typesense, local, Rebase-hosted).
|
|
20
|
+
- Firebase login view with configurable sign-in providers.
|
|
21
|
+
|
|
22
|
+
## Key Exports
|
|
23
|
+
|
|
24
|
+
### Components
|
|
25
|
+
|
|
26
|
+
| Export | Description |
|
|
27
|
+
|---|---|
|
|
28
|
+
| `RebaseFirebaseApp` | Full-featured Rebase app component backed by Firebase. Handles init, auth, routing, and rendering |
|
|
29
|
+
| `RebaseFirebaseAppProps` | Props type for `RebaseFirebaseApp` — name, logo, collections, views, signInOptions, plugins, etc. |
|
|
30
|
+
| `FirebaseLoginView` | Standalone Firebase login view with social sign-in buttons |
|
|
31
|
+
|
|
32
|
+
### Hooks
|
|
33
|
+
|
|
34
|
+
| Export | Description |
|
|
35
|
+
|---|---|
|
|
36
|
+
| `useInitialiseFirebase` | Initializes the Firebase app from config |
|
|
37
|
+
| `useFirebaseAuthController` | Manages Firebase Auth state (sign-in, sign-out, user) |
|
|
38
|
+
| `useFirestoreDriver` | Creates a Firestore-backed `DataDriver` for CRUD and realtime listeners |
|
|
39
|
+
| `useFirebaseStorageSource` | Provides file upload/download via Firebase Storage |
|
|
40
|
+
| `useAppCheck` | Enables Firebase App Check verification |
|
|
41
|
+
| `useRecaptcha` | reCAPTCHA integration for App Check |
|
|
42
|
+
| `useBuildUserManagement` | Builds a user/role management delegate from Firestore |
|
|
43
|
+
| `useFirebaseAccessGate` | Evaluates whether the current user can access the admin panel |
|
|
44
|
+
| `useFirebaseRealTimeDBDelegate` | Realtime Database integration |
|
|
45
|
+
|
|
46
|
+
### Utils
|
|
47
|
+
|
|
48
|
+
| Export | Description |
|
|
49
|
+
|---|---|
|
|
50
|
+
| `buildAlgoliaSearchController` | Algolia text search adapter |
|
|
51
|
+
| `buildPineconeSearchController` | Pinecone text search adapter |
|
|
52
|
+
| `buildRebaseSearchController` | Rebase-hosted search adapter |
|
|
53
|
+
| `buildLocalTextSearchController` | Client-side fuzzy search (Fuse.js) |
|
|
54
|
+
| `buildTextSearchController` | Generic text search adapter builder |
|
|
55
|
+
| `buildCollectionsFromFirestore` | Auto-generate collection configs by introspecting Firestore data |
|
|
56
|
+
|
|
57
|
+
### Types
|
|
58
|
+
|
|
59
|
+
| Export | Description |
|
|
60
|
+
|---|---|
|
|
61
|
+
| `FirebaseSignInProvider` | Provider ID strings (`google.com`, `github.com`, etc.) |
|
|
62
|
+
| `FirebaseSignInOption` | Sign-in config with scopes and custom parameters |
|
|
63
|
+
| `FirebaseAuthController` | Extended auth controller type for Firebase |
|
|
64
|
+
| `FirebaseUserWrapper` | Rebase user wrapper around Firebase User |
|
|
65
|
+
| `FirestoreTextSearchControllerBuilder` | Builder type for text search controllers |
|
|
66
|
+
| `AppCheckOptions` | App Check configuration type |
|
|
67
|
+
|
|
68
|
+
## Quick Start
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
import { RebaseFirebaseApp } from "@rebasepro/client-firebase";
|
|
72
|
+
|
|
73
|
+
const firebaseConfig = {
|
|
74
|
+
apiKey: "...",
|
|
75
|
+
authDomain: "...",
|
|
76
|
+
projectId: "...",
|
|
77
|
+
storageBucket: "...",
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export default function App() {
|
|
81
|
+
return (
|
|
82
|
+
<RebaseFirebaseApp
|
|
83
|
+
name="My Admin"
|
|
84
|
+
firebaseConfig={firebaseConfig}
|
|
85
|
+
collections={[/* your collections */]}
|
|
86
|
+
signInOptions={["google.com"]}
|
|
87
|
+
/>
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Related Packages
|
|
93
|
+
|
|
94
|
+
- `@rebasepro/admin` — Admin panel UI (Scaffold, Drawer, SideDialogs)
|
|
95
|
+
- `@rebasepro/core` — Core framework (Rebase provider, routing)
|
|
96
|
+
- `@rebasepro/common` — Shared data utilities
|
|
97
|
+
- `@rebasepro/types` — Shared type definitions
|
|
98
|
+
- `@rebasepro/ui` — UI component library
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import { AuthController, DataDriver,
|
|
1
|
+
import { AuthController, DataDriver, User, UserManagementDelegate } from "@rebasepro/types";
|
|
2
|
+
export interface Role {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
isAdmin?: boolean;
|
|
6
|
+
}
|
|
2
7
|
export interface UserManagementDelegateParams<CONTROLLER extends AuthController<User> = AuthController<User>> {
|
|
3
8
|
authController: CONTROLLER;
|
|
4
9
|
/**
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { FirebaseApp } from "@firebase/app";
|
|
2
2
|
import { FirebaseAuthController, FirebaseSignInOption, FirebaseSignInProvider, FirebaseUserWrapper } from "../types";
|
|
3
|
-
import {
|
|
3
|
+
import type { User } from "@rebasepro/types";
|
|
4
4
|
export interface FirebaseAuthControllerProps {
|
|
5
5
|
loading?: boolean;
|
|
6
6
|
firebaseApp?: FirebaseApp;
|
|
7
7
|
signInOptions?: Array<FirebaseSignInProvider | FirebaseSignInOption>;
|
|
8
8
|
onSignOut?: () => void;
|
|
9
|
-
defineRolesFor?: (user: User) => Promise<
|
|
9
|
+
defineRolesFor?: (user: User) => Promise<string[] | undefined> | string[] | undefined;
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
12
|
* Use this hook to build an {@link AuthController} based on Firebase Auth
|
package/dist/index.es.js
CHANGED
|
@@ -34,9 +34,7 @@ const useFirebaseAuthController = ({
|
|
|
34
34
|
const [userRoles, _setUserRoles] = useState();
|
|
35
35
|
const [extra, setExtra] = useState();
|
|
36
36
|
const setUserRoles = useCallback((roles) => {
|
|
37
|
-
|
|
38
|
-
const newRoleIds = roles?.map((r_0) => r_0.id);
|
|
39
|
-
if (!deepEqual(currentRoleIds, newRoleIds)) {
|
|
37
|
+
if (!deepEqual(userRoles, roles)) {
|
|
40
38
|
_setUserRoles(roles);
|
|
41
39
|
}
|
|
42
40
|
}, [userRoles]);
|
|
@@ -224,8 +222,7 @@ const useFirebaseAuthController = ({
|
|
|
224
222
|
}, []);
|
|
225
223
|
const firebaseUserWrapper = loggedUser ? {
|
|
226
224
|
...loggedUser,
|
|
227
|
-
roles: userRoles
|
|
228
|
-
// User.roles is string[], keep Role[] internally only
|
|
225
|
+
roles: userRoles,
|
|
229
226
|
firebaseUser: loggedUser
|
|
230
227
|
} : null;
|
|
231
228
|
return {
|
|
@@ -614,7 +611,8 @@ function normalizePropertiesEnumValues(properties, sortObjectFormat = false) {
|
|
|
614
611
|
if (normalizedProperty.enum) {
|
|
615
612
|
normalizedProperty.enum = normalizeEnumValuesToArray(normalizedProperty.enum, sortObjectFormat);
|
|
616
613
|
}
|
|
617
|
-
|
|
614
|
+
const propType = normalizedProperty.type ?? normalizedProperty.dataType;
|
|
615
|
+
if (propType === "array" && typeof normalizedProperty.of === "object" && normalizedProperty.of !== null) {
|
|
618
616
|
const ofProp = normalizedProperty.of;
|
|
619
617
|
if (ofProp.enum) {
|
|
620
618
|
normalizedProperty.of = {
|
|
@@ -623,7 +621,7 @@ function normalizePropertiesEnumValues(properties, sortObjectFormat = false) {
|
|
|
623
621
|
};
|
|
624
622
|
}
|
|
625
623
|
}
|
|
626
|
-
if (
|
|
624
|
+
if (propType === "map" && normalizedProperty.properties) {
|
|
627
625
|
normalizedProperty.properties = normalizePropertiesEnumValues(normalizedProperty.properties, sortObjectFormat);
|
|
628
626
|
}
|
|
629
627
|
result[key] = normalizedProperty;
|
|
@@ -2024,8 +2022,8 @@ function useBuildUserManagement({
|
|
|
2024
2022
|
if (!usersWithRoleIds) throw Error("Users not loaded");
|
|
2025
2023
|
const mgmtUser = usersWithRoleIds.find((u_1) => u_1.email?.toLowerCase() === user_1?.email?.toLowerCase());
|
|
2026
2024
|
if (!mgmtUser || !mgmtUser.roles) return void 0;
|
|
2027
|
-
return
|
|
2028
|
-
}, [
|
|
2025
|
+
return mgmtUser.roles;
|
|
2026
|
+
}, [usersWithRoleIds]);
|
|
2029
2027
|
const accessGate = useCallback(({
|
|
2030
2028
|
user: user_2
|
|
2031
2029
|
}) => {
|
|
@@ -2065,8 +2063,8 @@ function useBuildUserManagement({
|
|
|
2065
2063
|
throw Error("Could not find a user with the provided email in the user management system.");
|
|
2066
2064
|
}, [loading, users]);
|
|
2067
2065
|
const userRoles = authController.user ? defineRolesFor(authController.user) : void 0;
|
|
2068
|
-
const isAdmin = (userRoles ?? []).some((
|
|
2069
|
-
const userRoleIds = userRoles
|
|
2066
|
+
const isAdmin = (userRoles ?? []).some((r) => r === "admin");
|
|
2067
|
+
const userRoleIds = userRoles;
|
|
2070
2068
|
useEffect(() => {
|
|
2071
2069
|
console.debug("Setting user roles", {
|
|
2072
2070
|
userRoles,
|