@qlover/create-app 0.10.1 → 0.10.3

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 (214) hide show
  1. package/CHANGELOG.md +178 -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/index.cjs +4 -4
  5. package/dist/index.js +4 -4
  6. package/dist/templates/next-app/config/IOCIdentifier.ts +2 -2
  7. package/dist/templates/next-app/config/Identifier/common/common.ts +14 -0
  8. package/dist/templates/next-app/config/Identifier/pages/index.ts +1 -0
  9. package/dist/templates/next-app/config/Identifier/pages/page.about.ts +20 -0
  10. package/dist/templates/next-app/config/common.ts +1 -1
  11. package/dist/templates/next-app/config/cookies.ts +23 -0
  12. package/dist/templates/next-app/config/i18n/AboutI18n.ts +14 -0
  13. package/dist/templates/next-app/config/i18n/i18nConfig.ts +3 -1
  14. package/dist/templates/next-app/config/i18n/index.ts +1 -0
  15. package/dist/templates/next-app/config/i18n/loginI18n.ts +8 -0
  16. package/dist/templates/next-app/config/theme.ts +4 -0
  17. package/dist/templates/next-app/eslint.config.mjs +9 -2
  18. package/dist/templates/next-app/next.config.ts +1 -0
  19. package/dist/templates/next-app/package.json +17 -6
  20. package/dist/templates/next-app/public/locales/en.json +5 -0
  21. package/dist/templates/next-app/public/locales/zh.json +5 -0
  22. package/dist/templates/next-app/src/app/[locale]/admin/AdminI18nProvider.tsx +37 -0
  23. package/dist/templates/next-app/src/app/[locale]/admin/layout.tsx +30 -6
  24. package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +1 -1
  25. package/dist/templates/next-app/src/app/[locale]/layout.tsx +47 -10
  26. package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +1 -1
  27. package/dist/templates/next-app/src/app/[locale]/login/page.tsx +22 -10
  28. package/dist/templates/next-app/src/app/[locale]/page.tsx +23 -8
  29. package/dist/templates/next-app/src/app/[locale]/register/page.tsx +21 -9
  30. package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +7 -28
  31. package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +7 -34
  32. package/dist/templates/next-app/src/app/api/admin/locales/route.ts +12 -34
  33. package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +7 -26
  34. package/dist/templates/next-app/src/app/api/admin/users/route.ts +14 -33
  35. package/dist/templates/next-app/src/app/api/locales/json/route.ts +13 -25
  36. package/dist/templates/next-app/src/app/api/user/login/route.ts +6 -46
  37. package/dist/templates/next-app/src/app/api/user/logout/route.ts +5 -24
  38. package/dist/templates/next-app/src/app/api/user/register/route.ts +6 -45
  39. package/dist/templates/next-app/src/app/manifest.ts +16 -0
  40. package/dist/templates/next-app/src/app/robots.txt +2 -0
  41. package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +3 -3
  42. package/dist/templates/next-app/src/base/cases/AppConfig.ts +14 -13
  43. package/dist/templates/next-app/src/base/cases/Datetime.ts +3 -3
  44. package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +8 -2
  45. package/dist/templates/next-app/src/base/cases/DialogHandler.ts +30 -4
  46. package/dist/templates/next-app/src/base/cases/InversifyContainer.ts +16 -4
  47. package/dist/templates/next-app/src/base/cases/NavigateBridge.ts +20 -4
  48. package/dist/templates/next-app/src/base/cases/RequestEncryptPlugin.ts +8 -2
  49. package/dist/templates/next-app/src/base/cases/ResourceState.ts +3 -3
  50. package/dist/templates/next-app/src/base/cases/RouterService.ts +28 -10
  51. package/dist/templates/next-app/src/base/cases/StringEncryptor.ts +14 -2
  52. package/dist/templates/next-app/src/base/cases/TranslateI18nInterface.ts +1 -1
  53. package/dist/templates/next-app/src/base/cases/UserServiceApi.ts +20 -5
  54. package/dist/templates/next-app/src/base/cases/ZodColumnBuilder.ts +31 -8
  55. package/dist/templates/next-app/src/base/port/AdminLayoutInterface.ts +4 -1
  56. package/dist/templates/next-app/src/base/port/AppApiInterface.ts +22 -0
  57. package/dist/templates/next-app/src/base/port/I18nServiceInterface.ts +27 -7
  58. package/dist/templates/next-app/src/base/port/IOCInterface.ts +9 -0
  59. package/dist/templates/next-app/src/base/services/AdminPageEvent.ts +1 -1
  60. package/dist/templates/next-app/src/base/services/AdminPageScheduler.ts +3 -3
  61. package/dist/templates/next-app/src/base/services/I18nService.ts +20 -10
  62. package/dist/templates/next-app/src/base/services/ResourceService.ts +32 -11
  63. package/dist/templates/next-app/src/base/services/UserService.ts +12 -3
  64. package/dist/templates/next-app/src/base/services/adminApi/AdminLocalesApi.ts +9 -6
  65. package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +20 -5
  66. package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +21 -4
  67. package/dist/templates/next-app/src/base/services/appApi/AppUserApi.ts +12 -3
  68. package/dist/templates/next-app/src/base/services/appApi/AppUserApiBootstrap.ts +10 -2
  69. package/dist/templates/next-app/src/base/types/{PageProps.ts → AppPageRouter.ts} +4 -1
  70. package/dist/templates/next-app/src/base/types/PagesRouter.ts +9 -0
  71. package/dist/templates/next-app/src/core/bootstraps/BootstrapClient.ts +20 -6
  72. package/dist/templates/next-app/src/core/bootstraps/BootstrapServer.ts +27 -9
  73. package/dist/templates/next-app/src/core/bootstraps/BootstrapsRegistry.ts +6 -4
  74. package/dist/templates/next-app/src/core/clientIoc/ClientIOC.ts +39 -9
  75. package/dist/templates/next-app/src/core/clientIoc/ClientIOCRegister.ts +9 -2
  76. package/dist/templates/next-app/src/core/serverIoc/ServerIOC.ts +37 -10
  77. package/dist/templates/next-app/src/core/serverIoc/ServerIOCRegister.ts +9 -2
  78. package/dist/templates/next-app/src/i18n/loadMessages.ts +103 -0
  79. package/dist/templates/next-app/src/i18n/request.ts +3 -22
  80. package/dist/templates/next-app/src/pages/[locale]/about.tsx +61 -0
  81. package/dist/templates/next-app/src/pages/_app.tsx +50 -0
  82. package/dist/templates/next-app/src/pages/_document.tsx +13 -0
  83. package/dist/templates/next-app/src/{middleware.ts → proxy.ts} +2 -1
  84. package/dist/templates/next-app/src/server/AppErrorApi.ts +1 -1
  85. package/dist/templates/next-app/src/server/AppPageRouteParams.ts +107 -0
  86. package/dist/templates/next-app/src/server/AppSuccessApi.ts +1 -1
  87. package/dist/templates/next-app/src/server/NextApiServer.ts +62 -0
  88. package/dist/templates/next-app/src/server/PagesRouteParams.ts +146 -0
  89. package/dist/templates/next-app/src/server/PasswordEncrypt.ts +8 -2
  90. package/dist/templates/next-app/src/server/ServerAuth.ts +20 -5
  91. package/dist/templates/next-app/src/server/{sqlBridges/SupabaseBridge.ts → SupabaseBridge.ts} +50 -8
  92. package/dist/templates/next-app/src/server/UserCredentialToken.ts +8 -2
  93. package/dist/templates/next-app/src/server/controllers/AdminLocalesController.ts +86 -0
  94. package/dist/templates/next-app/src/server/controllers/AdminUserController.ts +42 -0
  95. package/dist/templates/next-app/src/server/controllers/LocalesController.ts +36 -0
  96. package/dist/templates/next-app/src/server/controllers/UserController.ts +86 -0
  97. package/dist/templates/next-app/src/server/port/AIControllerInterface.ts +8 -0
  98. package/dist/templates/next-app/src/server/port/AdminLocalesControllerInterface.ts +21 -0
  99. package/dist/templates/next-app/src/server/port/AdminUserControllerInterface.ts +11 -0
  100. package/dist/templates/next-app/src/server/port/LocalesControllerInterface.ts +10 -0
  101. package/dist/templates/next-app/src/server/port/{ParamsHandlerInterface.ts → RouteParamsnHandlerInterface.ts} +9 -2
  102. package/dist/templates/next-app/src/server/port/ServerInterface.ts +2 -2
  103. package/dist/templates/next-app/src/server/port/UserControllerInerface.ts +8 -0
  104. package/dist/templates/next-app/src/server/port/UserServiceInterface.ts +1 -1
  105. package/dist/templates/next-app/src/server/port/ValidatorInterface.ts +2 -2
  106. package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +31 -9
  107. package/dist/templates/next-app/src/server/repositorys/UserRepository.ts +15 -6
  108. package/dist/templates/next-app/src/server/services/AIService.ts +3 -1
  109. package/dist/templates/next-app/src/server/services/AdminAuthPlugin.ts +5 -2
  110. package/dist/templates/next-app/src/{base → server}/services/AdminLocalesService.ts +2 -2
  111. package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +29 -14
  112. package/dist/templates/next-app/src/server/services/ApiUserService.ts +6 -3
  113. package/dist/templates/next-app/src/server/services/UserService.ts +12 -3
  114. package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +24 -7
  115. package/dist/templates/next-app/src/server/validators/LoginValidator.ts +17 -5
  116. package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +17 -11
  117. package/dist/templates/next-app/src/styles/css/antd-themes/_common/_default.css +0 -44
  118. package/dist/templates/next-app/src/styles/css/antd-themes/_common/dark.css +0 -44
  119. package/dist/templates/next-app/src/styles/css/antd-themes/_common/pink.css +0 -44
  120. package/dist/templates/next-app/src/styles/css/index.css +1 -1
  121. package/dist/templates/next-app/src/styles/css/scrollbar.css +34 -0
  122. package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +34 -11
  123. package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +69 -39
  124. package/dist/templates/next-app/src/uikit/components/ClientRootProvider.tsx +64 -0
  125. package/dist/templates/next-app/src/uikit/components/ClinetRenderProvider.tsx +42 -0
  126. package/dist/templates/next-app/src/uikit/components/IOCProvider.tsx +34 -0
  127. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportEvent.ts +7 -1
  128. package/dist/templates/next-app/src/uikit/components-app/AppBridge.tsx +17 -0
  129. package/dist/templates/next-app/src/uikit/components-app/AppRoutePage.tsx +112 -0
  130. package/dist/templates/next-app/src/uikit/{components → components-app}/LanguageSwitcher.tsx +15 -19
  131. package/dist/templates/next-app/src/uikit/{components → components-app}/ThemeSwitcher.tsx +53 -52
  132. package/dist/templates/next-app/src/uikit/components-pages/LanguageSwitcher.tsx +98 -0
  133. package/dist/templates/next-app/src/uikit/components-pages/PagesRoutePage.tsx +93 -0
  134. package/dist/templates/next-app/src/uikit/context/IOCContext.ts +16 -4
  135. package/dist/templates/next-app/src/uikit/hook/useStrictEffect.ts +32 -0
  136. package/dist/templates/next-app/tsconfig.json +3 -2
  137. package/dist/templates/react-app/__tests__/__mocks__/BootstrapTest.ts +3 -1
  138. package/dist/templates/react-app/__tests__/__mocks__/MockAppConfig.ts +19 -19
  139. package/dist/templates/react-app/__tests__/__mocks__/MockDialogHandler.ts +8 -8
  140. package/dist/templates/react-app/__tests__/__mocks__/MockLogger.ts +9 -9
  141. package/dist/templates/react-app/__tests__/__mocks__/components/TestBootstrapsProvider.tsx +1 -1
  142. package/dist/templates/react-app/__tests__/__mocks__/i18nextHttpBackend.ts +5 -5
  143. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOC.ts +9 -5
  144. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOCRegister.ts +8 -4
  145. package/dist/templates/react-app/__tests__/src/base/cases/I18nKeyErrorPlugin.test.ts +4 -4
  146. package/dist/templates/react-app/__tests__/src/base/cases/InversifyContainer.test.ts +5 -5
  147. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapClient.test.ts +3 -3
  148. package/dist/templates/react-app/__tests__/src/uikit/components/chatMessage/ChatRoot.test.tsx +1 -1
  149. package/dist/templates/react-app/docs/en/components/chat-message-component.md +35 -29
  150. package/dist/templates/react-app/docs/en/components/chat-message-refactor.md +18 -5
  151. package/dist/templates/react-app/docs/en/components/message-base-list-component.md +11 -12
  152. package/dist/templates/react-app/docs/en/request.md +1 -3
  153. package/dist/templates/react-app/docs/zh/components/chat-message-component.md +35 -29
  154. package/dist/templates/react-app/docs/zh/components/chat-message-refactor.md +18 -5
  155. package/dist/templates/react-app/docs/zh/components/message-base-list-component.md +11 -12
  156. package/dist/templates/react-app/docs/zh/request.md +1 -3
  157. package/dist/templates/react-app/eslint.config.mjs +10 -5
  158. package/dist/templates/react-app/src/App.tsx +1 -1
  159. package/dist/templates/react-app/src/base/apis/feApi/FeApi.ts +2 -2
  160. package/dist/templates/react-app/src/base/apis/feApi/FeApiBootstarp.ts +14 -11
  161. package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +10 -16
  162. package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +12 -10
  163. package/dist/templates/react-app/src/base/cases/AppConfig.ts +19 -19
  164. package/dist/templates/react-app/src/base/cases/DialogHandler.ts +28 -5
  165. package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +5 -2
  166. package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +16 -4
  167. package/dist/templates/react-app/src/base/cases/PublicAssetsPath.ts +1 -1
  168. package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +6 -3
  169. package/dist/templates/react-app/src/base/cases/RequestLogger.ts +17 -8
  170. package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +4 -6
  171. package/dist/templates/react-app/src/base/cases/ResourceState.ts +3 -3
  172. package/dist/templates/react-app/src/base/cases/RouterLoader.ts +3 -3
  173. package/dist/templates/react-app/src/base/cases/TranslateI18nInterface.ts +1 -1
  174. package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +2 -2
  175. package/dist/templates/react-app/src/base/port/IOCInterface.ts +4 -2
  176. package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +5 -5
  177. package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +7 -7
  178. package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +8 -8
  179. package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +4 -2
  180. package/dist/templates/react-app/src/base/services/BaseLayoutService.ts +3 -3
  181. package/dist/templates/react-app/src/base/services/I18nService.ts +24 -13
  182. package/dist/templates/react-app/src/base/services/IdentifierService.ts +21 -26
  183. package/dist/templates/react-app/src/base/services/RouteService.ts +8 -8
  184. package/dist/templates/react-app/src/base/services/UserBootstrap.ts +2 -2
  185. package/dist/templates/react-app/src/base/services/UserGatewayPlugin.ts +9 -5
  186. package/dist/templates/react-app/src/base/services/UserService.ts +10 -4
  187. package/dist/templates/react-app/src/core/bootstraps/BootstrapClient.ts +3 -1
  188. package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +5 -2
  189. package/dist/templates/react-app/src/core/clientIoc/ClientIOC.ts +11 -4
  190. package/dist/templates/react-app/src/core/clientIoc/ClientIOCRegister.ts +5 -4
  191. package/dist/templates/react-app/src/pages/base/Layout.tsx +1 -1
  192. package/dist/templates/react-app/src/styles/css/antd-themes/_common/_default.css +0 -44
  193. package/dist/templates/react-app/src/styles/css/antd-themes/_common/dark.css +0 -44
  194. package/dist/templates/react-app/src/styles/css/antd-themes/_common/pink.css +0 -44
  195. package/dist/templates/react-app/src/styles/css/index.css +1 -1
  196. package/dist/templates/react-app/src/styles/css/scrollbar.css +34 -0
  197. package/dist/templates/react-app/src/uikit/bridges/ExecutorPageBridge.ts +2 -2
  198. package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +4 -4
  199. package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +8 -2
  200. package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +6 -6
  201. package/dist/templates/react-app/src/uikit/components/AppRouterProvider.tsx +1 -1
  202. package/dist/templates/react-app/src/uikit/components/BootstrapsProvider.tsx +1 -3
  203. package/dist/templates/react-app/src/uikit/components/MessageBaseList.tsx +4 -1
  204. package/dist/templates/react-app/src/uikit/components/chatMessage/ChatMessageBridge.ts +39 -16
  205. package/dist/templates/react-app/src/uikit/components/chatMessage/MessageApi.ts +4 -2
  206. package/package.json +3 -3
  207. package/dist/templates/next-app/src/server/PageParams.ts +0 -66
  208. package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +0 -80
  209. package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +0 -65
  210. package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +0 -58
  211. package/dist/templates/next-app/src/uikit/components/NextIntlProvider.tsx +0 -21
  212. package/dist/templates/react-app/makes/eslint-utils.mjs +0 -195
  213. /package/dist/templates/next-app/{src/app/[locale] → public}/favicon.ico +0 -0
  214. /package/dist/templates/next-app/src/uikit/{components → components-app}/LogoutButton.tsx +0 -0
