@qlover/create-app 0.7.15 → 0.9.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 (363) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/configs/_common/.github/workflows/general-check.yml +1 -1
  3. package/dist/configs/_common/.github/workflows/release.yml +2 -2
  4. package/dist/configs/_common/.gitignore.template +6 -0
  5. package/dist/configs/_common/.prettierignore +17 -5
  6. package/dist/configs/_common/.vscode/settings.json +6 -1
  7. package/dist/index.cjs +1 -1
  8. package/dist/index.js +1 -1
  9. package/dist/templates/next-app/.env.template +1 -1
  10. package/dist/templates/next-app/README.en.md +0 -1
  11. package/dist/templates/next-app/README.md +0 -1
  12. package/dist/templates/next-app/config/Identifier/api.ts +5 -5
  13. package/dist/templates/next-app/config/Identifier/common/admint.table.ts +69 -0
  14. package/dist/templates/next-app/config/Identifier/common/common.ts +76 -0
  15. package/dist/templates/next-app/config/Identifier/common/index.ts +3 -0
  16. package/dist/templates/next-app/config/Identifier/{validator.ts → common/validators.ts} +5 -5
  17. package/dist/templates/next-app/config/Identifier/index.ts +2 -12
  18. package/dist/templates/next-app/config/Identifier/pages/index.ts +6 -0
  19. package/dist/templates/next-app/config/Identifier/pages/page.admin.home.ts +27 -0
  20. package/dist/templates/next-app/config/Identifier/pages/page.admin.locales.ts +266 -0
  21. package/dist/templates/next-app/config/Identifier/pages/page.admin.user.ts +293 -0
  22. package/dist/templates/{react-app/config/Identifier → next-app/config/Identifier/pages}/page.home.ts +15 -22
  23. package/dist/templates/next-app/config/Identifier/{page.login.ts → pages/page.login.ts} +28 -34
  24. package/dist/templates/next-app/config/Identifier/{page.register.ts → pages/page.register.ts} +30 -29
  25. package/dist/templates/next-app/config/adminNavs.ts +19 -0
  26. package/dist/templates/next-app/config/common.ts +22 -13
  27. package/dist/templates/next-app/config/i18n/HomeI18n.ts +5 -5
  28. package/dist/templates/next-app/config/i18n/admin18n.ts +61 -19
  29. package/dist/templates/next-app/config/i18n/i18nConfig.ts +2 -0
  30. package/dist/templates/next-app/config/i18n/i18nKeyScheam.ts +36 -0
  31. package/dist/templates/next-app/config/i18n/loginI18n.ts +22 -22
  32. package/dist/templates/next-app/config/i18n/register18n.ts +23 -24
  33. package/dist/templates/next-app/docs/en/index.md +0 -1
  34. package/dist/templates/next-app/docs/en/project-structure.md +0 -1
  35. package/dist/templates/next-app/docs/zh/index.md +0 -1
  36. package/dist/templates/next-app/docs/zh/project-structure.md +0 -1
  37. package/dist/templates/next-app/make/generateLocales.ts +19 -12
  38. package/dist/templates/next-app/migrations/schema/LocalesSchema.ts +15 -0
  39. package/dist/templates/next-app/migrations/sql/1694244000000.sql +11 -0
  40. package/dist/templates/next-app/package.json +7 -3
  41. package/dist/templates/next-app/public/locales/en.json +172 -207
  42. package/dist/templates/next-app/public/locales/zh.json +172 -207
  43. package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +153 -0
  44. package/dist/templates/next-app/src/app/[locale]/admin/users/page.tsx +48 -50
  45. package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +2 -2
  46. package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +34 -0
  47. package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +40 -0
  48. package/dist/templates/next-app/src/app/api/admin/locales/route.ts +42 -0
  49. package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +32 -0
  50. package/dist/templates/next-app/src/app/api/locales/json/route.ts +44 -0
  51. package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +1 -13
  52. package/dist/templates/next-app/src/base/cases/Datetime.ts +18 -0
  53. package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +12 -6
  54. package/dist/templates/next-app/src/base/cases/ResourceState.ts +17 -0
  55. package/dist/templates/next-app/src/base/cases/TranslateI18nInterface.ts +25 -0
  56. package/dist/templates/next-app/src/base/cases/ZodColumnBuilder.ts +200 -0
  57. package/dist/templates/next-app/src/base/port/ZodBuilderInterface.ts +8 -0
  58. package/dist/templates/next-app/src/base/services/AdminLocalesService.ts +20 -0
  59. package/dist/templates/next-app/src/base/services/AdminPageEvent.ts +26 -0
  60. package/dist/templates/next-app/src/base/services/AdminPageScheduler.ts +42 -0
  61. package/dist/templates/next-app/src/base/services/ResourceService.ts +122 -0
  62. package/dist/templates/next-app/src/base/services/adminApi/AdminLocalesApi.ts +104 -0
  63. package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +38 -5
  64. package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +1 -1
  65. package/dist/templates/next-app/src/i18n/request.ts +30 -1
  66. package/dist/templates/next-app/src/server/PageParams.ts +2 -10
  67. package/dist/templates/next-app/src/server/port/DBBridgeInterface.ts +5 -0
  68. package/dist/templates/next-app/src/server/port/DBTableInterface.ts +2 -0
  69. package/dist/templates/next-app/src/server/port/LocalesRepositoryInterface.ts +43 -0
  70. package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +197 -0
  71. package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +122 -0
  72. package/dist/templates/next-app/src/server/sqlBridges/SupabaseBridge.ts +60 -11
  73. package/dist/templates/next-app/src/server/validators/ExtendedExecutorError.ts +6 -0
  74. package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +131 -0
  75. package/dist/templates/next-app/src/server/validators/LoginValidator.ts +2 -5
  76. package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +32 -16
  77. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/_default.css +2 -1
  78. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/dark.css +28 -29
  79. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/pink.css +2 -1
  80. package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +17 -3
  81. package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +5 -4
  82. package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +5 -4
  83. package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +3 -2
  84. package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +1 -1
  85. package/dist/templates/next-app/src/uikit/components/EditableCell.tsx +118 -0
  86. package/dist/templates/next-app/src/uikit/components/LogoutButton.tsx +5 -6
  87. package/dist/templates/next-app/src/uikit/components/ThemeSwitcher.tsx +1 -1
  88. package/dist/templates/next-app/src/uikit/components/With.tsx +2 -2
  89. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportButton.tsx +62 -0
  90. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportEvent.ts +28 -0
  91. package/dist/templates/next-app/src/uikit/components/localesImportButton/import.module.css +6 -0
  92. package/dist/templates/next-app/src/uikit/hook/useI18nInterface.ts +8 -14
  93. package/dist/templates/next-app/src/uikit/hook/useWarnTranslations.ts +25 -0
  94. package/dist/templates/react-app/.prettierignore +17 -0
  95. package/dist/templates/react-app/README.en.md +71 -54
  96. package/dist/templates/react-app/README.md +35 -18
  97. package/dist/templates/react-app/__tests__/__mocks__/BootstrapTest.ts +14 -0
  98. package/dist/templates/react-app/__tests__/__mocks__/MockAppConfit.ts +1 -1
  99. package/dist/templates/react-app/__tests__/__mocks__/MockDialogHandler.ts +2 -2
  100. package/dist/templates/react-app/__tests__/__mocks__/MockLogger.ts +1 -1
  101. package/dist/templates/react-app/__tests__/__mocks__/components/TestApp.tsx +45 -0
  102. package/dist/templates/react-app/__tests__/__mocks__/components/TestBootstrapsProvider.tsx +34 -0
  103. package/dist/templates/react-app/__tests__/__mocks__/components/TestRouter.tsx +46 -0
  104. package/dist/templates/react-app/__tests__/__mocks__/components/index.ts +12 -0
  105. package/dist/templates/react-app/__tests__/__mocks__/createMockGlobals.ts +1 -2
  106. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOC.ts +51 -0
  107. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOCRegister.ts +69 -0
  108. package/dist/templates/react-app/__tests__/setup/index.ts +1 -51
  109. package/dist/templates/react-app/__tests__/setup/setupGlobal.ts +51 -0
  110. package/dist/templates/react-app/__tests__/src/App.structure.test.tsx +115 -0
  111. package/dist/templates/react-app/__tests__/src/base/cases/AppConfig.test.ts +2 -2
  112. package/dist/templates/react-app/__tests__/src/base/cases/AppError.test.ts +1 -1
  113. package/dist/templates/react-app/__tests__/src/base/cases/DialogHandler.test.ts +3 -5
  114. package/dist/templates/react-app/__tests__/src/base/cases/I18nKeyErrorPlugin.test.ts +13 -2
  115. package/dist/templates/react-app/__tests__/src/base/cases/InversifyContainer.test.ts +1 -1
  116. package/dist/templates/react-app/__tests__/src/base/cases/PublicAssetsPath.test.ts +1 -1
  117. package/dist/templates/react-app/__tests__/src/base/cases/RequestLogger.test.ts +5 -5
  118. package/dist/templates/react-app/__tests__/src/base/cases/RequestStatusCatcher.test.ts +1 -2
  119. package/dist/templates/react-app/__tests__/src/base/cases/RouterLoader.test.ts +25 -15
  120. package/dist/templates/react-app/__tests__/src/base/services/I18nService.test.ts +29 -15
  121. package/dist/templates/react-app/__tests__/src/core/IOC.test.ts +19 -9
  122. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapClient.test.ts +153 -0
  123. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapsApp.test.ts +9 -7
  124. package/dist/templates/react-app/__tests__/src/main.integration.test.tsx +4 -5
  125. package/dist/templates/react-app/__tests__/src/main.test.tsx +4 -4
  126. package/dist/templates/react-app/__tests__/src/uikit/components/BaseHeader.test.tsx +68 -59
  127. package/dist/templates/react-app/__tests__/src/uikit/components/chatMessage/ChatRoot.test.tsx +274 -0
  128. package/dist/templates/react-app/config/IOCIdentifier.ts +11 -8
  129. package/dist/templates/react-app/config/Identifier/{common.error.ts → common/common.error.ts} +5 -5
  130. package/dist/templates/react-app/config/Identifier/{common.ts → common/common.ts} +9 -9
  131. package/dist/templates/react-app/config/Identifier/common/index.ts +2 -0
  132. package/dist/templates/react-app/config/Identifier/components/component.chatMessage.ts +56 -0
  133. package/dist/templates/react-app/config/Identifier/components/component.messageBaseList.ts +103 -0
  134. package/dist/templates/react-app/config/Identifier/index.ts +1 -9
  135. package/dist/templates/react-app/config/Identifier/pages/index.ts +9 -0
  136. package/dist/templates/react-app/config/Identifier/{page.about.ts → pages/page.about.ts} +34 -26
  137. package/dist/templates/react-app/config/Identifier/{page.executor.ts → pages/page.executor.ts} +47 -39
  138. package/dist/templates/{next-app/config/Identifier → react-app/config/Identifier/pages}/page.home.ts +24 -23
  139. package/dist/templates/react-app/config/Identifier/pages/page.identifiter.ts +102 -0
  140. package/dist/templates/react-app/config/Identifier/{page.jsonStorage.ts → pages/page.jsonStorage.ts} +18 -11
  141. package/dist/templates/react-app/config/Identifier/{page.login.ts → pages/page.login.ts} +37 -27
  142. package/dist/templates/react-app/config/Identifier/pages/page.message.ts +20 -0
  143. package/dist/templates/react-app/config/Identifier/{page.register.ts → pages/page.register.ts} +37 -25
  144. package/dist/templates/react-app/config/Identifier/{page.request.ts → pages/page.request.ts} +34 -44
  145. package/dist/templates/react-app/config/app.router.ts +81 -61
  146. package/dist/templates/react-app/config/i18n/PageI18nInterface.ts +51 -0
  147. package/dist/templates/react-app/config/i18n/aboutI18n.ts +42 -0
  148. package/dist/templates/react-app/config/i18n/chatMessageI18n.ts +17 -0
  149. package/dist/templates/react-app/config/i18n/executorI18n.ts +51 -0
  150. package/dist/templates/react-app/config/i18n/homeI18n.ts +24 -0
  151. package/dist/templates/react-app/config/i18n/i18nConfig.ts +30 -0
  152. package/dist/templates/react-app/config/i18n/identifiter18n.ts +30 -0
  153. package/dist/templates/react-app/config/i18n/jsonStorage18n.ts +27 -0
  154. package/dist/templates/react-app/config/i18n/login18n.ts +42 -0
  155. package/dist/templates/react-app/config/i18n/messageBaseListI18n.ts +22 -0
  156. package/dist/templates/react-app/config/i18n/messageI18n.ts +14 -0
  157. package/dist/templates/react-app/config/i18n/notFoundI18n.ts +34 -0
  158. package/dist/templates/react-app/config/i18n/register18n.ts +40 -0
  159. package/dist/templates/react-app/config/i18n/request18n.ts +41 -0
  160. package/dist/templates/react-app/config/theme.ts +14 -4
  161. package/dist/templates/react-app/docs/en/bootstrap.md +1670 -341
  162. package/dist/templates/react-app/docs/en/components/chat-message-component.md +314 -0
  163. package/dist/templates/react-app/docs/en/components/chat-message-refactor.md +270 -0
  164. package/dist/templates/react-app/docs/en/components/message-base-list-component.md +172 -0
  165. package/dist/templates/react-app/docs/en/development-guide.md +1021 -345
  166. package/dist/templates/react-app/docs/en/env.md +1132 -278
  167. package/dist/templates/react-app/docs/en/i18n.md +858 -147
  168. package/dist/templates/react-app/docs/en/index.md +733 -104
  169. package/dist/templates/react-app/docs/en/ioc.md +1228 -287
  170. package/dist/templates/react-app/docs/en/playwright/e2e-tests.md +321 -0
  171. package/dist/templates/react-app/docs/en/playwright/index.md +19 -0
  172. package/dist/templates/react-app/docs/en/playwright/installation-summary.md +332 -0
  173. package/dist/templates/react-app/docs/en/playwright/overview.md +222 -0
  174. package/dist/templates/react-app/docs/en/playwright/quickstart.md +325 -0
  175. package/dist/templates/react-app/docs/en/playwright/reorganization-notes.md +340 -0
  176. package/dist/templates/react-app/docs/en/playwright/setup-complete.md +290 -0
  177. package/dist/templates/react-app/docs/en/playwright/testing-guide.md +565 -0
  178. package/dist/templates/react-app/docs/en/store.md +1194 -184
  179. package/dist/templates/react-app/docs/en/why-no-globals.md +797 -0
  180. package/dist/templates/react-app/docs/zh/bootstrap.md +1670 -341
  181. package/dist/templates/react-app/docs/zh/components/chat-message-component.md +314 -0
  182. package/dist/templates/react-app/docs/zh/components/chat-message-refactor.md +270 -0
  183. package/dist/templates/react-app/docs/zh/components/message-base-list-component.md +172 -0
  184. package/dist/templates/react-app/docs/zh/development-guide.md +1021 -345
  185. package/dist/templates/react-app/docs/zh/env.md +1132 -275
  186. package/dist/templates/react-app/docs/zh/i18n.md +858 -147
  187. package/dist/templates/react-app/docs/zh/index.md +717 -104
  188. package/dist/templates/react-app/docs/zh/ioc.md +1229 -287
  189. package/dist/templates/react-app/docs/zh/playwright/e2e-tests.md +321 -0
  190. package/dist/templates/react-app/docs/zh/playwright/index.md +19 -0
  191. package/dist/templates/react-app/docs/zh/playwright/installation-summary.md +332 -0
  192. package/dist/templates/react-app/docs/zh/playwright/overview.md +222 -0
  193. package/dist/templates/react-app/docs/zh/playwright/quickstart.md +325 -0
  194. package/dist/templates/react-app/docs/zh/playwright/reorganization-notes.md +340 -0
  195. package/dist/templates/react-app/docs/zh/playwright/setup-complete.md +290 -0
  196. package/dist/templates/react-app/docs/zh/playwright/testing-guide.md +565 -0
  197. package/dist/templates/react-app/docs/zh/store.md +1192 -184
  198. package/dist/templates/react-app/docs/zh/why-no-globals.md +797 -0
  199. package/dist/templates/react-app/e2e/App.spec.ts +319 -0
  200. package/dist/templates/react-app/e2e/fixtures/base.fixture.ts +40 -0
  201. package/dist/templates/react-app/e2e/main.spec.ts +20 -0
  202. package/dist/templates/react-app/e2e/utils/test-helpers.ts +19 -0
  203. package/dist/templates/react-app/eslint.config.mjs +247 -0
  204. package/dist/templates/react-app/makes/eslint-utils.mjs +195 -0
  205. package/dist/templates/react-app/makes/generateTs2LocalesOptions.ts +26 -0
  206. package/dist/templates/react-app/package.json +31 -3
  207. package/dist/templates/react-app/playwright.config.ts +79 -0
  208. package/dist/templates/react-app/public/locales/en/common.json +233 -179
  209. package/dist/templates/react-app/public/locales/zh/common.json +233 -179
  210. package/dist/templates/react-app/src/App.tsx +15 -42
  211. package/dist/templates/react-app/src/base/apis/AiApi.ts +5 -5
  212. package/dist/templates/react-app/src/base/apis/feApi/FeApi.ts +1 -1
  213. package/dist/templates/react-app/src/base/apis/feApi/FeApiAdapter.ts +1 -1
  214. package/dist/templates/react-app/src/base/apis/feApi/FeApiBootstarp.ts +8 -8
  215. package/dist/templates/react-app/src/base/apis/feApi/FeApiType.ts +1 -1
  216. package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +6 -6
  217. package/dist/templates/react-app/src/base/apis/userApi/UserApiAdapter.ts +1 -1
  218. package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +12 -14
  219. package/dist/templates/react-app/src/base/apis/userApi/UserApiType.ts +1 -1
  220. package/dist/templates/react-app/src/base/cases/DialogHandler.ts +5 -2
  221. package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +3 -3
  222. package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +3 -3
  223. package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +2 -2
  224. package/dist/templates/react-app/src/base/cases/RequestLogger.ts +4 -4
  225. package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +1 -1
  226. package/dist/templates/react-app/src/base/cases/ResourceState.ts +23 -0
  227. package/dist/templates/react-app/src/base/cases/RouterLoader.ts +4 -4
  228. package/dist/templates/react-app/src/base/cases/TranslateI18nInterface.ts +26 -0
  229. package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +2 -3
  230. package/dist/templates/react-app/src/base/port/I18nServiceInterface.ts +1 -1
  231. package/dist/templates/react-app/src/base/port/IOCInterface.ts +36 -0
  232. package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +2 -1
  233. package/dist/templates/react-app/src/base/port/ProcesserExecutorInterface.ts +1 -1
  234. package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +2 -2
  235. package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +9 -5
  236. package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +1 -1
  237. package/dist/templates/react-app/src/base/services/I18nService.ts +29 -29
  238. package/dist/templates/react-app/src/base/services/IdentifierService.ts +143 -0
  239. package/dist/templates/react-app/src/base/services/ProcesserExecutor.ts +3 -3
  240. package/dist/templates/react-app/src/base/services/RouteService.ts +27 -8
  241. package/dist/templates/react-app/src/base/services/UserService.ts +8 -8
  242. package/dist/templates/react-app/src/base/types/Page.ts +14 -2
  243. package/dist/templates/react-app/src/base/types/global.d.ts +1 -1
  244. package/dist/templates/react-app/src/core/IOC.ts +5 -46
  245. package/dist/templates/react-app/src/core/bootstraps/{BootstrapApp.ts → BootstrapClient.ts} +44 -17
  246. package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +14 -7
  247. package/dist/templates/react-app/src/core/bootstraps/IocIdentifierTest.ts +1 -1
  248. package/dist/templates/react-app/src/core/bootstraps/PrintBootstrap.ts +1 -1
  249. package/dist/templates/react-app/src/core/clientIoc/ClientIOC.ts +40 -0
  250. package/dist/templates/react-app/src/core/{IocRegisterImpl.ts → clientIoc/ClientIOCRegister.ts} +35 -24
  251. package/dist/templates/react-app/src/core/globals.ts +9 -9
  252. package/dist/templates/react-app/src/main.tsx +4 -4
  253. package/dist/templates/react-app/src/pages/404.tsx +6 -3
  254. package/dist/templates/react-app/src/pages/500.tsx +5 -2
  255. package/dist/templates/react-app/src/pages/NoRouteFound.tsx +5 -0
  256. package/dist/templates/react-app/src/pages/auth/Layout.tsx +9 -6
  257. package/dist/templates/react-app/src/pages/auth/LoginPage.tsx +46 -56
  258. package/dist/templates/react-app/src/pages/auth/RegisterPage.tsx +46 -58
  259. package/dist/templates/react-app/src/pages/base/AboutPage.tsx +35 -40
  260. package/dist/templates/react-app/src/pages/base/ExecutorPage.tsx +51 -51
  261. package/dist/templates/react-app/src/pages/base/HomePage.tsx +14 -15
  262. package/dist/templates/react-app/src/pages/base/IdentifierPage.tsx +70 -11
  263. package/dist/templates/react-app/src/pages/base/JSONStoragePage.tsx +24 -25
  264. package/dist/templates/react-app/src/pages/base/Layout.tsx +2 -2
  265. package/dist/templates/react-app/src/pages/base/MessagePage.tsx +40 -0
  266. package/dist/templates/react-app/src/pages/base/RedirectPathname.tsx +3 -2
  267. package/dist/templates/react-app/src/pages/base/RequestPage.tsx +41 -59
  268. package/dist/templates/react-app/src/styles/css/antd-themes/{_default.css → _common/_default.css} +85 -0
  269. package/dist/templates/react-app/src/styles/css/antd-themes/{dark.css → _common/dark.css} +99 -0
  270. package/dist/templates/react-app/src/styles/css/antd-themes/_common/index.css +3 -0
  271. package/dist/templates/react-app/src/styles/css/antd-themes/{pink.css → _common/pink.css} +86 -0
  272. package/dist/templates/react-app/src/styles/css/antd-themes/index.css +4 -3
  273. package/dist/templates/react-app/src/styles/css/antd-themes/menu/_default.css +108 -0
  274. package/dist/templates/react-app/src/styles/css/antd-themes/menu/dark.css +67 -0
  275. package/dist/templates/react-app/src/styles/css/antd-themes/menu/index.css +3 -0
  276. package/dist/templates/react-app/src/styles/css/antd-themes/menu/pink.css +67 -0
  277. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/_default.css +34 -0
  278. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/dark.css +31 -0
  279. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/index.css +3 -0
  280. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/pink.css +36 -0
  281. package/dist/templates/react-app/src/styles/css/antd-themes/table/_default.css +44 -0
  282. package/dist/templates/react-app/src/styles/css/antd-themes/table/dark.css +43 -0
  283. package/dist/templates/react-app/src/styles/css/antd-themes/table/index.css +3 -0
  284. package/dist/templates/react-app/src/styles/css/antd-themes/table/pink.css +43 -0
  285. package/dist/templates/react-app/src/styles/css/page.css +4 -3
  286. package/dist/templates/react-app/src/styles/css/themes/_default.css +1 -0
  287. package/dist/templates/react-app/src/styles/css/themes/dark.css +1 -0
  288. package/dist/templates/react-app/src/styles/css/themes/pink.css +1 -0
  289. package/dist/templates/react-app/src/styles/css/zIndex.css +1 -1
  290. package/dist/templates/react-app/src/uikit/bridges/ExecutorPageBridge.ts +3 -3
  291. package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +2 -2
  292. package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +1 -1
  293. package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +3 -3
  294. package/dist/templates/react-app/src/uikit/components/AppRouterProvider.tsx +35 -0
  295. package/dist/templates/react-app/src/uikit/components/BaseHeader.tsx +15 -11
  296. package/dist/templates/react-app/src/uikit/components/BaseRouteProvider.tsx +14 -11
  297. package/dist/templates/react-app/src/uikit/components/BaseRouteSeo.tsx +18 -0
  298. package/dist/templates/react-app/src/uikit/components/BootstrapsProvider.tsx +13 -0
  299. package/dist/templates/react-app/src/uikit/components/ClientSeo.tsx +62 -0
  300. package/dist/templates/react-app/src/uikit/components/ComboProvider.tsx +38 -0
  301. package/dist/templates/react-app/src/uikit/components/LanguageSwitcher.tsx +48 -27
  302. package/dist/templates/react-app/src/uikit/components/Loading.tsx +4 -2
  303. package/dist/templates/react-app/src/uikit/components/LocaleLink.tsx +4 -5
  304. package/dist/templates/react-app/src/uikit/components/LogoutButton.tsx +34 -11
  305. package/dist/templates/react-app/src/uikit/components/MessageBaseList.tsx +240 -0
  306. package/dist/templates/react-app/src/uikit/components/ProcessExecutorProvider.tsx +9 -5
  307. package/dist/templates/react-app/src/uikit/components/RouterRenderComponent.tsx +6 -3
  308. package/dist/templates/react-app/src/uikit/components/ThemeSwitcher.tsx +97 -40
  309. package/dist/templates/react-app/src/uikit/components/UserAuthProvider.tsx +5 -5
  310. package/dist/templates/react-app/src/uikit/components/With.tsx +17 -0
  311. package/dist/templates/react-app/src/uikit/components/chatMessage/ChatMessageBridge.ts +176 -0
  312. package/dist/templates/react-app/src/uikit/components/chatMessage/ChatRoot.tsx +21 -0
  313. package/dist/templates/react-app/src/uikit/components/chatMessage/FocusBar.tsx +106 -0
  314. package/dist/templates/react-app/src/uikit/components/chatMessage/MessageApi.ts +271 -0
  315. package/dist/templates/react-app/src/uikit/components/chatMessage/MessageItem.tsx +102 -0
  316. package/dist/templates/react-app/src/uikit/components/chatMessage/MessagesList.tsx +86 -0
  317. package/dist/templates/react-app/src/uikit/contexts/BaseRouteContext.ts +17 -11
  318. package/dist/templates/react-app/src/uikit/contexts/IOCContext.ts +13 -0
  319. package/dist/templates/react-app/src/uikit/hooks/useAppTranslation.ts +26 -0
  320. package/dist/templates/react-app/src/uikit/hooks/useI18nGuard.ts +8 -11
  321. package/dist/templates/react-app/src/uikit/hooks/useI18nInterface.ts +25 -0
  322. package/dist/templates/react-app/src/uikit/hooks/useIOC.ts +35 -0
  323. package/dist/templates/react-app/src/uikit/hooks/useNavigateBridge.ts +3 -3
  324. package/dist/templates/react-app/src/uikit/hooks/useStrictEffect.ts +0 -1
  325. package/dist/templates/react-app/tsconfig.e2e.json +21 -0
  326. package/dist/templates/react-app/tsconfig.json +8 -1
  327. package/dist/templates/react-app/tsconfig.node.json +1 -1
  328. package/dist/templates/react-app/tsconfig.test.json +3 -1
  329. package/dist/templates/react-app/vite.config.ts +50 -34
  330. package/package.json +2 -1
  331. package/dist/configs/react-app/eslint.config.js +0 -94
  332. package/dist/templates/next-app/config/Identifier/common.error.ts +0 -41
  333. package/dist/templates/next-app/config/Identifier/common.ts +0 -69
  334. package/dist/templates/next-app/config/Identifier/page.about.ts +0 -181
  335. package/dist/templates/next-app/config/Identifier/page.admin.ts +0 -48
  336. package/dist/templates/next-app/config/Identifier/page.executor.ts +0 -272
  337. package/dist/templates/next-app/config/Identifier/page.identifiter.ts +0 -39
  338. package/dist/templates/next-app/config/Identifier/page.jsonStorage.ts +0 -72
  339. package/dist/templates/next-app/config/Identifier/page.request.ts +0 -182
  340. package/dist/templates/next-app/src/base/cases/ChatAction.ts +0 -21
  341. package/dist/templates/next-app/src/base/cases/FocusBarAction.ts +0 -36
  342. package/dist/templates/next-app/src/base/cases/RequestState.ts +0 -20
  343. package/dist/templates/next-app/src/base/port/AdminPageInterface.ts +0 -85
  344. package/dist/templates/next-app/src/base/port/AsyncStateInterface.ts +0 -7
  345. package/dist/templates/next-app/src/base/services/AdminUserService.ts +0 -45
  346. package/dist/templates/next-app/src/uikit/components/ChatRoot.tsx +0 -17
  347. package/dist/templates/next-app/src/uikit/components/chat/ChatActionInterface.ts +0 -30
  348. package/dist/templates/next-app/src/uikit/components/chat/ChatFocusBar.tsx +0 -65
  349. package/dist/templates/next-app/src/uikit/components/chat/ChatMessages.tsx +0 -59
  350. package/dist/templates/next-app/src/uikit/components/chat/ChatWrap.tsx +0 -28
  351. package/dist/templates/next-app/src/uikit/components/chat/FocusBarActionInterface.ts +0 -19
  352. package/dist/templates/next-app/src/uikit/hook/useMountedClient.ts +0 -17
  353. package/dist/templates/next-app/src/uikit/hook/useStore.ts +0 -15
  354. package/dist/templates/react-app/__tests__/__mocks__/I18nService.ts +0 -13
  355. package/dist/templates/react-app/__tests__/src/App.test.tsx +0 -139
  356. package/dist/templates/react-app/config/Identifier/page.identifiter.ts +0 -39
  357. package/dist/templates/react-app/config/i18n.ts +0 -15
  358. package/dist/templates/react-app/docs/en/project-structure.md +0 -434
  359. package/dist/templates/react-app/docs/zh/project-structure.md +0 -434
  360. package/dist/templates/react-app/src/base/cases/RequestState.ts +0 -20
  361. package/dist/templates/react-app/src/base/port/AsyncStateInterface.ts +0 -7
  362. package/dist/templates/react-app/src/uikit/hooks/useDocumentTitle.ts +0 -15
  363. package/dist/templates/react-app/src/uikit/hooks/useStore.ts +0 -15
