@udhuong/admin-core 0.1.0 → 0.1.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 (275) hide show
  1. package/dist/client/auth/AuthContext.d.ts +19 -0
  2. package/dist/client/auth/AuthContext.d.ts.map +1 -0
  3. package/dist/client/auth/AuthContext.js +115 -0
  4. package/dist/client/auth/AuthContext.js.map +1 -0
  5. package/dist/client/auth/PermissionGuard.d.ts +12 -0
  6. package/dist/client/auth/PermissionGuard.d.ts.map +1 -0
  7. package/dist/client/auth/PermissionGuard.js +23 -0
  8. package/dist/client/auth/PermissionGuard.js.map +1 -0
  9. package/dist/client/auth/ProtectedPage.d.ts +9 -0
  10. package/dist/client/auth/ProtectedPage.d.ts.map +1 -0
  11. package/dist/client/auth/ProtectedPage.js +57 -0
  12. package/dist/client/auth/ProtectedPage.js.map +1 -0
  13. package/dist/client/auth/ProtectedRoute.d.ts +4 -0
  14. package/dist/client/auth/ProtectedRoute.d.ts.map +1 -0
  15. package/dist/client/auth/ProtectedRoute.js +25 -0
  16. package/dist/client/auth/ProtectedRoute.js.map +1 -0
  17. package/dist/client/auth/api-client.d.ts +4 -0
  18. package/dist/client/auth/api-client.d.ts.map +1 -0
  19. package/dist/client/auth/api-client.js +83 -0
  20. package/dist/client/auth/api-client.js.map +1 -0
  21. package/dist/client/auth/auth.service.d.ts +7 -0
  22. package/dist/client/auth/auth.service.d.ts.map +1 -0
  23. package/dist/client/auth/auth.service.js +19 -0
  24. package/dist/client/auth/auth.service.js.map +1 -0
  25. package/dist/client/auth/index.d.ts +7 -0
  26. package/dist/client/auth/index.d.ts.map +1 -0
  27. package/dist/client/auth/index.js +7 -0
  28. package/dist/client/auth/index.js.map +1 -0
  29. package/dist/client/components/PageHeader.d.ts +19 -0
  30. package/dist/client/components/PageHeader.d.ts.map +1 -0
  31. package/dist/client/components/PageHeader.js +7 -0
  32. package/dist/client/components/PageHeader.js.map +1 -0
  33. package/dist/client/components/Providers.d.ts +9 -0
  34. package/dist/client/components/Providers.d.ts.map +1 -0
  35. package/dist/client/components/Providers.js +52 -0
  36. package/dist/client/components/Providers.js.map +1 -0
  37. package/dist/client/components/ThemeToggle.d.ts +6 -0
  38. package/dist/client/components/ThemeToggle.d.ts.map +1 -0
  39. package/dist/client/components/ThemeToggle.js +22 -0
  40. package/dist/client/components/ThemeToggle.js.map +1 -0
  41. package/dist/client/components/index.d.ts +4 -0
  42. package/dist/client/components/index.d.ts.map +1 -0
  43. package/dist/client/components/index.js +4 -0
  44. package/dist/client/components/index.js.map +1 -0
  45. package/dist/client/config/AdminConfigContext.d.ts +12 -0
  46. package/dist/client/config/AdminConfigContext.d.ts.map +1 -0
  47. package/dist/client/config/AdminConfigContext.js +29 -0
  48. package/dist/client/config/AdminConfigContext.js.map +1 -0
  49. package/dist/client/config/defaults.d.ts +4 -0
  50. package/dist/client/config/defaults.d.ts.map +1 -0
  51. package/dist/client/config/defaults.js +86 -0
  52. package/dist/client/config/defaults.js.map +1 -0
  53. package/dist/client/config/types.d.ts +61 -0
  54. package/dist/client/config/types.d.ts.map +1 -0
  55. package/dist/client/config/types.js +2 -0
  56. package/dist/client/config/types.js.map +1 -0
  57. package/dist/client/constants/api-routes.d.ts +104 -0
  58. package/dist/client/constants/api-routes.d.ts.map +1 -0
  59. package/dist/client/constants/api-routes.js +91 -0
  60. package/dist/client/constants/api-routes.js.map +1 -0
  61. package/dist/client/constants/permissions.d.ts +38 -0
  62. package/dist/client/constants/permissions.d.ts.map +1 -0
  63. package/dist/client/constants/permissions.js +37 -0
  64. package/dist/client/constants/permissions.js.map +1 -0
  65. package/dist/client/contexts/ThemeContext.d.ts +3 -0
  66. package/dist/client/contexts/ThemeContext.d.ts.map +1 -0
  67. package/dist/client/contexts/ThemeContext.js +8 -0
  68. package/dist/client/contexts/ThemeContext.js.map +1 -0
  69. package/dist/client/hooks/useToast.d.ts +14 -0
  70. package/dist/client/hooks/useToast.d.ts.map +1 -0
  71. package/dist/client/hooks/useToast.js +90 -0
  72. package/dist/client/hooks/useToast.js.map +1 -0
  73. package/dist/client/index.d.ts +25 -0
  74. package/dist/client/index.d.ts.map +1 -0
  75. package/dist/client/index.js +33 -0
  76. package/dist/client/index.js.map +1 -0
  77. package/dist/client/layouts/AdminLayout.d.ts +4 -0
  78. package/dist/client/layouts/AdminLayout.d.ts.map +1 -0
  79. package/dist/client/layouts/AdminLayout.js +72 -0
  80. package/dist/client/layouts/AdminLayout.js.map +1 -0
  81. package/dist/client/layouts/Sidebar.d.ts +6 -0
  82. package/dist/client/layouts/Sidebar.d.ts.map +1 -0
  83. package/dist/client/layouts/Sidebar.js +86 -0
  84. package/dist/client/layouts/Sidebar.js.map +1 -0
  85. package/dist/client/layouts/index.d.ts +3 -0
  86. package/dist/client/layouts/index.d.ts.map +1 -0
  87. package/dist/client/layouts/index.js +3 -0
  88. package/dist/client/layouts/index.js.map +1 -0
  89. package/dist/client/lib/utils.d.ts +5 -0
  90. package/dist/client/lib/utils.d.ts.map +1 -0
  91. package/dist/client/lib/utils.js +22 -0
  92. package/dist/client/lib/utils.js.map +1 -0
  93. package/dist/client/pages/ChangePasswordPage.d.ts +2 -0
  94. package/dist/client/pages/ChangePasswordPage.d.ts.map +1 -0
  95. package/dist/client/pages/ChangePasswordPage.js +58 -0
  96. package/dist/client/pages/ChangePasswordPage.js.map +1 -0
  97. package/dist/client/pages/ForgotPasswordPage.d.ts +2 -0
  98. package/dist/client/pages/ForgotPasswordPage.d.ts.map +1 -0
  99. package/dist/client/pages/ForgotPasswordPage.js +30 -0
  100. package/dist/client/pages/ForgotPasswordPage.js.map +1 -0
  101. package/dist/client/pages/LoginPage.d.ts +2 -0
  102. package/dist/client/pages/LoginPage.d.ts.map +1 -0
  103. package/dist/client/pages/LoginPage.js +52 -0
  104. package/dist/client/pages/LoginPage.js.map +1 -0
  105. package/dist/client/pages/PermissionsPage.d.ts +2 -0
  106. package/dist/client/pages/PermissionsPage.d.ts.map +1 -0
  107. package/dist/client/pages/PermissionsPage.js +42 -0
  108. package/dist/client/pages/PermissionsPage.js.map +1 -0
  109. package/dist/client/pages/ProfilePage.d.ts +2 -0
  110. package/dist/client/pages/ProfilePage.d.ts.map +1 -0
  111. package/dist/client/pages/ProfilePage.js +107 -0
  112. package/dist/client/pages/ProfilePage.js.map +1 -0
  113. package/dist/client/pages/ResetPasswordPage.d.ts +2 -0
  114. package/dist/client/pages/ResetPasswordPage.d.ts.map +1 -0
  115. package/dist/client/pages/ResetPasswordPage.js +68 -0
  116. package/dist/client/pages/ResetPasswordPage.js.map +1 -0
  117. package/dist/client/pages/RolesPage.d.ts +2 -0
  118. package/dist/client/pages/RolesPage.d.ts.map +1 -0
  119. package/dist/client/pages/RolesPage.js +82 -0
  120. package/dist/client/pages/RolesPage.js.map +1 -0
  121. package/dist/client/pages/UnauthorizedPage.d.ts +2 -0
  122. package/dist/client/pages/UnauthorizedPage.d.ts.map +1 -0
  123. package/dist/client/pages/UnauthorizedPage.js +9 -0
  124. package/dist/client/pages/UnauthorizedPage.js.map +1 -0
  125. package/dist/client/pages/UserDetailPage.d.ts +6 -0
  126. package/dist/client/pages/UserDetailPage.d.ts.map +1 -0
  127. package/dist/client/pages/UserDetailPage.js +220 -0
  128. package/dist/client/pages/UserDetailPage.js.map +1 -0
  129. package/dist/client/pages/UserPreferencesPage.d.ts +2 -0
  130. package/dist/client/pages/UserPreferencesPage.d.ts.map +1 -0
  131. package/dist/client/pages/UserPreferencesPage.js +152 -0
  132. package/dist/client/pages/UserPreferencesPage.js.map +1 -0
  133. package/dist/client/pages/UsersPage.d.ts +2 -0
  134. package/dist/client/pages/UsersPage.d.ts.map +1 -0
  135. package/dist/client/pages/UsersPage.js +228 -0
  136. package/dist/client/pages/UsersPage.js.map +1 -0
  137. package/dist/client/pages/VerifyEmailPage.d.ts +2 -0
  138. package/dist/client/pages/VerifyEmailPage.d.ts.map +1 -0
  139. package/dist/client/pages/VerifyEmailPage.js +43 -0
  140. package/dist/client/pages/VerifyEmailPage.js.map +1 -0
  141. package/dist/client/pages/index.d.ts +13 -0
  142. package/dist/client/pages/index.d.ts.map +1 -0
  143. package/dist/client/pages/index.js +13 -0
  144. package/dist/client/pages/index.js.map +1 -0
  145. package/dist/client/pages/roles/RoleModal.d.ts +10 -0
  146. package/dist/client/pages/roles/RoleModal.d.ts.map +1 -0
  147. package/dist/client/pages/roles/RoleModal.js +123 -0
  148. package/dist/client/pages/roles/RoleModal.js.map +1 -0
  149. package/dist/client/pages/users/DangerZone.d.ts +10 -0
  150. package/dist/client/pages/users/DangerZone.d.ts.map +1 -0
  151. package/dist/client/pages/users/DangerZone.js +8 -0
  152. package/dist/client/pages/users/DangerZone.js.map +1 -0
  153. package/dist/client/pages/users/ProfileCard.d.ts +14 -0
  154. package/dist/client/pages/users/ProfileCard.d.ts.map +1 -0
  155. package/dist/client/pages/users/ProfileCard.js +8 -0
  156. package/dist/client/pages/users/ProfileCard.js.map +1 -0
  157. package/dist/client/pages/users/SecuritySection.d.ts +14 -0
  158. package/dist/client/pages/users/SecuritySection.d.ts.map +1 -0
  159. package/dist/client/pages/users/SecuritySection.js +16 -0
  160. package/dist/client/pages/users/SecuritySection.js.map +1 -0
  161. package/dist/client/pages/users/SessionsSection.d.ts +25 -0
  162. package/dist/client/pages/users/SessionsSection.d.ts.map +1 -0
  163. package/dist/client/pages/users/SessionsSection.js +93 -0
  164. package/dist/client/pages/users/SessionsSection.js.map +1 -0
  165. package/dist/client/pages/users/SocialAccountsSection.d.ts +29 -0
  166. package/dist/client/pages/users/SocialAccountsSection.d.ts.map +1 -0
  167. package/dist/client/pages/users/SocialAccountsSection.js +72 -0
  168. package/dist/client/pages/users/SocialAccountsSection.js.map +1 -0
  169. package/dist/client/pages/users/UserDetailModal.d.ts +24 -0
  170. package/dist/client/pages/users/UserDetailModal.d.ts.map +1 -0
  171. package/dist/client/pages/users/UserDetailModal.js +42 -0
  172. package/dist/client/pages/users/UserDetailModal.js.map +1 -0
  173. package/dist/client/pages/users/UserFilters.d.ts +14 -0
  174. package/dist/client/pages/users/UserFilters.d.ts.map +1 -0
  175. package/dist/client/pages/users/UserFilters.js +22 -0
  176. package/dist/client/pages/users/UserFilters.js.map +1 -0
  177. package/dist/client/pages/users/UserStats.d.ts +9 -0
  178. package/dist/client/pages/users/UserStats.d.ts.map +1 -0
  179. package/dist/client/pages/users/UserStats.js +37 -0
  180. package/dist/client/pages/users/UserStats.js.map +1 -0
  181. package/dist/client/pages/users/UserTable.d.ts +24 -0
  182. package/dist/client/pages/users/UserTable.d.ts.map +1 -0
  183. package/dist/client/pages/users/UserTable.js +39 -0
  184. package/dist/client/pages/users/UserTable.js.map +1 -0
  185. package/dist/client/pages/users/VerificationSection.d.ts +9 -0
  186. package/dist/client/pages/users/VerificationSection.d.ts.map +1 -0
  187. package/dist/client/pages/users/VerificationSection.js +8 -0
  188. package/dist/client/pages/users/VerificationSection.js.map +1 -0
  189. package/dist/client/types/auth.d.ts +29 -0
  190. package/dist/client/types/auth.d.ts.map +1 -0
  191. package/dist/client/types/auth.js +2 -0
  192. package/dist/client/types/auth.js.map +1 -0
  193. package/dist/client/types/rbac.d.ts +39 -0
  194. package/dist/client/types/rbac.d.ts.map +1 -0
  195. package/dist/client/types/rbac.js +5 -0
  196. package/dist/client/types/rbac.js.map +1 -0
  197. package/dist/client/types/status.d.ts +12 -0
  198. package/dist/client/types/status.d.ts.map +1 -0
  199. package/dist/client/types/status.js +14 -0
  200. package/dist/client/types/status.js.map +1 -0
  201. package/dist/client/ui/Badge.d.ts +14 -0
  202. package/dist/client/ui/Badge.d.ts.map +1 -0
  203. package/dist/client/ui/Badge.js +32 -0
  204. package/dist/client/ui/Badge.js.map +1 -0
  205. package/dist/client/ui/Button.d.ts +18 -0
  206. package/dist/client/ui/Button.d.ts.map +1 -0
  207. package/dist/client/ui/Button.js +33 -0
  208. package/dist/client/ui/Button.js.map +1 -0
  209. package/dist/client/ui/Checkbox.d.ts +14 -0
  210. package/dist/client/ui/Checkbox.d.ts.map +1 -0
  211. package/dist/client/ui/Checkbox.js +35 -0
  212. package/dist/client/ui/Checkbox.js.map +1 -0
  213. package/dist/client/ui/ConfirmModal.d.ts +14 -0
  214. package/dist/client/ui/ConfirmModal.d.ts.map +1 -0
  215. package/dist/client/ui/ConfirmModal.js +43 -0
  216. package/dist/client/ui/ConfirmModal.js.map +1 -0
  217. package/dist/client/ui/DataTable.d.ts +69 -0
  218. package/dist/client/ui/DataTable.d.ts.map +1 -0
  219. package/dist/client/ui/DataTable.js +133 -0
  220. package/dist/client/ui/DataTable.js.map +1 -0
  221. package/dist/client/ui/Dropdown.d.ts +11 -0
  222. package/dist/client/ui/Dropdown.d.ts.map +1 -0
  223. package/dist/client/ui/Dropdown.js +65 -0
  224. package/dist/client/ui/Dropdown.js.map +1 -0
  225. package/dist/client/ui/FileInput.d.ts +16 -0
  226. package/dist/client/ui/FileInput.d.ts.map +1 -0
  227. package/dist/client/ui/FileInput.js +45 -0
  228. package/dist/client/ui/FileInput.js.map +1 -0
  229. package/dist/client/ui/Input.d.ts +16 -0
  230. package/dist/client/ui/Input.d.ts.map +1 -0
  231. package/dist/client/ui/Input.js +33 -0
  232. package/dist/client/ui/Input.js.map +1 -0
  233. package/dist/client/ui/LoadingSpinner.d.ts +7 -0
  234. package/dist/client/ui/LoadingSpinner.d.ts.map +1 -0
  235. package/dist/client/ui/LoadingSpinner.js +12 -0
  236. package/dist/client/ui/LoadingSpinner.js.map +1 -0
  237. package/dist/client/ui/Modal.d.ts +14 -0
  238. package/dist/client/ui/Modal.d.ts.map +1 -0
  239. package/dist/client/ui/Modal.js +46 -0
  240. package/dist/client/ui/Modal.js.map +1 -0
  241. package/dist/client/ui/Pagination.d.ts +14 -0
  242. package/dist/client/ui/Pagination.d.ts.map +1 -0
  243. package/dist/client/ui/Pagination.js +50 -0
  244. package/dist/client/ui/Pagination.js.map +1 -0
  245. package/dist/client/ui/Radio.d.ts +34 -0
  246. package/dist/client/ui/Radio.d.ts.map +1 -0
  247. package/dist/client/ui/Radio.js +44 -0
  248. package/dist/client/ui/Radio.js.map +1 -0
  249. package/dist/client/ui/Range.d.ts +17 -0
  250. package/dist/client/ui/Range.d.ts.map +1 -0
  251. package/dist/client/ui/Range.js +28 -0
  252. package/dist/client/ui/Range.js.map +1 -0
  253. package/dist/client/ui/Rating.d.ts +18 -0
  254. package/dist/client/ui/Rating.d.ts.map +1 -0
  255. package/dist/client/ui/Rating.js +64 -0
  256. package/dist/client/ui/Rating.js.map +1 -0
  257. package/dist/client/ui/Select.d.ts +20 -0
  258. package/dist/client/ui/Select.d.ts.map +1 -0
  259. package/dist/client/ui/Select.js +30 -0
  260. package/dist/client/ui/Select.js.map +1 -0
  261. package/dist/client/ui/Textarea.d.ts +14 -0
  262. package/dist/client/ui/Textarea.d.ts.map +1 -0
  263. package/dist/client/ui/Textarea.js +20 -0
  264. package/dist/client/ui/Textarea.js.map +1 -0
  265. package/dist/client/ui/Toggle.d.ts +13 -0
  266. package/dist/client/ui/Toggle.d.ts.map +1 -0
  267. package/dist/client/ui/Toggle.js +29 -0
  268. package/dist/client/ui/Toggle.js.map +1 -0
  269. package/dist/client/ui/index.d.ts +31 -0
  270. package/dist/client/ui/index.d.ts.map +1 -0
  271. package/dist/client/ui/index.js +35 -0
  272. package/dist/client/ui/index.js.map +1 -0
  273. package/dist/tailwind.preset.d.ts +10 -0
  274. package/dist/tailwind.preset.js +12 -0
  275. package/package.json +46 -17
