@digitaldefiance/express-suite-react-components 5.0.0 → 5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +4 -0
  3. package/package.json +3 -4
  4. package/src/auth/AdminRoute.tsx +54 -0
  5. package/src/auth/Private.tsx +17 -0
  6. package/src/auth/PrivateRoute.tsx +28 -0
  7. package/src/auth/UnAuth.tsx +16 -0
  8. package/src/auth/UnAuthRoute.tsx +30 -0
  9. package/src/auth/{index.d.ts → index.ts} +2 -3
  10. package/src/components/ApiAccess.tsx +175 -0
  11. package/src/components/BackupCodeLoginForm.tsx +489 -0
  12. package/src/components/BackupCodesForm.tsx +287 -0
  13. package/src/components/CategoryMenu.tsx +155 -0
  14. package/src/components/ChangePasswordForm.tsx +273 -0
  15. package/src/components/ConfirmationDialog.tsx +48 -0
  16. package/src/components/CurrencyCodeSelector.tsx +60 -0
  17. package/src/components/CurrencyInput.tsx +80 -0
  18. package/src/components/DashboardPage.tsx +24 -0
  19. package/src/components/DropdownMenu.tsx +105 -0
  20. package/src/components/ExpirationSecondsSelector.tsx +60 -0
  21. package/src/components/FakeEmailAdminPanel.tsx +374 -0
  22. package/src/components/Flag.tsx +52 -0
  23. package/src/components/ForgotPasswordForm.tsx +174 -0
  24. package/src/components/LoginForm.tsx +468 -0
  25. package/src/components/LogoutPage.tsx +21 -0
  26. package/src/components/RegisterForm.tsx +1169 -0
  27. package/src/components/ResetPasswordForm.tsx +247 -0
  28. package/src/components/SideMenu.tsx +46 -0
  29. package/src/components/SideMenuListItem.tsx +75 -0
  30. package/src/components/T.tsx +24 -0
  31. package/src/components/TDiv.tsx +26 -0
  32. package/src/components/TImgAlt.tsx +28 -0
  33. package/src/components/TopMenu.tsx +252 -0
  34. package/src/components/TotpSetupForm.tsx +188 -0
  35. package/src/components/TotpVerificationForm.tsx +148 -0
  36. package/src/components/TranslatedTitle.tsx +31 -0
  37. package/src/components/UserLanguageSelector.tsx +45 -0
  38. package/src/components/UserMenu.tsx +15 -0
  39. package/src/components/UserSettingsForm.tsx +904 -0
  40. package/src/components/VerifyEmailPage.tsx +222 -0
  41. package/src/components/__tests__/RegisterForm.totp.spec.tsx +377 -0
  42. package/src/components/__tests__/TotpSetupForm.spec.tsx +258 -0
  43. package/src/components/__tests__/TotpVerificationForm.spec.tsx +259 -0
  44. package/src/components/__tests__/UserSettingsForm.totp.spec.tsx +396 -0
  45. package/src/components/{index.d.ts → index.ts} +1 -1
  46. package/src/contexts/AuthProvider.spec.tsx +1284 -0
  47. package/src/contexts/AuthProvider.tsx +977 -0
  48. package/src/contexts/I18nProvider.tsx +164 -0
  49. package/src/contexts/MenuContext.tsx +426 -0
  50. package/src/contexts/SuiteConfigProvider.tsx +93 -0
  51. package/src/contexts/ThemeProvider.tsx +67 -0
  52. package/src/contexts/{index.d.ts → index.ts} +0 -1
  53. package/src/hooks/{index.d.ts → index.ts} +0 -1
  54. package/src/hooks/useAuthenticatedApi.tsx +67 -0
  55. package/src/hooks/useBackupCodes.ts +105 -0
  56. package/src/hooks/useEmailVerification.ts +54 -0
  57. package/src/hooks/useExpiringValue.ts +78 -0
  58. package/src/hooks/useLocalStorage.ts +18 -0
  59. package/src/hooks/useUserSettings.ts +271 -0
  60. package/src/{index.d.ts → index.ts} +1 -1
  61. package/src/interfaces/IAppConfig.ts +7 -0
  62. package/src/interfaces/ICategoryConfig.ts +41 -0
  63. package/src/interfaces/IMenuConfig.ts +28 -0
  64. package/src/interfaces/IMenuOption.ts +79 -0
  65. package/src/interfaces/{index.d.ts → index.ts} +0 -1
  66. package/src/services/__mocks__/authService.ts +14 -0
  67. package/src/services/__tests__/authService.totp.property.spec.ts +360 -0
  68. package/src/services/__tests__/authService.totp.spec.ts +439 -0
  69. package/src/services/api.ts +13 -0
  70. package/src/services/authService.ts +692 -0
  71. package/src/services/authenticatedApi.ts +17 -0
  72. package/src/services/index.ts +3 -0
  73. package/src/types/MenuType.ts +15 -0
  74. package/src/types/expirationSeconds.ts +18 -0
  75. package/src/types/index.ts +1 -0
  76. package/src/types/translation.ts +20 -0
  77. package/src/wrappers/BackupCodeLoginWrapper.tsx +34 -0
  78. package/src/wrappers/BackupCodesWrapper.tsx +28 -0
  79. package/src/wrappers/ChangePasswordFormWrapper.tsx +34 -0
  80. package/src/wrappers/ForgotPasswordFormWrapper.tsx +45 -0
  81. package/src/wrappers/LoginFormWrapper.tsx +108 -0
  82. package/src/wrappers/LogoutPageWrapper.tsx +30 -0
  83. package/src/wrappers/RegisterFormWrapper.tsx +109 -0
  84. package/src/wrappers/ResetPasswordFormWrapper.tsx +57 -0
  85. package/src/wrappers/UserSettingsFormWrapper.tsx +140 -0
  86. package/src/wrappers/VerifyEmailPageWrapper.tsx +27 -0
  87. package/src/wrappers/__tests__/LoginFormWrapper.totp.spec.tsx +339 -0
  88. package/src/wrappers/{index.d.ts → index.tsx} +10 -1
  89. package/src/auth/AdminRoute.d.ts +0 -8
  90. package/src/auth/AdminRoute.d.ts.map +0 -1
  91. package/src/auth/AdminRoute.js +0 -28
  92. package/src/auth/Private.d.ts +0 -6
  93. package/src/auth/Private.d.ts.map +0 -1
  94. package/src/auth/Private.js +0 -14
  95. package/src/auth/PrivateRoute.d.ts +0 -8
  96. package/src/auth/PrivateRoute.d.ts.map +0 -1
  97. package/src/auth/PrivateRoute.js +0 -23
  98. package/src/auth/UnAuth.d.ts +0 -6
  99. package/src/auth/UnAuth.d.ts.map +0 -1
  100. package/src/auth/UnAuth.js +0 -14
  101. package/src/auth/UnAuthRoute.d.ts +0 -8
  102. package/src/auth/UnAuthRoute.d.ts.map +0 -1
  103. package/src/auth/UnAuthRoute.js +0 -22
  104. package/src/auth/index.d.ts.map +0 -1
  105. package/src/auth/index.js +0 -12
  106. package/src/components/ApiAccess.d.ts +0 -16
  107. package/src/components/ApiAccess.d.ts.map +0 -1
  108. package/src/components/ApiAccess.js +0 -77
  109. package/src/components/BackupCodeLoginForm.d.ts +0 -43
  110. package/src/components/BackupCodeLoginForm.d.ts.map +0 -1
  111. package/src/components/BackupCodeLoginForm.js +0 -139
  112. package/src/components/BackupCodesForm.d.ts +0 -26
  113. package/src/components/BackupCodesForm.d.ts.map +0 -1
  114. package/src/components/BackupCodesForm.js +0 -120
  115. package/src/components/CategoryMenu.d.ts +0 -17
  116. package/src/components/CategoryMenu.d.ts.map +0 -1
  117. package/src/components/CategoryMenu.js +0 -65
  118. package/src/components/ChangePasswordForm.d.ts +0 -26
  119. package/src/components/ChangePasswordForm.d.ts.map +0 -1
  120. package/src/components/ChangePasswordForm.js +0 -78
  121. package/src/components/ConfirmationDialog.d.ts +0 -13
  122. package/src/components/ConfirmationDialog.d.ts.map +0 -1
  123. package/src/components/ConfirmationDialog.js +0 -10
  124. package/src/components/CurrencyCodeSelector.d.ts +0 -9
  125. package/src/components/CurrencyCodeSelector.d.ts.map +0 -1
  126. package/src/components/CurrencyCodeSelector.js +0 -31
  127. package/src/components/CurrencyInput.d.ts +0 -13
  128. package/src/components/CurrencyInput.d.ts.map +0 -1
  129. package/src/components/CurrencyInput.js +0 -22
  130. package/src/components/DashboardPage.d.ts +0 -8
  131. package/src/components/DashboardPage.d.ts.map +0 -1
  132. package/src/components/DashboardPage.js +0 -10
  133. package/src/components/DropdownMenu.d.ts +0 -13
  134. package/src/components/DropdownMenu.d.ts.map +0 -1
  135. package/src/components/DropdownMenu.js +0 -63
  136. package/src/components/ExpirationSecondsSelector.d.ts +0 -13
  137. package/src/components/ExpirationSecondsSelector.d.ts.map +0 -1
  138. package/src/components/ExpirationSecondsSelector.js +0 -32
  139. package/src/components/FakeEmailAdminPanel.d.ts +0 -23
  140. package/src/components/FakeEmailAdminPanel.d.ts.map +0 -1
  141. package/src/components/FakeEmailAdminPanel.js +0 -147
  142. package/src/components/Flag.d.ts +0 -20
  143. package/src/components/Flag.d.ts.map +0 -1
  144. package/src/components/Flag.js +0 -43
  145. package/src/components/ForgotPasswordForm.d.ts +0 -18
  146. package/src/components/ForgotPasswordForm.d.ts.map +0 -1
  147. package/src/components/ForgotPasswordForm.js +0 -61
  148. package/src/components/LoginForm.d.ts +0 -44
  149. package/src/components/LoginForm.d.ts.map +0 -1
  150. package/src/components/LoginForm.js +0 -123
  151. package/src/components/LogoutPage.d.ts +0 -8
  152. package/src/components/LogoutPage.d.ts.map +0 -1
  153. package/src/components/LogoutPage.js +0 -16
  154. package/src/components/RegisterForm.d.ts +0 -100
  155. package/src/components/RegisterForm.d.ts.map +0 -1
  156. package/src/components/RegisterForm.js +0 -306
  157. package/src/components/ResetPasswordForm.d.ts +0 -23
  158. package/src/components/ResetPasswordForm.d.ts.map +0 -1
  159. package/src/components/ResetPasswordForm.js +0 -78
  160. package/src/components/SideMenu.d.ts +0 -8
  161. package/src/components/SideMenu.d.ts.map +0 -1
  162. package/src/components/SideMenu.js +0 -25
  163. package/src/components/SideMenuListItem.d.ts +0 -13
  164. package/src/components/SideMenuListItem.d.ts.map +0 -1
  165. package/src/components/SideMenuListItem.js +0 -44
  166. package/src/components/T.d.ts +0 -7
  167. package/src/components/T.d.ts.map +0 -1
  168. package/src/components/T.js +0 -13
  169. package/src/components/TDiv.d.ts +0 -9
  170. package/src/components/TDiv.d.ts.map +0 -1
  171. package/src/components/TDiv.js +0 -14
  172. package/src/components/TImgAlt.d.ts +0 -10
  173. package/src/components/TImgAlt.d.ts.map +0 -1
  174. package/src/components/TImgAlt.js +0 -14
  175. package/src/components/TopMenu.d.ts +0 -50
  176. package/src/components/TopMenu.d.ts.map +0 -1
  177. package/src/components/TopMenu.js +0 -79
  178. package/src/components/TotpSetupForm.d.ts +0 -24
  179. package/src/components/TotpSetupForm.d.ts.map +0 -1
  180. package/src/components/TotpSetupForm.js +0 -82
  181. package/src/components/TotpVerificationForm.d.ts +0 -23
  182. package/src/components/TotpVerificationForm.d.ts.map +0 -1
  183. package/src/components/TotpVerificationForm.js +0 -66
  184. package/src/components/TranslatedTitle.d.ts +0 -8
  185. package/src/components/TranslatedTitle.d.ts.map +0 -1
  186. package/src/components/TranslatedTitle.js +0 -15
  187. package/src/components/UserLanguageSelector.d.ts +0 -4
  188. package/src/components/UserLanguageSelector.d.ts.map +0 -1
  189. package/src/components/UserLanguageSelector.js +0 -31
  190. package/src/components/UserMenu.d.ts +0 -4
  191. package/src/components/UserMenu.d.ts.map +0 -1
  192. package/src/components/UserMenu.js +0 -12
  193. package/src/components/UserSettingsForm.d.ts +0 -113
  194. package/src/components/UserSettingsForm.d.ts.map +0 -1
  195. package/src/components/UserSettingsForm.js +0 -269
  196. package/src/components/VerifyEmailPage.d.ts +0 -24
  197. package/src/components/VerifyEmailPage.d.ts.map +0 -1
  198. package/src/components/VerifyEmailPage.js +0 -81
  199. package/src/components/index.d.ts.map +0 -1
  200. package/src/components/index.js +0 -35
  201. package/src/contexts/AuthProvider.d.ts +0 -186
  202. package/src/contexts/AuthProvider.d.ts.map +0 -1
  203. package/src/contexts/AuthProvider.js +0 -515
  204. package/src/contexts/I18nProvider.d.ts +0 -27
  205. package/src/contexts/I18nProvider.d.ts.map +0 -1
  206. package/src/contexts/I18nProvider.js +0 -60
  207. package/src/contexts/MenuContext.d.ts +0 -20
  208. package/src/contexts/MenuContext.d.ts.map +0 -1
  209. package/src/contexts/MenuContext.js +0 -275
  210. package/src/contexts/SuiteConfigProvider.d.ts +0 -44
  211. package/src/contexts/SuiteConfigProvider.d.ts.map +0 -1
  212. package/src/contexts/SuiteConfigProvider.js +0 -43
  213. package/src/contexts/ThemeProvider.d.ts +0 -15
  214. package/src/contexts/ThemeProvider.d.ts.map +0 -1
  215. package/src/contexts/ThemeProvider.js +0 -36
  216. package/src/contexts/index.d.ts.map +0 -1
  217. package/src/contexts/index.js +0 -8
  218. package/src/hooks/index.d.ts.map +0 -1
  219. package/src/hooks/index.js +0 -9
  220. package/src/hooks/useAuthenticatedApi.d.ts +0 -34
  221. package/src/hooks/useAuthenticatedApi.d.ts.map +0 -1
  222. package/src/hooks/useAuthenticatedApi.js +0 -46
  223. package/src/hooks/useBackupCodes.d.ts +0 -15
  224. package/src/hooks/useBackupCodes.d.ts.map +0 -1
  225. package/src/hooks/useBackupCodes.js +0 -74
  226. package/src/hooks/useEmailVerification.d.ts +0 -10
  227. package/src/hooks/useEmailVerification.d.ts.map +0 -1
  228. package/src/hooks/useEmailVerification.js +0 -40
  229. package/src/hooks/useExpiringValue.d.ts +0 -14
  230. package/src/hooks/useExpiringValue.d.ts.map +0 -1
  231. package/src/hooks/useExpiringValue.js +0 -53
  232. package/src/hooks/useLocalStorage.d.ts +0 -2
  233. package/src/hooks/useLocalStorage.d.ts.map +0 -1
  234. package/src/hooks/useLocalStorage.js +0 -15
  235. package/src/hooks/useUserSettings.d.ts +0 -48
  236. package/src/hooks/useUserSettings.d.ts.map +0 -1
  237. package/src/hooks/useUserSettings.js +0 -171
  238. package/src/index.d.ts.map +0 -1
  239. package/src/index.js +0 -12
  240. package/src/interfaces/IAppConfig.d.ts +0 -8
  241. package/src/interfaces/IAppConfig.d.ts.map +0 -1
  242. package/src/interfaces/IAppConfig.js +0 -2
  243. package/src/interfaces/ICategoryConfig.d.ts +0 -41
  244. package/src/interfaces/ICategoryConfig.d.ts.map +0 -1
  245. package/src/interfaces/ICategoryConfig.js +0 -2
  246. package/src/interfaces/IMenuConfig.d.ts +0 -28
  247. package/src/interfaces/IMenuConfig.d.ts.map +0 -1
  248. package/src/interfaces/IMenuConfig.js +0 -2
  249. package/src/interfaces/IMenuOption.d.ts +0 -82
  250. package/src/interfaces/IMenuOption.d.ts.map +0 -1
  251. package/src/interfaces/IMenuOption.js +0 -2
  252. package/src/interfaces/index.d.ts.map +0 -1
  253. package/src/interfaces/index.js +0 -7
  254. package/src/services/__mocks__/authService.d.ts +0 -21
  255. package/src/services/__mocks__/authService.d.ts.map +0 -1
  256. package/src/services/__mocks__/authService.js +0 -15
  257. package/src/services/api.d.ts +0 -3
  258. package/src/services/api.d.ts.map +0 -1
  259. package/src/services/api.js +0 -14
  260. package/src/services/authService.d.ts +0 -126
  261. package/src/services/authService.d.ts.map +0 -1
  262. package/src/services/authService.js +0 -471
  263. package/src/services/authenticatedApi.d.ts +0 -3
  264. package/src/services/authenticatedApi.d.ts.map +0 -1
  265. package/src/services/authenticatedApi.js +0 -18
  266. package/src/services/index.d.ts +0 -4
  267. package/src/services/index.d.ts.map +0 -1
  268. package/src/services/index.js +0 -6
  269. package/src/types/MenuType.d.ts +0 -11
  270. package/src/types/MenuType.d.ts.map +0 -1
  271. package/src/types/MenuType.js +0 -12
  272. package/src/types/expirationSeconds.d.ts +0 -3
  273. package/src/types/expirationSeconds.d.ts.map +0 -1
  274. package/src/types/expirationSeconds.js +0 -17
  275. package/src/types/index.d.ts +0 -2
  276. package/src/types/index.d.ts.map +0 -1
  277. package/src/types/index.js +0 -4
  278. package/src/types/translation.d.ts +0 -10
  279. package/src/types/translation.d.ts.map +0 -1
  280. package/src/types/translation.js +0 -9
  281. package/src/wrappers/BackupCodeLoginWrapper.d.ts +0 -8
  282. package/src/wrappers/BackupCodeLoginWrapper.d.ts.map +0 -1
  283. package/src/wrappers/BackupCodeLoginWrapper.js +0 -20
  284. package/src/wrappers/BackupCodesWrapper.d.ts +0 -7
  285. package/src/wrappers/BackupCodesWrapper.d.ts.map +0 -1
  286. package/src/wrappers/BackupCodesWrapper.js +0 -17
  287. package/src/wrappers/ChangePasswordFormWrapper.d.ts +0 -8
  288. package/src/wrappers/ChangePasswordFormWrapper.d.ts.map +0 -1
  289. package/src/wrappers/ChangePasswordFormWrapper.js +0 -21
  290. package/src/wrappers/ForgotPasswordFormWrapper.d.ts +0 -8
  291. package/src/wrappers/ForgotPasswordFormWrapper.d.ts.map +0 -1
  292. package/src/wrappers/ForgotPasswordFormWrapper.js +0 -29
  293. package/src/wrappers/LoginFormWrapper.d.ts +0 -21
  294. package/src/wrappers/LoginFormWrapper.d.ts.map +0 -1
  295. package/src/wrappers/LoginFormWrapper.js +0 -72
  296. package/src/wrappers/LogoutPageWrapper.d.ts +0 -9
  297. package/src/wrappers/LogoutPageWrapper.d.ts.map +0 -1
  298. package/src/wrappers/LogoutPageWrapper.js +0 -21
  299. package/src/wrappers/RegisterFormWrapper.d.ts +0 -20
  300. package/src/wrappers/RegisterFormWrapper.d.ts.map +0 -1
  301. package/src/wrappers/RegisterFormWrapper.js +0 -51
  302. package/src/wrappers/ResetPasswordFormWrapper.d.ts +0 -9
  303. package/src/wrappers/ResetPasswordFormWrapper.d.ts.map +0 -1
  304. package/src/wrappers/ResetPasswordFormWrapper.js +0 -34
  305. package/src/wrappers/UserSettingsFormWrapper.d.ts +0 -29
  306. package/src/wrappers/UserSettingsFormWrapper.d.ts.map +0 -1
  307. package/src/wrappers/UserSettingsFormWrapper.js +0 -95
  308. package/src/wrappers/VerifyEmailPageWrapper.d.ts +0 -8
  309. package/src/wrappers/VerifyEmailPageWrapper.d.ts.map +0 -1
  310. package/src/wrappers/VerifyEmailPageWrapper.js +0 -21
  311. package/src/wrappers/index.d.ts.map +0 -1
  312. package/src/wrappers/index.js +0 -24
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Digital Defiance, Jessica Mulein
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -364,6 +364,10 @@ MIT © Digital Defiance
364
364
 
