@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.
@@ -1,5 +1,5 @@
1
1
  import { ApplicationVerifier, ConfirmationResult, User as FirebaseUser } from "@firebase/auth";
2
- import { AuthController, Role, User } from "@rebasepro/types";
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: Role[]) => void;
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.3.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.3.0",
18
- "@rebasepro/common": "0.3.0",
19
- "@rebasepro/types": "0.3.0",
20
- "@rebasepro/core": "0.3.0",
21
- "@rebasepro/ui": "0.3.0",
22
- "@rebasepro/utils": "0.3.0"
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) => Role[] | undefined) = useCallback((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 roles.filter(r => mgmtUser.roles.includes(r.id));
262
- }, [roles, usersWithRoleIds]);
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.id === "admin");
311
+ const isAdmin = (userRoles ?? []).some(r => r === "admin");
307
312
 
308
- const userRoleIds = userRoles?.map(r => r.id);
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 { Role, User } from "@rebasepro/types";
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<Role[] | undefined> | Role[] | undefined;
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<Role[] | undefined>();
56
+ const [userRoles, _setUserRoles] = useState<string[] | undefined>();
57
57
  const [extra, setExtra] = useState<any>();
58
58
 
59
- const setUserRoles = useCallback((roles: Role[] | undefined) => {
60
- const currentRoleIds = userRoles?.map(r => r.id);
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?.map(r => r.id), // User.roles is string[], keep Role[] internally only
300
+ roles: userRoles,
303
301
  firebaseUser: loggedUser
304
302
  }
305
303
  : null;
@@ -1,6 +1,6 @@
1
1
  import { ApplicationVerifier, ConfirmationResult, User as FirebaseUser } from "@firebase/auth";
2
2
 
3
- import { AuthController, Role, User } from "@rebasepro/types";
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: Role[]) => void;
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 (normalizedProperty.dataType === "array" && typeof normalizedProperty.of === "object" && normalizedProperty.of !== null) {
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 (normalizedProperty.dataType === "map" && normalizedProperty.properties) {
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, Function>).collections(collectionName).retrieve();
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, Function>)
338
+ const result = await (typesenseClient as Record<string, (...args: any[]) => any>)
339
339
  .collections(collectionName)
340
340
  .documents()
341
341
  .search(searchParams);