@@ -1,182 +0,0 @@
1
- /**
2
- * @description Request page title
3
- * @localZh 请求示例
4
- * @localEn Request Examples
5
- */
6
- export const PAGE_REQUEST_TITLE = 'page__request__title';
7
-
8
- /**
9
- * @description Request page description
10
- * @localZh 展示各种请求示例和用法
11
- * @localEn Demonstrate various request examples and usage
12
- */
13
- export const PAGE_REQUEST_DESCRIPTION = 'page__request__description';
14
-
15
- /**
16
- * @description Request timeout message
17
- * @localZh 请求超时
18
- * @localEn Request Timeout
19
- */
20
- export const REQUEST_TIMEOUT = 'request__requestTimeout';
21
- /**
22
- * @description Hello result message
23
- * @localZh Hello 结果是
24
- * @localEn Hello result is
25
- */
26
- export const REQUEST_HELLO_RESULT = 'request__helloResult';
27
- /**
28
- * @description Hello error message
29
- * @localZh Hello 错误是
30
- * @localEn Hello error is
31
- */
32
- export const REQUEST_HELLO_ERROR = 'request__helloError';
33
- /**
34
- * @description IpInfo result message
35
- * @localZh IpInfo 结果是
36
- * @localEn IpInfo result is
37
- */
38
- export const REQUEST_IP_INFO_RESULT = 'request__ipInfoResult';
39
- /**
40
- * @description IpInfo title
41
- * @localZh IpInfo
42
- * @localEn IpInfo
43
- */
44
- export const REQUEST_IP_INFO = 'request__ipInfo';
45
- /**
46
- * @description Random user title
47
- * @localZh 随机用户
48
- * @localEn RandomUser
49
- */
50
- export const REQUEST_RANDOM_USER = 'request__randomUser';
51
- /**
52
- * @description Loading message
53
- * @localZh 加载中______
54
- * @localEn Loading______
55
- */
56
- export const REQUEST_LOADING = 'request__loading';
57
- /**
58
- * @description Random user result message
59
- * @localZh 随机用户 结果是
60
- * @localEn RandomUser result is
61
- */
62
- export const REQUEST_RANDOM_USER_RESULT = 'request__randomUserResult';
63
- /**
64
- * @description Random user error message
65
- * @localZh 随机用户 错误是
66
- * @localEn RandomUser error is
67
- */
68
- export const REQUEST_RANDOM_USER_ERROR = 'request__randomUserError';
69
- /**
70
- * @description Trigger abort request button text
71
- * @localZh 触发中止请求
72
- * @localEn Trigger Abort Request
73
- */
74
- export const REQUEST_TRIGGER_ABORT = 'request__triggerAbortRequest';
75
- /**
76
- * @description Stop abort request button text
77
- * @localZh 停止中止请求
78
- * @localEn Stop Abort Request
79
- */
80
- export const REQUEST_STOP_ABORT = 'request__stopAbortRequest';
81
- /**
82
- * @description Abort request result message
83
- * @localZh 中止请求 结果是
84
- * @localEn Abort Request Result
85
- */
86
- export const REQUEST_ABORT_RESULT = 'request__abortRequestResult';
87
- /**
88
- * @description Abort request error message
89
- * @localZh 中止请求 错误是
90
- * @localEn Abort Request Error
91
- */
92
- export const REQUEST_ABORT_ERROR = 'request__abortRequestError';
93
-
94
- /**
95
- * @description Request page timeout title
96
- * @localZh 请求超时时间
97
- * @localEn Request Timeout
98
- */
99
- export const PAGE_REQUEST_TIMEOUT = 'page__request__timeout';
100
- /**
101
- * @description Request page hello api title
102
- * @localZh AI API: Hello
103
- * @localEn AI API: Hello
104
- */
105
- export const PAGE_REQUEST_HELLO_TITLE = 'page__request__hello__title';
106
- /**
107
- * @description Request page hello api description
108
- * @localZh 函数式 api, 使用了 FetchURLPlugin, RequestCommonPlugin, ApiMockPlugin, RequestLogger 插件
109
- * @localEn Functional API using FetchURLPlugin, RequestCommonPlugin, ApiMockPlugin, RequestLogger plugins
110
- */
111
- export const PAGE_REQUEST_HELLO_DESCRIPTION =
112
- 'page__request__hello__description';
113
- /**
114
- * @description Request page hello button text
115
- * @localZh Hello
116
- * @localEn Hello
117
- */
118
- export const PAGE_REQUEST_HELLO_BUTTON = 'page__request__hello__button';
119
- /**
120
- * @description Request page ip info title
121
- * @localZh FeApi: IP Information
122
- * @localEn FeApi: IP Information
123
- */
124
- export const PAGE_REQUEST_IP_INFO_TITLE = 'page__request__ip_info__title';
125
- /**
126
- * @description Request page ip info description
127
- * @localZh RequestScheduler 类式 api, 使用了 FetchURLPlugin, RequestCommonPlugin, RequestLogger, ApiPickDataPlugin 插件, 其中 ApiPickDataPlugin 插件可以将返回类型统一扁平到 data 字段
128
- * @localEn RequestScheduler class API using FetchURLPlugin, RequestCommonPlugin, RequestLogger, ApiPickDataPlugin plugins, where ApiPickDataPlugin can flatten return types to data field
129
- */
130
- export const PAGE_REQUEST_IP_INFO_DESCRIPTION =
131
- 'page__request__ip_info__description';
132
- /**
133
- * @description Request page random user title
134
- * @localZh UserApi: Random User
135
- * @localEn UserApi: Random User
136
- */
137
- export const PAGE_REQUEST_RANDOM_USER_TITLE =
138
- 'page__request__random_user__title';
139
- /**
140
- * @description Request page random user description
141
- * @localZh RequestTransaction 类式 api, 使用了 FetchURLPlugin, RequestCommonPlugin, ApiMockPlugin, FetchAbortPlugin, RequestLogger, ApiCatchPlugin 插件, 其中 FetchAbortPlugin 可以中止请求, ApiCatchPlugin 可以将捕获的错误统一到 apiCatchResult 字段
142
- * @localEn RequestTransaction class API using FetchURLPlugin, RequestCommonPlugin, ApiMockPlugin, FetchAbortPlugin, RequestLogger, ApiCatchPlugin plugins, where FetchAbortPlugin can abort requests, ApiCatchPlugin can unify caught errors to apiCatchResult field
143
- */
144
- export const PAGE_REQUEST_RANDOM_USER_DESCRIPTION =
145
- 'page__request__random_user__description';
146
- /**
147
- * @description Request page api catch result title
148
- * @localZh UserApi: Api Catch Result
149
- * @localEn UserApi: Api Catch Result
150
- */
151
- export const PAGE_REQUEST_API_CATCH_TITLE = 'page__request__api_catch__title';
152
- /**
153
- * @description Request page abort request title
154
- * @localZh UserApi: Abort Request
155
- * @localEn UserApi: Abort Request
156
- */
157
- export const PAGE_REQUEST_ABORT_TITLE = 'page__request__abort__title';
158
- /**
159
- * @description Request page trigger abort request button
160
- * @localZh 触发中止请求
161
- * @localEn Trigger Abort Request
162
- */
163
- export const PAGE_REQUEST_TRIGGER_ABORT = 'page__request__trigger_abort';
164
- /**
165
- * @description Request page stop abort request button
166
- * @localZh 停止中止请求
167
- * @localEn Stop Abort Request
168
- */
169
- export const PAGE_REQUEST_STOP_ABORT = 'page__request__stop_abort';
170
- /**
171
- * @description Request page trigger api catch result button
172
- * @localZh 触发 API 捕获结果
173
- * @localEn Trigger API Catch Result
174
- */
175
- export const PAGE_REQUEST_TRIGGER_API_CATCH =
176
- 'page__request__trigger_api_catch';
177
- /**
178
- * @description Request page stop api catch result button
179
- * @localZh 停止 API 捕获结果
180
- * @localEn Stop API Catch Result
181
- */
182
- export const PAGE_REQUEST_STOP_API_CATCH = 'page__request__stop_api_catch';
@@ -1,21 +0,0 @@
1
- import { injectable } from 'inversify';
2
- import {
3
- ChatActionInterface,
4
- type MessageInterface,
5
- type ChatStateInterface
6
- } from '@/uikit/components/chat/ChatActionInterface';
7
-
8
- class ChatState implements ChatStateInterface {
9
- messages: MessageInterface[] = [];
10
- }
11
-
12
- @injectable()
13
- export class ChatAction extends ChatActionInterface<ChatStateInterface> {
14
- constructor() {
15
- super(() => new ChatState());
16
- }
17
-
18
- focus(): void {
19
- console.log('focus');
20
- }
21
- }
@@ -1,36 +0,0 @@
1
- import { injectable } from 'inversify';
2
-
3
- import type { FocusBarStateInterface } from '@/uikit/components/chat/FocusBarActionInterface';
4
- import { FocusBarActionInterface } from '@/uikit/components/chat/FocusBarActionInterface';
5
- import { RequestState } from './RequestState';
6
-
7
- class FocusBarState implements FocusBarStateInterface {
8
- showHistoryArea = false;
9
- inputValue = '';
10
- sendState = new RequestState();
11
- }
12
-
13
- @injectable()
14
- export class FocusBarAction extends FocusBarActionInterface<FocusBarStateInterface> {
15
- constructor() {
16
- super(() => new FocusBarState());
17
- }
18
-
19
- sendMessage(_message: string): Promise<void> {
20
- return new Promise((resolve) => {
21
- this.emit(this.cloneState({ sendState: new RequestState(true) }));
22
- setTimeout(() => {
23
- this.emit(this.cloneState({ sendState: new RequestState().end() }));
24
- resolve();
25
- }, 1000);
26
- });
27
- }
28
-
29
- setInputValue(value: string): void {
30
- this.emit(this.cloneState({ inputValue: value }));
31
- }
32
-
33
- clearInput(): void {
34
- this.emit(this.cloneState({ inputValue: '' }));
35
- }
36
- }
@@ -1,20 +0,0 @@
1
- import type { AsyncStateInterface } from '@/base/port/AsyncStateInterface';
2
-
3
- export class RequestState<T = unknown> implements AsyncStateInterface<T> {
4
- startTime: number;
5
- endTime: number;
6
-
7
- constructor(
8
- public loading: boolean = false,
9
- public result: T | null = null,
10
- public error: unknown | null = null
11
- ) {
12
- this.startTime = Date.now();
13
- this.endTime = 0;
14
- }
15
-
16
- end(): this {
17
- this.endTime = Date.now();
18
- return this;
19
- }
20
- }
@@ -1,85 +0,0 @@
1
- import { StoreInterface } from '@qlover/corekit-bridge';
2
- import { RequestState } from '../cases/RequestState';
3
- import type { PaginationInterface } from '../../server/port/PaginationInterface';
4
- import type { StoreStateInterface } from '@qlover/corekit-bridge';
5
-
6
- export interface AdminPageListParams {
7
- page: number;
8
- pageSize: number;
9
- }
10
-
11
- export class AdminPageState implements StoreStateInterface {
12
- listParams: AdminPageListParams = {
13
- page: 1,
14
- pageSize: 10
15
- };
16
- initState = new RequestState<unknown>();
17
- listState = new RequestState<PaginationInterface<unknown>>();
18
- }
19
-
20
- export abstract class AdminPageInterface<
21
- S extends AdminPageState
22
- > extends StoreInterface<S> {
23
- /**
24
- * 初始化
25
- * @returns
26
- */
27
- async initialize(): Promise<unknown> {
28
- this.emit(
29
- this.cloneState({
30
- initState: new RequestState(true)
31
- } as Partial<S>)
32
- );
33
-
34
- try {
35
- const result = await this.fetchList(this.state.listParams);
36
-
37
- this.emit(
38
- this.cloneState({
39
- initState: new RequestState(false, result).end()
40
- } as Partial<S>)
41
- );
42
- return result;
43
- } catch (error) {
44
- this.emit(
45
- this.cloneState({
46
- initState: new RequestState(false, null, error).end()
47
- } as Partial<S>)
48
- );
49
-
50
- return error;
51
- }
52
- }
53
-
54
- /**
55
- * 销毁
56
- */
57
- destroy(): void {
58
- this.reset();
59
- }
60
-
61
- /**
62
- * 获取列表
63
- * @param params
64
- * @returns
65
- */
66
- abstract fetchList(
67
- params: Partial<AdminPageListParams>
68
- ): Promise<PaginationInterface<unknown>>;
69
-
70
- changeListState(state: RequestState<unknown>): void {
71
- this.emit(
72
- this.cloneState({
73
- listState: state
74
- } as Partial<S>)
75
- );
76
- }
77
-
78
- changeListParams(params: Partial<AdminPageListParams>): void {
79
- this.emit(
80
- this.cloneState({
81
- listParams: params
82
- } as Partial<S>)
83
- );
84
- }
85
- }
@@ -1,7 +0,0 @@
1
- export interface AsyncStateInterface<T> {
2
- loading: boolean;
3
- result: T | null;
4
- error: unknown | null;
5
- startTime: number;
6
- endTime: number;
7
- }
@@ -1,45 +0,0 @@
1
- import { inject, injectable } from 'inversify';
2
- import type { PaginationInterface } from '@/server/port/PaginationInterface';
3
- import {
4
- AdminPageInterface,
5
- type AdminPageListParams,
6
- AdminPageState
7
- } from '../port/AdminPageInterface';
8
- import { AdminUserApi } from './adminApi/AdminUserApi';
9
- import { RequestState } from '../cases/RequestState';
10
-
11
- @injectable()
12
- export class AdminUserService extends AdminPageInterface<AdminPageState> {
13
- constructor(@inject(AdminUserApi) protected adminUserApi: AdminUserApi) {
14
- super(() => new AdminPageState());
15
- }
16
-
17
- override async fetchList(
18
- params: Partial<AdminPageListParams>
19
- ): Promise<PaginationInterface<unknown>> {
20
- this.changeListState(new RequestState(true));
21
-
22
- try {
23
- const response = await this.adminUserApi.getUserList(
24
- Object.assign({}, this.state.listParams, params)
25
- );
26
-
27
- if (response.data.success) {
28
- const paginationData = response.data
29
- .data as PaginationInterface<unknown>;
30
-
31
- this.changeListState(new RequestState(false, paginationData));
32
-
33
- return paginationData;
34
- }
35
-
36
- this.changeListState(
37
- new RequestState(false, null, response.data.message)
38
- );
39
- } catch (error) {
40
- this.changeListState(new RequestState(false, null, error));
41
- }
42
-
43
- return this.state.listState.result!;
44
- }
45
- }
@@ -1,17 +0,0 @@
1
- 'use client';
2
-
3
- import { ChatAction } from '@/base/cases/ChatAction';
4
- import { FocusBarAction } from '@/base/cases/FocusBarAction';
5
- import { useIOC } from '../hook/useIOC';
6
- import { ChatWrap } from './chat/ChatWrap';
7
-
8
- export function ChatRoot() {
9
- const chatAction = useIOC(ChatAction);
10
- const focusBarAction = useIOC(FocusBarAction);
11
-
12
- return (
13
- <div data-testid="ChatRoot" className="fixed bottom-0 right-0 ">
14
- <ChatWrap chatAction={chatAction} focusBarAction={focusBarAction} />
15
- </div>
16
- );
17
- }
@@ -1,30 +0,0 @@
1
- import {
2
- StoreInterface,
3
- type StoreStateInterface
4
- } from '@qlover/corekit-bridge';
5
-
6
- export const MessageType = Object.freeze({
7
- USER: 'user',
8
- ASSISTANT: 'assistant'
9
- });
10
-
11
- export type MessageTypeValue = (typeof MessageType)[keyof typeof MessageType];
12
-
13
- export interface MessageInterface {
14
- id: string;
15
- content: unknown;
16
- role: MessageTypeValue;
17
- createdAt: string;
18
-
19
- loading?: boolean;
20
- }
21
-
22
- export interface ChatStateInterface extends StoreStateInterface {
23
- messages: MessageInterface[];
24
- }
25
-
26
- export abstract class ChatActionInterface<
27
- S extends ChatStateInterface
28
- > extends StoreInterface<S> {
29
- abstract focus(): void;
30
- }
@@ -1,65 +0,0 @@
1
- import { SendOutlined } from '@ant-design/icons';
2
- import { Button, Input } from 'antd';
3
- import { useCallback, useRef } from 'react';
4
- import { useStore } from '../../hook/useStore';
5
- import type {
6
- FocusBarActionInterface,
7
- FocusBarStateInterface
8
- } from './FocusBarActionInterface';
9
-
10
- export function ChatFocusBar({
11
- focusBarAction
12
- }: {
13
- focusBarAction: FocusBarActionInterface<FocusBarStateInterface>;
14
- }) {
15
- const inputRef = useRef<HTMLTextAreaElement>(null);
16
- const { inputValue } = useStore(focusBarAction);
17
- const sendState = useStore(focusBarAction, (state) => state.sendState);
18
-
19
- const handleInputChange = useCallback(
20
- (e: React.ChangeEvent<HTMLTextAreaElement>) => {
21
- focusBarAction.setInputValue(e.target.value);
22
- },
23
- [focusBarAction]
24
- );
25
-
26
- const handleKeyDown = useCallback(
27
- (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
28
- if (e.key === 'Enter' && !e.shiftKey) {
29
- e.preventDefault();
30
- focusBarAction.sendMessage(inputValue);
31
- }
32
- },
33
- [focusBarAction, inputValue]
34
- );
35
-
36
- const sending = sendState.loading;
37
-
38
- return (
39
- <div
40
- data-testid="ChatFocusBarInput"
41
- className="flex items-end gap-2 p-4 bg-elevated border-t border-c-border"
42
- >
43
- <Input.TextArea
44
- ref={inputRef}
45
- disabled={sending}
46
- value={inputValue}
47
- onChange={handleInputChange}
48
- onKeyDown={handleKeyDown}
49
- placeholder="Type your message..."
50
- rows={1}
51
- />
52
- <Button
53
- data-testid="ChatFocusBarSendButton"
54
- onClick={() => {
55
- focusBarAction.sendMessage(inputValue);
56
- }}
57
- type="primary"
58
- className="flex items-center justify-center !h-10 !w-10 !rounded-full !bg-c-brand !text-white hover:!bg-c-brand-hover transition-colors"
59
- icon={<SendOutlined />}
60
- loading={sending}
61
- disabled={sending}
62
- />
63
- </div>
64
- );
65
- }
@@ -1,59 +0,0 @@
1
- import { useEffect, useRef } from 'react';
2
- import { MessageType } from './ChatActionInterface';
3
- import { useStore } from '../../hook/useStore';
4
- import type {
5
- ChatActionInterface,
6
- ChatStateInterface,
7
- MessageInterface
8
- } from './ChatActionInterface';
9
-
10
- function MessageItem({ message }: { message: MessageInterface }) {
11
- return (
12
- <div
13
- data-testid="MessageItem"
14
- className={`flex ${
15
- message.role === MessageType.USER ? 'justify-end' : 'justify-start'
16
- } mb-4`}
17
- >
18
- <div
19
- data-testid="MessageItemContent"
20
- className={`max-w-[70%] rounded-lg p-3 ${
21
- message.role === MessageType.USER
22
- ? 'bg-blue-500 text-white'
23
- : 'bg-gray-100 dark:bg-gray-700'
24
- }`}
25
- >
26
- <p className="whitespace-pre-wrap break-words">{message.content}</p>
27
- <div className="mt-1 text-xs opacity-70">
28
- {new Date(message.createdAt).toLocaleTimeString()}
29
- </div>
30
- </div>
31
- </div>
32
- );
33
- }
34
-
35
- export function ChatMessages({
36
- chatAction
37
- }: {
38
- chatAction: ChatActionInterface<ChatStateInterface>;
39
- }) {
40
- const messagesEndRef = useRef<HTMLDivElement>(null);
41
- const { messages } = useStore(chatAction);
42
-
43
- useEffect(() => {
44
- messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
45
- }, [messages]);
46
-
47
- return (
48
- <div data-testid="ChatMessages" className="flex-1 overflow-y-auto p-4">
49
- {messages.map((message: MessageInterface) => (
50
- <MessageItem
51
- data-testid="MessageItem"
52
- key={message.id}
53
- message={message}
54
- />
55
- ))}
56
- <div ref={messagesEndRef} />
57
- </div>
58
- );
59
- }
@@ -1,28 +0,0 @@
1
- import { ChatFocusBar } from './ChatFocusBar';
2
- import { ChatMessages } from './ChatMessages';
3
- import type {
4
- ChatActionInterface,
5
- ChatStateInterface
6
- } from './ChatActionInterface';
7
- import type {
8
- FocusBarActionInterface,
9
- FocusBarStateInterface
10
- } from './FocusBarActionInterface';
11
-
12
- export function ChatWrap({
13
- chatAction,
14
- focusBarAction
15
- }: {
16
- chatAction: ChatActionInterface<ChatStateInterface>;
17
- focusBarAction: FocusBarActionInterface<FocusBarStateInterface>;
18
- }) {
19
- return (
20
- <div
21
- data-testid="ChatWrap"
22
- className="flex h-full flex-col p-2 bg-primary shadow-2xl"
23
- >
24
- <ChatMessages chatAction={chatAction} />
25
- <ChatFocusBar focusBarAction={focusBarAction} />
26
- </div>
27
- );
28
- }
@@ -1,19 +0,0 @@
1
- import {
2
- StoreInterface,
3
- type StoreStateInterface
4
- } from '@qlover/corekit-bridge';
5
- import type { AsyncStateInterface } from '@/base/port/AsyncStateInterface';
6
-
7
- export interface FocusBarStateInterface extends StoreStateInterface {
8
- showHistoryArea: boolean;
9
- inputValue: string;
10
- sendState: AsyncStateInterface<unknown>;
11
- }
12
-
13
- export abstract class FocusBarActionInterface<
14
- S extends FocusBarStateInterface
15
- > extends StoreInterface<S> {
16
- abstract setInputValue(value: string): void;
17
- abstract clearInput(): void;
18
- abstract sendMessage(message: string): void | Promise<void>;
19
- }
@@ -1,17 +0,0 @@
1
- import { useEffect, useState } from 'react';
2
-
3
- export const useMountedClient = () => {
4
- const [mounted, setMounted] = useState(false);
5
-
6
- useEffect(() => {
7
- const timer = requestAnimationFrame(() => {
8
- setMounted(true);
9
- });
10
-
11
- return () => {
12
- cancelAnimationFrame(timer);
13
- };
14
- }, []);
15
-
16
- return mounted;
17
- };
@@ -1,15 +0,0 @@
1
- import { useSliceStore, type SliceStore } from '@qlover/slice-store-react';
2
- import type {
3
- StoreInterface,
4
- StoreStateInterface
5
- } from '@qlover/corekit-bridge';
6
-
7
- export function useStore<
8
- C extends StoreInterface<StoreStateInterface>,
9
- State = C['state']
10
- >(store: C, selector?: (state: C['state']) => State): State {
11
- return useSliceStore(
12
- store as unknown as SliceStore<StoreStateInterface>,
13
- selector
14
- );
15
- }
@@ -1,13 +0,0 @@
1
- import { vi } from 'vitest';
2
- import { I18nService } from '@/base/services/I18nService';
3
-
4
- export class MockI18nService extends I18nService {
5
- constructor() {
6
- super('/');
7
- }
8
-
9
- t = vi.fn((key: string) => key);
10
- changeLanguage = vi.fn();
11
- changeLoading = vi.fn();
12
- onBefore = vi.fn();
13
- }