365
365
  ## ChangeLog
366
366
 
367
+ ### Version 5.0.1
368
+
369
+ - Added `data-testid="qr-code-svg"` to the `TotpSetupForm` QR code so the TOTP setup QR can be targeted in end-to-end tests (the form already exposed test ids for its other controls).
370
+
367
371
  ### Version 5.0.0
368
372
 
369
373
  - **BREAKING**: Replaced the `react-router-dom` peer dependency with `react-router` (`>=7`). Install `react-router` in your app instead of `react-router-dom`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digitaldefiance/express-suite-react-components",
3
- "version": "5.0.0",
3
+ "version": "5.0.2",
4
4
  "homepage": "https://github.com/Digital-Defiance/react-components",
5
5
  "description": "React MUI components for Digital Defiance Express Suite",
6
6
  "repository": {
@@ -78,6 +78,5 @@
78
78
  ],
79
79
  "author": "Digital Defiance",
80
80
  "license": "MIT",
81
- "packageManager": "yarn@4.10.3",
82
- "type": "commonjs"
83
- }
81
+ "packageManager": "yarn@4.10.3"
82
+ }
@@ -0,0 +1,54 @@
1
+ import { FC, ReactNode, useContext } from 'react';
2
+ import { Navigate, useLocation } from 'react-router';
3
+ import { AuthContext } from '../contexts/AuthProvider';
4
+ import { useI18n } from '../contexts';
5
+ import {
6
+ SuiteCoreComponentId,
7
+ SuiteCoreStringKey,
8
+ SuiteCoreStringKeyValue,
9
+ } from '@digitaldefiance/suite-core-lib';
10
+ import { useAuth } from '../contexts/AuthProvider';
11
+
12
+ interface AdminRouteProps {
13
+ children: ReactNode;
14
+ redirectTo?: string;
15
+ }
16
+
17
+ export const AdminRoute: FC<AdminRouteProps> = ({ children, redirectTo }) => {
18
+ const { admin } = useAuth();
19
+ const { tComponent } = useI18n();
20
+ const { isAuthenticated, isCheckingAuth } = useContext(AuthContext);
21
+ const location = useLocation();
22
+
23
+ if (isCheckingAuth) {
24
+ return (
25
+ <div>
26
+ {tComponent<SuiteCoreStringKeyValue>(
27
+ SuiteCoreComponentId,
28
+ SuiteCoreStringKey.Common_CheckingAuthentication
29
+ )}
30
+ ...
31
+ </div>
32
+ );
33
+ }
34
+
35
+ if (!isAuthenticated) {
36
+ return (
37
+ <Navigate
38
+ to={redirectTo ?? '/login'}
39
+ state={{ from: location }}
40
+ replace
41
+ />
42
+ );
43
+ }
44
+
45
+ if (!admin) {
46
+ return (
47
+ <Navigate to={redirectTo ?? '/'} state={{ from: location }} replace />
48
+ );
49
+ }
50
+
51
+ return <>{children}</>;
52
+ };
53
+
54
+ export default AdminRoute;
@@ -0,0 +1,17 @@
1
+ import { FC, ReactNode, useContext } from 'react';
2
+ import { AuthContext } from '../contexts/AuthProvider';
3
+ export interface PrivateProps {
4
+ children: ReactNode;
5
+ }
6
+
7
+ export const Private: FC<PrivateProps> = ({
8
+ children,
9
+ }) => {
10
+ const { isAuthenticated, isCheckingAuth } = useContext(AuthContext);
11
+
12
+ if (isCheckingAuth || !isAuthenticated) {
13
+ return <></>;
14
+ }
15
+
16
+ return <>{children}</>;
17
+ };
@@ -0,0 +1,28 @@
1
+ import { FC, ReactNode, useContext } from 'react';
2
+ import { Navigate, useLocation } from 'react-router';
3
+ import { AuthContext } from '../contexts/AuthProvider';
4
+ import { useI18n } from '../contexts';
5
+ import { SuiteCoreComponentId, SuiteCoreStringKey, SuiteCoreStringKeyValue } from '@digitaldefiance/suite-core-lib';
6
+
7
+ interface PrivateRouteProps {
8
+ children: ReactNode;
9
+ redirectTo?: string;
10
+ }
11
+
12
+ export const PrivateRoute: FC<PrivateRouteProps> = ({ children, redirectTo }) => {
13
+ const { tComponent } = useI18n();
14
+ const { isAuthenticated, isCheckingAuth } = useContext(AuthContext);
15
+ const location = useLocation();
16
+
17
+ if (isCheckingAuth) {
18
+ return <div>{tComponent<SuiteCoreStringKeyValue>(SuiteCoreComponentId, SuiteCoreStringKey.Common_CheckingAuthentication)}...</div>;
19
+ }
20
+
21
+ if (!isAuthenticated) {
22
+ return <Navigate to={redirectTo ?? "/login"} state={{ from: location }} replace />;
23
+ }
24
+
25
+ return <>{children}</>;
26
+ };
27
+
28
+ export default PrivateRoute;
@@ -0,0 +1,16 @@
1
+ import { FC, ReactNode, useContext } from 'react';
2
+ import { AuthContext } from '../contexts/AuthProvider';
3
+
4
+ export interface UnAuthProps {
5
+ children: ReactNode;
6
+ }
7
+
8
+ export const UnAuth: FC<UnAuthProps> = ({ children }) => {
9
+ const { isAuthenticated, isCheckingAuth } = useContext(AuthContext);
10
+
11
+ if (isCheckingAuth || isAuthenticated) {
12
+ return null;
13
+ }
14
+
15
+ return <>{children}</>;
16
+ };
@@ -0,0 +1,30 @@
1
+ import { FC, ReactNode, useContext } from 'react';
2
+ import { Navigate, useLocation } from 'react-router';
3
+ import { AuthContext, useI18n } from '../contexts';
4
+ import { SuiteCoreComponentId, SuiteCoreStringKey, SuiteCoreStringKeyValue } from '@digitaldefiance/suite-core-lib';
5
+
6
+ export interface UnAuthRouteProps {
7
+ children: ReactNode;
8
+ redirectTo?: string;
9
+ }
10
+
11
+ export const UnAuthRoute: FC<UnAuthRouteProps> = ({
12
+ children,
13
+ redirectTo = '/dashboard',
14
+ }) => {
15
+ const { isAuthenticated, isCheckingAuth } = useContext(AuthContext);
16
+ const { tComponent } = useI18n();
17
+ const location = useLocation();
18
+
19
+ if (isCheckingAuth) {
20
+ return <div>{tComponent<SuiteCoreStringKeyValue>(SuiteCoreComponentId, SuiteCoreStringKey.Common_CheckingAuthentication)}...</div>;
21
+ }
22
+
23
+ if (isAuthenticated) {
24
+ return <Navigate to={redirectTo ?? "/dashboard"} state={{ from: location }} replace />;
25
+ }
26
+
27
+ return <>{children}</>;
28
+ };
29
+
30
+ export default UnAuthRoute;
@@ -1,6 +1,5 @@
1
- export { default as AdminRoute } from './AdminRoute';
1
+ export { default as AdminRoute } from './AdminRoute'
2
2
  export { default as PrivateRoute } from './PrivateRoute';
