@qlover/create-app 0.7.14 → 0.8.0

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 (361) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/configs/_common/.gitignore.template +6 -0
  3. package/dist/configs/_common/.prettierignore +17 -5
  4. package/dist/configs/_common/.vscode/settings.json +6 -1
  5. package/dist/index.cjs +1 -1
  6. package/dist/index.js +1 -1
  7. package/dist/templates/next-app/.env.template +1 -1
  8. package/dist/templates/next-app/README.en.md +130 -0
  9. package/dist/templates/next-app/README.md +114 -20
  10. package/dist/templates/next-app/config/Identifier/api.ts +5 -5
  11. package/dist/templates/next-app/config/Identifier/common/admint.table.ts +69 -0
  12. package/dist/templates/next-app/config/Identifier/common/common.ts +76 -0
  13. package/dist/templates/next-app/config/Identifier/common/index.ts +3 -0
  14. package/dist/templates/next-app/config/Identifier/{validator.ts → common/validators.ts} +5 -5
  15. package/dist/templates/next-app/config/Identifier/index.ts +2 -12
  16. package/dist/templates/next-app/config/Identifier/pages/index.ts +6 -0
  17. package/dist/templates/next-app/config/Identifier/pages/page.admin.home.ts +27 -0
  18. package/dist/templates/next-app/config/Identifier/pages/page.admin.locales.ts +266 -0
  19. package/dist/templates/next-app/config/Identifier/pages/page.admin.user.ts +293 -0
  20. package/dist/templates/{react-app/config/Identifier → next-app/config/Identifier/pages}/page.home.ts +15 -22
  21. package/dist/templates/next-app/config/Identifier/{page.login.ts → pages/page.login.ts} +28 -34
  22. package/dist/templates/next-app/config/Identifier/{page.register.ts → pages/page.register.ts} +30 -29
  23. package/dist/templates/next-app/config/adminNavs.ts +19 -0
  24. package/dist/templates/next-app/config/common.ts +22 -13
  25. package/dist/templates/next-app/config/i18n/HomeI18n.ts +5 -5
  26. package/dist/templates/next-app/config/i18n/admin18n.ts +61 -19
  27. package/dist/templates/next-app/config/i18n/i18nConfig.ts +2 -0
  28. package/dist/templates/next-app/config/i18n/i18nKeyScheam.ts +36 -0
  29. package/dist/templates/next-app/config/i18n/loginI18n.ts +22 -22
  30. package/dist/templates/next-app/config/i18n/register18n.ts +23 -24
  31. package/dist/templates/next-app/docs/en/api.md +387 -0
  32. package/dist/templates/next-app/docs/en/component.md +544 -0
  33. package/dist/templates/next-app/docs/en/database.md +496 -0
  34. package/dist/templates/next-app/docs/en/development-guide.md +727 -0
  35. package/dist/templates/next-app/docs/en/env.md +563 -0
  36. package/dist/templates/next-app/docs/en/i18n.md +287 -0
  37. package/dist/templates/next-app/docs/en/index.md +165 -0
  38. package/dist/templates/next-app/docs/en/page.md +457 -0
  39. package/dist/templates/next-app/docs/en/project-structure.md +176 -0
  40. package/dist/templates/next-app/docs/en/router.md +427 -0
  41. package/dist/templates/next-app/docs/en/theme.md +532 -0
  42. package/dist/templates/next-app/docs/en/validator.md +478 -0
  43. package/dist/templates/next-app/docs/zh/api.md +387 -0
  44. package/dist/templates/next-app/docs/zh/component.md +544 -0
  45. package/dist/templates/next-app/docs/zh/database.md +496 -0
  46. package/dist/templates/next-app/docs/zh/development-guide.md +727 -0
  47. package/dist/templates/next-app/docs/zh/env.md +563 -0
  48. package/dist/templates/next-app/docs/zh/i18n.md +287 -0
  49. package/dist/templates/next-app/docs/zh/index.md +165 -0
  50. package/dist/templates/next-app/docs/zh/page.md +457 -0
  51. package/dist/templates/next-app/docs/zh/project-structure.md +176 -0
  52. package/dist/templates/next-app/docs/zh/router.md +427 -0
  53. package/dist/templates/next-app/docs/zh/theme.md +532 -0
  54. package/dist/templates/next-app/docs/zh/validator.md +476 -0
  55. package/dist/templates/next-app/make/generateLocales.ts +19 -12
  56. package/dist/templates/next-app/migrations/schema/LocalesSchema.ts +15 -0
  57. package/dist/templates/next-app/migrations/sql/1694244000000.sql +11 -0
  58. package/dist/templates/next-app/package.json +7 -3
  59. package/dist/templates/next-app/public/locales/en.json +172 -207
  60. package/dist/templates/next-app/public/locales/zh.json +172 -207
  61. package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +153 -0
  62. package/dist/templates/next-app/src/app/[locale]/admin/users/page.tsx +48 -50
  63. package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +2 -2
  64. package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +34 -0
  65. package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +40 -0
  66. package/dist/templates/next-app/src/app/api/admin/locales/route.ts +42 -0
  67. package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +32 -0
  68. package/dist/templates/next-app/src/app/api/locales/json/route.ts +44 -0
  69. package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +1 -13
  70. package/dist/templates/next-app/src/base/cases/Datetime.ts +18 -0
  71. package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +12 -6
  72. package/dist/templates/next-app/src/base/cases/ResourceState.ts +17 -0
  73. package/dist/templates/next-app/src/base/cases/TranslateI18nInterface.ts +25 -0
  74. package/dist/templates/next-app/src/base/cases/ZodColumnBuilder.ts +200 -0
  75. package/dist/templates/next-app/src/base/port/ZodBuilderInterface.ts +8 -0
  76. package/dist/templates/next-app/src/base/services/AdminLocalesService.ts +20 -0
  77. package/dist/templates/next-app/src/base/services/AdminPageEvent.ts +26 -0
  78. package/dist/templates/next-app/src/base/services/AdminPageScheduler.ts +42 -0
  79. package/dist/templates/next-app/src/base/services/ResourceService.ts +122 -0
  80. package/dist/templates/next-app/src/base/services/adminApi/AdminLocalesApi.ts +104 -0
  81. package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +38 -5
  82. package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +1 -1
  83. package/dist/templates/next-app/src/i18n/request.ts +30 -1
  84. package/dist/templates/next-app/src/server/PageParams.ts +2 -10
  85. package/dist/templates/next-app/src/server/port/DBBridgeInterface.ts +5 -0
  86. package/dist/templates/next-app/src/server/port/DBTableInterface.ts +2 -0
  87. package/dist/templates/next-app/src/server/port/LocalesRepositoryInterface.ts +43 -0
  88. package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +197 -0
  89. package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +122 -0
  90. package/dist/templates/next-app/src/server/sqlBridges/SupabaseBridge.ts +60 -11
  91. package/dist/templates/next-app/src/server/validators/ExtendedExecutorError.ts +6 -0
  92. package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +131 -0
  93. package/dist/templates/next-app/src/server/validators/LoginValidator.ts +2 -5
  94. package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +32 -16
  95. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/_default.css +2 -1
  96. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/dark.css +28 -29
  97. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/pink.css +2 -1
  98. package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +17 -3
  99. package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +5 -4
  100. package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +5 -4
  101. package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +3 -2
  102. package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +1 -1
  103. package/dist/templates/next-app/src/uikit/components/EditableCell.tsx +118 -0
  104. package/dist/templates/next-app/src/uikit/components/LogoutButton.tsx +5 -6
  105. package/dist/templates/next-app/src/uikit/components/ThemeSwitcher.tsx +1 -1
  106. package/dist/templates/next-app/src/uikit/components/With.tsx +2 -2
  107. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportButton.tsx +62 -0
  108. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportEvent.ts +28 -0
  109. package/dist/templates/next-app/src/uikit/components/localesImportButton/import.module.css +6 -0
  110. package/dist/templates/next-app/src/uikit/hook/useI18nInterface.ts +8 -14
  111. package/dist/templates/next-app/src/uikit/hook/useWarnTranslations.ts +25 -0
  112. package/dist/templates/react-app/.prettierignore +17 -0
  113. package/dist/templates/react-app/README.en.md +71 -54
  114. package/dist/templates/react-app/README.md +35 -18
  115. package/dist/templates/react-app/__tests__/__mocks__/BootstrapTest.ts +14 -0
  116. package/dist/templates/react-app/__tests__/__mocks__/MockAppConfit.ts +1 -1
  117. package/dist/templates/react-app/__tests__/__mocks__/MockDialogHandler.ts +2 -2
  118. package/dist/templates/react-app/__tests__/__mocks__/MockLogger.ts +1 -1
  119. package/dist/templates/react-app/__tests__/__mocks__/components/TestApp.tsx +45 -0
  120. package/dist/templates/react-app/__tests__/__mocks__/components/TestBootstrapsProvider.tsx +34 -0
  121. package/dist/templates/react-app/__tests__/__mocks__/components/TestRouter.tsx +46 -0
  122. package/dist/templates/react-app/__tests__/__mocks__/components/index.ts +12 -0
  123. package/dist/templates/react-app/__tests__/__mocks__/createMockGlobals.ts +1 -2
  124. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOC.ts +51 -0
  125. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOCRegister.ts +69 -0
  126. package/dist/templates/react-app/__tests__/setup/index.ts +1 -51
  127. package/dist/templates/react-app/__tests__/setup/setupGlobal.ts +51 -0
  128. package/dist/templates/react-app/__tests__/src/App.structure.test.tsx +115 -0
  129. package/dist/templates/react-app/__tests__/src/base/cases/AppConfig.test.ts +2 -2
  130. package/dist/templates/react-app/__tests__/src/base/cases/AppError.test.ts +1 -1
  131. package/dist/templates/react-app/__tests__/src/base/cases/DialogHandler.test.ts +3 -5
  132. package/dist/templates/react-app/__tests__/src/base/cases/I18nKeyErrorPlugin.test.ts +13 -2
  133. package/dist/templates/react-app/__tests__/src/base/cases/InversifyContainer.test.ts +1 -1
  134. package/dist/templates/react-app/__tests__/src/base/cases/PublicAssetsPath.test.ts +1 -1
  135. package/dist/templates/react-app/__tests__/src/base/cases/RequestLogger.test.ts +5 -5
  136. package/dist/templates/react-app/__tests__/src/base/cases/RequestStatusCatcher.test.ts +1 -2
  137. package/dist/templates/react-app/__tests__/src/base/cases/RouterLoader.test.ts +25 -15
  138. package/dist/templates/react-app/__tests__/src/base/services/I18nService.test.ts +29 -15
  139. package/dist/templates/react-app/__tests__/src/core/IOC.test.ts +19 -9
  140. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapClient.test.ts +153 -0
  141. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapsApp.test.ts +9 -7
  142. package/dist/templates/react-app/__tests__/src/main.integration.test.tsx +4 -5
  143. package/dist/templates/react-app/__tests__/src/main.test.tsx +4 -4
  144. package/dist/templates/react-app/__tests__/src/uikit/components/BaseHeader.test.tsx +68 -59
  145. package/dist/templates/react-app/config/IOCIdentifier.ts +8 -8
  146. package/dist/templates/react-app/config/Identifier/{common.error.ts → common/common.error.ts} +5 -5
  147. package/dist/templates/react-app/config/Identifier/{common.ts → common/common.ts} +9 -9
  148. package/dist/templates/react-app/config/Identifier/common/index.ts +2 -0
  149. package/dist/templates/react-app/config/Identifier/index.ts +1 -9
  150. package/dist/templates/react-app/config/Identifier/pages/index.ts +8 -0
  151. package/dist/templates/react-app/config/Identifier/{page.about.ts → pages/page.about.ts} +34 -26
  152. package/dist/templates/react-app/config/Identifier/{page.executor.ts → pages/page.executor.ts} +47 -39
  153. package/dist/templates/{next-app/config/Identifier → react-app/config/Identifier/pages}/page.home.ts +24 -23
  154. package/dist/templates/react-app/config/Identifier/pages/page.identifiter.ts +102 -0
  155. package/dist/templates/react-app/config/Identifier/{page.jsonStorage.ts → pages/page.jsonStorage.ts} +18 -11
  156. package/dist/templates/react-app/config/Identifier/{page.login.ts → pages/page.login.ts} +37 -27
  157. package/dist/templates/react-app/config/Identifier/{page.register.ts → pages/page.register.ts} +37 -25
  158. package/dist/templates/react-app/config/Identifier/{page.request.ts → pages/page.request.ts} +34 -44
  159. package/dist/templates/react-app/config/app.router.ts +66 -69
  160. package/dist/templates/react-app/config/i18n/PageI18nInterface.ts +51 -0
  161. package/dist/templates/react-app/config/i18n/aboutI18n.ts +42 -0
  162. package/dist/templates/react-app/config/i18n/executorI18n.ts +51 -0
  163. package/dist/templates/react-app/config/i18n/homeI18n.ts +24 -0
  164. package/dist/templates/react-app/config/i18n/i18nConfig.ts +30 -0
  165. package/dist/templates/react-app/config/i18n/identifiter18n.ts +30 -0
  166. package/dist/templates/react-app/config/i18n/jsonStorage18n.ts +27 -0
  167. package/dist/templates/react-app/config/i18n/login18n.ts +42 -0
  168. package/dist/templates/react-app/config/i18n/notFoundI18n.ts +34 -0
  169. package/dist/templates/react-app/config/i18n/register18n.ts +40 -0
  170. package/dist/templates/react-app/config/i18n/request18n.ts +41 -0
  171. package/dist/templates/react-app/config/theme.ts +14 -4
  172. package/dist/templates/react-app/docs/en/bootstrap.md +1670 -341
  173. package/dist/templates/react-app/docs/en/development-guide.md +1021 -345
  174. package/dist/templates/react-app/docs/en/env.md +1132 -278
  175. package/dist/templates/react-app/docs/en/i18n.md +858 -147
  176. package/dist/templates/react-app/docs/en/index.md +733 -104
  177. package/dist/templates/react-app/docs/en/ioc.md +1228 -287
  178. package/dist/templates/react-app/docs/en/playwright/e2e-tests.md +321 -0
  179. package/dist/templates/react-app/docs/en/playwright/index.md +19 -0
  180. package/dist/templates/react-app/docs/en/playwright/installation-summary.md +332 -0
  181. package/dist/templates/react-app/docs/en/playwright/overview.md +222 -0
  182. package/dist/templates/react-app/docs/en/playwright/quickstart.md +325 -0
  183. package/dist/templates/react-app/docs/en/playwright/reorganization-notes.md +340 -0
  184. package/dist/templates/react-app/docs/en/playwright/setup-complete.md +290 -0
  185. package/dist/templates/react-app/docs/en/playwright/testing-guide.md +565 -0
  186. package/dist/templates/react-app/docs/en/store.md +1194 -184
  187. package/dist/templates/react-app/docs/en/why-no-globals.md +797 -0
  188. package/dist/templates/react-app/docs/zh/bootstrap.md +1670 -341
  189. package/dist/templates/react-app/docs/zh/development-guide.md +1021 -345
  190. package/dist/templates/react-app/docs/zh/env.md +1132 -275
  191. package/dist/templates/react-app/docs/zh/i18n.md +858 -147
  192. package/dist/templates/react-app/docs/zh/index.md +717 -104
  193. package/dist/templates/react-app/docs/zh/ioc.md +1229 -287
  194. package/dist/templates/react-app/docs/zh/playwright/e2e-tests.md +321 -0
  195. package/dist/templates/react-app/docs/zh/playwright/index.md +19 -0
  196. package/dist/templates/react-app/docs/zh/playwright/installation-summary.md +332 -0
  197. package/dist/templates/react-app/docs/zh/playwright/overview.md +222 -0
  198. package/dist/templates/react-app/docs/zh/playwright/quickstart.md +325 -0
  199. package/dist/templates/react-app/docs/zh/playwright/reorganization-notes.md +340 -0
  200. package/dist/templates/react-app/docs/zh/playwright/setup-complete.md +290 -0
  201. package/dist/templates/react-app/docs/zh/playwright/testing-guide.md +565 -0
  202. package/dist/templates/react-app/docs/zh/store.md +1192 -184
  203. package/dist/templates/react-app/docs/zh/why-no-globals.md +797 -0
  204. package/dist/templates/react-app/e2e/App.spec.ts +319 -0
  205. package/dist/templates/react-app/e2e/fixtures/base.fixture.ts +40 -0
  206. package/dist/templates/react-app/e2e/main.spec.ts +20 -0
  207. package/dist/templates/react-app/e2e/utils/test-helpers.ts +19 -0
  208. package/dist/templates/react-app/eslint.config.mjs +247 -0
  209. package/dist/templates/react-app/makes/eslint-utils.mjs +195 -0
  210. package/dist/templates/react-app/makes/generateTs2LocalesOptions.ts +26 -0
  211. package/dist/templates/react-app/package.json +31 -3
  212. package/dist/templates/react-app/playwright.config.ts +79 -0
  213. package/dist/templates/react-app/public/locales/en/common.json +190 -179
  214. package/dist/templates/react-app/public/locales/zh/common.json +190 -179
  215. package/dist/templates/react-app/src/App.tsx +15 -42
  216. package/dist/templates/react-app/src/base/apis/AiApi.ts +5 -5
  217. package/dist/templates/react-app/src/base/apis/feApi/FeApi.ts +1 -1
  218. package/dist/templates/react-app/src/base/apis/feApi/FeApiAdapter.ts +1 -1
  219. package/dist/templates/react-app/src/base/apis/feApi/FeApiBootstarp.ts +8 -8
  220. package/dist/templates/react-app/src/base/apis/feApi/FeApiType.ts +1 -1
  221. package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +6 -6
  222. package/dist/templates/react-app/src/base/apis/userApi/UserApiAdapter.ts +1 -1
  223. package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +12 -14
  224. package/dist/templates/react-app/src/base/apis/userApi/UserApiType.ts +1 -1
  225. package/dist/templates/react-app/src/base/cases/DialogHandler.ts +5 -2
  226. package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +3 -3
  227. package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +3 -3
  228. package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +2 -2
  229. package/dist/templates/react-app/src/base/cases/RequestLogger.ts +4 -4
  230. package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +1 -1
  231. package/dist/templates/react-app/src/base/cases/ResourceState.ts +23 -0
  232. package/dist/templates/react-app/src/base/cases/RouterLoader.ts +4 -4
  233. package/dist/templates/react-app/src/base/cases/TranslateI18nInterface.ts +26 -0
  234. package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +2 -3
  235. package/dist/templates/react-app/src/base/port/I18nServiceInterface.ts +1 -1
  236. package/dist/templates/react-app/src/base/port/IOCInterface.ts +36 -0
  237. package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +2 -1
  238. package/dist/templates/react-app/src/base/port/ProcesserExecutorInterface.ts +1 -1
  239. package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +2 -2
  240. package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +9 -5
  241. package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +1 -1
  242. package/dist/templates/react-app/src/base/services/I18nService.ts +29 -29
  243. package/dist/templates/react-app/src/base/services/IdentifierService.ts +143 -0
  244. package/dist/templates/react-app/src/base/services/ProcesserExecutor.ts +3 -3
  245. package/dist/templates/react-app/src/base/services/RouteService.ts +27 -8
  246. package/dist/templates/react-app/src/base/services/UserService.ts +8 -8
  247. package/dist/templates/react-app/src/base/types/Page.ts +14 -2
  248. package/dist/templates/react-app/src/base/types/global.d.ts +1 -1
  249. package/dist/templates/react-app/src/core/IOC.ts +5 -46
  250. package/dist/templates/react-app/src/core/bootstraps/{BootstrapApp.ts → BootstrapClient.ts} +44 -17
  251. package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +14 -7
  252. package/dist/templates/react-app/src/core/bootstraps/IocIdentifierTest.ts +1 -1
  253. package/dist/templates/react-app/src/core/bootstraps/PrintBootstrap.ts +1 -1
  254. package/dist/templates/react-app/src/core/clientIoc/ClientIOC.ts +40 -0
  255. package/dist/templates/react-app/src/core/{IocRegisterImpl.ts → clientIoc/ClientIOCRegister.ts} +35 -24
  256. package/dist/templates/react-app/src/core/globals.ts +9 -9
  257. package/dist/templates/react-app/src/main.tsx +4 -4
  258. package/dist/templates/react-app/src/pages/404.tsx +6 -3
  259. package/dist/templates/react-app/src/pages/500.tsx +5 -2
  260. package/dist/templates/react-app/src/pages/NoRouteFound.tsx +5 -0
  261. package/dist/templates/react-app/src/pages/auth/Layout.tsx +9 -6
  262. package/dist/templates/react-app/src/pages/auth/LoginPage.tsx +46 -56
  263. package/dist/templates/react-app/src/pages/auth/RegisterPage.tsx +46 -58
  264. package/dist/templates/react-app/src/pages/base/AboutPage.tsx +35 -40
  265. package/dist/templates/react-app/src/pages/base/ExecutorPage.tsx +51 -51
  266. package/dist/templates/react-app/src/pages/base/HomePage.tsx +14 -15
  267. package/dist/templates/react-app/src/pages/base/IdentifierPage.tsx +70 -11
  268. package/dist/templates/react-app/src/pages/base/JSONStoragePage.tsx +24 -25
  269. package/dist/templates/react-app/src/pages/base/Layout.tsx +2 -2
  270. package/dist/templates/react-app/src/pages/base/RedirectPathname.tsx +3 -2
  271. package/dist/templates/react-app/src/pages/base/RequestPage.tsx +41 -59
  272. package/dist/templates/react-app/src/styles/css/antd-themes/{_default.css → _common/_default.css} +85 -0
  273. package/dist/templates/react-app/src/styles/css/antd-themes/{dark.css → _common/dark.css} +99 -0
  274. package/dist/templates/react-app/src/styles/css/antd-themes/_common/index.css +3 -0
  275. package/dist/templates/react-app/src/styles/css/antd-themes/{pink.css → _common/pink.css} +86 -0
  276. package/dist/templates/react-app/src/styles/css/antd-themes/index.css +4 -3
  277. package/dist/templates/react-app/src/styles/css/antd-themes/menu/_default.css +108 -0
  278. package/dist/templates/react-app/src/styles/css/antd-themes/menu/dark.css +67 -0
  279. package/dist/templates/react-app/src/styles/css/antd-themes/menu/index.css +3 -0
  280. package/dist/templates/react-app/src/styles/css/antd-themes/menu/pink.css +67 -0
  281. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/_default.css +34 -0
  282. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/dark.css +31 -0
  283. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/index.css +3 -0
  284. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/pink.css +36 -0
  285. package/dist/templates/react-app/src/styles/css/antd-themes/table/_default.css +44 -0
  286. package/dist/templates/react-app/src/styles/css/antd-themes/table/dark.css +43 -0
  287. package/dist/templates/react-app/src/styles/css/antd-themes/table/index.css +3 -0
  288. package/dist/templates/react-app/src/styles/css/antd-themes/table/pink.css +43 -0
  289. package/dist/templates/react-app/src/styles/css/page.css +4 -3
  290. package/dist/templates/react-app/src/styles/css/themes/_default.css +1 -0
  291. package/dist/templates/react-app/src/styles/css/themes/dark.css +1 -0
  292. package/dist/templates/react-app/src/styles/css/themes/pink.css +1 -0
  293. package/dist/templates/react-app/src/styles/css/zIndex.css +1 -1
  294. package/dist/templates/react-app/src/uikit/bridges/ExecutorPageBridge.ts +3 -3
  295. package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +2 -2
  296. package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +1 -1
  297. package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +3 -3
  298. package/dist/templates/react-app/src/uikit/components/AppRouterProvider.tsx +35 -0
  299. package/dist/templates/react-app/src/uikit/components/BaseHeader.tsx +15 -11
  300. package/dist/templates/react-app/src/uikit/components/BaseRouteProvider.tsx +14 -11
  301. package/dist/templates/react-app/src/uikit/components/BaseRouteSeo.tsx +18 -0
  302. package/dist/templates/react-app/src/uikit/components/BootstrapsProvider.tsx +13 -0
  303. package/dist/templates/react-app/src/uikit/components/ClientSeo.tsx +62 -0
  304. package/dist/templates/react-app/src/uikit/components/ComboProvider.tsx +38 -0
  305. package/dist/templates/react-app/src/uikit/components/LanguageSwitcher.tsx +48 -27
  306. package/dist/templates/react-app/src/uikit/components/Loading.tsx +4 -2
  307. package/dist/templates/react-app/src/uikit/components/LocaleLink.tsx +4 -5
  308. package/dist/templates/react-app/src/uikit/components/LogoutButton.tsx +34 -11
  309. package/dist/templates/react-app/src/uikit/components/ProcessExecutorProvider.tsx +9 -5
  310. package/dist/templates/react-app/src/uikit/components/RouterRenderComponent.tsx +6 -3
  311. package/dist/templates/react-app/src/uikit/components/ThemeSwitcher.tsx +97 -40
  312. package/dist/templates/react-app/src/uikit/components/UserAuthProvider.tsx +5 -5
  313. package/dist/templates/react-app/src/uikit/components/With.tsx +17 -0
  314. package/dist/templates/react-app/src/uikit/contexts/BaseRouteContext.ts +17 -11
  315. package/dist/templates/react-app/src/uikit/contexts/IOCContext.ts +13 -0
  316. package/dist/templates/react-app/src/uikit/hooks/useAppTranslation.ts +26 -0
  317. package/dist/templates/react-app/src/uikit/hooks/useI18nGuard.ts +8 -11
  318. package/dist/templates/react-app/src/uikit/hooks/useI18nInterface.ts +25 -0
  319. package/dist/templates/react-app/src/uikit/hooks/useIOC.ts +35 -0
  320. package/dist/templates/react-app/src/uikit/hooks/useNavigateBridge.ts +3 -3
  321. package/dist/templates/react-app/src/uikit/hooks/useStrictEffect.ts +0 -1
  322. package/dist/templates/react-app/tsconfig.e2e.json +21 -0
  323. package/dist/templates/react-app/tsconfig.json +8 -1
  324. package/dist/templates/react-app/tsconfig.node.json +1 -1
  325. package/dist/templates/react-app/tsconfig.test.json +3 -1
  326. package/dist/templates/react-app/vite.config.ts +50 -34
  327. package/package.json +2 -1
  328. package/dist/configs/react-app/eslint.config.js +0 -94
  329. package/dist/templates/next-app/config/Identifier/common.error.ts +0 -41
  330. package/dist/templates/next-app/config/Identifier/common.ts +0 -69
  331. package/dist/templates/next-app/config/Identifier/page.about.ts +0 -181
  332. package/dist/templates/next-app/config/Identifier/page.admin.ts +0 -48
  333. package/dist/templates/next-app/config/Identifier/page.executor.ts +0 -272
  334. package/dist/templates/next-app/config/Identifier/page.identifiter.ts +0 -39
  335. package/dist/templates/next-app/config/Identifier/page.jsonStorage.ts +0 -72
  336. package/dist/templates/next-app/config/Identifier/page.request.ts +0 -182
  337. package/dist/templates/next-app/docs/env.md +0 -94
  338. package/dist/templates/next-app/src/base/cases/ChatAction.ts +0 -21
  339. package/dist/templates/next-app/src/base/cases/FocusBarAction.ts +0 -36
  340. package/dist/templates/next-app/src/base/cases/RequestState.ts +0 -20
  341. package/dist/templates/next-app/src/base/port/AdminPageInterface.ts +0 -85
  342. package/dist/templates/next-app/src/base/port/AsyncStateInterface.ts +0 -7
  343. package/dist/templates/next-app/src/base/services/AdminUserService.ts +0 -45
  344. package/dist/templates/next-app/src/uikit/components/ChatRoot.tsx +0 -17
  345. package/dist/templates/next-app/src/uikit/components/chat/ChatActionInterface.ts +0 -30
  346. package/dist/templates/next-app/src/uikit/components/chat/ChatFocusBar.tsx +0 -65
  347. package/dist/templates/next-app/src/uikit/components/chat/ChatMessages.tsx +0 -59
  348. package/dist/templates/next-app/src/uikit/components/chat/ChatWrap.tsx +0 -28
  349. package/dist/templates/next-app/src/uikit/components/chat/FocusBarActionInterface.ts +0 -19
  350. package/dist/templates/next-app/src/uikit/hook/useMountedClient.ts +0 -17
  351. package/dist/templates/next-app/src/uikit/hook/useStore.ts +0 -15
  352. package/dist/templates/react-app/__tests__/__mocks__/I18nService.ts +0 -13
  353. package/dist/templates/react-app/__tests__/src/App.test.tsx +0 -139
  354. package/dist/templates/react-app/config/Identifier/page.identifiter.ts +0 -39
  355. package/dist/templates/react-app/config/i18n.ts +0 -15
  356. package/dist/templates/react-app/docs/en/project-structure.md +0 -434
  357. package/dist/templates/react-app/docs/zh/project-structure.md +0 -434
  358. package/dist/templates/react-app/src/base/cases/RequestState.ts +0 -20
  359. package/dist/templates/react-app/src/base/port/AsyncStateInterface.ts +0 -7
  360. package/dist/templates/react-app/src/uikit/hooks/useDocumentTitle.ts +0 -15
  361. package/dist/templates/react-app/src/uikit/hooks/useStore.ts +0 -15