@@ -19,10 +19,10 @@ class MockI18nService extends I18nService {
19
19
  super('/');
20
20
  }
21
21
 
22
- t = vi.fn((key: string) => key);
23
- changeLanguage = vi.fn();
24
- changeLoading = vi.fn();
25
- onBefore = vi.fn();
22
+ public t = vi.fn((key: string) => key);
23
+ public changeLanguage = vi.fn();
24
+ public changeLoading = vi.fn();
25
+ public onBefore = vi.fn();
26
26
  }
27
27
 
28
28
  describe('I18nKeyErrorPlugin', () => {
@@ -86,7 +86,7 @@ describe('InversifyContainer', () => {
86
86
  it('should auto bind injectable class', () => {
87
87
  @injectable()
88
88
  class TestService {
89
- getValue(): string {
89
+ public getValue(): string {
90
90
  return 'test';
91
91
  }
92
92
  }
@@ -100,7 +100,7 @@ describe('InversifyContainer', () => {
100
100
  it('should handle manual dependency injection', () => {
101
101
  @injectable()
102
102
  class ServiceA {
103
- getValue(): string {
103
+ public getValue(): string {
104
104
  return 'A';
105
105
  }
106
106
  }
@@ -109,7 +109,7 @@ describe('InversifyContainer', () => {
109
109
  class ServiceB {
110
110
  constructor(private serviceA: ServiceA) {}
111
111
 
112
- getValueWithA(): string {
112
+ public getValueWithA(): string {
113
113
  return `B with ${this.serviceA.getValue()}`;
114
114
  }
115
115
  }
@@ -129,7 +129,7 @@ describe('InversifyContainer', () => {
129
129
  @injectable()
130
130
  class TestService {
131
131
  private count = 0;
132
- increment(): number {
132
+ public increment(): number {
133
133
  return ++this.count;
134
134
  }
135
135
  }
@@ -147,7 +147,7 @@ describe('InversifyContainer', () => {
147
147
  class ComplexService {
148
148
  private state = { count: 0 };
149
149
 
150
- updateState(): { count: number } {
150
+ public updateState(): { count: number } {
151
151
  this.state.count++;
152
152
  return this.state;
153
153
  }
@@ -37,7 +37,7 @@ describe('BootstrapClient', () => {
37
37
  const mockRegister = vi.fn().mockReturnValue([testBootstrapPlugin]);
38
38
 
39
39
  class TestBootstrapsRegistry implements BootstrapsRegistryInterface {
40
- register = mockRegister;
40
+ public register = mockRegister;
41
41
  }
42
42
 
43
43
  const args: BootstrapClientArgs = {
@@ -70,7 +70,7 @@ describe('BootstrapClient', () => {
70
70
  );
71
71
 
72
72
  class TestBootstrapsRegistry implements BootstrapsRegistryInterface {
73
- register = mockRegister;
73
+ public register = mockRegister;
74
74
  }
75
75
 
76
76
  const args: BootstrapClientArgs = {
@@ -114,7 +114,7 @@ describe('BootstrapClient', () => {
114
114
  );
115
115
 
116
116
  class TestBootstrapsRegistry implements BootstrapsRegistryInterface {
117
- register = mockRegister;
117
+ public register = mockRegister;
118
118
  }
119
119
 
120
120
  const args: BootstrapClientArgs = {
@@ -24,7 +24,7 @@ const mockI18n: ChatMessageI18nInterface = {
24
24
 
25
25
  // Simple mock gateway for testing
26
26
  class MockMessageGateway implements MessageGetwayInterface {
27
- sendMessage = vi.fn();
27
+ public sendMessage = vi.fn();
28
28
  }
29
29
 
30
30
  describe('ChatRoot Component', () => {
@@ -42,6 +42,7 @@ src/pages/base/
42
42
  ### 1. ChatMessageBridge (Bridge Layer)
43
43
 
44
44
  Bridge connecting UI and data layer, handles:
45
+
45
46
  - Message sending logic
46
47
  - Draft management
47
48
  - State control
@@ -52,20 +53,23 @@ Bridge connecting UI and data layer, handles:
52
53
  Simulates backend API, supports three modes:
53
54
 
54
55
  #### Streaming Mode (stream: true)
56
+
55
57
  ```typescript
56
58
  {
57
- stream: true // Character-by-character output, stoppable
59
+ stream: true; // Character-by-character output, stoppable
58
60
  }
59
61
  ```
60
62
 
61
63
  #### Interruptible Normal Mode
64
+
62
65
  ```typescript
63
66
  {
64
- stream: false // One-time return, stoppable
67
+ stream: false; // One-time return, stoppable
65
68
  }
66
69
  ```
67
70
 
68
71
  #### Fast Normal Mode
72
+
69
73
  ```typescript
70
74
  // No options passed, one-time return, non-stoppable
71
75
  ```
@@ -73,6 +77,7 @@ Simulates backend API, supports three modes:
73
77
  ### 3. ChatMessageStore (State Management)
74
78
 
75
79
  Manages all message states:
80
+
76
81
  - `messages` - History message list
77
82
  - `draftMessages` - Draft message list
78
83
  - `streaming` - Whether streaming output is in progress
@@ -104,6 +109,7 @@ export default function ChatMessagePage() {
104
109
  ### Message Styles
105
110
 
106
111
  **User Messages**:
112
+
107
113
  - Blue background
108
114
  - Right-aligned
109
115
  - Max width 80%
@@ -111,6 +117,7 @@ export default function ChatMessagePage() {
111
117
  - Has retry button
112
118
 
113
119
  **AI Messages**:
120
+
114
121
  - Light background + border
115
122
  - Left-aligned
116
123
  - Max width 85%
@@ -132,25 +139,25 @@ export default function ChatMessagePage() {
132
139
  interface ChatMessageBridgeInterface<T> {
133
140
  // Send message
134
141
  send(message?: ChatMessage<T>): Promise<ChatMessage<T>>;
135
-
142
+
136
143
  // Stop sending
137
144
  stop(messageId?: string): boolean;
138
-
145
+
139
146
  // Stop all
140
147
  stopAll(): void;
141
-
148
+
142
149
  // Update content
143
150
  onChangeContent(content: T): void;
144
-
151
+
145
152
  // Get message store
146
153
  getMessageStore(): ChatMessageStore<T>;
147
-
154
+
148
155
  // Get first draft message
149
156
  getFirstDraftMessage(): ChatMessage<T> | null;
150
-
157
+
151
158
  // Get sending message
152
159
  getSendingMessage(): ChatMessage<T> | null;
153
-
160
+
154
161
  // Is send disabled
155
162
  getDisabledSend(): boolean;
156
163
  }
@@ -160,21 +167,18 @@ interface ChatMessageBridgeInterface<T> {
160
167
 
161
168
  ```typescript
162
169
  class MessageApi {
163
- async sendMessage<M>(
164
- message: M,
165
- options?: GatewayOptions<M>
166
- ): Promise<M>;
170
+ async sendMessage<M>(message: M, options?: GatewayOptions<M>): Promise<M>;
167
171
  }
168
172
 
169
173
  interface GatewayOptions<M> {
170
- stream?: boolean; // Whether streaming
171
- signal?: AbortSignal; // Stop signal
172
- onConnected?: () => void; // Connection success
174
+ stream?: boolean; // Whether streaming
175
+ signal?: AbortSignal; // Stop signal
176
+ onConnected?: () => void; // Connection success
173
177
  onChunk?: (msg: M) => void; // Streaming chunk callback
174
178
  onProgress?: (p: number) => void; // Progress callback
175
- onComplete?: (msg: M) => void; // Completion callback
176
- onAborted?: (msg: M) => void; // Stop callback
177
- onError?: (err: any) => void; // Error callback
179
+ onComplete?: (msg: M) => void; // Completion callback
180
+ onAborted?: (msg: M) => void; // Stop callback
181
+ onError?: (err: any) => void; // Error callback
178
182
  }
179
183
  ```
180
184
 
@@ -189,8 +193,8 @@ const [bridge] = useState(() => {
189
193
  gateway: messageApi,
190
194
  logger: logger,
191
195
  senderName: 'ChatSender',
192
- gatewayOptions: {
193
- stream: true // Change to false for normal mode
196
+ gatewayOptions: {
197
+ stream: true // Change to false for normal mode
194
198
  }
195
199
  }).use(new ChatSenderStrategy(SendFailureStrategy.KEEP_FAILED, logger));
196
200
  });
@@ -199,8 +203,8 @@ const [bridge] = useState(() => {
199
203
  ### 2. Custom Message Component
200
204
 
201
205
  ```typescript
202
- <MessagesList
203
- bridge={bridge}
206
+ <MessagesList
207
+ bridge={bridge}
204
208
  getMessageComponent={(props) => CustomMessageItem}
205
209
  />
206
210
  ```
@@ -217,13 +221,13 @@ async sendMessage<M>(message: M, options?: GatewayOptions<M>): Promise<M> {
217
221
  body: JSON.stringify(message),
218
222
  signal: options?.signal
219
223
  });
220
-
224
+
221
225
  // Handle streaming response
222
226
  if (options?.stream) {
223
227
  const reader = response.body?.getReader();
224
228
  // ... process streaming data
225
229
  }
226
-
230
+
227
231
  return response.json();
228
232
  }
229
233
  ```
@@ -233,6 +237,7 @@ async sendMessage<M>(message: M, options?: GatewayOptions<M>): Promise<M> {
233
237
  ### Test Features
234
238
 
235
239
  **Normal Messages**:
240
+
236
241
  ```
237
242
  Hello
238
243
  你好
@@ -240,6 +245,7 @@ Test message
240
245
  ```
241
246
 
242
247
  **Trigger Errors**:
248
+
243
249
  ```
244
250
  error
245
251
  Failed
@@ -247,6 +253,7 @@ test error
247
253
  ```
248
254
 
249
255
  **See Streaming Effect**:
256
+
250
257
  - Send any message
251
258
  - Watch character-by-character output
252
259
  - Click stop button to test interruption
@@ -277,13 +284,13 @@ MessageSender → MessageApi
277
284
 
278
285
  [Streaming Mode]
279
286
  onConnected → onChunk(word-by-word) → onComplete
280
-
287
+
281
288
  [Normal Mode]
282
289
  onConnected → onComplete
283
-
290
+
284
291
  [Error]
285
292
  onError
286
-
293
+
287
294
  [Stop]
288
295
  onAborted
289
296
 
@@ -311,4 +318,3 @@ UI Auto-updates
311
318
  ## 🎉 Summary
312
319
 
313
320
  ChatMessage is a fully-featured, elegantly designed chat component system, ready to use out of the box, supporting streaming output, error handling, state management, and other core features. Can be used directly in production or extended and customized as needed.
314
-
@@ -11,12 +11,14 @@ Refactored ChatMessage from a standalone page to a reusable component, integrate
11
11
  **File:** `src/uikit/components/chatMessage/ChatRoot.tsx`
12
12
 
13
13
  **Changes:**
14
+
14
15
  - Removed internal creation of `ChatMessageStore`, `MessageApi`, and `ChatMessageBridge`
15
16
  - Changed to accept `bridge` and `tt` (internationalization object) as props
16
17
  - Added `ChatRootProps` interface definition
17
18
  - Removed internal `useI18nInterface` call
18
19
 
19
20
  **Before:**
21
+
20
22
  ```typescript
21
23
  export function ChatRoot() {
22
24
  const messagesStore = useFactory(ChatMessageStore<string>);
@@ -29,7 +31,7 @@ export function ChatRoot() {
29
31
  gatewayOptions: { stream: true }
30
32
  }).use(new ChatSenderStrategy(SendFailureStrategy.KEEP_FAILED, logger));
31
33
  });
32
-
34
+
33
35
  return (
34
36
  <div data-testid="ChatRoot">
35
37
  <MessagesList bridge={bridge} />
@@ -40,6 +42,7 @@ export function ChatRoot() {
40
42
  ```
41
43
 
42
44
  **After:**
45
+
43
46
  ```typescript
44
47
  export interface ChatRootProps {
45
48
  bridge: ChatMessageBridge<string>;
@@ -61,12 +64,14 @@ export function ChatRoot({ bridge, tt }: ChatRootProps) {
61
64
  **File:** `src/pages/base/MessagePage.tsx`
62
65
 
63
66
  **Changes:**
67
+
64
68
  - Use `useI18nInterface` to get the internationalization object `tt` in MessagePage
65
69
  - Create `ChatMessageStore`, `MessageApi`, and `ChatMessageBridge` in MessagePage
66
70
  - Pass both `bridge` and `tt` to `ChatRoot` component via props
67
71
  - Also integrated the `MessageBaseList` component
68
72
 
69
73
  **Implementation:**
74
+
70
75
  ```typescript
71
76
  import { useFactory } from '@brain-toolkit/react-kit';
72
77
  import { chatMessageI18n } from '@config/i18n/chatMessageI18n';
@@ -112,11 +117,13 @@ export default function MessagePage() {
112
117
  ### 3. Child Component Refactoring (MessagesList, FocusBar, MessageItem)
113
118
 
114
119
  **Changes:**
120
+
115
121
  - Removed internal `useI18nInterface` calls from all child components
116
122
  - Changed to accept `tt` parameter via props
117
123
  - Updated Props interface definitions for each component
118
124
 
119
125
  **Example - MessagesList:**
126
+
120
127
  ```typescript
121
128
  // Before
122
129
  export function MessagesList({ bridge, ... }: MessagesListProps) {
@@ -139,37 +146,44 @@ export function MessagesList({ bridge, tt, ... }: MessagesListProps) {
139
146
  ### 4. Removed Standalone ChatMessagePage
140
147
 
141
148
  **Deleted Files:**
149
+
142
150
  - `src/pages/base/ChatMessagePage.tsx`
143
151
  - `config/Identifier/pages/page.chat.ts`
144
152
  - `config/i18n/chatI18n.ts`
145
153
 
146
154
  **Updated Files:**
155
+
147
156
  - `config/app.router.ts` - Removed `/chat` route configuration
148
157
  - `config/Identifier/pages/index.ts` - Removed `page.chat` export
149
158
 
150
159
  ## Advantages of Refactoring
151
160
 
152
161
  ### 1. Improved Component Reusability
162
+
153
163
  - `ChatRoot` is now a pure presentational component that can be used anywhere
154
164
  - Creation and configuration of `bridge` and `tt` are controlled by parent component for better flexibility
155
165
  - Parent component can customize internationalization content, supporting different language environments
156
166
 
157
167
  ### 2. Simplified Routing Structure
168
+
158
169
  - Reduced unnecessary routing layers
159
170
  - Directly integrated chat functionality into message page, aligning with business logic
160
171
 
161
172
  ### 3. Better Separation of Concerns
173
+
162
174
  - `ChatRoot` and its child components focus only on UI presentation
163
175
  - Business logic (store, api, bridge) is managed at the page level
164
176
  - Internationalization configuration is centrally managed at the page level
165
177
  - Easier to test and maintain
166
178
 
167
179
  ### 4. Reduced Boilerplate
180
+
168
181
  - No need to create a separate page for chat functionality
169
182
  - No need to create separate i18n configuration for the page
170
183
  - Child components don't need to repeatedly call `useI18nInterface`
171
184
 
172
185
  ### 5. Performance Improvement
186
+
173
187
  - Reduced number of hook calls (multiple child components share the same `tt` object)
174
188
  - Avoided redundant internationalization configuration parsing
175
189
 
@@ -197,7 +211,7 @@ import { MessageApi } from '@/uikit/components/chatMessage/MessageApi';
197
211
  function MyCustomChatPage() {
198
212
  // Get internationalization object
199
213
  const tt = useI18nInterface(chatMessageI18n);
200
-
214
+
201
215
  const messagesStore = useFactory(ChatMessageStore<string>);
202
216
  const messageApi = useFactory(MessageApi, messagesStore);
203
217
 
@@ -206,7 +220,7 @@ function MyCustomChatPage() {
206
220
  gateway: messageApi,
207
221
  logger: logger,
208
222
  senderName: 'MyCustomSender',
209
- gatewayOptions: {
223
+ gatewayOptions: {
210
224
  stream: true,
211
225
  // Can customize other options
212
226
  }
@@ -241,7 +255,7 @@ const customI18n: ChatMessageI18nInterface = {
241
255
  function MyCustomChatPage() {
242
256
  const tt = useI18nInterface(customI18n);
243
257
  // ... other logic
244
-
258
+
245
259
  return <ChatRoot bridge={bridge} tt={tt} />;
246
260
  }
247
261
  ```
@@ -267,4 +281,3 @@ function MyCustomChatPage() {
267
281
  - [ChatMessage Component Documentation](./chat-message-component.md)
268
282
  - [MessagePage Simplification Guide](./message-page-简化说明.md)
269
283
  - [Development Guide](./development-guide.md)
270
-
@@ -52,17 +52,17 @@ export default function MessagePage() {
52
52
 
53
53
  ### Supported Text
54
54
 
55
- | Text Item | Chinese | English |
56
- |-----------|---------|---------|
57
- | Title | 消息网关测试 | Message Gateway Test |
58
- | Description | 发送消息并等待网关响应 | Send messages and wait for gateway response |
59
- | Empty State | 暂无消息 | No messages yet |
60
- | User Label | 你 | You |
61
- | Gateway Label | 网关 | Gateway |
62
- | Processing | 处理中... | Processing... |
63
- | Failed Label | 网关(失败) | Gateway (Failed) |
64
- | Gateway Response | 网关响应 | Gateway Response |
65
- | Send Button | 发送 | Send |
55
+ | Text Item | Chinese | English |
56
+ | ---------------- | ---------------------- | ------------------------------------------- |
57
+ | Title | 消息网关测试 | Message Gateway Test |
58
+ | Description | 发送消息并等待网关响应 | Send messages and wait for gateway response |
59
+ | Empty State | 暂无消息 | No messages yet |
60
+ | User Label | 你 | You |
61
+ | Gateway Label | 网关 | Gateway |
62
+ | Processing | 处理中... | Processing... |
63
+ | Failed Label | 网关(失败) | Gateway (Failed) |
64
+ | Gateway Response | 网关响应 | Gateway Response |
65
+ | Send Button | 发送 | Send |
66
66
 
67
67
  ## 🧪 Testing Features
68
68
 
@@ -169,4 +169,3 @@ Possible feature expansion directions:
169
169
  ## 🎉 Summary
170
170
 
171
171
  `MessageBaseList` is a fully-featured, beautifully styled message component with complete internationalization support, perfect for testing and demonstrating message gateway functionality.
172
-
@@ -158,9 +158,7 @@ apiAdapter.usePlugin(new ApiMockPlugin(mockDataJson, logger));
158
158
 
159
159
  ```typescript
160
160
  @injectable()
161
- export class RequestLogger
162
- implements ExecutorPlugin<RequestAdapterFetchConfig>
163
- {
161
+ export class RequestLogger implements ExecutorPlugin<RequestAdapterFetchConfig> {
164
162
  readonly pluginName = 'RequestLogger';
165
163
 
166
164
  onBefore(context) {
@@ -42,6 +42,7 @@ src/pages/base/
42
42
  ### 1. ChatMessageBridge(桥接层)
43
43
 
44
44
  连接 UI 和数据层的桥梁,处理:
45
+
45
46
  - 消息发送逻辑
46
47
  - 草稿管理
47
48
  - 状态控制
@@ -52,20 +53,23 @@ src/pages/base/
52
53
  模拟后端 API,支持三种模式:
53
54
 
54
55
  #### 流式模式 (stream: true)
56
+
55
57
  ```typescript
56
58
  {
57
- stream: true // 逐字输出,可停止
59
+ stream: true; // 逐字输出,可停止
58
60
  }
59
61
  ```
60
62
 
61
63
  #### 可中断普通模式
64
+
62
65
  ```typescript
63
66
  {
64
- stream: false // 一次性返回,可停止
67
+ stream: false; // 一次性返回,可停止
65
68
  }
66
69
  ```
67
70
 
68
71
  #### 快速普通模式
72
+
69
73
  ```typescript
70
74
  // 不传 options,一次性返回,不可停止
71
75
  ```
@@ -73,6 +77,7 @@ src/pages/base/
73
77
  ### 3. ChatMessageStore(状态管理)
74
78
 
75
79
  管理所有消息状态:
80
+
76
81
  - `messages` - 历史消息列表
77
82
  - `draftMessages` - 草稿消息列表
78
83
  - `streaming` - 是否正在流式输出
@@ -104,6 +109,7 @@ export default function ChatMessagePage() {
104
109
  ### 消息样式
105
110
 
106
111
  **用户消息**:
112
+
107
113
  - 蓝色背景
108
114
  - 右对齐
109
115
  - 最大宽度 80%
@@ -111,6 +117,7 @@ export default function ChatMessagePage() {
111
117
  - 带重试按钮
112
118
 
113
119
  **AI 消息**:
120
+
114
121
  - 浅色背景 + 边框
115
122
  - 左对齐
116
123
  - 最大宽度 85%
@@ -132,25 +139,25 @@ export default function ChatMessagePage() {
132
139
  interface ChatMessageBridgeInterface<T> {
133
140
  // 发送消息
134
141
  send(message?: ChatMessage<T>): Promise<ChatMessage<T>>;
135
-
142
+
136
143
  // 停止发送
137
144
  stop(messageId?: string): boolean;
138
-
145
+
139
146
  // 停止所有
140
147
  stopAll(): void;
141
-
148
+
142
149
  // 更新内容
143
150
  onChangeContent(content: T): void;
144
-
151
+
145
152
  // 获取消息存储
146
153
  getMessageStore(): ChatMessageStore<T>;
147
-
154
+
148
155
  // 获取第一个草稿消息
149
156
  getFirstDraftMessage(): ChatMessage<T> | null;
150
-
157
+
151
158
  // 获取正在发送的消息
152
159
  getSendingMessage(): ChatMessage<T> | null;
153
-
160
+
154
161
  // 是否禁用发送
155
162
  getDisabledSend(): boolean;
156
163
  }
@@ -160,21 +167,18 @@ interface ChatMessageBridgeInterface<T> {
160
167
 
161
168
  ```typescript
162
169
  class MessageApi {
163
- async sendMessage<M>(
164
- message: M,
165
- options?: GatewayOptions<M>
166
- ): Promise<M>;
170
+ async sendMessage<M>(message: M, options?: GatewayOptions<M>): Promise<M>;
167
171
  }
168
172
 
169
173
  interface GatewayOptions<M> {
170
- stream?: boolean; // 是否流式
171
- signal?: AbortSignal; // 停止信号
172
- onConnected?: () => void; // 连接成功
174
+ stream?: boolean; // 是否流式
175
+ signal?: AbortSignal; // 停止信号
176
+ onConnected?: () => void; // 连接成功
173
177
  onChunk?: (msg: M) => void; // 流式块回调
174
178
  onProgress?: (p: number) => void; // 进度回调
175
- onComplete?: (msg: M) => void; // 完成回调
176
- onAborted?: (msg: M) => void; // 停止回调
177
- onError?: (err: any) => void; // 错误回调
179
+ onComplete?: (msg: M) => void; // 完成回调
180
+ onAborted?: (msg: M) => void; // 停止回调
181
+ onError?: (err: any) => void; // 错误回调
178
182
  }
179
183
  ```
180
184
 
@@ -189,8 +193,8 @@ const [bridge] = useState(() => {
189
193
  gateway: messageApi,
190
194
  logger: logger,
191
195
  senderName: 'ChatSender',
192
- gatewayOptions: {
193
- stream: true // 改为 false 使用普通模式
196
+ gatewayOptions: {
197
+ stream: true // 改为 false 使用普通模式
194
198
  }
195
199
  }).use(new ChatSenderStrategy(SendFailureStrategy.KEEP_FAILED, logger));
196
200
  });
@@ -199,8 +203,8 @@ const [bridge] = useState(() => {
199
203
  ### 2. 自定义消息组件
200
204
 
201
205
  ```typescript
202
- <MessagesList
203
- bridge={bridge}
206
+ <MessagesList
207
+ bridge={bridge}
204
208
  getMessageComponent={(props) => CustomMessageItem}
205
209
  />
206
210
  ```
@@ -217,13 +221,13 @@ async sendMessage<M>(message: M, options?: GatewayOptions<M>): Promise<M> {
217
221
  body: JSON.stringify(message),
218
222
  signal: options?.signal
219
223
  });
220
-
224
+
221
225
  // 处理流式响应
222
226
  if (options?.stream) {
223
227
  const reader = response.body?.getReader();
224
228
  // ... 处理流式数据
225
229
  }
226
-
230
+
227
231
  return response.json();
228
232
  }
229
233
  ```
@@ -233,6 +237,7 @@ async sendMessage<M>(message: M, options?: GatewayOptions<M>): Promise<M> {
233
237
  ### 测试功能
234
238
 
235
239
  **正常消息**:
240
+
236
241
  ```
237
242
  Hello
238
243
  你好
@@ -240,6 +245,7 @@ Hello
240
245
  ```
241
246
 
242
247
  **触发错误**:
248
+
243
249
  ```
244
250
  error
245
251
  Failed
@@ -247,6 +253,7 @@ test error
247
253
  ```
248
254
 
249
255
  **查看流式效果**:
256
+
250
257
  - 发送任意消息
251
258
  - 观察逐字输出效果
252
259
  - 点击停止按钮测试中断
@@ -277,13 +284,13 @@ MessageSender → MessageApi
277
284
 
278
285
  [流式模式]
279
286
  onConnected → onChunk(逐字) → onComplete
280
-
287
+
281
288
  [普通模式]
282
289
  onConnected → onComplete
283
-
290
+
284
291
  [错误]
285
292
  onError
286
-
293
+
287
294
  [停止]
288
295
  onAborted
289
296
 
@@ -311,4 +318,3 @@ UI 自动更新
311
318
  ## 🎉 总结
312
319
 
313
320
  ChatMessage 是一个功能完整、设计优雅的聊天组件系统,开箱即用,支持流式输出、错误处理、状态管理等核心功能。可以直接用于生产环境,也可以根据需要进行扩展和定制。
314
-