@rovela-ai/sdk 0.2.1 → 0.3.1
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/admin/api/accept-invite.d.ts +65 -0
- package/dist/admin/api/accept-invite.d.ts.map +1 -0
- package/dist/admin/api/accept-invite.js +115 -0
- package/dist/admin/api/accept-invite.js.map +1 -0
- package/dist/admin/api/categories.d.ts.map +1 -1
- package/dist/admin/api/categories.js +21 -28
- package/dist/admin/api/categories.js.map +1 -1
- package/dist/admin/api/customers.d.ts.map +1 -1
- package/dist/admin/api/customers.js +17 -25
- package/dist/admin/api/customers.js.map +1 -1
- package/dist/admin/api/forgot-password.d.ts +39 -0
- package/dist/admin/api/forgot-password.d.ts.map +1 -0
- package/dist/admin/api/forgot-password.js +66 -0
- package/dist/admin/api/forgot-password.js.map +1 -0
- package/dist/admin/api/index.d.ts +6 -0
- package/dist/admin/api/index.d.ts.map +1 -1
- package/dist/admin/api/index.js +9 -0
- package/dist/admin/api/index.js.map +1 -1
- package/dist/admin/api/me.d.ts +72 -0
- package/dist/admin/api/me.d.ts.map +1 -0
- package/dist/admin/api/me.js +177 -0
- package/dist/admin/api/me.js.map +1 -0
- package/dist/admin/api/orders.d.ts.map +1 -1
- package/dist/admin/api/orders.js +21 -28
- package/dist/admin/api/orders.js.map +1 -1
- package/dist/admin/api/products.d.ts.map +1 -1
- package/dist/admin/api/products.js +33 -37
- package/dist/admin/api/products.js.map +1 -1
- package/dist/admin/api/refund.d.ts.map +1 -1
- package/dist/admin/api/refund.js +5 -7
- package/dist/admin/api/refund.js.map +1 -1
- package/dist/admin/api/reset-password.d.ts +49 -0
- package/dist/admin/api/reset-password.d.ts.map +1 -0
- package/dist/admin/api/reset-password.js +99 -0
- package/dist/admin/api/reset-password.js.map +1 -0
- package/dist/admin/api/return.d.ts.map +1 -1
- package/dist/admin/api/return.js +9 -12
- package/dist/admin/api/return.js.map +1 -1
- package/dist/admin/api/settings.d.ts.map +1 -1
- package/dist/admin/api/settings.js +9 -12
- package/dist/admin/api/settings.js.map +1 -1
- package/dist/admin/api/shipping.d.ts.map +1 -1
- package/dist/admin/api/shipping.js +65 -61
- package/dist/admin/api/shipping.js.map +1 -1
- package/dist/admin/api/stats.d.ts.map +1 -1
- package/dist/admin/api/stats.js +5 -7
- package/dist/admin/api/stats.js.map +1 -1
- package/dist/admin/api/stripe-status.d.ts.map +1 -1
- package/dist/admin/api/stripe-status.js +5 -7
- package/dist/admin/api/stripe-status.js.map +1 -1
- package/dist/admin/api/tax-zones.d.ts.map +1 -1
- package/dist/admin/api/tax-zones.js +21 -28
- package/dist/admin/api/tax-zones.js.map +1 -1
- package/dist/admin/api/users.d.ts +142 -0
- package/dist/admin/api/users.d.ts.map +1 -0
- package/dist/admin/api/users.js +356 -0
- package/dist/admin/api/users.js.map +1 -0
- package/dist/admin/components/AdminAcceptInviteForm.d.ts +3 -0
- package/dist/admin/components/AdminAcceptInviteForm.d.ts.map +1 -0
- package/dist/admin/components/AdminAcceptInviteForm.js +137 -0
- package/dist/admin/components/AdminAcceptInviteForm.js.map +1 -0
- package/dist/admin/components/AdminAccountPage.d.ts +10 -0
- package/dist/admin/components/AdminAccountPage.d.ts.map +1 -0
- package/dist/admin/components/AdminAccountPage.js +123 -0
- package/dist/admin/components/AdminAccountPage.js.map +1 -0
- package/dist/admin/components/AdminForgotPasswordForm.d.ts +8 -0
- package/dist/admin/components/AdminForgotPasswordForm.d.ts.map +1 -0
- package/dist/admin/components/AdminForgotPasswordForm.js +59 -0
- package/dist/admin/components/AdminForgotPasswordForm.js.map +1 -0
- package/dist/admin/components/AdminNav.d.ts.map +1 -1
- package/dist/admin/components/AdminNav.js +32 -4
- package/dist/admin/components/AdminNav.js.map +1 -1
- package/dist/admin/components/AdminResetPasswordForm.d.ts +12 -0
- package/dist/admin/components/AdminResetPasswordForm.d.ts.map +1 -0
- package/dist/admin/components/AdminResetPasswordForm.js +134 -0
- package/dist/admin/components/AdminResetPasswordForm.js.map +1 -0
- package/dist/admin/components/AdminUserMenu.d.ts.map +1 -1
- package/dist/admin/components/AdminUserMenu.js +2 -2
- package/dist/admin/components/AdminUserMenu.js.map +1 -1
- package/dist/admin/components/InviteUserDialog.d.ts +3 -0
- package/dist/admin/components/InviteUserDialog.d.ts.map +1 -0
- package/dist/admin/components/InviteUserDialog.js +127 -0
- package/dist/admin/components/InviteUserDialog.js.map +1 -0
- package/dist/admin/components/UsersTable.d.ts +3 -0
- package/dist/admin/components/UsersTable.d.ts.map +1 -0
- package/dist/admin/components/UsersTable.js +399 -0
- package/dist/admin/components/UsersTable.js.map +1 -0
- package/dist/admin/components/index.d.ts +9 -0
- package/dist/admin/components/index.d.ts.map +1 -1
- package/dist/admin/components/index.js +9 -0
- package/dist/admin/components/index.js.map +1 -1
- package/dist/admin/config.d.ts +15 -10
- package/dist/admin/config.d.ts.map +1 -1
- package/dist/admin/config.js +38 -11
- package/dist/admin/config.js.map +1 -1
- package/dist/admin/hooks/index.d.ts +4 -0
- package/dist/admin/hooks/index.d.ts.map +1 -1
- package/dist/admin/hooks/index.js +3 -0
- package/dist/admin/hooks/index.js.map +1 -1
- package/dist/admin/hooks/useAdminMe.d.ts +31 -0
- package/dist/admin/hooks/useAdminMe.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminMe.js +103 -0
- package/dist/admin/hooks/useAdminMe.js.map +1 -0
- package/dist/admin/hooks/useAdminPermissions.d.ts +3 -0
- package/dist/admin/hooks/useAdminPermissions.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminPermissions.js +51 -0
- package/dist/admin/hooks/useAdminPermissions.js.map +1 -0
- package/dist/admin/hooks/useAdminUsers.d.ts +3 -0
- package/dist/admin/hooks/useAdminUsers.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminUsers.js +240 -0
- package/dist/admin/hooks/useAdminUsers.js.map +1 -0
- package/dist/admin/index.d.ts +4 -4
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +20 -2
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/permissions.d.ts +92 -0
- package/dist/admin/permissions.d.ts.map +1 -0
- package/dist/admin/permissions.js +201 -0
- package/dist/admin/permissions.js.map +1 -0
- package/dist/admin/server/admin-invite.d.ts +122 -0
- package/dist/admin/server/admin-invite.d.ts.map +1 -0
- package/dist/admin/server/admin-invite.js +235 -0
- package/dist/admin/server/admin-invite.js.map +1 -0
- package/dist/admin/server/admin-password-reset.d.ts +87 -0
- package/dist/admin/server/admin-password-reset.d.ts.map +1 -0
- package/dist/admin/server/admin-password-reset.js +220 -0
- package/dist/admin/server/admin-password-reset.js.map +1 -0
- package/dist/admin/server/admin-self-service.d.ts +86 -0
- package/dist/admin/server/admin-self-service.d.ts.map +1 -0
- package/dist/admin/server/admin-self-service.js +188 -0
- package/dist/admin/server/admin-self-service.js.map +1 -0
- package/dist/admin/server/admin-service.d.ts.map +1 -1
- package/dist/admin/server/admin-service.js +21 -2
- package/dist/admin/server/admin-service.js.map +1 -1
- package/dist/admin/server/admin-session.d.ts +137 -0
- package/dist/admin/server/admin-session.d.ts.map +1 -0
- package/dist/admin/server/admin-session.js +229 -0
- package/dist/admin/server/admin-session.js.map +1 -0
- package/dist/admin/server/index.d.ts +7 -0
- package/dist/admin/server/index.d.ts.map +1 -1
- package/dist/admin/server/index.js +20 -0
- package/dist/admin/server/index.js.map +1 -1
- package/dist/admin/server/user-management.d.ts +223 -0
- package/dist/admin/server/user-management.d.ts.map +1 -0
- package/dist/admin/server/user-management.js +846 -0
- package/dist/admin/server/user-management.js.map +1 -0
- package/dist/admin/types.d.ts +153 -2
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/auth/config.d.ts.map +1 -1
- package/dist/auth/config.js +11 -2
- package/dist/auth/config.js.map +1 -1
- package/dist/core/db/queries.d.ts +19 -13
- package/dist/core/db/queries.d.ts.map +1 -1
- package/dist/core/db/schema.d.ts +327 -9
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.js +80 -3
- package/dist/core/db/schema.js.map +1 -1
- package/dist/core/types.d.ts +19 -3
- package/dist/core/types.d.ts.map +1 -1
- package/dist/emails/index.d.ts +2 -2
- package/dist/emails/index.d.ts.map +1 -1
- package/dist/emails/index.js +3 -1
- package/dist/emails/index.js.map +1 -1
- package/dist/emails/send/admin-auth.d.ts +94 -0
- package/dist/emails/send/admin-auth.d.ts.map +1 -0
- package/dist/emails/send/admin-auth.js +118 -0
- package/dist/emails/send/admin-auth.js.map +1 -0
- package/dist/emails/send/index.d.ts +2 -0
- package/dist/emails/send/index.d.ts.map +1 -1
- package/dist/emails/send/index.js +4 -0
- package/dist/emails/send/index.js.map +1 -1
- package/dist/emails/templates/admin-invite.d.ts +40 -0
- package/dist/emails/templates/admin-invite.d.ts.map +1 -0
- package/dist/emails/templates/admin-invite.js +62 -0
- package/dist/emails/templates/admin-invite.js.map +1 -0
- package/dist/emails/templates/index.d.ts +1 -0
- package/dist/emails/templates/index.d.ts.map +1 -1
- package/dist/emails/templates/index.js +4 -0
- package/dist/emails/templates/index.js.map +1 -1
- package/dist/emails/types.d.ts +22 -1
- package/dist/emails/types.d.ts.map +1 -1
- package/package.json +21 -1
package/dist/admin/config.js
CHANGED
|
@@ -25,18 +25,23 @@ const DEFAULT_SESSION_MAX_AGE = 8 * 60 * 60;
|
|
|
25
25
|
/**
|
|
26
26
|
* Create NextAuth options for store admin authentication.
|
|
27
27
|
*
|
|
28
|
-
* @
|
|
29
|
-
*
|
|
28
|
+
* @deprecated The Rovela sandbox template mounts exactly ONE NextAuth
|
|
29
|
+
* endpoint at `/api/auth/[...nextauth]`, wired to `createAuthOptions()`
|
|
30
|
+
* from `@rovela-ai/sdk/auth` — which already knows both the `credentials`
|
|
31
|
+
* and `admin-credentials` providers. `requireAdmin()` reads sessions via
|
|
32
|
+
* that same unified config, so the cookie name and SameSite policy match
|
|
33
|
+
* between write and read.
|
|
30
34
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* import NextAuth from 'next-auth'
|
|
35
|
-
* import { createAdminAuthOptions } from '@rovela/sdk/admin'
|
|
35
|
+
* Mounting a separate `/api/admin/auth/[...nextauth]` with this function
|
|
36
|
+
* creates a second cookie namespace that will NOT be read by
|
|
37
|
+
* `requireAdmin()`. Every admin API call will return 401.
|
|
36
38
|
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
39
|
+
* Use `createAuthOptions()` from `@rovela-ai/sdk/auth` instead. This
|
|
40
|
+
* function is kept to preserve SDK API compatibility for existing
|
|
41
|
+
* consumers and will be removed in a future major release.
|
|
42
|
+
*
|
|
43
|
+
* @param options - Configuration options
|
|
44
|
+
* @returns NextAuth options object
|
|
40
45
|
*/
|
|
41
46
|
export function createAdminAuthOptions(options = {}) {
|
|
42
47
|
const { sessionMaxAge = DEFAULT_SESSION_MAX_AGE, signInPage = '/admin/login', errorPage = '/admin/login', dashboardPage = '/admin', } = options;
|
|
@@ -59,12 +64,16 @@ export function createAdminAuthOptions(options = {}) {
|
|
|
59
64
|
// Throw error with specific code for frontend handling
|
|
60
65
|
throw new Error(result.error, { cause: result.code });
|
|
61
66
|
}
|
|
62
|
-
// Return user object for session
|
|
67
|
+
// Return user object for session. `sessionVersion` is embedded
|
|
68
|
+
// in the JWT at sign-in so `requireAdmin` can detect forced
|
|
69
|
+
// logouts after password changes (Phase 4).
|
|
70
|
+
const sessionVersion = result.admin.sessionVersion ?? 0;
|
|
63
71
|
return {
|
|
64
72
|
id: result.admin.id,
|
|
65
73
|
email: result.admin.email,
|
|
66
74
|
name: result.admin.name,
|
|
67
75
|
role: result.admin.role,
|
|
76
|
+
sessionVersion,
|
|
68
77
|
};
|
|
69
78
|
},
|
|
70
79
|
}),
|
|
@@ -76,6 +85,22 @@ export function createAdminAuthOptions(options = {}) {
|
|
|
76
85
|
jwt: {
|
|
77
86
|
maxAge: sessionMaxAge,
|
|
78
87
|
},
|
|
88
|
+
// Distinct cookie name from the customer auth config so admin and
|
|
89
|
+
// customer sessions never collide in the same app. Before this fix,
|
|
90
|
+
// both configs used NextAuth's default cookie name which caused
|
|
91
|
+
// subtle auth bugs. `__Secure-` prefix is auto-added in production
|
|
92
|
+
// (https) by NextAuth; we specify the base name here.
|
|
93
|
+
cookies: {
|
|
94
|
+
sessionToken: {
|
|
95
|
+
name: 'rovela.admin.session-token',
|
|
96
|
+
options: {
|
|
97
|
+
httpOnly: true,
|
|
98
|
+
sameSite: 'lax',
|
|
99
|
+
path: '/',
|
|
100
|
+
secure: process.env.NODE_ENV === 'production',
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
},
|
|
79
104
|
pages: {
|
|
80
105
|
signIn: signInPage,
|
|
81
106
|
error: errorPage,
|
|
@@ -91,6 +116,7 @@ export function createAdminAuthOptions(options = {}) {
|
|
|
91
116
|
adminToken.email = user.email ?? undefined;
|
|
92
117
|
adminToken.name = user.name ?? undefined;
|
|
93
118
|
adminToken.role = adminUser.role;
|
|
119
|
+
adminToken.sessionVersion = adminUser.sessionVersion ?? 0;
|
|
94
120
|
}
|
|
95
121
|
return token;
|
|
96
122
|
},
|
|
@@ -103,6 +129,7 @@ export function createAdminAuthOptions(options = {}) {
|
|
|
103
129
|
user.email = adminToken.email;
|
|
104
130
|
user.name = adminToken.name;
|
|
105
131
|
user.role = adminToken.role;
|
|
132
|
+
user.sessionVersion = adminToken.sessionVersion ?? 0;
|
|
106
133
|
}
|
|
107
134
|
return session;
|
|
108
135
|
},
|
package/dist/admin/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/admin/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,mBAAmB,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/admin/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,5 +9,9 @@ export { useAdminOrders } from './useAdminOrders';
|
|
|
9
9
|
export { useAdminProducts } from './useAdminProducts';
|
|
10
10
|
export { useAdminCategories } from './useAdminCategories';
|
|
11
11
|
export { useAdminCustomers } from './useAdminCustomers';
|
|
12
|
+
export { useAdminUsers } from './useAdminUsers';
|
|
13
|
+
export { useAdminPermissions } from './useAdminPermissions';
|
|
14
|
+
export { useAdminMe } from './useAdminMe';
|
|
15
|
+
export type { AdminMe, UseAdminMeReturn } from './useAdminMe';
|
|
12
16
|
export type { CategoryTreeItem } from './useAdminCategories';
|
|
13
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/admin/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/admin/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC7D,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA"}
|
|
@@ -9,4 +9,7 @@ export { useAdminOrders } from './useAdminOrders';
|
|
|
9
9
|
export { useAdminProducts } from './useAdminProducts';
|
|
10
10
|
export { useAdminCategories } from './useAdminCategories';
|
|
11
11
|
export { useAdminCustomers } from './useAdminCustomers';
|
|
12
|
+
export { useAdminUsers } from './useAdminUsers';
|
|
13
|
+
export { useAdminPermissions } from './useAdminPermissions';
|
|
14
|
+
export { useAdminMe } from './useAdminMe';
|
|
12
15
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/admin/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/admin/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface AdminMe {
|
|
2
|
+
id: string;
|
|
3
|
+
email: string;
|
|
4
|
+
name: string;
|
|
5
|
+
role: string;
|
|
6
|
+
status: string;
|
|
7
|
+
createdAt: string;
|
|
8
|
+
lastLoginAt: string | null;
|
|
9
|
+
}
|
|
10
|
+
export interface UseAdminMeReturn {
|
|
11
|
+
me: AdminMe | null;
|
|
12
|
+
isLoading: boolean;
|
|
13
|
+
error: string | null;
|
|
14
|
+
refetch: () => Promise<void>;
|
|
15
|
+
updateProfile: (data: {
|
|
16
|
+
name?: string;
|
|
17
|
+
email?: string;
|
|
18
|
+
}) => Promise<{
|
|
19
|
+
success: boolean;
|
|
20
|
+
error?: string;
|
|
21
|
+
}>;
|
|
22
|
+
changePassword: (data: {
|
|
23
|
+
currentPassword: string;
|
|
24
|
+
newPassword: string;
|
|
25
|
+
}) => Promise<{
|
|
26
|
+
success: boolean;
|
|
27
|
+
error?: string;
|
|
28
|
+
}>;
|
|
29
|
+
}
|
|
30
|
+
export declare function useAdminMe(): UseAdminMeReturn;
|
|
31
|
+
//# sourceMappingURL=useAdminMe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAdminMe.d.ts","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminMe.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,GAAG,IAAI,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,aAAa,EAAE,CAAC,IAAI,EAAE;QACpB,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACnD,cAAc,EAAE,CAAC,IAAI,EAAE;QACrB,eAAe,EAAE,MAAM,CAAA;QACvB,WAAW,EAAE,MAAM,CAAA;KACpB,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACpD;AAMD,wBAAgB,UAAU,IAAI,gBAAgB,CAoG7C"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
/**
|
|
3
|
+
* @rovela/sdk/admin/hooks/useAdminMe
|
|
4
|
+
*
|
|
5
|
+
* Client hook for the logged-in admin's self-service data: fetch own
|
|
6
|
+
* profile, update own profile, change own password.
|
|
7
|
+
*
|
|
8
|
+
* Lightweight compared to `useAdminUsers` — no list/pagination state.
|
|
9
|
+
* Internal state tracks:
|
|
10
|
+
* - `me`: the current admin row (fetched on mount)
|
|
11
|
+
* - `isLoading`: initial fetch in progress
|
|
12
|
+
* - `error`: last fetch/update error
|
|
13
|
+
*
|
|
14
|
+
* Mutations return a typed result instead of throwing so the caller can
|
|
15
|
+
* surface errors in form UI.
|
|
16
|
+
*/
|
|
17
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
18
|
+
// =============================================================================
|
|
19
|
+
// Hook
|
|
20
|
+
// =============================================================================
|
|
21
|
+
export function useAdminMe() {
|
|
22
|
+
const [me, setMe] = useState(null);
|
|
23
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
24
|
+
const [error, setError] = useState(null);
|
|
25
|
+
const refetch = useCallback(async () => {
|
|
26
|
+
setIsLoading(true);
|
|
27
|
+
setError(null);
|
|
28
|
+
try {
|
|
29
|
+
const res = await fetch('/api/admin/me');
|
|
30
|
+
if (!res.ok) {
|
|
31
|
+
const data = (await res.json().catch(() => ({})));
|
|
32
|
+
throw new Error(data.error || 'Failed to load profile');
|
|
33
|
+
}
|
|
34
|
+
const data = (await res.json());
|
|
35
|
+
setMe(data);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
console.error('[useAdminMe] fetch error:', err);
|
|
39
|
+
setError(err instanceof Error ? err.message : 'Failed to load profile');
|
|
40
|
+
setMe(null);
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
setIsLoading(false);
|
|
44
|
+
}
|
|
45
|
+
}, []);
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
refetch();
|
|
48
|
+
}, [refetch]);
|
|
49
|
+
const updateProfile = useCallback(async (data) => {
|
|
50
|
+
try {
|
|
51
|
+
const res = await fetch('/api/admin/me', {
|
|
52
|
+
method: 'PATCH',
|
|
53
|
+
headers: { 'Content-Type': 'application/json' },
|
|
54
|
+
body: JSON.stringify(data),
|
|
55
|
+
});
|
|
56
|
+
const body = (await res.json().catch(() => ({})));
|
|
57
|
+
if (!res.ok || !body.success) {
|
|
58
|
+
return {
|
|
59
|
+
success: false,
|
|
60
|
+
error: body.error || 'Failed to update profile',
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
await refetch();
|
|
64
|
+
return { success: true };
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
console.error('[useAdminMe] updateProfile error:', err);
|
|
68
|
+
return {
|
|
69
|
+
success: false,
|
|
70
|
+
error: err instanceof Error ? err.message : 'Failed to update profile',
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}, [refetch]);
|
|
74
|
+
const changePassword = useCallback(async (data) => {
|
|
75
|
+
try {
|
|
76
|
+
const res = await fetch('/api/admin/me/password', {
|
|
77
|
+
method: 'PATCH',
|
|
78
|
+
headers: { 'Content-Type': 'application/json' },
|
|
79
|
+
body: JSON.stringify(data),
|
|
80
|
+
});
|
|
81
|
+
const body = (await res.json().catch(() => ({})));
|
|
82
|
+
if (!res.ok || !body.success) {
|
|
83
|
+
return {
|
|
84
|
+
success: false,
|
|
85
|
+
error: body.error || 'Failed to change password',
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// Password change bumps sessionVersion → this session is now
|
|
89
|
+
// invalid on the very next request. We deliberately DON'T refetch
|
|
90
|
+
// here — the UI will catch the 401 and redirect to login.
|
|
91
|
+
return { success: true };
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
console.error('[useAdminMe] changePassword error:', err);
|
|
95
|
+
return {
|
|
96
|
+
success: false,
|
|
97
|
+
error: err instanceof Error ? err.message : 'Failed to change password',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}, []);
|
|
101
|
+
return { me, isLoading, error, refetch, updateProfile, changePassword };
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=useAdminMe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAdminMe.js","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminMe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAdminPermissions.d.ts","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminPermissions.ts"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAA;AAMzD,wBAAgB,mBAAmB,IAAI,yBAAyB,CA+B/D"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
/**
|
|
3
|
+
* @rovela/sdk/admin/hooks/useAdminPermissions
|
|
4
|
+
*
|
|
5
|
+
* Client-side permission helpers. Pure wrapper around `admin/permissions.ts`
|
|
6
|
+
* that reads the current admin's role from `useAdminAuth`.
|
|
7
|
+
*
|
|
8
|
+
* No network calls — permissions are a function of the JWT already in memory,
|
|
9
|
+
* so this hook is cheap and synchronous once the session has loaded.
|
|
10
|
+
*
|
|
11
|
+
* Server-side is still the source of truth; this hook exists purely for UI
|
|
12
|
+
* gating (hide/disable buttons the user couldn't use anyway).
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* function UsersPage() {
|
|
17
|
+
* const { can, canManageUser, isOwner } = useAdminPermissions()
|
|
18
|
+
* if (!can('users.read')) return <NoAccess />
|
|
19
|
+
*
|
|
20
|
+
* return users.map(u => (
|
|
21
|
+
* <Row
|
|
22
|
+
* user={u}
|
|
23
|
+
* canDelete={isOwner && canManageUser(u)}
|
|
24
|
+
* canDeactivate={canManageUser(u)}
|
|
25
|
+
* />
|
|
26
|
+
* ))
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
import { useMemo, useCallback } from 'react';
|
|
31
|
+
import { useAdminAuth } from './useAdminAuth';
|
|
32
|
+
import { hasPermission, canManageUser as canManageUserCore, } from '../permissions';
|
|
33
|
+
// =============================================================================
|
|
34
|
+
// Hook
|
|
35
|
+
// =============================================================================
|
|
36
|
+
export function useAdminPermissions() {
|
|
37
|
+
const { admin } = useAdminAuth();
|
|
38
|
+
const role = (admin?.role ?? null);
|
|
39
|
+
const isOwner = role === 'owner';
|
|
40
|
+
const isAdministrator = role === 'administrator' || role === 'admin'; // legacy alias
|
|
41
|
+
const can = useCallback((permission) => {
|
|
42
|
+
return hasPermission(role, permission);
|
|
43
|
+
}, [role]);
|
|
44
|
+
const canManageUser = useCallback((target) => {
|
|
45
|
+
if (!admin)
|
|
46
|
+
return false;
|
|
47
|
+
return canManageUserCore({ id: admin.id, role: admin.role }, target);
|
|
48
|
+
}, [admin]);
|
|
49
|
+
return useMemo(() => ({ role, isOwner, isAdministrator, can, canManageUser }), [role, isOwner, isAdministrator, can, canManageUser]);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=useAdminPermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAdminPermissions.js","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminPermissions.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EACL,aAAa,EACb,aAAa,IAAI,iBAAiB,GAEnC,MAAM,gBAAgB,CAAA;AAIvB,gFAAgF;AAChF,OAAO;AACP,gFAAgF;AAEhF,MAAM,UAAU,mBAAmB;IACjC,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,EAAE,CAAA;IAEhC,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI,CAAqB,CAAA;IAEtD,MAAM,OAAO,GAAG,IAAI,KAAK,OAAO,CAAA;IAChC,MAAM,eAAe,GACnB,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,OAAO,CAAA,CAAC,eAAe;IAE9D,MAAM,GAAG,GAAG,WAAW,CACrB,CAAC,UAAsB,EAAW,EAAE;QAClC,OAAO,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACxC,CAAC,EACD,CAAC,IAAI,CAAC,CACP,CAAA;IAED,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,MAAuC,EAAW,EAAE;QACnD,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAA;QACxB,OAAO,iBAAiB,CACtB,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAiB,EAAE,EAC/C,MAAM,CACP,CAAA;IACH,CAAC,EACD,CAAC,KAAK,CAAC,CACR,CAAA;IAED,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,EAC9D,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,aAAa,CAAC,CACrD,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAdminUsers.d.ts","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminUsers.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAKV,mBAAmB,EACpB,MAAM,UAAU,CAAA;AAOjB,wBAAgB,aAAa,IAAI,mBAAmB,CAmSnD"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
/**
|
|
3
|
+
* @rovela/sdk/admin/hooks/useAdminUsers
|
|
4
|
+
*
|
|
5
|
+
* Admin user management data hook. Mirrors `useAdminCustomers` — state for
|
|
6
|
+
* the list, fetchers, and mutation helpers (deactivate, reactivate, delete).
|
|
7
|
+
*
|
|
8
|
+
* All mutations optimistically refetch the current page afterward so the
|
|
9
|
+
* table always reflects server state. Errors from mutations are returned
|
|
10
|
+
* to the caller so the UI can surface them in a toast or confirm dialog.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* function UsersPage() {
|
|
15
|
+
* const { users, isLoading, fetchUsers, deactivate } = useAdminUsers()
|
|
16
|
+
*
|
|
17
|
+
* useEffect(() => { fetchUsers() }, [fetchUsers])
|
|
18
|
+
*
|
|
19
|
+
* const handleDeactivate = async (id: string) => {
|
|
20
|
+
* const result = await deactivate(id)
|
|
21
|
+
* if (!result.success) toast.error(result.error)
|
|
22
|
+
* }
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
import { useState, useCallback, useRef } from 'react';
|
|
27
|
+
// =============================================================================
|
|
28
|
+
// Hook
|
|
29
|
+
// =============================================================================
|
|
30
|
+
export function useAdminUsers() {
|
|
31
|
+
const [users, setUsers] = useState([]);
|
|
32
|
+
const [total, setTotal] = useState(0);
|
|
33
|
+
const [page, setPage] = useState(1);
|
|
34
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
35
|
+
const [error, setError] = useState(null);
|
|
36
|
+
// Keep the last fetch options around so mutation handlers can refetch
|
|
37
|
+
// the exact same view without the caller passing them in again.
|
|
38
|
+
const lastOptionsRef = useRef({});
|
|
39
|
+
const fetchUsers = useCallback(async (options = {}) => {
|
|
40
|
+
const merged = {
|
|
41
|
+
page: 1,
|
|
42
|
+
limit: 20,
|
|
43
|
+
...options,
|
|
44
|
+
};
|
|
45
|
+
lastOptionsRef.current = merged;
|
|
46
|
+
setIsLoading(true);
|
|
47
|
+
setError(null);
|
|
48
|
+
try {
|
|
49
|
+
const params = new URLSearchParams();
|
|
50
|
+
if (merged.search)
|
|
51
|
+
params.set('search', merged.search);
|
|
52
|
+
if (merged.status && merged.status !== 'all')
|
|
53
|
+
params.set('status', merged.status);
|
|
54
|
+
if (merged.role && merged.role !== 'all')
|
|
55
|
+
params.set('role', merged.role);
|
|
56
|
+
params.set('page', String(merged.page ?? 1));
|
|
57
|
+
params.set('limit', String(merged.limit ?? 20));
|
|
58
|
+
const response = await fetch(`/api/admin/users?${params.toString()}`);
|
|
59
|
+
if (!response.ok) {
|
|
60
|
+
const data = (await response.json().catch(() => ({})));
|
|
61
|
+
throw new Error(data.error || 'Failed to fetch users');
|
|
62
|
+
}
|
|
63
|
+
const data = (await response.json());
|
|
64
|
+
setUsers(data.data ?? []);
|
|
65
|
+
setTotal(data.total ?? 0);
|
|
66
|
+
setPage(data.page ?? 1);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
console.error('[useAdminUsers] Fetch error:', err);
|
|
70
|
+
setError(err instanceof Error ? err.message : 'Failed to fetch users');
|
|
71
|
+
setUsers([]);
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
setIsLoading(false);
|
|
75
|
+
}
|
|
76
|
+
}, []);
|
|
77
|
+
const getUser = useCallback(async (id) => {
|
|
78
|
+
try {
|
|
79
|
+
const response = await fetch(`/api/admin/users/${id}`);
|
|
80
|
+
if (!response.ok)
|
|
81
|
+
return null;
|
|
82
|
+
const data = (await response.json());
|
|
83
|
+
return data.data ?? null;
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
console.error('[useAdminUsers] getUser error:', err);
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}, []);
|
|
90
|
+
// Internal helper: PATCH with action discriminator
|
|
91
|
+
const patchAction = useCallback(async (id, action) => {
|
|
92
|
+
try {
|
|
93
|
+
const response = await fetch(`/api/admin/users/${id}`, {
|
|
94
|
+
method: 'PATCH',
|
|
95
|
+
headers: { 'Content-Type': 'application/json' },
|
|
96
|
+
body: JSON.stringify({ action }),
|
|
97
|
+
});
|
|
98
|
+
const data = (await response.json().catch(() => ({})));
|
|
99
|
+
if (!response.ok || !data.success) {
|
|
100
|
+
return { success: false, error: data.error || `Failed to ${action} user` };
|
|
101
|
+
}
|
|
102
|
+
// Refresh current view so the table reflects the new state
|
|
103
|
+
await fetchUsers(lastOptionsRef.current);
|
|
104
|
+
return { success: true };
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
console.error(`[useAdminUsers] ${action} error:`, err);
|
|
108
|
+
return {
|
|
109
|
+
success: false,
|
|
110
|
+
error: err instanceof Error ? err.message : `Failed to ${action} user`,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}, [fetchUsers]);
|
|
114
|
+
const deactivate = useCallback((id) => patchAction(id, 'deactivate'), [patchAction]);
|
|
115
|
+
const reactivate = useCallback((id) => patchAction(id, 'reactivate'), [patchAction]);
|
|
116
|
+
const deleteUser = useCallback(async (id) => {
|
|
117
|
+
try {
|
|
118
|
+
const response = await fetch(`/api/admin/users/${id}`, {
|
|
119
|
+
method: 'DELETE',
|
|
120
|
+
});
|
|
121
|
+
const data = (await response.json().catch(() => ({})));
|
|
122
|
+
if (!response.ok || !data.success) {
|
|
123
|
+
return { success: false, error: data.error || 'Failed to delete user' };
|
|
124
|
+
}
|
|
125
|
+
await fetchUsers(lastOptionsRef.current);
|
|
126
|
+
return { success: true };
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
console.error('[useAdminUsers] delete error:', err);
|
|
130
|
+
return {
|
|
131
|
+
success: false,
|
|
132
|
+
error: err instanceof Error ? err.message : 'Failed to delete user',
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}, [fetchUsers]);
|
|
136
|
+
// =========================================================================
|
|
137
|
+
// Phase 3 — invite, resend, cancel, change role
|
|
138
|
+
// =========================================================================
|
|
139
|
+
const invite = useCallback(async (payload) => {
|
|
140
|
+
try {
|
|
141
|
+
const response = await fetch('/api/admin/users', {
|
|
142
|
+
method: 'POST',
|
|
143
|
+
headers: { 'Content-Type': 'application/json' },
|
|
144
|
+
body: JSON.stringify(payload),
|
|
145
|
+
});
|
|
146
|
+
const data = (await response.json().catch(() => ({})));
|
|
147
|
+
if (!response.ok || !data.success) {
|
|
148
|
+
return {
|
|
149
|
+
success: false,
|
|
150
|
+
error: data.error || 'Failed to send invite',
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
await fetchUsers(lastOptionsRef.current);
|
|
154
|
+
return {
|
|
155
|
+
success: true,
|
|
156
|
+
adminId: data.adminId,
|
|
157
|
+
inviteUrl: data.inviteUrl,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
console.error('[useAdminUsers] invite error:', err);
|
|
162
|
+
return {
|
|
163
|
+
success: false,
|
|
164
|
+
error: err instanceof Error ? err.message : 'Failed to send invite',
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}, [fetchUsers]);
|
|
168
|
+
const resendInvite = useCallback(async (id) => {
|
|
169
|
+
try {
|
|
170
|
+
const response = await fetch(`/api/admin/users/${id}`, {
|
|
171
|
+
method: 'PATCH',
|
|
172
|
+
headers: { 'Content-Type': 'application/json' },
|
|
173
|
+
body: JSON.stringify({ action: 'resend_invite' }),
|
|
174
|
+
});
|
|
175
|
+
const data = (await response.json().catch(() => ({})));
|
|
176
|
+
if (!response.ok || !data.success) {
|
|
177
|
+
return {
|
|
178
|
+
success: false,
|
|
179
|
+
error: data.error || 'Failed to resend invite',
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
await fetchUsers(lastOptionsRef.current);
|
|
183
|
+
return {
|
|
184
|
+
success: true,
|
|
185
|
+
inviteUrl: data.inviteUrl,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
console.error('[useAdminUsers] resendInvite error:', err);
|
|
190
|
+
return {
|
|
191
|
+
success: false,
|
|
192
|
+
error: err instanceof Error ? err.message : 'Failed to resend invite',
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
}, [fetchUsers]);
|
|
196
|
+
const cancelInvite = useCallback((id) => patchAction(id, 'cancel_invite'), [patchAction]);
|
|
197
|
+
const changeRole = useCallback(async (id, newRole) => {
|
|
198
|
+
try {
|
|
199
|
+
const response = await fetch(`/api/admin/users/${id}`, {
|
|
200
|
+
method: 'PATCH',
|
|
201
|
+
headers: { 'Content-Type': 'application/json' },
|
|
202
|
+
body: JSON.stringify({ action: 'change_role', role: newRole }),
|
|
203
|
+
});
|
|
204
|
+
const data = (await response.json().catch(() => ({})));
|
|
205
|
+
if (!response.ok || !data.success) {
|
|
206
|
+
return {
|
|
207
|
+
success: false,
|
|
208
|
+
error: data.error || 'Failed to change role',
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
await fetchUsers(lastOptionsRef.current);
|
|
212
|
+
return { success: true };
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
console.error('[useAdminUsers] changeRole error:', err);
|
|
216
|
+
return {
|
|
217
|
+
success: false,
|
|
218
|
+
error: err instanceof Error ? err.message : 'Failed to change role',
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
}, [fetchUsers]);
|
|
222
|
+
return {
|
|
223
|
+
users,
|
|
224
|
+
total,
|
|
225
|
+
page,
|
|
226
|
+
isLoading,
|
|
227
|
+
error,
|
|
228
|
+
fetchUsers,
|
|
229
|
+
getUser,
|
|
230
|
+
deactivate,
|
|
231
|
+
reactivate,
|
|
232
|
+
deleteUser,
|
|
233
|
+
// Phase 3
|
|
234
|
+
invite,
|
|
235
|
+
resendInvite,
|
|
236
|
+
cancelInvite,
|
|
237
|
+
changeRole,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=useAdminUsers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAdminUsers.js","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminUsers.ts"],"names":[],"mappings":"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"}
|