@rebasepro/client-firebase 0.3.0 → 0.4.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/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/types/auth.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ApplicationVerifier, ConfirmationResult, User as FirebaseUser } from "@firebase/auth";
|
|
2
|
-
import { AuthController,
|
|
2
|
+
import type { AuthController, User } from "@rebasepro/types";
|
|
3
3
|
/**
|
|
4
4
|
* @group Firebase
|
|
5
5
|
*/
|
|
@@ -37,5 +37,5 @@ export type FirebaseAuthController<USER extends User = FirebaseUserWrapper, Extr
|
|
|
37
37
|
*/
|
|
38
38
|
skipLogin: () => void;
|
|
39
39
|
setUser: (user: USER | null) => void;
|
|
40
|
-
setUserRoles: (roles:
|
|
40
|
+
setUserRoles: (roles: string[]) => void;
|
|
41
41
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rebasepro/client-firebase",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.4.0",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -14,12 +14,12 @@
|
|
|
14
14
|
"fast-equals": "6.0.0",
|
|
15
15
|
"fuse.js": "^7.3.0",
|
|
16
16
|
"react-router-dom": "^7.15.1",
|
|
17
|
-
"@rebasepro/admin": "0.
|
|
18
|
-
"@rebasepro/
|
|
19
|
-
"@rebasepro/
|
|
20
|
-
"@rebasepro/
|
|
21
|
-
"@rebasepro/
|
|
22
|
-
"@rebasepro/
|
|
17
|
+
"@rebasepro/admin": "0.4.0",
|
|
18
|
+
"@rebasepro/types": "0.4.0",
|
|
19
|
+
"@rebasepro/ui": "0.4.0",
|
|
20
|
+
"@rebasepro/utils": "0.4.0",
|
|
21
|
+
"@rebasepro/core": "0.4.0",
|
|
22
|
+
"@rebasepro/common": "0.4.0"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
25
|
"firebase": "^10.12.2 || ^11.0.0 || ^12.0.0",
|
|
@@ -6,12 +6,17 @@ import {
|
|
|
6
6
|
AuthController,
|
|
7
7
|
DataDriver,
|
|
8
8
|
Entity,
|
|
9
|
-
Role,
|
|
10
9
|
User,
|
|
11
10
|
UserManagementDelegate
|
|
12
11
|
} from "@rebasepro/types";
|
|
13
12
|
import { FirebaseAccessGate } from "./useFirebaseAccessGate";
|
|
14
13
|
|
|
14
|
+
export interface Role {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
isAdmin?: boolean;
|
|
18
|
+
}
|
|
19
|
+
|
|
15
20
|
type UserWithRoleIds<USER extends User = User> = Omit<USER, "roles"> & { roles: string[] };
|
|
16
21
|
|
|
17
22
|
export interface UserManagementDelegateParams<CONTROLLER extends AuthController<User> = AuthController<User>> {
|
|
@@ -254,12 +259,12 @@ export function useBuildUserManagement<CONTROLLER extends AuthController<User> =
|
|
|
254
259
|
|
|
255
260
|
|
|
256
261
|
|
|
257
|
-
const defineRolesFor: ((user: User) =>
|
|
262
|
+
const defineRolesFor: ((user: User) => string[] | undefined) = useCallback((user) => {
|
|
258
263
|
if (!usersWithRoleIds) throw Error("Users not loaded");
|
|
259
264
|
const mgmtUser = usersWithRoleIds.find(u => u.email?.toLowerCase() === user?.email?.toLowerCase());
|
|
260
265
|
if (!mgmtUser || !mgmtUser.roles) return undefined;
|
|
261
|
-
return
|
|
262
|
-
}, [
|
|
266
|
+
return mgmtUser.roles;
|
|
267
|
+
}, [usersWithRoleIds]);
|
|
263
268
|
|
|
264
269
|
const accessGate: FirebaseAccessGate<USER> = useCallback(({ user }) => {
|
|
265
270
|
|
|
@@ -303,9 +308,9 @@ export function useBuildUserManagement<CONTROLLER extends AuthController<User> =
|
|
|
303
308
|
}, [loading, users]);
|
|
304
309
|
|
|
305
310
|
const userRoles = authController.user ? defineRolesFor(authController.user) : undefined;
|
|
306
|
-
const isAdmin = (userRoles ?? []).some(r => r
|
|
311
|
+
const isAdmin = (userRoles ?? []).some(r => r === "admin");
|
|
307
312
|
|
|
308
|
-
const userRoleIds = userRoles
|
|
313
|
+
const userRoleIds = userRoles;
|
|
309
314
|
useEffect(() => {
|
|
310
315
|
console.debug("Setting user roles", {
|
|
311
316
|
userRoles,
|
|
@@ -24,14 +24,14 @@ import {
|
|
|
24
24
|
} from "@firebase/auth";
|
|
25
25
|
import { FirebaseApp } from "@firebase/app";
|
|
26
26
|
import { FirebaseAuthController, FirebaseSignInOption, FirebaseSignInProvider, FirebaseUserWrapper } from "../types";
|
|
27
|
-
import {
|
|
27
|
+
import type { User } from "@rebasepro/types";
|
|
28
28
|
|
|
29
29
|
export interface FirebaseAuthControllerProps {
|
|
30
30
|
loading?: boolean;
|
|
31
31
|
firebaseApp?: FirebaseApp;
|
|
32
32
|
signInOptions?: Array<FirebaseSignInProvider | FirebaseSignInOption>;
|
|
33
33
|
onSignOut?: () => void;
|
|
34
|
-
defineRolesFor?: (user: User) => Promise<
|
|
34
|
+
defineRolesFor?: (user: User) => Promise<string[] | undefined> | string[] | undefined;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
/**
|
|
@@ -53,13 +53,11 @@ export const useFirebaseAuthController = <USER extends FirebaseUserWrapper = any
|
|
|
53
53
|
const [authLoading, setAuthLoading] = useState(true);
|
|
54
54
|
const [loginSkipped, setLoginSkipped] = useState<boolean>(false);
|
|
55
55
|
const [confirmationResult, setConfirmationResult] = useState<undefined | ConfirmationResult>();
|
|
56
|
-
const [userRoles, _setUserRoles] = useState<
|
|
56
|
+
const [userRoles, _setUserRoles] = useState<string[] | undefined>();
|
|
57
57
|
const [extra, setExtra] = useState<any>();
|
|
58
58
|
|
|
59
|
-
const setUserRoles = useCallback((roles:
|
|
60
|
-
|
|
61
|
-
const newRoleIds = roles?.map(r => r.id);
|
|
62
|
-
if (!equal(currentRoleIds, newRoleIds)) {
|
|
59
|
+
const setUserRoles = useCallback((roles: string[] | undefined) => {
|
|
60
|
+
if (!equal(userRoles, roles)) {
|
|
63
61
|
_setUserRoles(roles);
|
|
64
62
|
}
|
|
65
63
|
}, [userRoles]);
|
|
@@ -299,7 +297,7 @@ export const useFirebaseAuthController = <USER extends FirebaseUserWrapper = any
|
|
|
299
297
|
const firebaseUserWrapper: FirebaseUserWrapper | null = loggedUser
|
|
300
298
|
? {
|
|
301
299
|
...loggedUser,
|
|
302
|
-
roles: userRoles
|
|
300
|
+
roles: userRoles,
|
|
303
301
|
firebaseUser: loggedUser
|
|
304
302
|
}
|
|
305
303
|
: null;
|
package/src/types/auth.tsx
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ApplicationVerifier, ConfirmationResult, User as FirebaseUser } from "@firebase/auth";
|
|
2
2
|
|
|
3
|
-
import { AuthController,
|
|
3
|
+
import type { AuthController, User } from "@rebasepro/types";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @group Firebase
|
|
@@ -69,6 +69,6 @@ export type FirebaseAuthController<USER extends User = FirebaseUserWrapper, Extr
|
|
|
69
69
|
|
|
70
70
|
setUser: (user: USER | null) => void;
|
|
71
71
|
|
|
72
|
-
setUserRoles: (roles:
|
|
72
|
+
setUserRoles: (roles: string[]) => void;
|
|
73
73
|
|
|
74
74
|
};
|
|
@@ -117,8 +117,10 @@ function normalizePropertiesEnumValues(
|
|
|
117
117
|
);
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
+
const propType = normalizedProperty.type ?? normalizedProperty.dataType;
|
|
121
|
+
|
|
120
122
|
// Handle array properties with enum values in "of"
|
|
121
|
-
if (
|
|
123
|
+
if (propType === "array" && typeof normalizedProperty.of === "object" && normalizedProperty.of !== null) {
|
|
122
124
|
const ofProp = normalizedProperty.of as Record<string, unknown>;
|
|
123
125
|
if (ofProp.enum) {
|
|
124
126
|
normalizedProperty.of = {
|
|
@@ -132,7 +134,7 @@ function normalizePropertiesEnumValues(
|
|
|
132
134
|
}
|
|
133
135
|
|
|
134
136
|
// Handle map properties recursively
|
|
135
|
-
if (
|
|
137
|
+
if (propType === "map" && normalizedProperty.properties) {
|
|
136
138
|
normalizedProperty.properties = normalizePropertiesEnumValues(
|
|
137
139
|
normalizedProperty.properties as Properties,
|
|
138
140
|
sortObjectFormat
|
|
@@ -253,7 +253,7 @@ export function buildRebaseSearchController(
|
|
|
253
253
|
}
|
|
254
254
|
|
|
255
255
|
try {
|
|
256
|
-
const collection = await (typesenseClient as Record<string,
|
|
256
|
+
const collection = await (typesenseClient as Record<string, (...args: any[]) => any>).collections(collectionName).retrieve();
|
|
257
257
|
|
|
258
258
|
// Extract string fields from the schema
|
|
259
259
|
const stringFields = (collection.fields as Array<{ type: string; name: string }>)
|
|
@@ -335,7 +335,7 @@ export function buildRebaseSearchController(
|
|
|
335
335
|
searchParams.filter_by = parentFilter;
|
|
336
336
|
}
|
|
337
337
|
|
|
338
|
-
const result = await (typesenseClient as Record<string,
|
|
338
|
+
const result = await (typesenseClient as Record<string, (...args: any[]) => any>)
|
|
339
339
|
.collections(collectionName)
|
|
340
340
|
.documents()
|
|
341
341
|
.search(searchParams);
|