@@ -0,0 +1,90 @@
1
+ import toast from 'react-hot-toast';
2
+ export const useToast = () => {
3
+ const showSuccess = (message, options) => {
4
+ toast.success(message, {
5
+ duration: options?.duration || 3000,
6
+ position: options?.position || 'top-right',
7
+ style: {
8
+ background: '#f0fdf4',
9
+ color: '#166534',
10
+ border: '1px solid #bbf7d0',
11
+ borderRadius: '8px',
12
+ fontSize: '14px',
13
+ },
14
+ icon: '✅',
15
+ });
16
+ };
17
+ const showError = (message, options) => {
18
+ toast.error(message, {
19
+ duration: options?.duration || 4000,
20
+ position: options?.position || 'top-right',
21
+ style: {
22
+ background: '#fee2e2',
23
+ color: '#dc2626',
24
+ border: '1px solid #fecaca',
25
+ borderRadius: '8px',
26
+ fontSize: '14px',
27
+ },
28
+ icon: '🚫',
29
+ });
30
+ };
31
+ const showWarning = (message, options) => {
32
+ toast(message, {
33
+ duration: options?.duration || 3000,
34
+ position: options?.position || 'top-right',
35
+ style: {
36
+ background: '#fffbeb',
37
+ color: '#d97706',
38
+ border: '1px solid #fde68a',
39
+ borderRadius: '8px',
40
+ fontSize: '14px',
41
+ },
42
+ icon: '⚠️',
43
+ });
44
+ };
45
+ const showInfo = (message, options) => {
46
+ toast(message, {
47
+ duration: options?.duration || 3000,
48
+ position: options?.position || 'top-right',
49
+ style: {
50
+ background: '#eff6ff',
51
+ color: '#1d4ed8',
52
+ border: '1px solid #bfdbfe',
53
+ borderRadius: '8px',
54
+ fontSize: '14px',
55
+ },
56
+ icon: 'ℹ️',
57
+ });
58
+ };
59
+ const showPermissionError = (action) => {
60
+ const message = action
61
+ ? `Bạn không có quyền ${action}`
62
+ : 'Bạn không có quyền thực hiện thao tác này';
63
+ showError(message, { duration: 4000 });
64
+ };
65
+ const showToast = (message, type = 'info', options) => {
66
+ switch (type) {
67
+ case 'success':
68
+ showSuccess(message, options);
69
+ break;
70
+ case 'error':
71
+ showError(message, options);
72
+ break;
73
+ case 'warning':
74
+ showWarning(message, options);
75
+ break;
76
+ case 'info':
77
+ showInfo(message, options);
78
+ break;
79
+ }
80
+ };
81
+ return {
82
+ success: showSuccess,
83
+ error: showError,
84
+ warning: showWarning,
85
+ info: showInfo,
86
+ permissionError: showPermissionError,
87
+ showToast,
88
+ };
89
+ };
90
+ //# sourceMappingURL=useToast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useToast.js","sourceRoot":"","sources":["../../../src/client/hooks/useToast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export { AdminConfigProvider, useAdminConfig } from './config/AdminConfigContext';
2
+ export type { AdminConfig, MenuSection, MenuItem, SubMenuItem, CoreRoutes } from './config/types';
3
+ export { DEFAULT_CORE_ROUTES, getDefaultMenuSections } from './config/defaults';
4
+ export { AuthProvider, useAuth } from './auth/AuthContext';
5
+ export { default as ProtectedRoute } from './auth/ProtectedRoute';
6
+ export { default as ProtectedPage } from './auth/ProtectedPage';
7
+ export { default as PermissionGuard } from './auth/PermissionGuard';
8
+ export { initApiClient, getApiClient } from './auth/api-client';
9
+ export { authService } from './auth/auth.service';
10
+ export { default as AdminLayout } from './layouts/AdminLayout';
11
+ export { default as Sidebar } from './layouts/Sidebar';
12
+ export { CoreProviders } from './components/Providers';
13
+ export * from './ui';
14
+ export { default as ThemeToggle } from './components/ThemeToggle';
15
+ export { default as PageHeader } from './components/PageHeader';
16
+ export { LoginPage, ChangePasswordPage, ForgotPasswordPage, ResetPasswordPage, VerifyEmailPage, UnauthorizedPage, UsersPage, UserDetailPage, RolesPage, PermissionsPage, ProfilePage, UserPreferencesPage, } from './pages';
17
+ export { ThemeProvider, useTheme } from './contexts/ThemeContext';
18
+ export { useToast } from './hooks/useToast';
19
+ export { cn, formatDate, formatDateTime } from './lib/utils';
20
+ export { CORE_API_ROUTES, CORE_ADMIN_API_ROUTES } from './constants/api-routes';
21
+ export { PERMISSIONS, ROLES, ROLE_PERMISSIONS, checkPermission, checkAnyPermission, checkAllPermissions } from './constants/permissions';
22
+ export type { Permission, RoleKey } from './constants/permissions';
23
+ export type { User, AuthResponse, LoginCredentials } from './types/auth';
24
+ export { RequestStatus, VerificationStatus } from './types/status';
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AACjF,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AACjG,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAG/E,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGjD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAGtD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAGtD,cAAc,MAAM,CAAA;AAGpB,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAG/D,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,SAAS,EACT,eAAe,EACf,WAAW,EACX,mBAAmB,GACpB,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAGjE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAG3C,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAG5D,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAC/E,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AACxI,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AAGlE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACxE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,33 @@
1
+ // Config
2
+ export { AdminConfigProvider, useAdminConfig } from './config/AdminConfigContext';
3
+ export { DEFAULT_CORE_ROUTES, getDefaultMenuSections } from './config/defaults';
4
+ // Auth
5
+ export { AuthProvider, useAuth } from './auth/AuthContext';
6
+ export { default as ProtectedRoute } from './auth/ProtectedRoute';
7
+ export { default as ProtectedPage } from './auth/ProtectedPage';
8
+ export { default as PermissionGuard } from './auth/PermissionGuard';
9
+ export { initApiClient, getApiClient } from './auth/api-client';
10
+ export { authService } from './auth/auth.service';
11
+ // Layouts
12
+ export { default as AdminLayout } from './layouts/AdminLayout';
13
+ export { default as Sidebar } from './layouts/Sidebar';
14
+ // Providers
15
+ export { CoreProviders } from './components/Providers';
16
+ // UI Components
17
+ export * from './ui';
18
+ // Components
19
+ export { default as ThemeToggle } from './components/ThemeToggle';
20
+ export { default as PageHeader } from './components/PageHeader';
21
+ // Pages
22
+ export { LoginPage, ChangePasswordPage, ForgotPasswordPage, ResetPasswordPage, VerifyEmailPage, UnauthorizedPage, UsersPage, UserDetailPage, RolesPage, PermissionsPage, ProfilePage, UserPreferencesPage, } from './pages';
23
+ // Contexts
24
+ export { ThemeProvider, useTheme } from './contexts/ThemeContext';
25
+ // Hooks
26
+ export { useToast } from './hooks/useToast';
27
+ // Lib
28
+ export { cn, formatDate, formatDateTime } from './lib/utils';
29
+ // Constants
30
+ export { CORE_API_ROUTES, CORE_ADMIN_API_ROUTES } from './constants/api-routes';
31
+ export { PERMISSIONS, ROLES, ROLE_PERMISSIONS, checkPermission, checkAnyPermission, checkAllPermissions } from './constants/permissions';
32
+ export { RequestStatus, VerificationStatus } from './types/status';
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAEjF,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAE/E,OAAO;AACP,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD,UAAU;AACV,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAEtD,YAAY;AACZ,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEtD,gBAAgB;AAChB,cAAc,MAAM,CAAA;AAEpB,aAAa;AACb,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAE/D,QAAQ;AACR,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,SAAS,EACT,eAAe,EACf,WAAW,EACX,mBAAmB,GACpB,MAAM,SAAS,CAAA;AAEhB,WAAW;AACX,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAEjE,QAAQ;AACR,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE3C,MAAM;AACN,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5D,YAAY;AACZ,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAC/E,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAKxI,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,4 @@
1
+ export default function AdminLayout({ children }: {
2
+ children: React.ReactNode;
3
+ }): import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=AdminLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminLayout.d.ts","sourceRoot":"","sources":["../../../src/client/layouts/AdminLayout.tsx"],"names":[],"mappings":"AAWA,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CA8L9E"}
@@ -0,0 +1,72 @@
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import Sidebar from './Sidebar';
4
+ import ThemeToggle from '../components/ThemeToggle';
5
+ import { useAuth } from '../auth/AuthContext';
6
+ import { useAdminConfig } from '../config/AdminConfigContext';
7
+ import { Bell, Menu } from 'lucide-react';
8
+ import Link from 'next/link';
9
+ import Image from 'next/image';
10
+ import { useEffect, useState } from 'react';
11
+ export default function AdminLayout({ children }) {
12
+ const { user, logout } = useAuth();
13
+ const config = useAdminConfig();
14
+ const homeUrl = config.homeUrl || '/';
15
+ const logoText = config.appLogoText || config.appName?.charAt(0) || 'A';
16
+ // Initialize to avoid layout shift on first paint
17
+ const [isSidebarOpen, setIsSidebarOpen] = useState(() => {
18
+ if (typeof window === 'undefined') {
19
+ // SSR: assume desktop open to reserve space; mobile is hidden via `lg:block`
20
+ return true;
21
+ }
22
+ const desktop = window.matchMedia('(min-width: 1024px)').matches;
23
+ if (desktop) {
24
+ const saved = localStorage.getItem('sidebarOpen');
25
+ return saved !== null ? JSON.parse(saved) : true;
26
+ }
27
+ return false;
28
+ });
29
+ const [isDesktop, setIsDesktop] = useState(() => {
30
+ if (typeof window === 'undefined')
31
+ return false;
32
+ return window.matchMedia('(min-width: 1024px)').matches;
33
+ });
34
+ const [mounted, setMounted] = useState(false);
35
+ // Detect screen size
36
+ useEffect(() => {
37
+ const checkScreenSize = () => {
38
+ const desktop = window.innerWidth >= 1024;
39
+ setIsDesktop(desktop);
40
+ if (desktop) {
41
+ // On desktop, load saved state
42
+ const savedSidebarState = localStorage.getItem('sidebarOpen');
43
+ if (savedSidebarState !== null) {
44
+ setIsSidebarOpen(JSON.parse(savedSidebarState));
45
+ }
46
+ else {
47
+ setIsSidebarOpen(true);
48
+ }
49
+ }
50
+ else {
51
+ // On mobile, always start closed
52
+ setIsSidebarOpen(false);
53
+ }
54
+ };
55
+ setMounted(true);
56
+ checkScreenSize();
57
+ window.addEventListener('resize', checkScreenSize);
58
+ return () => window.removeEventListener('resize', checkScreenSize);
59
+ }, []);
60
+ // Toggle sidebar
61
+ const toggleSidebar = () => {
62
+ const newState = !isSidebarOpen;
63
+ setIsSidebarOpen(newState);
64
+ if (isDesktop) {
65
+ localStorage.setItem('sidebarOpen', JSON.stringify(newState));
66
+ }
67
+ };
68
+ return (_jsxs("div", { className: "flex h-screen bg-base-200", children: [_jsx("div", { className: `hidden lg:block ${isSidebarOpen ? 'w-64' : 'w-0'} overflow-hidden`, children: _jsx(Sidebar, { isCollapsed: !isSidebarOpen }) }), mounted && !isDesktop && isSidebarOpen && (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 bg-black/50 z-40 lg:hidden", onClick: () => setIsSidebarOpen(false) }), _jsx("div", { className: "fixed inset-y-0 left-0 w-64 bg-base-100 z-50 lg:hidden", children: _jsx(Sidebar, { isCollapsed: false }) })] })), _jsxs("div", { className: "flex-1 flex flex-col overflow-hidden", children: [_jsx("header", { className: "bg-base-100 border-b border-base-300", children: _jsxs("div", { className: "flex items-center justify-between h-16 px-4 lg:px-6", children: [_jsxs("div", { className: "flex items-center gap-4", children: [_jsx("button", { onClick: toggleSidebar, className: "btn btn-ghost btn-sm btn-square", "aria-label": "Toggle menu", children: _jsx(Menu, { className: "w-5 h-5" }) }), _jsx("div", { className: "flex lg:hidden items-center gap-2", children: _jsxs(Link, { href: homeUrl, className: "flex items-center gap-3 p-4 border-b border-base-300 hover:bg-base-200 transition-colors", children: [config.appLogo ? (_jsx("div", { className: "flex-shrink-0", children: config.appLogo })) : (_jsx("div", { className: "w-8 h-8 bg-primary rounded-lg flex items-center justify-center", children: _jsx("span", { className: "text-primary-content font-bold text-sm", children: logoText.charAt(0) }) })), _jsx("span", { className: "font-semibold text-base-content", children: config.appName || logoText })] }) })] }), _jsxs("div", { className: "flex items-center gap-2", children: [config.headerExtra, _jsx(ThemeToggle, {}), _jsxs("div", { className: "dropdown dropdown-end", children: [_jsx("button", { tabIndex: 0, className: "btn btn-ghost btn-circle btn-sm", children: _jsxs("div", { className: "indicator", children: [_jsx(Bell, { className: "w-5 h-5" }), _jsx("span", { className: "badge badge-xs badge-error indicator-item" })] }) }), _jsx("div", { tabIndex: 0, className: "dropdown-content mt-3 z-50 card card-compact w-64 bg-base-100 shadow-xl border border-base-300", children: _jsxs("div", { className: "card-body", children: [_jsx("h3", { className: "font-semibold text-sm", children: "Notifications" }), _jsx("p", { className: "text-sm text-base-content/70", children: "No new notifications" })] }) })] }), _jsxs("div", { className: "dropdown dropdown-end", children: [_jsxs("button", { tabIndex: 0, className: "btn btn-ghost gap-2 px-2", children: [user?.avatar ? (_jsx("div", { className: "avatar", children: _jsx("div", { className: "w-8 h-8 rounded-full", children: _jsx(Image, { src: user.avatar, alt: user?.displayName || user?.username || 'User', width: 32, height: 32, className: "rounded-full object-cover" }) }) })) : (_jsx("div", { className: "w-8 h-8 bg-primary rounded-full flex items-center justify-center", children: _jsx("span", { className: "text-primary-content font-medium text-sm", children: user?.displayName?.charAt(0).toUpperCase() ||
69
+ user?.username?.charAt(0).toUpperCase() ||
70
+ user?.email?.charAt(0).toUpperCase() || 'U' }) })), _jsx("span", { className: "hidden md:inline font-medium", children: user?.displayName || user?.username || user?.email || 'User' })] }), _jsxs("ul", { tabIndex: 0, className: "dropdown-content menu menu-sm mt-3 z-50 p-2 shadow-xl bg-base-100 rounded-box w-52 border border-base-300", children: [_jsx("li", { children: _jsx(Link, { href: config.resolvedRoutes.PROFILE, children: "Profile" }) }), _jsx("li", { children: _jsx(Link, { href: config.resolvedRoutes.USER_SETTINGS, children: "Settings" }) }), _jsx("li", { className: "sm:hidden", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { children: "Theme" }), _jsx(ThemeToggle, {})] }) }), _jsx("li", { className: "border-t border-base-300 mt-1 pt-1", children: _jsx("button", { onClick: logout, children: "Logout" }) })] })] })] })] }) }), _jsx("main", { className: "flex-1 overflow-y-auto bg-base-200", children: children })] })] }));
71
+ }
72
+ //# sourceMappingURL=AdminLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminLayout.js","sourceRoot":"","sources":["../../../src/client/layouts/AdminLayout.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface SidebarProps {
2
+ isCollapsed?: boolean;
3
+ }
4
+ export default function Sidebar({ isCollapsed }: SidebarProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=Sidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../src/client/layouts/Sidebar.tsx"],"names":[],"mappings":"AAYA,UAAU,YAAY;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,EAAE,WAAmB,EAAE,EAAE,YAAY,2CAqLpE"}
@@ -0,0 +1,86 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useAdminConfig } from '../config/AdminConfigContext';
4
+ import { getDefaultMenuSections } from '../config/defaults';
5
+ import { ChevronRight, } from 'lucide-react';
6
+ import Link from 'next/link';
7
+ import { usePathname } from 'next/navigation';
8
+ import { useState, useEffect } from 'react';
9
+ export default function Sidebar({ isCollapsed = false }) {
10
+ const config = useAdminConfig();
11
+ const resolvedMenuSections = config.menuSections
12
+ ? config.menuSections
13
+ : [
14
+ ...(config.prependMenuSections || []),
15
+ ...getDefaultMenuSections(config.resolvedRoutes, config.features),
16
+ ...(config.extraMenuSections || []),
17
+ ];
18
+ const [expandedItems, setExpandedItems] = useState(new Set());
19
+ const pathname = usePathname();
20
+ const [mounted, setMounted] = useState(false);
21
+ // Initial mount
22
+ useEffect(() => {
23
+ setMounted(true);
24
+ }, []);
25
+ // Auto-expand menu items based on current pathname (merge, don't replace)
26
+ useEffect(() => {
27
+ if (!mounted)
28
+ return;
29
+ const pathExpanded = new Set();
30
+ resolvedMenuSections.forEach(section => {
31
+ section.items.forEach(item => {
32
+ if (item.children) {
33
+ const hasActiveChild = item.children.some(child => pathname === child.href);
34
+ if (hasActiveChild) {
35
+ pathExpanded.add(item.label);
36
+ }
37
+ }
38
+ });
39
+ });
40
+ setExpandedItems(prev => {
41
+ const next = new Set(prev);
42
+ pathExpanded.forEach(label => next.add(label));
43
+ // If unchanged, return prev to avoid unnecessary re-render
44
+ if (next.size === prev.size)
45
+ return prev;
46
+ return next;
47
+ });
48
+ }, [pathname, mounted]);
49
+ const toggleExpanded = (label) => {
50
+ setExpandedItems(prev => {
51
+ const newExpanded = new Set(prev);
52
+ if (newExpanded.has(label)) {
53
+ newExpanded.delete(label);
54
+ }
55
+ else {
56
+ newExpanded.add(label);
57
+ }
58
+ return newExpanded;
59
+ });
60
+ };
61
+ const isActive = (href) => {
62
+ return pathname === href;
63
+ };
64
+ const hasActiveChild = (children) => {
65
+ if (!children)
66
+ return false;
67
+ return children.some(child => pathname === child.href);
68
+ };
69
+ const logoText = config.appLogoText || config.appName?.charAt(0) || 'A';
70
+ const homeUrl = config.homeUrl || '/';
71
+ return (_jsxs("aside", { className: "flex flex-col h-full bg-base-100 border-r border-base-300", children: [_jsxs(Link, { href: homeUrl, className: "flex items-center gap-3 p-4 border-b border-base-300 hover:bg-base-200 transition-colors", children: [config.appLogo ? (_jsx("div", { className: "flex-shrink-0", children: config.appLogo })) : (_jsx("div", { className: "w-8 h-8 bg-primary rounded-lg flex items-center justify-center flex-shrink-0", children: _jsx("span", { className: "text-primary-content font-bold text-sm", children: logoText.charAt(0) }) })), !isCollapsed && (_jsx("span", { className: "font-semibold text-base-content text-lg", children: config.appName || logoText }))] }), _jsx("nav", { className: "flex-1 py-2 overflow-y-auto", children: resolvedMenuSections.map((section, sectionIndex) => (_jsxs("div", { className: "mb-2", children: [section.label && !isCollapsed && (_jsx("div", { className: "px-4 py-2 mt-2", children: _jsx("h3", { className: "text-xs font-semibold text-base-content/50 uppercase tracking-wider", children: section.label }) })), section.items.map((item) => {
72
+ const hasChildren = item.children && item.children.length > 0;
73
+ const isExpanded = expandedItems.has(item.label);
74
+ const itemIsActive = item.href ? isActive(item.href) : hasActiveChild(item.children);
75
+ return (_jsx("div", { children: hasChildren ? (_jsxs("div", { children: [_jsxs("button", { onClick: () => !isCollapsed && toggleExpanded(item.label), className: `w-full flex items-center justify-between px-4 py-2.5 text-sm border-r-2 ${itemIsActive
76
+ ? 'text-primary bg-primary/5 font-medium border-primary'
77
+ : 'text-base-content hover:bg-base-200 border-transparent'}`, children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("span", { className: itemIsActive ? 'text-primary' : 'text-base-content/70', children: item.icon }), !isCollapsed && _jsx("span", { children: item.label })] }), !isCollapsed && (_jsx(ChevronRight, { className: `w-4 h-4 transition-transform duration-150 ${isExpanded ? 'rotate-90' : ''} ${itemIsActive ? 'text-primary' : 'text-base-content/50'}` }))] }), isExpanded && !isCollapsed && (_jsx("div", { className: "bg-base-200/30", children: item.children.map((child) => (_jsxs(Link, { href: child.href, className: `flex items-center gap-3 px-4 pl-12 py-2.5 text-sm border-r-2 ${pathname === child.href
78
+ ? 'text-primary bg-primary/5 font-medium border-primary'
79
+ : 'text-base-content/80 hover:bg-base-200 border-transparent'}`, children: [_jsx("span", { className: pathname === child.href ? 'text-primary' : 'text-base-content/60', children: child.icon }), _jsx("span", { children: child.label })] }, child.href))) }))] })) : (
80
+ /* Single Item without Children */
81
+ _jsxs(Link, { href: item.href, className: `flex items-center gap-3 px-4 py-2.5 text-sm border-r-2 ${itemIsActive
82
+ ? 'text-primary bg-primary/5 font-medium border-primary'
83
+ : 'text-base-content hover:bg-base-200 border-transparent'}`, children: [_jsx("span", { className: itemIsActive ? 'text-primary' : 'text-base-content/70', children: item.icon }), !isCollapsed && _jsx("span", { children: item.label })] })) }, item.label));
84
+ })] }, sectionIndex))) }), config.sidebarFooter && (_jsx("div", { className: "border-t border-base-300 p-4", children: config.sidebarFooter }))] }));
85
+ }
86
+ //# sourceMappingURL=Sidebar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sidebar.js","sourceRoot":"","sources":["../../../src/client/layouts/Sidebar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { default as AdminLayout } from './AdminLayout';
2
+ export { default as Sidebar } from './Sidebar';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/layouts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { default as AdminLayout } from './AdminLayout';
2
+ export { default as Sidebar } from './Sidebar';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/layouts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { type ClassValue } from 'clsx';
2
+ export declare function cn(...inputs: ClassValue[]): string;
3
+ export declare function formatDate(date: string | Date): string;
4
+ export declare function formatDateTime(date: string | Date): string;
5
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/client/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAA;AAG5C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,UAM7C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,UAQjD"}
@@ -0,0 +1,22 @@
1
+ import { clsx } from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
+ export function cn(...inputs) {
4
+ return twMerge(clsx(inputs));
5
+ }
6
+ export function formatDate(date) {
7
+ return new Date(date).toLocaleDateString('vi-VN', {
8
+ year: 'numeric',
9
+ month: 'long',
10
+ day: 'numeric',
11
+ });
12
+ }
13
+ export function formatDateTime(date) {
14
+ return new Date(date).toLocaleDateString('vi-VN', {
15
+ year: 'numeric',
16
+ month: 'numeric',
17
+ day: 'numeric',
18
+ hour: '2-digit',
19
+ minute: '2-digit',
20
+ });
21
+ }
22
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/client/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,IAAI,EAAE,MAAM,MAAM,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAExC,MAAM,UAAU,EAAE,CAAC,GAAG,MAAoB;IACxC,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;AAC9B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC5C,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;QAChD,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,SAAS;KACf,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAmB;IAChD,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;QAChD,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;KAClB,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export default function ChangePasswordPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ChangePasswordPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChangePasswordPage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/ChangePasswordPage.tsx"],"names":[],"mappings":"AAWA,MAAM,CAAC,OAAO,UAAU,kBAAkB,4CA6KzC"}
@@ -0,0 +1,58 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { useRouter } from 'next/navigation';
5
+ import { Eye, EyeOff, Lock, ArrowRight, SkipForward } from 'lucide-react';
6
+ import toast from 'react-hot-toast';
7
+ import { getApiClient } from '../auth/api-client';
8
+ import { CORE_API_ROUTES } from '../constants/api-routes';
9
+ import { useAdminConfig } from '../config/AdminConfigContext';
10
+ export default function ChangePasswordPage() {
11
+ const apiClient = getApiClient();
12
+ const { resolvedRoutes } = useAdminConfig();
13
+ const router = useRouter();
14
+ const [loading, setLoading] = useState(false);
15
+ const [showCurrentPassword, setShowCurrentPassword] = useState(false);
16
+ const [showPassword, setShowPassword] = useState(false);
17
+ const [showConfirmPassword, setShowConfirmPassword] = useState(false);
18
+ const [formData, setFormData] = useState({
19
+ currentPassword: '',
20
+ password: '',
21
+ confirmPassword: '',
22
+ });
23
+ const handleSubmit = async (e) => {
24
+ e.preventDefault();
25
+ if (formData.password !== formData.confirmPassword) {
26
+ toast.error('Mật khẩu xác nhận không khớp');
27
+ return;
28
+ }
29
+ if (formData.password.length < 6) {
30
+ toast.error('Mật khẩu phải có ít nhất 6 ký tự');
31
+ return;
32
+ }
33
+ setLoading(true);
34
+ try {
35
+ // OAuth module expects: currentPassword, password, newPasswordConfirmation
36
+ await apiClient.post(CORE_API_ROUTES.AUTH.CHANGE_PASSWORD, {
37
+ currentPassword: formData.currentPassword,
38
+ newPassword: formData.password,
39
+ newPasswordConfirmation: formData.confirmPassword,
40
+ });
41
+ toast.success('Đổi mật khẩu thành công');
42
+ router.push(resolvedRoutes.DASHBOARD);
43
+ }
44
+ catch (error) {
45
+ console.error('Failed to change password:', error);
46
+ const message = error.response?.data?.message || 'Có lỗi xảy ra';
47
+ toast.error(message);
48
+ }
49
+ finally {
50
+ setLoading(false);
51
+ }
52
+ };
53
+ const handleSkip = () => {
54
+ router.push(resolvedRoutes.DASHBOARD);
55
+ };
56
+ return (_jsx("div", { className: "min-h-screen flex items-center justify-center bg-gray-50 p-4", children: _jsxs("div", { className: "max-w-md w-full bg-white rounded-2xl shadow-xl p-8", children: [_jsxs("div", { className: "text-center mb-8", children: [_jsx("div", { className: "w-16 h-16 bg-primary/10 rounded-full flex items-center justify-center mx-auto mb-4", children: _jsx(Lock, { className: "w-8 h-8 text-primary" }) }), _jsx("h1", { className: "text-2xl font-bold text-gray-900 mb-2", children: "\u0110\u1ED5i m\u1EADt kh\u1EA9u" }), _jsx("p", { className: "text-gray-500", children: "V\u00EC l\u00FD do b\u1EA3o m\u1EADt, vui l\u00F2ng \u0111\u1ED5i m\u1EADt kh\u1EA9u cho l\u1EA7n \u0111\u0103ng nh\u1EADp \u0111\u1EA7u ti\u00EAn." })] }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-6", children: [_jsxs("div", { children: [_jsx("label", { className: "block text-sm font-medium text-gray-700 mb-1", children: "M\u1EADt kh\u1EA9u hi\u1EC7n t\u1EA1i" }), _jsxs("div", { className: "relative", children: [_jsx("input", { type: showCurrentPassword ? 'text' : 'password', required: true, value: formData.currentPassword, onChange: (e) => setFormData({ ...formData, currentPassword: e.target.value }), className: "w-full px-4 py-2 pl-10 rounded-lg border border-gray-200 focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary", placeholder: "Nh\u1EADp m\u1EADt kh\u1EA9u hi\u1EC7n t\u1EA1i" }), _jsx(Lock, { className: "absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400" }), _jsx("button", { type: "button", onClick: () => setShowCurrentPassword(!showCurrentPassword), className: "absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600", children: showCurrentPassword ? _jsx(EyeOff, { className: "w-4 h-4" }) : _jsx(Eye, { className: "w-4 h-4" }) })] })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-sm font-medium text-gray-700 mb-1", children: "M\u1EADt kh\u1EA9u m\u1EDBi" }), _jsxs("div", { className: "relative", children: [_jsx("input", { type: showPassword ? 'text' : 'password', required: true, value: formData.password, onChange: (e) => setFormData({ ...formData, password: e.target.value }), className: "w-full px-4 py-2 pl-10 rounded-lg border border-gray-200 focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary", placeholder: "Nh\u1EADp m\u1EADt kh\u1EA9u m\u1EDBi" }), _jsx(Lock, { className: "absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400" }), _jsx("button", { type: "button", onClick: () => setShowPassword(!showPassword), className: "absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600", children: showPassword ? _jsx(EyeOff, { className: "w-4 h-4" }) : _jsx(Eye, { className: "w-4 h-4" }) })] })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-sm font-medium text-gray-700 mb-1", children: "X\u00E1c nh\u1EADn m\u1EADt kh\u1EA9u" }), _jsxs("div", { className: "relative", children: [_jsx("input", { type: showConfirmPassword ? 'text' : 'password', required: true, value: formData.confirmPassword, onChange: (e) => setFormData({ ...formData, confirmPassword: e.target.value }), className: "w-full px-4 py-2 pl-10 rounded-lg border border-gray-200 focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary", placeholder: "Nh\u1EADp l\u1EA1i m\u1EADt kh\u1EA9u m\u1EDBi" }), _jsx(Lock, { className: "absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400" }), _jsx("button", { type: "button", onClick: () => setShowConfirmPassword(!showConfirmPassword), className: "absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600", children: showConfirmPassword ? _jsx(EyeOff, { className: "w-4 h-4" }) : _jsx(Eye, { className: "w-4 h-4" }) })] })] }), _jsx("button", { type: "submit", disabled: loading, className: "w-full py-2.5 bg-primary text-white rounded-lg hover:bg-primary/90 transition-colors flex items-center justify-center gap-2 font-medium disabled:opacity-50 disabled:cursor-not-allowed", children: loading ? (_jsx("div", { className: "w-5 h-5 border-2 border-white/30 border-t-white rounded-full animate-spin" })) : (_jsxs(_Fragment, { children: ["\u0110\u1ED5i m\u1EADt kh\u1EA9u", _jsx(ArrowRight, { className: "w-4 h-4" })] })) }), _jsxs("div", { className: "relative", children: [_jsx("div", { className: "absolute inset-0 flex items-center", children: _jsx("div", { className: "w-full border-t border-gray-200" }) }), _jsx("div", { className: "relative flex justify-center text-sm", children: _jsx("span", { className: "px-2 bg-white text-gray-500", children: "Ho\u1EB7c" }) })] }), _jsxs("button", { type: "button", onClick: handleSkip, className: "w-full py-2.5 border border-gray-200 text-gray-600 rounded-lg hover:bg-gray-50 transition-colors flex items-center justify-center gap-2 font-medium", children: ["B\u1ECF qua, t\u00F4i s\u1EBD \u0111\u1ED5i sau", _jsx(SkipForward, { className: "w-4 h-4" })] })] })] }) }));
57
+ }
58
+ //# sourceMappingURL=ChangePasswordPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChangePasswordPage.js","sourceRoot":"","sources":["../../../src/client/pages/ChangePasswordPage.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACzE,OAAO,KAAK,MAAM,iBAAiB,CAAA;AAEnC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAE7D,MAAM,CAAC,OAAO,UAAU,kBAAkB;IACxC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAAA;IAC3C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7C,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACrE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACvD,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACrE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC;QACvC,eAAe,EAAE,EAAE;QACnB,QAAQ,EAAE,EAAE;QACZ,eAAe,EAAE,EAAE;KACpB,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,KAAK,EAAE,CAAkB,EAAE,EAAE;QAChD,CAAC,CAAC,cAAc,EAAE,CAAA;QAElB,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,eAAe,EAAE,CAAC;YACnD,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAA;YAC3C,OAAM;QACR,CAAC;QAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAA;YAC/C,OAAM;QACR,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,CAAA;QAEhB,IAAI,CAAC;YACH,2EAA2E;YAC3E,MAAM,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE;gBACzD,eAAe,EAAE,QAAQ,CAAC,eAAe;gBACzC,WAAW,EAAE,QAAQ,CAAC,QAAQ;gBAC9B,uBAAuB,EAAE,QAAQ,CAAC,eAAe;aAClD,CAAC,CAAA;YACF,KAAK,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAA;YACxC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;QACvC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAA;YAClD,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,eAAe,CAAA;YAChE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACtB,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC;IACH,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;IACvC,CAAC,CAAA;IAED,OAAO,CACL,cAAK,SAAS,EAAC,8DAA8D,YAC3E,eAAK,SAAS,EAAC,oDAAoD,aACjE,eAAK,SAAS,EAAC,kBAAkB,aAC/B,cAAK,SAAS,EAAC,oFAAoF,YACjG,KAAC,IAAI,IAAC,SAAS,EAAC,sBAAsB,GAAG,GACrC,EACN,aAAI,SAAS,EAAC,uCAAuC,iDAAkB,EACvE,YAAG,SAAS,EAAC,eAAe,oKAExB,IACA,EAEN,gBAAM,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAC,WAAW,aACjD,0BACE,gBAAO,SAAS,EAAC,8CAA8C,sDAEvD,EACR,eAAK,SAAS,EAAC,UAAU,aACvB,gBACE,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,EAC/C,QAAQ,QACR,KAAK,EAAE,QAAQ,CAAC,eAAe,EAC/B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAC9E,SAAS,EAAC,qIAAqI,EAC/I,WAAW,EAAC,iDAAwB,GACpC,EACF,KAAC,IAAI,IAAC,SAAS,EAAC,gEAAgE,GAAG,EACnF,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,CAAC,mBAAmB,CAAC,EAC3D,SAAS,EAAC,6EAA6E,YAEtF,mBAAmB,CAAC,CAAC,CAAC,KAAC,MAAM,IAAC,SAAS,EAAC,SAAS,GAAG,CAAC,CAAC,CAAC,KAAC,GAAG,IAAC,SAAS,EAAC,SAAS,GAAG,GAC5E,IACL,IACF,EAEN,0BACE,gBAAO,SAAS,EAAC,8CAA8C,4CAEvD,EACR,eAAK,SAAS,EAAC,UAAU,aACvB,gBACE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,EACxC,QAAQ,QACR,KAAK,EAAE,QAAQ,CAAC,QAAQ,EACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EACvE,SAAS,EAAC,qIAAqI,EAC/I,WAAW,EAAC,uCAAmB,GAC/B,EACF,KAAC,IAAI,IAAC,SAAS,EAAC,gEAAgE,GAAG,EACnF,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,EAC7C,SAAS,EAAC,6EAA6E,YAEtF,YAAY,CAAC,CAAC,CAAC,KAAC,MAAM,IAAC,SAAS,EAAC,SAAS,GAAG,CAAC,CAAC,CAAC,KAAC,GAAG,IAAC,SAAS,EAAC,SAAS,GAAG,GACrE,IACL,IACF,EAEN,0BACE,gBAAO,SAAS,EAAC,8CAA8C,sDAEvD,EACR,eAAK,SAAS,EAAC,UAAU,aACvB,gBACE,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,EAC/C,QAAQ,QACR,KAAK,EAAE,QAAQ,CAAC,eAAe,EAC/B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAC9E,SAAS,EAAC,qIAAqI,EAC/I,WAAW,EAAC,gDAAuB,GACnC,EACF,KAAC,IAAI,IAAC,SAAS,EAAC,gEAAgE,GAAG,EACnF,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,CAAC,mBAAmB,CAAC,EAC3D,SAAS,EAAC,6EAA6E,YAEtF,mBAAmB,CAAC,CAAC,CAAC,KAAC,MAAM,IAAC,SAAS,EAAC,SAAS,GAAG,CAAC,CAAC,CAAC,KAAC,GAAG,IAAC,SAAS,EAAC,SAAS,GAAG,GAC5E,IACL,IACF,EAEN,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAC,yLAAyL,YAElM,OAAO,CAAC,CAAC,CAAC,CACT,cAAK,SAAS,EAAC,2EAA2E,GAAG,CAC9F,CAAC,CAAC,CAAC,CACF,kEAEE,KAAC,UAAU,IAAC,SAAS,EAAC,SAAS,GAAG,IACjC,CACJ,GACM,EAET,eAAK,SAAS,EAAC,UAAU,aACvB,cAAK,SAAS,EAAC,oCAAoC,YACjD,cAAK,SAAS,EAAC,iCAAiC,GAAO,GACnD,EACN,cAAK,SAAS,EAAC,sCAAsC,YACnD,eAAM,SAAS,EAAC,6BAA6B,0BAAY,GACrD,IACF,EAEN,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,UAAU,EACnB,SAAS,EAAC,qJAAqJ,gEAG/J,KAAC,WAAW,IAAC,SAAS,EAAC,SAAS,GAAG,IAC5B,IACJ,IACH,GACF,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export default function ForgotPasswordPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ForgotPasswordPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ForgotPasswordPage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/ForgotPasswordPage.tsx"],"names":[],"mappings":"AAQA,MAAM,CAAC,OAAO,UAAU,kBAAkB,4CAwGzC"}
@@ -0,0 +1,30 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { useRouter } from 'next/navigation';
5
+ import { useAdminConfig } from '../config/AdminConfigContext';
6
+ import { authService } from '../auth/auth.service';
7
+ import { RequestStatus } from '../types/status';
8
+ export default function ForgotPasswordPage() {
9
+ const { resolvedRoutes } = useAdminConfig();
10
+ const router = useRouter();
11
+ const [email, setEmail] = useState('');
12
+ const [status, setStatus] = useState(RequestStatus.IDLE);
13
+ const [message, setMessage] = useState('');
14
+ const handleSubmit = async (e) => {
15
+ e.preventDefault();
16
+ setStatus(RequestStatus.LOADING);
17
+ setMessage('');
18
+ try {
19
+ await authService.forgotPassword(email);
20
+ setStatus(RequestStatus.SUCCESS);
21
+ setMessage('Email đặt lại mật khẩu đã được gửi. Vui lòng kiểm tra hộp thư của bạn.');
22
+ }
23
+ catch (error) {
24
+ setStatus(RequestStatus.ERROR);
25
+ setMessage(error.response?.data?.message || 'Có lỗi xảy ra. Vui lòng thử lại.');
26
+ }
27
+ };
28
+ return (_jsx("div", { className: "min-h-screen flex items-center justify-center bg-base-200 px-4", children: _jsx("div", { className: "card w-full max-w-md bg-base-100 shadow-xl", children: _jsxs("div", { className: "card-body", children: [_jsx("h2", { className: "card-title text-3xl justify-center", children: "Qu\u00EAn m\u1EADt kh\u1EA9u" }), _jsx("p", { className: "text-center text-base-content/70", children: "Nh\u1EADp email c\u1EE7a b\u1EA1n \u0111\u1EC3 nh\u1EADn link \u0111\u1EB7t l\u1EA1i m\u1EADt kh\u1EA9u" }), status === RequestStatus.SUCCESS ? (_jsxs("div", { className: "alert alert-success mt-4", children: [_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", className: "stroke-current shrink-0 h-6 w-6", fill: "none", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" }) }), _jsx("span", { children: message })] })) : (_jsxs("form", { onSubmit: handleSubmit, className: "mt-4", children: [status === RequestStatus.ERROR && (_jsxs("div", { className: "alert alert-error mb-4", children: [_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", className: "stroke-current shrink-0 h-6 w-6", fill: "none", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z" }) }), _jsx("span", { children: message })] })), _jsxs("div", { className: "form-control", children: [_jsx("label", { className: "label", htmlFor: "email", children: _jsx("span", { className: "label-text", children: "Email" }) }), _jsx("input", { id: "email", name: "email", type: "email", required: true, value: email, onChange: (e) => setEmail(e.target.value), className: "input input-bordered w-full", placeholder: "Nh\u1EADp email c\u1EE7a b\u1EA1n" })] }), _jsx("div", { className: "flex items-center justify-between mt-4", children: _jsx("button", { type: "button", onClick: () => router.push(resolvedRoutes.LOGIN), className: "link link-primary text-sm", children: "\u2190 V\u1EC1 trang \u0111\u0103ng nh\u1EADp" }) }), _jsx("div", { className: "form-control mt-6", children: _jsxs("button", { type: "submit", disabled: status === RequestStatus.LOADING, className: "btn btn-primary w-full", children: [status === RequestStatus.LOADING && _jsx("span", { className: "loading loading-spinner" }), status === RequestStatus.LOADING ? 'Đang gửi...' : 'Gửi email đặt lại mật khẩu'] }) })] })), status === RequestStatus.SUCCESS && (_jsx("div", { className: "card-actions justify-center mt-4", children: _jsx("button", { onClick: () => router.push(resolvedRoutes.LOGIN), className: "btn btn-primary w-full", children: "V\u1EC1 trang \u0111\u0103ng nh\u1EADp" }) }))] }) }) }));
29
+ }
30
+ //# sourceMappingURL=ForgotPasswordPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ForgotPasswordPage.js","sourceRoot":"","sources":["../../../src/client/pages/ForgotPasswordPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export default function LoginPage(): import("react/jsx-runtime").JSX.Element | null;
2
+ //# sourceMappingURL=LoginPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoginPage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/LoginPage.tsx"],"names":[],"mappings":"AAoBA,MAAM,CAAC,OAAO,UAAU,SAAS,mDAkIhC"}