@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.
- package/dist/client/auth/AuthContext.d.ts +19 -0
- package/dist/client/auth/AuthContext.d.ts.map +1 -0
- package/dist/client/auth/AuthContext.js +115 -0
- package/dist/client/auth/AuthContext.js.map +1 -0
- package/dist/client/auth/PermissionGuard.d.ts +12 -0
- package/dist/client/auth/PermissionGuard.d.ts.map +1 -0
- package/dist/client/auth/PermissionGuard.js +23 -0
- package/dist/client/auth/PermissionGuard.js.map +1 -0
- package/dist/client/auth/ProtectedPage.d.ts +9 -0
- package/dist/client/auth/ProtectedPage.d.ts.map +1 -0
- package/dist/client/auth/ProtectedPage.js +57 -0
- package/dist/client/auth/ProtectedPage.js.map +1 -0
- package/dist/client/auth/ProtectedRoute.d.ts +4 -0
- package/dist/client/auth/ProtectedRoute.d.ts.map +1 -0
- package/dist/client/auth/ProtectedRoute.js +25 -0
- package/dist/client/auth/ProtectedRoute.js.map +1 -0
- package/dist/client/auth/api-client.d.ts +4 -0
- package/dist/client/auth/api-client.d.ts.map +1 -0
- package/dist/client/auth/api-client.js +83 -0
- package/dist/client/auth/api-client.js.map +1 -0
- package/dist/client/auth/auth.service.d.ts +7 -0
- package/dist/client/auth/auth.service.d.ts.map +1 -0
- package/dist/client/auth/auth.service.js +19 -0
- package/dist/client/auth/auth.service.js.map +1 -0
- package/dist/client/auth/index.d.ts +7 -0
- package/dist/client/auth/index.d.ts.map +1 -0
- package/dist/client/auth/index.js +7 -0
- package/dist/client/auth/index.js.map +1 -0
- package/dist/client/components/PageHeader.d.ts +19 -0
- package/dist/client/components/PageHeader.d.ts.map +1 -0
- package/dist/client/components/PageHeader.js +7 -0
- package/dist/client/components/PageHeader.js.map +1 -0
- package/dist/client/components/Providers.d.ts +9 -0
- package/dist/client/components/Providers.d.ts.map +1 -0
- package/dist/client/components/Providers.js +52 -0
- package/dist/client/components/Providers.js.map +1 -0
- package/dist/client/components/ThemeToggle.d.ts +6 -0
- package/dist/client/components/ThemeToggle.d.ts.map +1 -0
- package/dist/client/components/ThemeToggle.js +22 -0
- package/dist/client/components/ThemeToggle.js.map +1 -0
- package/dist/client/components/index.d.ts +4 -0
- package/dist/client/components/index.d.ts.map +1 -0
- package/dist/client/components/index.js +4 -0
- package/dist/client/components/index.js.map +1 -0
- package/dist/client/config/AdminConfigContext.d.ts +12 -0
- package/dist/client/config/AdminConfigContext.d.ts.map +1 -0
- package/dist/client/config/AdminConfigContext.js +29 -0
- package/dist/client/config/AdminConfigContext.js.map +1 -0
- package/dist/client/config/defaults.d.ts +4 -0
- package/dist/client/config/defaults.d.ts.map +1 -0
- package/dist/client/config/defaults.js +86 -0
- package/dist/client/config/defaults.js.map +1 -0
- package/dist/client/config/types.d.ts +61 -0
- package/dist/client/config/types.d.ts.map +1 -0
- package/dist/client/config/types.js +2 -0
- package/dist/client/config/types.js.map +1 -0
- package/dist/client/constants/api-routes.d.ts +104 -0
- package/dist/client/constants/api-routes.d.ts.map +1 -0
- package/dist/client/constants/api-routes.js +91 -0
- package/dist/client/constants/api-routes.js.map +1 -0
- package/dist/client/constants/permissions.d.ts +38 -0
- package/dist/client/constants/permissions.d.ts.map +1 -0
- package/dist/client/constants/permissions.js +37 -0
- package/dist/client/constants/permissions.js.map +1 -0
- package/dist/client/contexts/ThemeContext.d.ts +3 -0
- package/dist/client/contexts/ThemeContext.d.ts.map +1 -0
- package/dist/client/contexts/ThemeContext.js +8 -0
- package/dist/client/contexts/ThemeContext.js.map +1 -0
- package/dist/client/hooks/useToast.d.ts +14 -0
- package/dist/client/hooks/useToast.d.ts.map +1 -0
- package/dist/client/hooks/useToast.js +90 -0
- package/dist/client/hooks/useToast.js.map +1 -0
- package/dist/client/index.d.ts +25 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +33 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/layouts/AdminLayout.d.ts +4 -0
- package/dist/client/layouts/AdminLayout.d.ts.map +1 -0
- package/dist/client/layouts/AdminLayout.js +72 -0
- package/dist/client/layouts/AdminLayout.js.map +1 -0
- package/dist/client/layouts/Sidebar.d.ts +6 -0
- package/dist/client/layouts/Sidebar.d.ts.map +1 -0
- package/dist/client/layouts/Sidebar.js +86 -0
- package/dist/client/layouts/Sidebar.js.map +1 -0
- package/dist/client/layouts/index.d.ts +3 -0
- package/dist/client/layouts/index.d.ts.map +1 -0
- package/dist/client/layouts/index.js +3 -0
- package/dist/client/layouts/index.js.map +1 -0
- package/dist/client/lib/utils.d.ts +5 -0
- package/dist/client/lib/utils.d.ts.map +1 -0
- package/dist/client/lib/utils.js +22 -0
- package/dist/client/lib/utils.js.map +1 -0
- package/dist/client/pages/ChangePasswordPage.d.ts +2 -0
- package/dist/client/pages/ChangePasswordPage.d.ts.map +1 -0
- package/dist/client/pages/ChangePasswordPage.js +58 -0
- package/dist/client/pages/ChangePasswordPage.js.map +1 -0
- package/dist/client/pages/ForgotPasswordPage.d.ts +2 -0
- package/dist/client/pages/ForgotPasswordPage.d.ts.map +1 -0
- package/dist/client/pages/ForgotPasswordPage.js +30 -0
- package/dist/client/pages/ForgotPasswordPage.js.map +1 -0
- package/dist/client/pages/LoginPage.d.ts +2 -0
- package/dist/client/pages/LoginPage.d.ts.map +1 -0
- package/dist/client/pages/LoginPage.js +52 -0
- package/dist/client/pages/LoginPage.js.map +1 -0
- package/dist/client/pages/PermissionsPage.d.ts +2 -0
- package/dist/client/pages/PermissionsPage.d.ts.map +1 -0
- package/dist/client/pages/PermissionsPage.js +42 -0
- package/dist/client/pages/PermissionsPage.js.map +1 -0
- package/dist/client/pages/ProfilePage.d.ts +2 -0
- package/dist/client/pages/ProfilePage.d.ts.map +1 -0
- package/dist/client/pages/ProfilePage.js +107 -0
- package/dist/client/pages/ProfilePage.js.map +1 -0
- package/dist/client/pages/ResetPasswordPage.d.ts +2 -0
- package/dist/client/pages/ResetPasswordPage.d.ts.map +1 -0
- package/dist/client/pages/ResetPasswordPage.js +68 -0
- package/dist/client/pages/ResetPasswordPage.js.map +1 -0
- package/dist/client/pages/RolesPage.d.ts +2 -0
- package/dist/client/pages/RolesPage.d.ts.map +1 -0
- package/dist/client/pages/RolesPage.js +82 -0
- package/dist/client/pages/RolesPage.js.map +1 -0
- package/dist/client/pages/UnauthorizedPage.d.ts +2 -0
- package/dist/client/pages/UnauthorizedPage.d.ts.map +1 -0
- package/dist/client/pages/UnauthorizedPage.js +9 -0
- package/dist/client/pages/UnauthorizedPage.js.map +1 -0
- package/dist/client/pages/UserDetailPage.d.ts +6 -0
- package/dist/client/pages/UserDetailPage.d.ts.map +1 -0
- package/dist/client/pages/UserDetailPage.js +220 -0
- package/dist/client/pages/UserDetailPage.js.map +1 -0
- package/dist/client/pages/UserPreferencesPage.d.ts +2 -0
- package/dist/client/pages/UserPreferencesPage.d.ts.map +1 -0
- package/dist/client/pages/UserPreferencesPage.js +152 -0
- package/dist/client/pages/UserPreferencesPage.js.map +1 -0
- package/dist/client/pages/UsersPage.d.ts +2 -0
- package/dist/client/pages/UsersPage.d.ts.map +1 -0
- package/dist/client/pages/UsersPage.js +228 -0
- package/dist/client/pages/UsersPage.js.map +1 -0
- package/dist/client/pages/VerifyEmailPage.d.ts +2 -0
- package/dist/client/pages/VerifyEmailPage.d.ts.map +1 -0
- package/dist/client/pages/VerifyEmailPage.js +43 -0
- package/dist/client/pages/VerifyEmailPage.js.map +1 -0
- package/dist/client/pages/index.d.ts +13 -0
- package/dist/client/pages/index.d.ts.map +1 -0
- package/dist/client/pages/index.js +13 -0
- package/dist/client/pages/index.js.map +1 -0
- package/dist/client/pages/roles/RoleModal.d.ts +10 -0
- package/dist/client/pages/roles/RoleModal.d.ts.map +1 -0
- package/dist/client/pages/roles/RoleModal.js +123 -0
- package/dist/client/pages/roles/RoleModal.js.map +1 -0
- package/dist/client/pages/users/DangerZone.d.ts +10 -0
- package/dist/client/pages/users/DangerZone.d.ts.map +1 -0
- package/dist/client/pages/users/DangerZone.js +8 -0
- package/dist/client/pages/users/DangerZone.js.map +1 -0
- package/dist/client/pages/users/ProfileCard.d.ts +14 -0
- package/dist/client/pages/users/ProfileCard.d.ts.map +1 -0
- package/dist/client/pages/users/ProfileCard.js +8 -0
- package/dist/client/pages/users/ProfileCard.js.map +1 -0
- package/dist/client/pages/users/SecuritySection.d.ts +14 -0
- package/dist/client/pages/users/SecuritySection.d.ts.map +1 -0
- package/dist/client/pages/users/SecuritySection.js +16 -0
- package/dist/client/pages/users/SecuritySection.js.map +1 -0
- package/dist/client/pages/users/SessionsSection.d.ts +25 -0
- package/dist/client/pages/users/SessionsSection.d.ts.map +1 -0
- package/dist/client/pages/users/SessionsSection.js +93 -0
- package/dist/client/pages/users/SessionsSection.js.map +1 -0
- package/dist/client/pages/users/SocialAccountsSection.d.ts +29 -0
- package/dist/client/pages/users/SocialAccountsSection.d.ts.map +1 -0
- package/dist/client/pages/users/SocialAccountsSection.js +72 -0
- package/dist/client/pages/users/SocialAccountsSection.js.map +1 -0
- package/dist/client/pages/users/UserDetailModal.d.ts +24 -0
- package/dist/client/pages/users/UserDetailModal.d.ts.map +1 -0
- package/dist/client/pages/users/UserDetailModal.js +42 -0
- package/dist/client/pages/users/UserDetailModal.js.map +1 -0
- package/dist/client/pages/users/UserFilters.d.ts +14 -0
- package/dist/client/pages/users/UserFilters.d.ts.map +1 -0
- package/dist/client/pages/users/UserFilters.js +22 -0
- package/dist/client/pages/users/UserFilters.js.map +1 -0
- package/dist/client/pages/users/UserStats.d.ts +9 -0
- package/dist/client/pages/users/UserStats.d.ts.map +1 -0
- package/dist/client/pages/users/UserStats.js +37 -0
- package/dist/client/pages/users/UserStats.js.map +1 -0
- package/dist/client/pages/users/UserTable.d.ts +24 -0
- package/dist/client/pages/users/UserTable.d.ts.map +1 -0
- package/dist/client/pages/users/UserTable.js +39 -0
- package/dist/client/pages/users/UserTable.js.map +1 -0
- package/dist/client/pages/users/VerificationSection.d.ts +9 -0
- package/dist/client/pages/users/VerificationSection.d.ts.map +1 -0
- package/dist/client/pages/users/VerificationSection.js +8 -0
- package/dist/client/pages/users/VerificationSection.js.map +1 -0
- package/dist/client/types/auth.d.ts +29 -0
- package/dist/client/types/auth.d.ts.map +1 -0
- package/dist/client/types/auth.js +2 -0
- package/dist/client/types/auth.js.map +1 -0
- package/dist/client/types/rbac.d.ts +39 -0
- package/dist/client/types/rbac.d.ts.map +1 -0
- package/dist/client/types/rbac.js +5 -0
- package/dist/client/types/rbac.js.map +1 -0
- package/dist/client/types/status.d.ts +12 -0
- package/dist/client/types/status.d.ts.map +1 -0
- package/dist/client/types/status.js +14 -0
- package/dist/client/types/status.js.map +1 -0
- package/dist/client/ui/Badge.d.ts +14 -0
- package/dist/client/ui/Badge.d.ts.map +1 -0
- package/dist/client/ui/Badge.js +32 -0
- package/dist/client/ui/Badge.js.map +1 -0
- package/dist/client/ui/Button.d.ts +18 -0
- package/dist/client/ui/Button.d.ts.map +1 -0
- package/dist/client/ui/Button.js +33 -0
- package/dist/client/ui/Button.js.map +1 -0
- package/dist/client/ui/Checkbox.d.ts +14 -0
- package/dist/client/ui/Checkbox.d.ts.map +1 -0
- package/dist/client/ui/Checkbox.js +35 -0
- package/dist/client/ui/Checkbox.js.map +1 -0
- package/dist/client/ui/ConfirmModal.d.ts +14 -0
- package/dist/client/ui/ConfirmModal.d.ts.map +1 -0
- package/dist/client/ui/ConfirmModal.js +43 -0
- package/dist/client/ui/ConfirmModal.js.map +1 -0
- package/dist/client/ui/DataTable.d.ts +69 -0
- package/dist/client/ui/DataTable.d.ts.map +1 -0
- package/dist/client/ui/DataTable.js +133 -0
- package/dist/client/ui/DataTable.js.map +1 -0
- package/dist/client/ui/Dropdown.d.ts +11 -0
- package/dist/client/ui/Dropdown.d.ts.map +1 -0
- package/dist/client/ui/Dropdown.js +65 -0
- package/dist/client/ui/Dropdown.js.map +1 -0
- package/dist/client/ui/FileInput.d.ts +16 -0
- package/dist/client/ui/FileInput.d.ts.map +1 -0
- package/dist/client/ui/FileInput.js +45 -0
- package/dist/client/ui/FileInput.js.map +1 -0
- package/dist/client/ui/Input.d.ts +16 -0
- package/dist/client/ui/Input.d.ts.map +1 -0
- package/dist/client/ui/Input.js +33 -0
- package/dist/client/ui/Input.js.map +1 -0
- package/dist/client/ui/LoadingSpinner.d.ts +7 -0
- package/dist/client/ui/LoadingSpinner.d.ts.map +1 -0
- package/dist/client/ui/LoadingSpinner.js +12 -0
- package/dist/client/ui/LoadingSpinner.js.map +1 -0
- package/dist/client/ui/Modal.d.ts +14 -0
- package/dist/client/ui/Modal.d.ts.map +1 -0
- package/dist/client/ui/Modal.js +46 -0
- package/dist/client/ui/Modal.js.map +1 -0
- package/dist/client/ui/Pagination.d.ts +14 -0
- package/dist/client/ui/Pagination.d.ts.map +1 -0
- package/dist/client/ui/Pagination.js +50 -0
- package/dist/client/ui/Pagination.js.map +1 -0
- package/dist/client/ui/Radio.d.ts +34 -0
- package/dist/client/ui/Radio.d.ts.map +1 -0
- package/dist/client/ui/Radio.js +44 -0
- package/dist/client/ui/Radio.js.map +1 -0
- package/dist/client/ui/Range.d.ts +17 -0
- package/dist/client/ui/Range.d.ts.map +1 -0
- package/dist/client/ui/Range.js +28 -0
- package/dist/client/ui/Range.js.map +1 -0
- package/dist/client/ui/Rating.d.ts +18 -0
- package/dist/client/ui/Rating.d.ts.map +1 -0
- package/dist/client/ui/Rating.js +64 -0
- package/dist/client/ui/Rating.js.map +1 -0
- package/dist/client/ui/Select.d.ts +20 -0
- package/dist/client/ui/Select.d.ts.map +1 -0
- package/dist/client/ui/Select.js +30 -0
- package/dist/client/ui/Select.js.map +1 -0
- package/dist/client/ui/Textarea.d.ts +14 -0
- package/dist/client/ui/Textarea.d.ts.map +1 -0
- package/dist/client/ui/Textarea.js +20 -0
- package/dist/client/ui/Textarea.js.map +1 -0
- package/dist/client/ui/Toggle.d.ts +13 -0
- package/dist/client/ui/Toggle.d.ts.map +1 -0
- package/dist/client/ui/Toggle.js +29 -0
- package/dist/client/ui/Toggle.js.map +1 -0
- package/dist/client/ui/index.d.ts +31 -0
- package/dist/client/ui/index.d.ts.map +1 -0
- package/dist/client/ui/index.js +35 -0
- package/dist/client/ui/index.js.map +1 -0
- package/dist/tailwind.preset.d.ts +10 -0
- package/dist/tailwind.preset.js +12 -0
- 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":"AAAA,OAAO,KAAK,MAAM,iBAAiB,CAAA;AAOnC,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAE;IAC3B,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,OAAsB,EAAE,EAAE;QAC9D,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE;YACrB,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI;YACnC,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,WAAW;YAC1C,KAAK,EAAE;gBACL,UAAU,EAAE,SAAS;gBACrB,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,mBAAmB;gBAC3B,YAAY,EAAE,KAAK;gBACnB,QAAQ,EAAE,MAAM;aACjB;YACD,IAAI,EAAE,GAAG;SACV,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,CAAC,OAAe,EAAE,OAAsB,EAAE,EAAE;QAC5D,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE;YACnB,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI;YACnC,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,WAAW;YAC1C,KAAK,EAAE;gBACL,UAAU,EAAE,SAAS;gBACrB,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,mBAAmB;gBAC3B,YAAY,EAAE,KAAK;gBACnB,QAAQ,EAAE,MAAM;aACjB;YACD,IAAI,EAAE,IAAI;SACX,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,OAAsB,EAAE,EAAE;QAC9D,KAAK,CAAC,OAAO,EAAE;YACb,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI;YACnC,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,WAAW;YAC1C,KAAK,EAAE;gBACL,UAAU,EAAE,SAAS;gBACrB,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,mBAAmB;gBAC3B,YAAY,EAAE,KAAK;gBACnB,QAAQ,EAAE,MAAM;aACjB;YACD,IAAI,EAAE,IAAI;SACX,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAE,OAAsB,EAAE,EAAE;QAC3D,KAAK,CAAC,OAAO,EAAE;YACb,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI;YACnC,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,WAAW;YAC1C,KAAK,EAAE;gBACL,UAAU,EAAE,SAAS;gBACrB,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,mBAAmB;gBAC3B,YAAY,EAAE,KAAK;gBACnB,QAAQ,EAAE,MAAM;aACjB;YACD,IAAI,EAAE,IAAI;SACX,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,mBAAmB,GAAG,CAAC,MAAe,EAAE,EAAE;QAC9C,MAAM,OAAO,GAAG,MAAM;YACpB,CAAC,CAAC,sBAAsB,MAAM,EAAE;YAChC,CAAC,CAAC,2CAA2C,CAAA;QAE/C,SAAS,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACxC,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,CAAC,OAAe,EAAE,OAAiD,MAAM,EAAE,OAAsB,EAAE,EAAE;QACrH,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,SAAS;gBACZ,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAC7B,MAAK;YACP,KAAK,OAAO;gBACV,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAC3B,MAAK;YACP,KAAK,SAAS;gBACZ,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAC7B,MAAK;YACP,KAAK,MAAM;gBACT,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAC1B,MAAK;QACT,CAAC;IACH,CAAC,CAAA;IAED,OAAO;QACL,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,WAAW;QACpB,IAAI,EAAE,QAAQ;QACd,eAAe,EAAE,mBAAmB;QACpC,SAAS;KACV,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,MAAM,CAAC,OAAO,UAAU,kBAAkB;IACxC,MAAM,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAAA;IAC3C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACtC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAgB,aAAa,CAAC,IAAI,CAAC,CAAA;IACvE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAE1C,MAAM,YAAY,GAAG,KAAK,EAAE,CAAkB,EAAE,EAAE;QAChD,CAAC,CAAC,cAAc,EAAE,CAAA;QAClB,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QAChC,UAAU,CAAC,EAAE,CAAC,CAAA;QAEd,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;YACvC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;YAChC,UAAU,CAAC,wEAAwE,CAAC,CAAA;QACtF,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;YAC9B,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,kCAAkC,CAAC,CAAA;QACjF,CAAC;IACH,CAAC,CAAA;IAED,OAAO,CACL,cAAK,SAAS,EAAC,gEAAgE,YAC7E,cAAK,SAAS,EAAC,4CAA4C,YACzD,eAAK,SAAS,EAAC,WAAW,aACxB,aAAI,SAAS,EAAC,oCAAoC,6CAE7C,EACL,YAAG,SAAS,EAAC,kCAAkC,wHAE3C,EAEH,MAAM,KAAK,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAClC,eAAK,SAAS,EAAC,0BAA0B,aACvC,cAAK,KAAK,EAAC,4BAA4B,EAAC,SAAS,EAAC,iCAAiC,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,YACjH,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,EAAC,GAAG,EAAC,CAAC,EAAC,+CAA+C,GAAG,GACnH,EACN,yBAAO,OAAO,GAAQ,IAClB,CACP,CAAC,CAAC,CAAC,CACF,gBAAM,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAC,MAAM,aAC3C,MAAM,KAAK,aAAa,CAAC,KAAK,IAAI,CACjC,eAAK,SAAS,EAAC,wBAAwB,aACrC,cAAK,KAAK,EAAC,4BAA4B,EAAC,SAAS,EAAC,iCAAiC,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,YACjH,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,EAAC,GAAG,EAAC,CAAC,EAAC,sEAAsE,GAAG,GAC1I,EACN,yBAAO,OAAO,GAAQ,IAClB,CACP,EAED,eAAK,SAAS,EAAC,cAAc,aAC3B,gBAAO,SAAS,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,YACtC,eAAM,SAAS,EAAC,YAAY,sBAAa,GACnC,EACR,gBACE,EAAE,EAAC,OAAO,EACV,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,OAAO,EACZ,QAAQ,QACR,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,SAAS,EAAC,6BAA6B,EACvC,WAAW,EAAC,mCAAoB,GAChC,IACE,EAEN,cAAK,SAAS,EAAC,wCAAwC,YACrD,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAChD,SAAS,EAAC,2BAA2B,8DAG9B,GACL,EAEN,cAAK,SAAS,EAAC,mBAAmB,YAChC,kBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,MAAM,KAAK,aAAa,CAAC,OAAO,EAC1C,SAAS,EAAC,wBAAwB,aAEjC,MAAM,KAAK,aAAa,CAAC,OAAO,IAAI,eAAM,SAAS,EAAC,yBAAyB,GAAQ,EACrF,MAAM,KAAK,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,4BAA4B,IACzE,GACL,IACD,CACR,EAEA,MAAM,KAAK,aAAa,CAAC,OAAO,IAAI,CACnC,cAAK,SAAS,EAAC,kCAAkC,YAC/C,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAChD,SAAS,EAAC,wBAAwB,uDAG3B,GACL,CACP,IACG,GACF,GACF,CACP,CAAA;AACH,CAAC"}
|
|
@@ -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"}
|