@@ -1,11 +1,11 @@
1
- import { useState } from 'react';
2
- import { Form, Input, Button } from 'antd';
3
1
  import { UserOutlined, LockOutlined, GoogleOutlined } from '@ant-design/icons';
4
- import { IOC } from '@/core/IOC';
5
- import { useBaseRoutePage } from '@/uikit/contexts/BaseRouteContext';
6
- import * as i18nKeys from '@config/Identifier/page.login';
7
- import LocaleLink from '@/uikit/components/LocaleLink';
2
+ import { login18n } from '@config/i18n/login18n';
8
3
  import { IOCIdentifier } from '@config/IOCIdentifier';
4
+ import { Form, Input, Button } from 'antd';
5
+ import { useState } from 'react';
6
+ import { LocaleLink } from '@/uikit/components/LocaleLink';
7
+ import { useI18nInterface } from '@/uikit/hooks/useI18nInterface';
8
+ import { useIOC } from '@/uikit/hooks/useIOC';
9
9
 
10
10
  interface LoginFormData {
11
11
  email: string;
@@ -13,9 +13,12 @@ interface LoginFormData {
13
13
  }
14
14
 
15
15
  export default function LoginPage() {
16
- const { t } = useBaseRoutePage();
17
- const userService = IOC(IOCIdentifier.UserServiceInterface);
18
- const AppConfig = IOC(IOCIdentifier.AppConfig);
16
+ const tt = useI18nInterface(login18n);
17
+ const userService = useIOC(IOCIdentifier.UserServiceInterface);
18
+ const AppConfig = useIOC(IOCIdentifier.AppConfig);
19
+ const routeService = useIOC(IOCIdentifier.RouteServiceInterface);
20
+ const logger = useIOC(IOCIdentifier.Logger);
21
+
19
22
  const [loading, setLoading] = useState(false);
20
23
 
21
24
  const handleLogin = async (values: LoginFormData) => {
@@ -25,16 +28,19 @@ export default function LoginPage() {
25
28
  username: values.email,
26
29
  password: values.password
27
30
  });
28
- IOC(IOCIdentifier.RouteServiceInterface).replaceToHome();
31
+ routeService.replaceToHome();
29
32
  } catch (error) {
30
- IOC(IOCIdentifier.Logger).error(error);
33
+ logger.error(error);
31
34
  } finally {
32
35
  setLoading(false);
33
36
  }
34
37
  };
