@workos-inc/widgets 0.0.0-pre.0 → 0.0.0-pre.2
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/cjs/lib/api/role.d.ts.map +1 -1
- package/dist/cjs/lib/api/role.js +35 -14
- package/dist/cjs/lib/api/role.js.map +1 -1
- package/dist/cjs/lib/api/user.d.ts.map +1 -1
- package/dist/cjs/lib/api/user.js +105 -67
- package/dist/cjs/lib/api/user.js.map +1 -1
- package/dist/cjs/lib/constants.d.ts +2 -1
- package/dist/cjs/lib/constants.d.ts.map +1 -1
- package/dist/cjs/lib/constants.js +3 -2
- package/dist/cjs/lib/constants.js.map +1 -1
- package/dist/cjs/lib/delete-user-dialog.d.ts.map +1 -1
- package/dist/cjs/lib/delete-user-dialog.js +1 -1
- package/dist/cjs/lib/delete-user-dialog.js.map +1 -1
- package/dist/cjs/lib/edit-user-details-dialog.d.ts.map +1 -1
- package/dist/cjs/lib/edit-user-details-dialog.js +3 -5
- package/dist/cjs/lib/edit-user-details-dialog.js.map +1 -1
- package/dist/cjs/lib/elements.d.ts +21 -12
- package/dist/cjs/lib/elements.d.ts.map +1 -1
- package/dist/cjs/lib/elements.js +118 -30
- package/dist/cjs/lib/elements.js.map +1 -1
- package/dist/cjs/lib/error-boundary.d.ts +58 -0
- package/dist/cjs/lib/error-boundary.d.ts.map +1 -0
- package/dist/cjs/lib/error-boundary.js +113 -0
- package/dist/cjs/lib/error-boundary.js.map +1 -0
- package/dist/cjs/lib/errors.d.ts +34 -0
- package/dist/cjs/lib/errors.d.ts.map +1 -0
- package/dist/cjs/lib/errors.js +40 -0
- package/dist/cjs/lib/errors.js.map +1 -0
- package/dist/cjs/lib/invite-user-dialog.d.ts.map +1 -1
- package/dist/cjs/lib/invite-user-dialog.js +2 -2
- package/dist/cjs/lib/invite-user-dialog.js.map +1 -1
- package/dist/cjs/lib/resend-invite-dialog.d.ts.map +1 -1
- package/dist/cjs/lib/resend-invite-dialog.js +2 -2
- package/dist/cjs/lib/resend-invite-dialog.js.map +1 -1
- package/dist/cjs/lib/revoke-invite-dialog.d.ts.map +1 -1
- package/dist/cjs/lib/revoke-invite-dialog.js +1 -1
- package/dist/cjs/lib/revoke-invite-dialog.js.map +1 -1
- package/dist/cjs/lib/use-layout-effect.d.ts +4 -0
- package/dist/cjs/lib/use-layout-effect.d.ts.map +1 -0
- package/dist/cjs/lib/use-layout-effect.js +8 -0
- package/dist/cjs/lib/use-layout-effect.js.map +1 -0
- package/dist/cjs/lib/user-actions-dropdown.d.ts.map +1 -1
- package/dist/cjs/lib/user-actions-dropdown.js +2 -9
- package/dist/cjs/lib/user-actions-dropdown.js.map +1 -1
- package/dist/cjs/lib/users-filter.d.ts +1 -0
- package/dist/cjs/lib/users-filter.d.ts.map +1 -1
- package/dist/cjs/lib/users-filter.js +2 -9
- package/dist/cjs/lib/users-filter.js.map +1 -1
- package/dist/cjs/lib/users-management-context.d.ts +2 -2
- package/dist/cjs/lib/users-management-context.d.ts.map +1 -1
- package/dist/cjs/lib/users-management.d.ts +9 -6
- package/dist/cjs/lib/users-management.d.ts.map +1 -1
- package/dist/cjs/lib/users-management.js +77 -20
- package/dist/cjs/lib/users-management.js.map +1 -1
- package/dist/cjs/lib/users-search.d.ts.map +1 -1
- package/dist/cjs/lib/users-search.js +3 -9
- package/dist/cjs/lib/users-search.js.map +1 -1
- package/dist/cjs/lib/utils.d.ts +2 -0
- package/dist/cjs/lib/utils.d.ts.map +1 -1
- package/dist/cjs/lib/utils.js +18 -0
- package/dist/cjs/lib/utils.js.map +1 -1
- package/dist/cjs/users-management.client.d.ts +1 -1
- package/dist/cjs/users-management.client.d.ts.map +1 -1
- package/dist/cjs/users-management.client.js +15 -5
- package/dist/cjs/users-management.client.js.map +1 -1
- package/dist/cjs/workos-widgets.client.d.ts.map +1 -1
- package/dist/cjs/workos-widgets.client.js +2 -1
- package/dist/cjs/workos-widgets.client.js.map +1 -1
- package/dist/esm/lib/api/role.d.ts.map +1 -1
- package/dist/esm/lib/api/role.js +35 -14
- package/dist/esm/lib/api/role.js.map +1 -1
- package/dist/esm/lib/api/user.d.ts.map +1 -1
- package/dist/esm/lib/api/user.js +105 -67
- package/dist/esm/lib/api/user.js.map +1 -1
- package/dist/esm/lib/constants.d.ts +2 -1
- package/dist/esm/lib/constants.d.ts.map +1 -1
- package/dist/esm/lib/constants.js +2 -1
- package/dist/esm/lib/constants.js.map +1 -1
- package/dist/esm/lib/delete-user-dialog.d.ts.map +1 -1
- package/dist/esm/lib/delete-user-dialog.js +2 -2
- package/dist/esm/lib/delete-user-dialog.js.map +1 -1
- package/dist/esm/lib/edit-user-details-dialog.d.ts.map +1 -1
- package/dist/esm/lib/edit-user-details-dialog.js +4 -6
- package/dist/esm/lib/edit-user-details-dialog.js.map +1 -1
- package/dist/esm/lib/elements.d.ts +21 -12
- package/dist/esm/lib/elements.d.ts.map +1 -1
- package/dist/esm/lib/elements.js +95 -30
- package/dist/esm/lib/elements.js.map +1 -1
- package/dist/esm/lib/error-boundary.d.ts +58 -0
- package/dist/esm/lib/error-boundary.d.ts.map +1 -0
- package/dist/esm/lib/error-boundary.js +86 -0
- package/dist/esm/lib/error-boundary.js.map +1 -0
- package/dist/esm/lib/errors.d.ts +34 -0
- package/dist/esm/lib/errors.d.ts.map +1 -0
- package/dist/esm/lib/errors.js +34 -0
- package/dist/esm/lib/errors.js.map +1 -0
- package/dist/esm/lib/invite-user-dialog.d.ts.map +1 -1
- package/dist/esm/lib/invite-user-dialog.js +3 -3
- package/dist/esm/lib/invite-user-dialog.js.map +1 -1
- package/dist/esm/lib/resend-invite-dialog.d.ts.map +1 -1
- package/dist/esm/lib/resend-invite-dialog.js +3 -3
- package/dist/esm/lib/resend-invite-dialog.js.map +1 -1
- package/dist/esm/lib/revoke-invite-dialog.d.ts.map +1 -1
- package/dist/esm/lib/revoke-invite-dialog.js +2 -2
- package/dist/esm/lib/revoke-invite-dialog.js.map +1 -1
- package/dist/esm/lib/use-layout-effect.d.ts +4 -0
- package/dist/esm/lib/use-layout-effect.d.ts.map +1 -0
- package/dist/esm/lib/use-layout-effect.js +5 -0
- package/dist/esm/lib/use-layout-effect.js.map +1 -0
- package/dist/esm/lib/user-actions-dropdown.d.ts.map +1 -1
- package/dist/esm/lib/user-actions-dropdown.js +3 -10
- package/dist/esm/lib/user-actions-dropdown.js.map +1 -1
- package/dist/esm/lib/users-filter.d.ts +1 -0
- package/dist/esm/lib/users-filter.d.ts.map +1 -1
- package/dist/esm/lib/users-filter.js +4 -11
- package/dist/esm/lib/users-filter.js.map +1 -1
- package/dist/esm/lib/users-management-context.d.ts +2 -2
- package/dist/esm/lib/users-management-context.d.ts.map +1 -1
- package/dist/esm/lib/users-management.d.ts +9 -6
- package/dist/esm/lib/users-management.d.ts.map +1 -1
- package/dist/esm/lib/users-management.js +74 -22
- package/dist/esm/lib/users-management.js.map +1 -1
- package/dist/esm/lib/users-search.d.ts.map +1 -1
- package/dist/esm/lib/users-search.js +5 -11
- package/dist/esm/lib/users-search.js.map +1 -1
- package/dist/esm/lib/utils.d.ts +2 -0
- package/dist/esm/lib/utils.d.ts.map +1 -1
- package/dist/esm/lib/utils.js +13 -0
- package/dist/esm/lib/utils.js.map +1 -1
- package/dist/esm/users-management.client.d.ts +1 -1
- package/dist/esm/users-management.client.d.ts.map +1 -1
- package/dist/esm/users-management.client.js +16 -6
- package/dist/esm/users-management.client.js.map +1 -1
- package/dist/esm/workos-widgets.client.d.ts.map +1 -1
- package/dist/esm/workos-widgets.client.js +2 -1
- package/dist/esm/workos-widgets.client.js.map +1 -1
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +9 -4
- package/src/base.css +111 -0
- package/src/lib/api/role.ts +39 -16
- package/src/lib/api/user.ts +119 -75
- package/src/lib/constants.ts +2 -1
- package/src/lib/delete-user-dialog.tsx +7 -3
- package/src/lib/edit-user-details-dialog.tsx +15 -10
- package/src/lib/elements.tsx +242 -61
- package/src/lib/error-boundary.tsx +166 -0
- package/src/lib/errors.ts +49 -0
- package/src/lib/invite-user-dialog.tsx +21 -12
- package/src/lib/resend-invite-dialog.tsx +11 -5
- package/src/lib/revoke-invite-dialog.tsx +7 -3
- package/src/lib/use-layout-effect.ts +6 -0
- package/src/lib/user-actions-dropdown.tsx +8 -16
- package/src/lib/users-filter.tsx +13 -73
- package/src/lib/users-management-context.tsx +1 -1
- package/src/lib/users-management.tsx +345 -184
- package/src/lib/users-search.tsx +5 -63
- package/src/lib/utils.ts +21 -0
- package/src/users-management.client.tsx +39 -16
- package/src/users-management.css +4 -0
- package/src/workos-widgets.client.tsx +2 -1
- package/dist/cjs/lib/pagination.d.ts +0 -8
- package/dist/cjs/lib/pagination.d.ts.map +0 -1
- package/dist/cjs/lib/pagination.js +0 -67
- package/dist/cjs/lib/pagination.js.map +0 -1
- package/dist/esm/lib/pagination.d.ts +0 -8
- package/dist/esm/lib/pagination.d.ts.map +0 -1
- package/dist/esm/lib/pagination.js +0 -40
- package/dist/esm/lib/pagination.js.map +0 -1
- package/src/lib/pagination.tsx +0 -69
package/src/lib/api/user.ts
CHANGED
|
@@ -12,6 +12,7 @@ import { parseErrorResponse } from "../utils";
|
|
|
12
12
|
import { useWorkOsApiUrl } from "../widgets-context";
|
|
13
13
|
import { API_ENDPOINTS } from "./config";
|
|
14
14
|
import { USER_ROW_LIMIT, WIDGETS_API_VERSION } from "../constants";
|
|
15
|
+
import { ApiError, FetchError, NoAuthTokenError } from "../errors";
|
|
15
16
|
|
|
16
17
|
export interface PaginationData {
|
|
17
18
|
before?: string;
|
|
@@ -54,15 +55,6 @@ export type Paginated<T> = { data: T; pagination: PaginationData };
|
|
|
54
55
|
|
|
55
56
|
type PaginatedUsers = Paginated<User[]>;
|
|
56
57
|
|
|
57
|
-
class InviteUserError extends Error {
|
|
58
|
-
status: number;
|
|
59
|
-
constructor(args: { message: string; status: number }) {
|
|
60
|
-
super(args.message);
|
|
61
|
-
this.name = "InviteUserError";
|
|
62
|
-
this.status = args.status;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
58
|
export const useUsers = (context?: UsersManagementContextType) => {
|
|
67
59
|
const {
|
|
68
60
|
authToken,
|
|
@@ -206,6 +198,8 @@ export const useResendUserInvite = (args?: {
|
|
|
206
198
|
});
|
|
207
199
|
};
|
|
208
200
|
|
|
201
|
+
type AuthToken = () => Promise<string>;
|
|
202
|
+
|
|
209
203
|
/**
|
|
210
204
|
* Fetch functions
|
|
211
205
|
*/
|
|
@@ -219,7 +213,7 @@ async function fetchUsers({
|
|
|
219
213
|
searchQuery,
|
|
220
214
|
}: {
|
|
221
215
|
baseUrl: string;
|
|
222
|
-
authToken:
|
|
216
|
+
authToken: AuthToken | null;
|
|
223
217
|
limit: number;
|
|
224
218
|
before: string | undefined;
|
|
225
219
|
after: string | undefined;
|
|
@@ -227,7 +221,7 @@ async function fetchUsers({
|
|
|
227
221
|
role: string | null;
|
|
228
222
|
}) {
|
|
229
223
|
if (!authToken) {
|
|
230
|
-
throw new
|
|
224
|
+
throw new NoAuthTokenError();
|
|
231
225
|
}
|
|
232
226
|
const url = new URL(`${baseUrl}/${API_ENDPOINTS.USERS}`);
|
|
233
227
|
url.searchParams.set("limit", limit.toString());
|
|
@@ -245,16 +239,24 @@ async function fetchUsers({
|
|
|
245
239
|
}
|
|
246
240
|
const response = await fetch(url, {
|
|
247
241
|
cache: "no-store",
|
|
248
|
-
headers: getAuthHeaders(authToken),
|
|
242
|
+
headers: getAuthHeaders(await authToken()),
|
|
249
243
|
}).catch((error) => {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
244
|
+
throw new FetchError({
|
|
245
|
+
message: "Failed to fetch users",
|
|
246
|
+
queryType: "query",
|
|
247
|
+
recordType: "users",
|
|
248
|
+
context: { error },
|
|
249
|
+
});
|
|
253
250
|
});
|
|
254
251
|
|
|
255
252
|
if (!response.ok) {
|
|
256
|
-
|
|
257
|
-
throw new
|
|
253
|
+
const { message, status } = await parseErrorResponse(response);
|
|
254
|
+
throw new ApiError({
|
|
255
|
+
message,
|
|
256
|
+
status,
|
|
257
|
+
queryType: "query",
|
|
258
|
+
recordType: "users",
|
|
259
|
+
});
|
|
258
260
|
}
|
|
259
261
|
// TODO validate the response
|
|
260
262
|
const json = await response.json();
|
|
@@ -267,23 +269,31 @@ async function fetchUsers({
|
|
|
267
269
|
|
|
268
270
|
const fetchUser = async (
|
|
269
271
|
userId: string,
|
|
270
|
-
{ authToken, baseUrl }: { authToken:
|
|
272
|
+
{ authToken, baseUrl }: { authToken: AuthToken | null; baseUrl: string },
|
|
271
273
|
) => {
|
|
272
274
|
if (!authToken) {
|
|
273
|
-
throw new
|
|
275
|
+
throw new NoAuthTokenError();
|
|
274
276
|
}
|
|
275
277
|
const response = await fetch(`${baseUrl}/${API_ENDPOINTS.USERS}/${userId}`, {
|
|
276
|
-
headers: getAuthHeaders(authToken),
|
|
278
|
+
headers: getAuthHeaders(await authToken()),
|
|
277
279
|
cache: "no-store",
|
|
278
280
|
}).catch((error) => {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
281
|
+
throw new FetchError({
|
|
282
|
+
message: "Failed to fetch user",
|
|
283
|
+
queryType: "query",
|
|
284
|
+
recordType: "users",
|
|
285
|
+
context: { error },
|
|
286
|
+
});
|
|
282
287
|
});
|
|
283
288
|
|
|
284
289
|
if (!response.ok) {
|
|
285
|
-
|
|
286
|
-
throw new
|
|
290
|
+
const { message, status } = await parseErrorResponse(response);
|
|
291
|
+
throw new ApiError({
|
|
292
|
+
message,
|
|
293
|
+
status,
|
|
294
|
+
queryType: "query",
|
|
295
|
+
recordType: "users",
|
|
296
|
+
});
|
|
287
297
|
}
|
|
288
298
|
// TODO validate the response
|
|
289
299
|
const json = await response.json();
|
|
@@ -296,28 +306,40 @@ const updateUserRole = async (
|
|
|
296
306
|
authToken,
|
|
297
307
|
baseUrl,
|
|
298
308
|
data,
|
|
299
|
-
}: {
|
|
309
|
+
}: {
|
|
310
|
+
authToken: AuthToken | null;
|
|
311
|
+
baseUrl: string;
|
|
312
|
+
data: { roles: string[] };
|
|
313
|
+
},
|
|
300
314
|
) => {
|
|
301
315
|
if (!authToken) {
|
|
302
|
-
|
|
303
|
-
throw new Error("No auth token");
|
|
316
|
+
throw new NoAuthTokenError();
|
|
304
317
|
}
|
|
305
318
|
|
|
306
319
|
const response = await fetch(`${baseUrl}/${API_ENDPOINTS.USERS}/${userId}`, {
|
|
307
320
|
method: "POST",
|
|
308
321
|
headers: {
|
|
309
322
|
"Content-Type": "application/json",
|
|
310
|
-
...getAuthHeaders(authToken),
|
|
323
|
+
...getAuthHeaders(await authToken()),
|
|
311
324
|
},
|
|
312
325
|
body: JSON.stringify(data),
|
|
313
326
|
}).catch((error) => {
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
327
|
+
throw new FetchError({
|
|
328
|
+
message: "Failed to update user",
|
|
329
|
+
queryType: "mutation",
|
|
330
|
+
recordType: "users",
|
|
331
|
+
context: { error },
|
|
332
|
+
});
|
|
317
333
|
});
|
|
318
334
|
|
|
319
335
|
if (!response.ok) {
|
|
320
|
-
|
|
336
|
+
const { message, status } = await parseErrorResponse(response);
|
|
337
|
+
throw new ApiError({
|
|
338
|
+
message,
|
|
339
|
+
status,
|
|
340
|
+
queryType: "mutation",
|
|
341
|
+
recordType: "users",
|
|
342
|
+
});
|
|
321
343
|
}
|
|
322
344
|
// TODO validate the response
|
|
323
345
|
const json = await response.json();
|
|
@@ -327,36 +349,38 @@ const updateUserRole = async (
|
|
|
327
349
|
const inviteUser = async ({
|
|
328
350
|
authToken,
|
|
329
351
|
baseUrl,
|
|
330
|
-
|
|
331
|
-
|
|
352
|
+
email,
|
|
353
|
+
role,
|
|
354
|
+
}: InviteUserPayload & { authToken: AuthToken | null; baseUrl: string }) => {
|
|
332
355
|
if (!authToken) {
|
|
333
|
-
|
|
334
|
-
throw new Error("No auth token");
|
|
335
|
-
}
|
|
336
|
-
if (!data.role) {
|
|
337
|
-
throw new Error("Role required to invite user");
|
|
356
|
+
throw new NoAuthTokenError();
|
|
338
357
|
}
|
|
339
358
|
const response = await fetch(`${baseUrl}/${API_ENDPOINTS.USER_INVITE}`, {
|
|
340
359
|
method: "POST",
|
|
341
360
|
headers: {
|
|
342
361
|
"Content-Type": "application/json",
|
|
343
|
-
...getAuthHeaders(authToken),
|
|
362
|
+
...getAuthHeaders(await authToken()),
|
|
344
363
|
},
|
|
345
364
|
body: JSON.stringify({
|
|
346
|
-
email
|
|
347
|
-
roles: [
|
|
365
|
+
email,
|
|
366
|
+
roles: [role],
|
|
348
367
|
}),
|
|
349
368
|
}).catch((error) => {
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
369
|
+
throw new FetchError({
|
|
370
|
+
message: "Failed to invite user",
|
|
371
|
+
queryType: "mutation",
|
|
372
|
+
recordType: "users",
|
|
373
|
+
context: { error },
|
|
374
|
+
});
|
|
353
375
|
});
|
|
354
376
|
|
|
355
377
|
if (!response.ok) {
|
|
356
378
|
const { message, status } = await parseErrorResponse(response);
|
|
357
|
-
throw new
|
|
379
|
+
throw new ApiError({
|
|
358
380
|
message,
|
|
359
381
|
status,
|
|
382
|
+
queryType: "mutation",
|
|
383
|
+
recordType: "users",
|
|
360
384
|
});
|
|
361
385
|
}
|
|
362
386
|
// TODO validate the response
|
|
@@ -366,26 +390,32 @@ const inviteUser = async ({
|
|
|
366
390
|
|
|
367
391
|
const deleteUser = async (
|
|
368
392
|
userId: string,
|
|
369
|
-
{ authToken, baseUrl }: { authToken:
|
|
393
|
+
{ authToken, baseUrl }: { authToken: AuthToken | null; baseUrl: string },
|
|
370
394
|
) => {
|
|
371
395
|
if (!authToken) {
|
|
372
|
-
|
|
373
|
-
throw new Error("No auth token");
|
|
396
|
+
throw new NoAuthTokenError();
|
|
374
397
|
}
|
|
375
398
|
|
|
376
399
|
const response = await fetch(`${baseUrl}/${API_ENDPOINTS.USERS}/${userId}`, {
|
|
377
400
|
method: "DELETE",
|
|
378
|
-
headers: getAuthHeaders(authToken),
|
|
401
|
+
headers: getAuthHeaders(await authToken()),
|
|
379
402
|
}).catch((error) => {
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
403
|
+
throw new FetchError({
|
|
404
|
+
message: "Failed to delete user. Please try again.",
|
|
405
|
+
queryType: "mutation",
|
|
406
|
+
recordType: "users",
|
|
407
|
+
context: { error },
|
|
408
|
+
});
|
|
383
409
|
});
|
|
384
410
|
|
|
385
411
|
if (!response.ok) {
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
412
|
+
const { message, status } = await parseErrorResponse(response);
|
|
413
|
+
throw new ApiError({
|
|
414
|
+
message,
|
|
415
|
+
status,
|
|
416
|
+
queryType: "mutation",
|
|
417
|
+
recordType: "users",
|
|
418
|
+
});
|
|
389
419
|
}
|
|
390
420
|
// TODO validate the response
|
|
391
421
|
const json = await response.json();
|
|
@@ -394,27 +424,34 @@ const deleteUser = async (
|
|
|
394
424
|
|
|
395
425
|
const revokeUserInvite = async (
|
|
396
426
|
userId: string,
|
|
397
|
-
{ authToken, baseUrl }: { authToken:
|
|
427
|
+
{ authToken, baseUrl }: { authToken: AuthToken | null; baseUrl: string },
|
|
398
428
|
) => {
|
|
399
429
|
if (!authToken) {
|
|
400
|
-
|
|
401
|
-
throw new Error("No auth token");
|
|
430
|
+
throw new NoAuthTokenError();
|
|
402
431
|
}
|
|
403
432
|
const response = await fetch(
|
|
404
433
|
`${baseUrl}/${API_ENDPOINTS.USER_INVITES}/${userId}`,
|
|
405
434
|
{
|
|
406
435
|
method: "DELETE",
|
|
407
|
-
headers: getAuthHeaders(authToken),
|
|
436
|
+
headers: getAuthHeaders(await authToken()),
|
|
408
437
|
},
|
|
409
438
|
).catch((error) => {
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
439
|
+
throw new FetchError({
|
|
440
|
+
message: "Failed to resend user invite. Please try again.",
|
|
441
|
+
queryType: "mutation",
|
|
442
|
+
recordType: "users",
|
|
443
|
+
context: { error },
|
|
444
|
+
});
|
|
413
445
|
});
|
|
414
446
|
|
|
415
447
|
if (!response.ok) {
|
|
416
|
-
|
|
417
|
-
throw new
|
|
448
|
+
const { message, status } = await parseErrorResponse(response);
|
|
449
|
+
throw new ApiError({
|
|
450
|
+
message,
|
|
451
|
+
status,
|
|
452
|
+
queryType: "mutation",
|
|
453
|
+
recordType: "users",
|
|
454
|
+
});
|
|
418
455
|
}
|
|
419
456
|
// TODO validate the response
|
|
420
457
|
const json = await response.json();
|
|
@@ -423,27 +460,34 @@ const revokeUserInvite = async (
|
|
|
423
460
|
|
|
424
461
|
const resendUserInvite = async (
|
|
425
462
|
userId: string,
|
|
426
|
-
{ authToken, baseUrl }: { authToken:
|
|
463
|
+
{ authToken, baseUrl }: { authToken: AuthToken | null; baseUrl: string },
|
|
427
464
|
) => {
|
|
428
465
|
if (!authToken) {
|
|
429
|
-
|
|
430
|
-
throw new Error("No auth token");
|
|
466
|
+
throw new NoAuthTokenError();
|
|
431
467
|
}
|
|
432
468
|
const response = await fetch(
|
|
433
469
|
`${baseUrl}/${API_ENDPOINTS.USER_INVITES_RESEND(userId)}`,
|
|
434
470
|
{
|
|
435
471
|
method: "POST",
|
|
436
|
-
headers: getAuthHeaders(authToken),
|
|
472
|
+
headers: getAuthHeaders(await authToken()),
|
|
437
473
|
},
|
|
438
474
|
).catch((error) => {
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
475
|
+
throw new FetchError({
|
|
476
|
+
message: "Failed to resend user invite. Please try again.",
|
|
477
|
+
queryType: "mutation",
|
|
478
|
+
recordType: "users",
|
|
479
|
+
context: { error },
|
|
480
|
+
});
|
|
442
481
|
});
|
|
443
482
|
|
|
444
483
|
if (!response.ok) {
|
|
445
|
-
|
|
446
|
-
throw new
|
|
484
|
+
const { message, status } = await parseErrorResponse(response);
|
|
485
|
+
throw new ApiError({
|
|
486
|
+
message,
|
|
487
|
+
status,
|
|
488
|
+
queryType: "mutation",
|
|
489
|
+
recordType: "users",
|
|
490
|
+
});
|
|
447
491
|
}
|
|
448
492
|
// TODO validate the response
|
|
449
493
|
const json = await response.json();
|
package/src/lib/constants.ts
CHANGED
|
@@ -11,7 +11,11 @@ import {
|
|
|
11
11
|
import { type ReactNode, useRef } from "react";
|
|
12
12
|
import { useDeleteUser } from "./api/user";
|
|
13
13
|
import type { User } from "./api/user";
|
|
14
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
AlertDialogContent,
|
|
16
|
+
DestructiveButton,
|
|
17
|
+
SecondaryButton,
|
|
18
|
+
} from "./elements";
|
|
15
19
|
|
|
16
20
|
interface DeleteUserDialogProps extends AlertDialog.RootProps {
|
|
17
21
|
open: boolean;
|
|
@@ -40,7 +44,7 @@ export const DeleteUserDialog = ({
|
|
|
40
44
|
<AlertDialog.Root {...props}>
|
|
41
45
|
{children && <AlertDialog.Trigger>{children}</AlertDialog.Trigger>}
|
|
42
46
|
|
|
43
|
-
<
|
|
47
|
+
<AlertDialogContent
|
|
44
48
|
maxWidth="480px"
|
|
45
49
|
onOpenAutoFocus={() => {
|
|
46
50
|
requestAnimationFrame(() => {
|
|
@@ -89,7 +93,7 @@ export const DeleteUserDialog = ({
|
|
|
89
93
|
{getMutationErrorMessage(deleteUser.error)}
|
|
90
94
|
</section>
|
|
91
95
|
</VisuallyHidden>
|
|
92
|
-
</
|
|
96
|
+
</AlertDialogContent>
|
|
93
97
|
</AlertDialog.Root>
|
|
94
98
|
);
|
|
95
99
|
};
|
|
@@ -13,10 +13,16 @@ import {
|
|
|
13
13
|
import { type ReactNode, useState } from "react";
|
|
14
14
|
import { useUpdateUserRole } from "./api/user";
|
|
15
15
|
import type { User } from "./api/user";
|
|
16
|
-
import {
|
|
16
|
+
import {
|
|
17
|
+
DialogContent,
|
|
18
|
+
PrimaryButton,
|
|
19
|
+
SecondaryButton,
|
|
20
|
+
SelectContent,
|
|
21
|
+
SelectItem,
|
|
22
|
+
SelectTrigger,
|
|
23
|
+
} from "./elements";
|
|
17
24
|
import { getBestName } from "./utils";
|
|
18
25
|
import { useRoles } from "./api/role";
|
|
19
|
-
import { useElement } from "./widgets-context";
|
|
20
26
|
|
|
21
27
|
interface EditUserDialogProps extends Dialog.RootProps {
|
|
22
28
|
open: boolean;
|
|
@@ -34,7 +40,6 @@ export const EditUserDetailsDialog = ({
|
|
|
34
40
|
const rolesQuery = useRoles();
|
|
35
41
|
const { data: roles } = rolesQuery;
|
|
36
42
|
const updateUser = useUpdateUserRole();
|
|
37
|
-
const dropdownProps = useElement("dropdown");
|
|
38
43
|
const [selectedRole, setSelectedRole] = useState(
|
|
39
44
|
user.roles[0]?.slug || "Unknown",
|
|
40
45
|
);
|
|
@@ -62,7 +67,7 @@ export const EditUserDetailsDialog = ({
|
|
|
62
67
|
return (
|
|
63
68
|
<Dialog.Root {...props}>
|
|
64
69
|
{children && <Dialog.Trigger>{children}</Dialog.Trigger>}
|
|
65
|
-
<
|
|
70
|
+
<DialogContent maxWidth="480px">
|
|
66
71
|
<Dialog.Title>Edit role</Dialog.Title>
|
|
67
72
|
<Dialog.Description>
|
|
68
73
|
Select the role to assign to <Text weight="bold">{displayName}</Text>
|
|
@@ -82,7 +87,7 @@ export const EditUserDetailsDialog = ({
|
|
|
82
87
|
disabled={rolesQuery.isLoading || showSingleRoleInfo}
|
|
83
88
|
>
|
|
84
89
|
<Skeleton loading={rolesQuery.isLoading}>
|
|
85
|
-
<
|
|
90
|
+
<SelectTrigger
|
|
86
91
|
id={selectId}
|
|
87
92
|
placeholder="Assign a role"
|
|
88
93
|
aria-labelledby={selectLabelId}
|
|
@@ -95,13 +100,13 @@ export const EditUserDetailsDialog = ({
|
|
|
95
100
|
/>
|
|
96
101
|
</Skeleton>
|
|
97
102
|
|
|
98
|
-
<
|
|
103
|
+
<SelectContent>
|
|
99
104
|
{roles.map((role) => (
|
|
100
|
-
<
|
|
105
|
+
<SelectItem key={role.slug} value={role.slug}>
|
|
101
106
|
{role.name}
|
|
102
|
-
</
|
|
107
|
+
</SelectItem>
|
|
103
108
|
))}
|
|
104
|
-
</
|
|
109
|
+
</SelectContent>
|
|
105
110
|
</Select.Root>
|
|
106
111
|
|
|
107
112
|
{showErrorMessage ? (
|
|
@@ -148,7 +153,7 @@ export const EditUserDetailsDialog = ({
|
|
|
148
153
|
{getMutationErrorMessage(updateUser.error)}
|
|
149
154
|
</section>
|
|
150
155
|
</VisuallyHidden>
|
|
151
|
-
</
|
|
156
|
+
</DialogContent>
|
|
152
157
|
</Dialog.Root>
|
|
153
158
|
);
|
|
154
159
|
};
|