@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.
Files changed (182) hide show
  1. package/dist/admin/api/accept-invite.d.ts +65 -0
  2. package/dist/admin/api/accept-invite.d.ts.map +1 -0
  3. package/dist/admin/api/accept-invite.js +115 -0
  4. package/dist/admin/api/accept-invite.js.map +1 -0
  5. package/dist/admin/api/categories.d.ts.map +1 -1
  6. package/dist/admin/api/categories.js +21 -28
  7. package/dist/admin/api/categories.js.map +1 -1
  8. package/dist/admin/api/customers.d.ts.map +1 -1
  9. package/dist/admin/api/customers.js +17 -25
  10. package/dist/admin/api/customers.js.map +1 -1
  11. package/dist/admin/api/forgot-password.d.ts +39 -0
  12. package/dist/admin/api/forgot-password.d.ts.map +1 -0
  13. package/dist/admin/api/forgot-password.js +66 -0
  14. package/dist/admin/api/forgot-password.js.map +1 -0
  15. package/dist/admin/api/index.d.ts +6 -0
  16. package/dist/admin/api/index.d.ts.map +1 -1
  17. package/dist/admin/api/index.js +9 -0
  18. package/dist/admin/api/index.js.map +1 -1
  19. package/dist/admin/api/me.d.ts +72 -0
  20. package/dist/admin/api/me.d.ts.map +1 -0
  21. package/dist/admin/api/me.js +177 -0
  22. package/dist/admin/api/me.js.map +1 -0
  23. package/dist/admin/api/orders.d.ts.map +1 -1
  24. package/dist/admin/api/orders.js +21 -28
  25. package/dist/admin/api/orders.js.map +1 -1
  26. package/dist/admin/api/products.d.ts.map +1 -1
  27. package/dist/admin/api/products.js +33 -37
  28. package/dist/admin/api/products.js.map +1 -1
  29. package/dist/admin/api/refund.d.ts.map +1 -1
  30. package/dist/admin/api/refund.js +5 -7
  31. package/dist/admin/api/refund.js.map +1 -1
  32. package/dist/admin/api/reset-password.d.ts +49 -0
  33. package/dist/admin/api/reset-password.d.ts.map +1 -0
  34. package/dist/admin/api/reset-password.js +99 -0
  35. package/dist/admin/api/reset-password.js.map +1 -0
  36. package/dist/admin/api/return.d.ts.map +1 -1
  37. package/dist/admin/api/return.js +9 -12
  38. package/dist/admin/api/return.js.map +1 -1
  39. package/dist/admin/api/settings.d.ts.map +1 -1
  40. package/dist/admin/api/settings.js +9 -12
  41. package/dist/admin/api/settings.js.map +1 -1
  42. package/dist/admin/api/shipping.d.ts.map +1 -1
  43. package/dist/admin/api/shipping.js +65 -61
  44. package/dist/admin/api/shipping.js.map +1 -1
  45. package/dist/admin/api/stats.d.ts.map +1 -1
  46. package/dist/admin/api/stats.js +5 -7
  47. package/dist/admin/api/stats.js.map +1 -1
  48. package/dist/admin/api/stripe-status.d.ts.map +1 -1
  49. package/dist/admin/api/stripe-status.js +5 -7
  50. package/dist/admin/api/stripe-status.js.map +1 -1
  51. package/dist/admin/api/tax-zones.d.ts.map +1 -1
  52. package/dist/admin/api/tax-zones.js +21 -28
  53. package/dist/admin/api/tax-zones.js.map +1 -1
  54. package/dist/admin/api/users.d.ts +142 -0
  55. package/dist/admin/api/users.d.ts.map +1 -0
  56. package/dist/admin/api/users.js +356 -0
  57. package/dist/admin/api/users.js.map +1 -0
  58. package/dist/admin/components/AdminAcceptInviteForm.d.ts +3 -0
  59. package/dist/admin/components/AdminAcceptInviteForm.d.ts.map +1 -0
  60. package/dist/admin/components/AdminAcceptInviteForm.js +137 -0
  61. package/dist/admin/components/AdminAcceptInviteForm.js.map +1 -0
  62. package/dist/admin/components/AdminAccountPage.d.ts +10 -0
  63. package/dist/admin/components/AdminAccountPage.d.ts.map +1 -0
  64. package/dist/admin/components/AdminAccountPage.js +123 -0
  65. package/dist/admin/components/AdminAccountPage.js.map +1 -0
  66. package/dist/admin/components/AdminForgotPasswordForm.d.ts +8 -0
  67. package/dist/admin/components/AdminForgotPasswordForm.d.ts.map +1 -0
  68. package/dist/admin/components/AdminForgotPasswordForm.js +59 -0
  69. package/dist/admin/components/AdminForgotPasswordForm.js.map +1 -0
  70. package/dist/admin/components/AdminNav.d.ts.map +1 -1
  71. package/dist/admin/components/AdminNav.js +32 -4
  72. package/dist/admin/components/AdminNav.js.map +1 -1
  73. package/dist/admin/components/AdminResetPasswordForm.d.ts +12 -0
  74. package/dist/admin/components/AdminResetPasswordForm.d.ts.map +1 -0
  75. package/dist/admin/components/AdminResetPasswordForm.js +134 -0
  76. package/dist/admin/components/AdminResetPasswordForm.js.map +1 -0
  77. package/dist/admin/components/AdminUserMenu.d.ts.map +1 -1
  78. package/dist/admin/components/AdminUserMenu.js +2 -2
  79. package/dist/admin/components/AdminUserMenu.js.map +1 -1
  80. package/dist/admin/components/InviteUserDialog.d.ts +3 -0
  81. package/dist/admin/components/InviteUserDialog.d.ts.map +1 -0
  82. package/dist/admin/components/InviteUserDialog.js +127 -0
  83. package/dist/admin/components/InviteUserDialog.js.map +1 -0
  84. package/dist/admin/components/UsersTable.d.ts +3 -0
  85. package/dist/admin/components/UsersTable.d.ts.map +1 -0
  86. package/dist/admin/components/UsersTable.js +399 -0
  87. package/dist/admin/components/UsersTable.js.map +1 -0
  88. package/dist/admin/components/index.d.ts +9 -0
  89. package/dist/admin/components/index.d.ts.map +1 -1
  90. package/dist/admin/components/index.js +9 -0
  91. package/dist/admin/components/index.js.map +1 -1
  92. package/dist/admin/config.d.ts +15 -10
  93. package/dist/admin/config.d.ts.map +1 -1
  94. package/dist/admin/config.js +38 -11
  95. package/dist/admin/config.js.map +1 -1
  96. package/dist/admin/hooks/index.d.ts +4 -0
  97. package/dist/admin/hooks/index.d.ts.map +1 -1
  98. package/dist/admin/hooks/index.js +3 -0
  99. package/dist/admin/hooks/index.js.map +1 -1
  100. package/dist/admin/hooks/useAdminMe.d.ts +31 -0
  101. package/dist/admin/hooks/useAdminMe.d.ts.map +1 -0
  102. package/dist/admin/hooks/useAdminMe.js +103 -0
  103. package/dist/admin/hooks/useAdminMe.js.map +1 -0
  104. package/dist/admin/hooks/useAdminPermissions.d.ts +3 -0
  105. package/dist/admin/hooks/useAdminPermissions.d.ts.map +1 -0
  106. package/dist/admin/hooks/useAdminPermissions.js +51 -0
  107. package/dist/admin/hooks/useAdminPermissions.js.map +1 -0
  108. package/dist/admin/hooks/useAdminUsers.d.ts +3 -0
  109. package/dist/admin/hooks/useAdminUsers.d.ts.map +1 -0
  110. package/dist/admin/hooks/useAdminUsers.js +240 -0
  111. package/dist/admin/hooks/useAdminUsers.js.map +1 -0
  112. package/dist/admin/index.d.ts +4 -4
  113. package/dist/admin/index.d.ts.map +1 -1
  114. package/dist/admin/index.js +20 -2
  115. package/dist/admin/index.js.map +1 -1
  116. package/dist/admin/permissions.d.ts +92 -0
  117. package/dist/admin/permissions.d.ts.map +1 -0
  118. package/dist/admin/permissions.js +201 -0
  119. package/dist/admin/permissions.js.map +1 -0
  120. package/dist/admin/server/admin-invite.d.ts +122 -0
  121. package/dist/admin/server/admin-invite.d.ts.map +1 -0
  122. package/dist/admin/server/admin-invite.js +235 -0
  123. package/dist/admin/server/admin-invite.js.map +1 -0
  124. package/dist/admin/server/admin-password-reset.d.ts +87 -0
  125. package/dist/admin/server/admin-password-reset.d.ts.map +1 -0
  126. package/dist/admin/server/admin-password-reset.js +220 -0
  127. package/dist/admin/server/admin-password-reset.js.map +1 -0
  128. package/dist/admin/server/admin-self-service.d.ts +86 -0
  129. package/dist/admin/server/admin-self-service.d.ts.map +1 -0
  130. package/dist/admin/server/admin-self-service.js +188 -0
  131. package/dist/admin/server/admin-self-service.js.map +1 -0
  132. package/dist/admin/server/admin-service.d.ts.map +1 -1
  133. package/dist/admin/server/admin-service.js +21 -2
  134. package/dist/admin/server/admin-service.js.map +1 -1
  135. package/dist/admin/server/admin-session.d.ts +137 -0
  136. package/dist/admin/server/admin-session.d.ts.map +1 -0
  137. package/dist/admin/server/admin-session.js +229 -0
  138. package/dist/admin/server/admin-session.js.map +1 -0
  139. package/dist/admin/server/index.d.ts +7 -0
  140. package/dist/admin/server/index.d.ts.map +1 -1
  141. package/dist/admin/server/index.js +20 -0
  142. package/dist/admin/server/index.js.map +1 -1
  143. package/dist/admin/server/user-management.d.ts +223 -0
  144. package/dist/admin/server/user-management.d.ts.map +1 -0
  145. package/dist/admin/server/user-management.js +846 -0
  146. package/dist/admin/server/user-management.js.map +1 -0
  147. package/dist/admin/types.d.ts +153 -2
  148. package/dist/admin/types.d.ts.map +1 -1
  149. package/dist/auth/config.d.ts.map +1 -1
  150. package/dist/auth/config.js +11 -2
  151. package/dist/auth/config.js.map +1 -1
  152. package/dist/core/db/queries.d.ts +19 -13
  153. package/dist/core/db/queries.d.ts.map +1 -1
  154. package/dist/core/db/schema.d.ts +327 -9
  155. package/dist/core/db/schema.d.ts.map +1 -1
  156. package/dist/core/db/schema.js +80 -3
  157. package/dist/core/db/schema.js.map +1 -1
  158. package/dist/core/types.d.ts +19 -3
  159. package/dist/core/types.d.ts.map +1 -1
  160. package/dist/emails/index.d.ts +2 -2
  161. package/dist/emails/index.d.ts.map +1 -1
  162. package/dist/emails/index.js +3 -1
  163. package/dist/emails/index.js.map +1 -1
  164. package/dist/emails/send/admin-auth.d.ts +94 -0
  165. package/dist/emails/send/admin-auth.d.ts.map +1 -0
  166. package/dist/emails/send/admin-auth.js +118 -0
  167. package/dist/emails/send/admin-auth.js.map +1 -0
  168. package/dist/emails/send/index.d.ts +2 -0
  169. package/dist/emails/send/index.d.ts.map +1 -1
  170. package/dist/emails/send/index.js +4 -0
  171. package/dist/emails/send/index.js.map +1 -1
  172. package/dist/emails/templates/admin-invite.d.ts +40 -0
  173. package/dist/emails/templates/admin-invite.d.ts.map +1 -0
  174. package/dist/emails/templates/admin-invite.js +62 -0
  175. package/dist/emails/templates/admin-invite.js.map +1 -0
  176. package/dist/emails/templates/index.d.ts +1 -0
  177. package/dist/emails/templates/index.d.ts.map +1 -1
  178. package/dist/emails/templates/index.js +4 -0
  179. package/dist/emails/templates/index.js.map +1 -1
  180. package/dist/emails/types.d.ts +22 -1
  181. package/dist/emails/types.d.ts.map +1 -1
  182. package/package.json +21 -1
@@ -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
- * @param options - Configuration options
29
- * @returns NextAuth options object
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
- * @example
32
- * ```typescript
33
- * // app/api/admin/auth/[...nextauth]/route.ts
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
- * const handler = NextAuth(createAdminAuthOptions())
38
- * export { handler as GET, handler as POST }
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
  },
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/admin/config.ts"],"names":[],"mappings":"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"}
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,3 @@
1
+ import type { UseAdminPermissionsReturn } from '../types';
2
+ export declare function useAdminPermissions(): UseAdminPermissionsReturn;
3
+ //# sourceMappingURL=useAdminPermissions.d.ts.map
@@ -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,3 @@
1
+ import type { UseAdminUsersReturn } from '../types';
2
+ export declare function useAdminUsers(): UseAdminUsersReturn;
3
+ //# sourceMappingURL=useAdminUsers.d.ts.map
@@ -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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"}