35
38
 
36
39
  return (
37
- <div className="flex min-h-screen text-xs1 bg-primary">
40
+ <div
41
+ data-testid="LoginPage"
42
+ className="flex min-h-screen text-xs1 bg-primary"
43
+ >
38
44
  {/* Left side - Brand section */}
39
45
  <div className="hidden lg:flex lg:w-1/2 bg-secondary p-12 flex-col">
40
46
  <div className="flex items-center gap-3 mb-12">
@@ -43,34 +49,20 @@ export default function LoginPage() {
43
49
  {AppConfig.appName}
44
50
  </span>
45
51
  </div>
46
- <h1 className="text-4xl font-bold text-text mb-4">
47
- {t(i18nKeys.LOGIN_WELCOME)}
48
- </h1>
49
- <p className="text-text-secondary text-lg mb-8">
50
- {t(i18nKeys.LOGIN_SUBTITLE)}
51
- </p>
52
+ <h1 className="text-4xl font-bold text-text mb-4">{tt.welcome}</h1>
53
+ <p className="text-text-secondary text-lg mb-8">{tt.subtitle}</p>
52
54
  <div className="space-y-4">
53
- <FeatureItem icon="🎯" text={t(i18nKeys.LOGIN_FEATURE_AI_PATHS)} />
54
- <FeatureItem
55
- icon="🎯"
56
- text={t(i18nKeys.LOGIN_FEATURE_SMART_RECOMMENDATIONS)}
57
- />
58
- <FeatureItem
59
- icon="📊"
60
- text={t(i18nKeys.LOGIN_FEATURE_PROGRESS_TRACKING)}
61
- />
55
+ <FeatureItem icon="🎯" text={tt.featureAiPaths} />
56
+ <FeatureItem icon="🎯" text={tt.featureSmartRecommendations} />
57
+ <FeatureItem icon="📊" text={tt.featureProgressTracking} />
62
58
  </div>
63
59
  </div>
64
60
 
65
61
  {/* Right side - Login form */}
66
62
  <div className="w-full lg:w-1/2 p-8 sm:p-12 flex items-center justify-center">
67
63
  <div className="w-full max-w-[420px]">
68
- <h2 className="text-2xl font-semibold mb-2 text-text">
69
- {t(i18nKeys.LOGIN_TITLE)}
70
- </h2>
71
- <p className="text-text-secondary mb-8">
72
- {t(i18nKeys.LOGIN_SUBTITLE)}
73
- </p>
64
+ <h2 className="text-2xl font-semibold mb-2 text-text">{tt.title2}</h2>
65
+ <p className="text-text-secondary mb-8">{tt.subtitle}</p>
74
66
 
75
67
  <Form
76
68
  name="login"
@@ -84,28 +76,24 @@ export default function LoginPage() {
84
76
  >
85
77
  <Form.Item
86
78
  name="email"
87
- rules={[
88
- { required: true, message: t(i18nKeys.LOGIN_EMAIL_REQUIRED) }
89
- ]}
79
+ rules={[{ required: true, message: tt.emailRequired }]}
90
80
  >
91
81
  <Input
92
82
  prefix={<UserOutlined className="text-text-tertiary" />}
93
- placeholder={t(i18nKeys.LOGIN_EMAIL)}
94
- title={t(i18nKeys.LOGIN_EMAIL_TITLE)}
83
+ placeholder={tt.email}
84
+ title={tt.emailTitle}
95
85
  className="h-12 text-base bg-secondary border-border"
96
86
  />
97
87
  </Form.Item>
98
88
 
99
89
  <Form.Item
100
90
  name="password"
101
- rules={[
102
- { required: true, message: t(i18nKeys.LOGIN_PASSWORD_REQUIRED) }
103
- ]}
91
+ rules={[{ required: true, message: tt.passwordRequired }]}
104
92
  >
105
93
  <Input.Password
106
94
  prefix={<LockOutlined />}
107
- placeholder={t(i18nKeys.LOGIN_PASSWORD)}
108
- title={t(i18nKeys.LOGIN_PASSWORD_TITLE)}
95
+ placeholder={tt.password}
96
+ title={tt.passwordTitle}
109
97
  className="h-12 text-base"
110
98
  />
111
99
  </Form.Item>
@@ -114,46 +102,45 @@ export default function LoginPage() {
114
102
  <a
115
103
  href="#"
116
104
  className="text-brand hover:text-brand-hover"
117
- title={t(i18nKeys.LOGIN_FORGOT_PASSWORD_TITLE)}
105
+ title={tt.forgotPasswordTitle}
118
106
  >
119
- {t(i18nKeys.LOGIN_FORGOT_PASSWORD)}
107
+ {tt.forgotPassword}
120
108
  </a>
121
109
  </div>
122
110
 
123
111
  <Form.Item>
124
112
  <Button
113
+ data-testid="LoginButton"
125
114
  type="primary"
126
115
  htmlType="submit"
127
116
  loading={loading}
128
- title={t(i18nKeys.LOGIN_BUTTON_TITLE)}
117
+ title={tt.buttonTitle}
129
118
  className="w-full h-12 text-base"
130
119
  >
131
- {t(i18nKeys.LOGIN_BUTTON)}
120
+ {tt.button}
132
121
  </Button>
133
122
  </Form.Item>
134
123
 
135
124
  <div className="text-center text-text-tertiary my-4">
136
- {t(i18nKeys.LOGIN_CONTINUE_WITH)}
125
+ {tt.continueWith}
137
126
  </div>
138
127
 
139
128
  <Button
140
129
  icon={<GoogleOutlined />}
141
130
  className="w-full h-12 text-base"
142
- title={t(i18nKeys.LOGIN_WITH_GOOGLE_TITLE)}
131
+ title={tt.withGoogleTitle}
143
132
  >
144
- {t(i18nKeys.LOGIN_WITH_GOOGLE)}
133
+ {tt.withGoogle}
145
134
  </Button>
146
135
 
147
136
  <div className="text-center mt-6">
148
- <span className="text-text-tertiary">
149
- {t(i18nKeys.LOGIN_NO_ACCOUNT)}{' '}
150
- </span>
137
+ <span className="text-text-tertiary">{tt.noAccount} </span>
151
138
  <LocaleLink
152
139
  href="/register"
153
140
  className="text-brand hover:text-brand-hover"
154
- title={t(i18nKeys.LOGIN_CREATE_ACCOUNT_TITLE)}
141
+ title={tt.createAccountTitle}
155
142
  >
156
- {t(i18nKeys.LOGIN_CREATE_ACCOUNT)}
143
+ {tt.createAccount}
157
144
  </LocaleLink>
158
145
  </div>
159
146
  </Form>
@@ -166,7 +153,10 @@ export default function LoginPage() {
166
153
  // Helper component for feature items
167
154
  function FeatureItem({ icon, text }: { icon: string; text: string }) {
168
155
  return (
169
- <div className="flex items-center gap-3 text-text">
156
+ <div
157
+ data-testid="FeatureItem"
158
+ className="flex items-center gap-3 text-text"
159
+ >
170
160
  <div className="w-8 h-8 bg-elevated rounded-lg flex items-center justify-center">
171
161
  {icon}
172
162
  </div>
@@ -1,17 +1,19 @@
1
- import { useState } from 'react';
2
- import { Form, Input, Button, Checkbox } from 'antd';
3
1
  import { UserOutlined, LockOutlined, MailOutlined } from '@ant-design/icons';
4
- import { IOC } from '@/core/IOC';
5
- import { useBaseRoutePage } from '@/uikit/contexts/BaseRouteContext';
6
- import { RegisterFormData } from '@/base/services/UserService';
7
- import * as i18nKeys from '@config/Identifier/page.register';
2
+ import { register18n } from '@config/i18n/register18n';
8
3
  import { IOCIdentifier } from '@config/IOCIdentifier';
4
+ import { Form, Input, Button, Checkbox } from 'antd';
5
+ import { useState } from 'react';
6
+ import type { RegisterFormData } from '@/base/services/UserService';
7
+ import { useI18nInterface } from '@/uikit/hooks/useI18nInterface';
8
+ import { useIOC } from '@/uikit/hooks/useIOC';
9
9
 
10
10
  export default function RegisterPage() {
11
- const { t } = useBaseRoutePage();
12
- const AppConfig = IOC(IOCIdentifier.AppConfig);
13
- const userService = IOC(IOCIdentifier.UserServiceInterface);
14
- const routeService = IOC(IOCIdentifier.RouteServiceInterface);
11
+ const tt = useI18nInterface(register18n);
12
+ const AppConfig = useIOC(IOCIdentifier.AppConfig);
13
+ const userService = useIOC(IOCIdentifier.UserServiceInterface);
14
+ const routeService = useIOC(IOCIdentifier.RouteServiceInterface);
15
+ const logger = useIOC(IOCIdentifier.Logger);
16
+
15
17
  const [loading, setLoading] = useState(false);
16
18
  const [form] = Form.useForm();
17
19
 
@@ -21,7 +23,7 @@ export default function RegisterPage() {
21
23
  await userService.register(values);
22
24
  routeService.replaceToHome();
23
25
  } catch (error) {
24
- IOC(IOCIdentifier.Logger).error(error);
26
+ logger.error(error);
25
27
  } finally {
26
28
  setLoading(false);
27
29
  }
@@ -33,7 +35,10 @@ export default function RegisterPage() {
33
35
  };
34
36
 
35
37
  return (
36
- <div className="flex min-h-screen text-xs1 bg-primary">
38
+ <div
39
+ data-testid="RegisterPage"
40
+ className="flex min-h-screen text-xs1 bg-primary"
41
+ >
37
42
  {/* Left side - Brand section */}
38
43
  <div className="hidden lg:flex lg:w-1/2 bg-secondary p-12 flex-col">
39
44
  <div className="flex items-center gap-3 mb-12">
@@ -42,34 +47,20 @@ export default function RegisterPage() {
42
47
  {AppConfig.appName}
43
48
  </span>
44
49
  </div>
45
- <h1 className="text-4xl font-bold text-text mb-4">
46
- {t(i18nKeys.REGISTER_TITLE)}
47
- </h1>
48
- <p className="text-text-secondary text-lg mb-8">
49
- {t(i18nKeys.REGISTER_SUBTITLE)}
50
- </p>
50
+ <h1 className="text-4xl font-bold text-text mb-4">{tt.title2}</h1>
51
+ <p className="text-text-secondary text-lg mb-8">{tt.subtitle}</p>
51
52
  <div className="space-y-4">
52
- <FeatureItem
53
- icon="🎯"
54
- text={t(i18nKeys.REGISTER_FEATURE_PERSONALIZED)}
55
- />
56
- <FeatureItem icon="👨‍🏫" text={t(i18nKeys.REGISTER_FEATURE_SUPPORT)} />
57
- <FeatureItem
58
- icon="👥"
59
- text={t(i18nKeys.REGISTER_FEATURE_COMMUNITY)}
60
- />
53
+ <FeatureItem icon="🎯" text={tt.featurePersonalized} />
54
+ <FeatureItem icon="👨‍🏫" text={tt.featureSupport} />
55
+ <FeatureItem icon="👥" text={tt.featureCommunity} />
61
56
  </div>
62
57
  </div>
63
58
 
64
59
  {/* Right side - Registration form */}
65
60
  <div className="w-full lg:w-1/2 p-8 sm:p-12 flex items-center justify-center">
66
61
  <div className="w-full max-w-[420px]">
67
- <h2 className="text-2xl font-semibold mb-2 text-text">
68
- {t(i18nKeys.REGISTER_TITLE)}
69
- </h2>
70
- <p className="text-text-secondary mb-8">
71
- {t(i18nKeys.REGISTER_SUBTITLE)}
72
- </p>
62
+ <h2 className="text-2xl font-semibold mb-2 text-text">{tt.title2}</h2>
63
+ <p className="text-text-secondary mb-8">{tt.subtitle}</p>
73
64
 
74
65
  <Form
75
66
  form={form}
@@ -83,13 +74,13 @@ export default function RegisterPage() {
83
74
  rules={[
84
75
  {
85
76
  required: true,
86
- message: t(i18nKeys.REGISTER_USERNAME_REQUIRED)
77
+ message: tt.usernameRequired
87
78
  }
88
79
  ]}
89
80
  >
90
81
  <Input
91
82
  prefix={<UserOutlined className="text-text-tertiary" />}
92
- placeholder={t(i18nKeys.REGISTER_USERNAME)}
83
+ placeholder={tt.username}
93
84
  className="h-12 text-base bg-secondary border-border"
94
85
  />
95
86
  </Form.Item>
@@ -99,17 +90,17 @@ export default function RegisterPage() {
99
90
  rules={[
100
91
  {
101
92
  required: true,
102
- message: t(i18nKeys.REGISTER_EMAIL_REQUIRED)
93
+ message: tt.emailRequired
103
94
  },
104
95
  {
105
96
  type: 'email',
106
- message: t(i18nKeys.REGISTER_EMAIL_REQUIRED)
97
+ message: tt.emailRequired
107
98
  }
108
99
  ]}
109
100
  >
110
101
  <Input
111
102
  prefix={<MailOutlined className="text-text-tertiary" />}
112
- placeholder={t(i18nKeys.REGISTER_EMAIL)}
103
+ placeholder={tt.email}
113
104
  className="h-12 text-base bg-secondary border-border"
114
105
  />
115
106
  </Form.Item>
@@ -119,13 +110,13 @@ export default function RegisterPage() {
119
110
  rules={[
120
111
  {
121
112
  required: true,
122
- message: t(i18nKeys.REGISTER_PASSWORD_REQUIRED)
113
+ message: tt.passwordRequired
123
114
  }
124
115
  ]}
125
116
  >
126
117
  <Input.Password
127
118
  prefix={<LockOutlined />}
128
- placeholder={t(i18nKeys.REGISTER_PASSWORD)}
119
+ placeholder={tt.password}
129
120
  className="h-12 text-base"
130
121
  />
131
122
  </Form.Item>
@@ -136,23 +127,21 @@ export default function RegisterPage() {
136
127
  rules={[
137
128
  {
138
129
  required: true,
139
- message: t(i18nKeys.REGISTER_CONFIRM_PASSWORD_REQUIRED)
130
+ message: tt.confirmPasswordRequired
140
131
  },
141
132
  ({ getFieldValue }) => ({
142
133
  validator(_, value) {
143
134
  if (!value || getFieldValue('password') === value) {
144
135
  return Promise.resolve();
145
136
  }
146
- return Promise.reject(
147
- t(i18nKeys.REGISTER_PASSWORD_MISMATCH)
148
- );
137
+ return Promise.reject(tt.passwordMismatch);
149
138
  }
150
139
  })
151
140
  ]}
152
141
  >
153
142
  <Input.Password
154
143
  prefix={<LockOutlined />}
155
- placeholder={t(i18nKeys.REGISTER_CONFIRM_PASSWORD)}
144
+ placeholder={tt.confirmPassword}
156
145
  className="h-12 text-base"
157
146
  />
158
147
  </Form.Item>
@@ -165,31 +154,29 @@ export default function RegisterPage() {
165
154
  validator: (_, value) =>
166
155
  value
167
156
  ? Promise.resolve()
168
- : Promise.reject(
169
- new Error(t(i18nKeys.REGISTER_TERMS_REQUIRED))
170
- )
157
+ : Promise.reject(new Error(tt.termsRequired))
171
158
  }
172
159
  ]}
173
160
  >
174
161
  <Checkbox>
175
162
  <span className="text-text-secondary">
176
- {t(i18nKeys.REGISTER_TERMS_PREFIX)}{' '}
163
+ {tt.termsPrefix}{' '}
177
164
  <a
178
165
  href="#"
179
166
  className="text-brand hover:text-brand-hover"
180
167
  target="_blank"
181
168
  rel="noopener noreferrer"
182
169
  >
183
- {t(i18nKeys.REGISTER_TERMS_LINK)}
170
+ {tt.termsLink}
184
171
  </a>{' '}
185
- {t(i18nKeys.REGISTER_TERMS_AND)}{' '}
172
+ {tt.termsAnd}{' '}
186
173
  <a
187
174
  href="#"
188
175
  className="text-brand hover:text-brand-hover"
189
176
  target="_blank"
190
177
  rel="noopener noreferrer"
191
178
  >
192
- {t(i18nKeys.REGISTER_PRIVACY_LINK)}
179
+ {tt.privacyLink}
193
180
  </a>
194
181
  </span>
195
182
  </Checkbox>
@@ -202,20 +189,18 @@ export default function RegisterPage() {
202
189
  loading={loading}
203
190
  className="w-full h-12 text-base"
204
191
  >
205
- {t(i18nKeys.REGISTER_BUTTON)}
192
+ {tt.button}
206
193
  </Button>
207
194
  </Form.Item>
208
195
 
209
196
  <div className="text-center mt-6">
210
- <span className="text-text-tertiary">
211
- {t(i18nKeys.REGISTER_HAVE_ACCOUNT)}{' '}
212
- </span>
197
+ <span className="text-text-tertiary">{tt.haveAccount} </span>
213
198
  <a
214
199
  href="#"
215
200
  className="text-brand hover:text-brand-hover"
216
201
  onClick={handleLoginClick}
217
202
  >
218
- {t(i18nKeys.REGISTER_LOGIN_LINK)}
203
+ {tt.loginLink}
219
204
  </a>
220
205
  </div>
221
206
  </Form>
@@ -228,7 +213,10 @@ export default function RegisterPage() {
228
213
  // Helper component for feature items
229
214
  function FeatureItem({ icon, text }: { icon: string; text: string }) {
230
215
  return (
231
- <div className="flex items-center gap-3 text-text">
216
+ <div
217
+ data-testid="FeatureItem"
218
+ className="flex items-center gap-3 text-text"
219
+ >
232
220
  <div className="w-8 h-8 bg-elevated rounded-lg flex items-center justify-center">
233
221
  {icon}
234
222
  </div>
@@ -1,5 +1,4 @@
1
- import { useBaseRoutePage } from '@/uikit/contexts/BaseRouteContext';
2
- import * as i18nKeys from '@config/Identifier/page.about';
1
+ import { aboutI18n } from '@config/i18n/aboutI18n';
3
2
  import {
4
3
  Button,
5
4
  Tooltip,
@@ -12,29 +11,31 @@ import {
12
11
  Alert
13
12
  } from 'antd';
14
13
  import { useState } from 'react';
14
+ import { useI18nInterface } from '@/uikit/hooks/useI18nInterface';
15
15
 
16
16
  export default function AboutPage() {
17
- const { t } = useBaseRoutePage();
18
17
  const [messageApi, contextHolder] = message.useMessage();
19
18
  const [notificationApi, contextHolder2] = notification.useNotification();
20
19
  const [isModalOpen, setIsModalOpen] = useState(false);
21
20
  const [isDrawerOpen, setIsDrawerOpen] = useState(false);
22
21
 
22
+ const tt = useI18nInterface(aboutI18n);
23
+
23
24
  const showMessage = () => {
24
- messageApi.info(t(i18nKeys.ABOUT_MESSAGE_TEST), 2000);
25
+ messageApi.info(tt.messageTest, 2000);
25
26
  };
26
27
 
27
28
  const showNotification = () => {
28
29
  notificationApi.open({
29
- message: t(i18nKeys.ABOUT_NOTIFICATION_TITLE),
30
- description: t(i18nKeys.ABOUT_NOTIFICATION_DESC),
30
+ message: tt.notificationTitle,
31
+ description: tt.notificationDescription,
31
32
  duration: 2000
32
33
  });
33
34
  };
34
35
  const showNotification2 = () => {
35
36
  notification.open({
36
- message: t(i18nKeys.ABOUT_NOTIFICATION_TITLE),
37
- description: t(i18nKeys.ABOUT_NOTIFICATION_DESC),
37
+ message: tt.notificationTitle,
38
+ description: tt.notificationDescription,
38
39
  duration: 2000
39
40
  });
40
41
  };
@@ -43,7 +44,7 @@ export default function AboutPage() {
43
44
  setIsModalOpen(true);
44
45
  };
45
46
  const showMessage2 = () => {
46
- message.info(t(i18nKeys.ABOUT_MESSAGE_TEST), 200);
47
+ message.info(tt.messageTest, 200);
47
48
  };
48
49
 
49
50
  const showDrawer = () => {
@@ -51,71 +52,65 @@ export default function AboutPage() {
51
52
  };
52
53
 
53
54
  return (
54
- <div className="min-h-screen bg-primary py-6 flex flex-col justify-center sm:py-12">
55
+ <div
56
+ data-testid="AboutPage"
57
+ className="min-h-screen bg-primary py-6 flex flex-col justify-center sm:py-12"
58
+ >
55
59
  {contextHolder}
56
60
  {contextHolder2}
57
61
  <div className="relative py-3 sm:max-w-xl sm:mx-auto">
58
62
  <h1 className="text-2xl font-bold text-center text-text mb-8">
59
- {t(i18nKeys.PAGE_ABOUT_TITLE)}
63
+ {tt.title}
60
64
  </h1>
61
65
 
62
66
  <div className="space-x-4 flex justify-center flex-wrap gap-4">
63
- <Button onClick={showMessage}>{t(i18nKeys.ABOUT_BTN_MESSAGE)}</Button>
64
- <Button onClick={showMessage2}>
65
- {t(i18nKeys.ABOUT_BTN_MESSAGE2)}
66
- </Button>
67
+ <Button onClick={showMessage}>{tt.btnMessage}</Button>
68
+ <Button onClick={showMessage2}>{tt.btnMessage2}</Button>
67
69
 
68
- <Button onClick={showNotification}>
69
- {t(i18nKeys.ABOUT_BTN_NOTIFICATION)}
70
- </Button>
70
+ <Button onClick={showNotification}>{tt.btnNotification}</Button>
71
71
 
72
- <Button onClick={showNotification2}>
73
- {t(i18nKeys.ABOUT_BTN_NOTIFICATION2)}
74
- </Button>
72
+ <Button onClick={showNotification2}>{tt.btnNotification2}</Button>
75
73
 
76
- <Tooltip title={t(i18nKeys.ABOUT_TOOLTIP_TEXT)}>
77
- <Button>{t(i18nKeys.ABOUT_BTN_TOOLTIP)}</Button>
74
+ <Tooltip title={tt.tooltipText}>
75
+ <Button>{tt.btnTooltip}</Button>
78
76
  </Tooltip>
79
77
 
80
78
  <Modal
81
- title={t(i18nKeys.ABOUT_MODAL_TITLE)}
79
+ title={tt.modalTitle}
82
80
  open={isModalOpen}
83
81
  onOk={() => setIsModalOpen(false)}
84
82
  onCancel={() => setIsModalOpen(false)}
85
83
  >
86
- <p>{t(i18nKeys.ABOUT_MODAL_CONTENT)}</p>
84
+ <p>{tt.modalContent}</p>
87
85
  </Modal>
88
86
 
89
- <Button onClick={showModal}>{t(i18nKeys.ABOUT_BTN_MODAL)}</Button>
87
+ <Button onClick={showModal}>{tt.btnModal}</Button>
90
88
 
91
89
  <Drawer
92
- title={t(i18nKeys.ABOUT_DRAWER_TITLE)}
90
+ title={tt.drawerTitle}
93
91
  open={isDrawerOpen}
94
92
  onClose={() => setIsDrawerOpen(false)}
95
93
  >
96
- <p>{t(i18nKeys.ABOUT_DRAWER_CONTENT)}</p>
94
+ <p>{tt.drawerContent}</p>
97
95
  </Drawer>
98
96
 
99
- <Button onClick={showDrawer}>{t(i18nKeys.ABOUT_BTN_DRAWER)}</Button>
97
+ <Button onClick={showDrawer}>{tt.btnDrawer}</Button>
100
98
 
101
- <Popover
102
- content={t(i18nKeys.ABOUT_POPOVER_CONTENT)}
103
- title={t(i18nKeys.ABOUT_POPOVER_TITLE)}
104
- >
105
- <Button>{t(i18nKeys.ABOUT_BTN_POPOVER)}</Button>
99
+ <Popover content={tt.popoverContent} title={tt.popoverTitle}>
100
+ <Button>{tt.btnPopover}</Button>
106
101
  </Popover>
107
102
 
108
103
  <Popconfirm
109
- title={t(i18nKeys.ABOUT_POPCONFIRM_TITLE)}
110
- description={t(i18nKeys.ABOUT_POPCONFIRM_DESC)}
111
- okText={t(i18nKeys.ABOUT_OK_TEXT)}
112
- cancelText={t(i18nKeys.ABOUT_CANCEL_TEXT)}
104
+ title={tt.popconfirmTitle}
105
+ description={tt.popconfirmDesc}
106
+ okText={tt.okText}
107
+ cancelText={tt.cancelText}
113
108
  >
114
- <Button>{t(i18nKeys.ABOUT_BTN_POPCONFIRM)}</Button>
109
+ <Button>{tt.btnPopconfirm}</Button>
115
110
  </Popconfirm>
116
111
 
117
112
  <Alert
118
- message={t(i18nKeys.ABOUT_ALERT_MESSAGE)}
113
+ message={tt.alertMessage}
119
114
  type="warning"
120
115
  showIcon
121
116
  closable