3
3
  export { default as UnAuthRoute } from './UnAuthRoute';
4
4
  export * from './Private';
5
- export * from './UnAuth';
6
- //# sourceMappingURL=index.d.ts.map
5
+ export * from './UnAuth'
@@ -0,0 +1,175 @@
1
+ import {
2
+ SuiteCoreComponentId,
3
+ SuiteCoreStringKey,
4
+ SuiteCoreStringKeyValue,
5
+ } from '@digitaldefiance/suite-core-lib';
6
+ import ContentCopyIcon from '@mui/icons-material/ContentCopy';
7
+ import {
8
+ Box,
9
+ Button,
10
+ Dialog,
11
+ DialogActions,
12
+ DialogContent,
13
+ DialogTitle,
14
+ styled,
15
+ TextField,
16
+ Typography,
17
+ } from '@mui/material';
18
+ import { FC, useState } from 'react';
19
+ import { useAuth, useI18n } from '../contexts';
20
+
21
+ const ApiAccessContainer = styled(Box)(({ theme }) => ({
22
+ display: 'flex',
23
+ flexDirection: 'column',
24
+ alignItems: 'center',
25
+ justifyContent: 'center',
26
+ minHeight: '100vh',
27
+ backgroundColor: theme.palette.background.default,
28
+ padding: theme.spacing(3),
29
+ }));
30
+
31
+ const ApiAccessContent = styled(Box)(({ theme }) => ({
32
+ maxWidth: '600px',
33
+ width: '100%',
34
+ backgroundColor: theme.palette.background.paper,
35
+ borderRadius: theme.shape.borderRadius,
36
+ padding: theme.spacing(4),
37
+ boxShadow: theme.shadows[3],
38
+ }));
39
+
40
+ const ApiAccessTitle = styled(Typography)(({ theme }) => ({
41
+ marginBottom: theme.spacing(3),
42
+ color: theme.palette.primary.main,
43
+ }));
44
+
45
+ export interface ApiAccessProps {
46
+ token?: string | null;
47
+ labels?: {
48
+ title?: string;
49
+ tokenNotAvailable?: string;
50
+ copyButton?: string;
51
+ notificationTitle?: string;
52
+ copied?: string;
53
+ copyFailed?: string;
54
+ ok?: string;
55
+ };
56
+ }
57
+
58
+ export const ApiAccess: FC<ApiAccessProps> = ({
59
+ token: tokenProp,
60
+ labels = {},
61
+ }) => {
62
+ const { token: authToken } = useAuth();
63
+ const token = tokenProp !== undefined ? tokenProp : authToken;
64
+ const { tComponent } = useI18n();
65
+ const [dialogOpen, setDialogOpen] = useState(false);
66
+ const [isError, setIsError] = useState(false);
67
+
68
+ const translatedLabels = {
69
+ title:
70
+ labels.title ||
71
+ tComponent<SuiteCoreStringKeyValue>(
72
+ SuiteCoreComponentId,
73
+ SuiteCoreStringKey.ApiAccess_Title
74
+ ),
75
+ tokenNotAvailable:
76
+ labels.tokenNotAvailable ||
77
+ tComponent<SuiteCoreStringKeyValue>(
78
+ SuiteCoreComponentId,
79
+ SuiteCoreStringKey.ApiAccess_TokenNotAvailable
80
+ ),
81
+ copyButton:
82
+ labels.copyButton ||
83
+ tComponent<SuiteCoreStringKeyValue>(
84
+ SuiteCoreComponentId,
85
+ SuiteCoreStringKey.Common_CopyToClipboard
86
+ ),
87
+ notificationTitle:
88
+ labels.notificationTitle ||
89
+ tComponent<SuiteCoreStringKeyValue>(
90
+ SuiteCoreComponentId,
91
+ SuiteCoreStringKey.Common_Notification
92
+ ),
93
+ copied:
94
+ labels.copied ||
95
+ tComponent<SuiteCoreStringKeyValue>(
96
+ SuiteCoreComponentId,
97
+ SuiteCoreStringKey.Common_CopiedToClipboard
98
+ ),
99
+ copyFailed:
100
+ labels.copyFailed ||
101
+ tComponent<SuiteCoreStringKeyValue>(
102
+ SuiteCoreComponentId,
103
+ SuiteCoreStringKey.Error_FailedToCopy
104
+ ),
105
+ ok:
106
+ labels.ok ||
107
+ tComponent<SuiteCoreStringKeyValue>(
108
+ SuiteCoreComponentId,
109
+ SuiteCoreStringKey.Common_OK
110
+ ),
111
+ };
112
+
113
+ const copyToClipboard = async () => {
114
+ if (token) {
115
+ try {
116
+ await navigator.clipboard.writeText(token);
117
+ setIsError(false);
118
+ setDialogOpen(true);
119
+ } catch {
120
+ setIsError(true);
121
+ }
122
+ }
123
+ };
124
+
125
+ const handleClose = () => {
126
+ setDialogOpen(false);
127
+ setIsError(false);
128
+ };
129
+
130
+ return (
131
+ <ApiAccessContainer>
132
+ <ApiAccessContent>
133
+ <ApiAccessTitle variant="h4" align="center">
134
+ {translatedLabels.title}
135
+ </ApiAccessTitle>
136
+ <TextField
137
+ fullWidth
138
+ multiline
139
+ rows={4}
140
+ value={token || translatedLabels.tokenNotAvailable}
141
+ slotProps={{
142
+ input: {
143
+ readOnly: true,
144
+ },
145
+ }}
146
+ variant="outlined"
147
+ margin="normal"
148
+ />
149
+ <Button
150
+ variant="contained"
151
+ color="primary"
152
+ startIcon={<ContentCopyIcon />}
153
+ onClick={copyToClipboard}
154
+ fullWidth
155
+ style={{ marginTop: '16px' }}
156
+ >
157
+ {translatedLabels.copyButton}
158
+ </Button>
159
+ </ApiAccessContent>
160
+ <Dialog open={dialogOpen} onClose={handleClose}>
161
+ <DialogTitle>{translatedLabels.notificationTitle}</DialogTitle>
162
+ <DialogContent>
163
+ {isError ? translatedLabels.copyFailed : translatedLabels.copied}
164
+ </DialogContent>
165
+ <DialogActions>
166
+ <Button onClick={handleClose} color="primary">
167
+ {translatedLabels.ok}
168
+ </Button>
169
+ </DialogActions>
170
+ </Dialog>
171
+ </ApiAccessContainer>
172
+ );
173
+ };
174
+
175
+ export default ApiAccess;