@qlover/create-app 0.7.15 → 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.
- package/CHANGELOG.md +4 -0
- package/dist/configs/_common/.gitignore.template +6 -0
- package/dist/configs/_common/.prettierignore +17 -5
- package/dist/configs/_common/.vscode/settings.json +6 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/templates/next-app/.env.template +1 -1
- package/dist/templates/next-app/README.en.md +0 -1
- package/dist/templates/next-app/README.md +0 -1
- package/dist/templates/next-app/config/Identifier/api.ts +5 -5
- package/dist/templates/next-app/config/Identifier/common/admint.table.ts +69 -0
- package/dist/templates/next-app/config/Identifier/common/common.ts +76 -0
- package/dist/templates/next-app/config/Identifier/common/index.ts +3 -0
- package/dist/templates/next-app/config/Identifier/{validator.ts → common/validators.ts} +5 -5
- package/dist/templates/next-app/config/Identifier/index.ts +2 -12
- package/dist/templates/next-app/config/Identifier/pages/index.ts +6 -0
- package/dist/templates/next-app/config/Identifier/pages/page.admin.home.ts +27 -0
- package/dist/templates/next-app/config/Identifier/pages/page.admin.locales.ts +266 -0
- package/dist/templates/next-app/config/Identifier/pages/page.admin.user.ts +293 -0
- package/dist/templates/{react-app/config/Identifier → next-app/config/Identifier/pages}/page.home.ts +15 -22
- package/dist/templates/next-app/config/Identifier/{page.login.ts → pages/page.login.ts} +28 -34
- package/dist/templates/next-app/config/Identifier/{page.register.ts → pages/page.register.ts} +30 -29
- package/dist/templates/next-app/config/adminNavs.ts +19 -0
- package/dist/templates/next-app/config/common.ts +22 -13
- package/dist/templates/next-app/config/i18n/HomeI18n.ts +5 -5
- package/dist/templates/next-app/config/i18n/admin18n.ts +61 -19
- package/dist/templates/next-app/config/i18n/i18nConfig.ts +2 -0
- package/dist/templates/next-app/config/i18n/i18nKeyScheam.ts +36 -0
- package/dist/templates/next-app/config/i18n/loginI18n.ts +22 -22
- package/dist/templates/next-app/config/i18n/register18n.ts +23 -24
- package/dist/templates/next-app/docs/en/index.md +0 -1
- package/dist/templates/next-app/docs/en/project-structure.md +0 -1
- package/dist/templates/next-app/docs/zh/index.md +0 -1
- package/dist/templates/next-app/docs/zh/project-structure.md +0 -1
- package/dist/templates/next-app/make/generateLocales.ts +19 -12
- package/dist/templates/next-app/migrations/schema/LocalesSchema.ts +15 -0
- package/dist/templates/next-app/migrations/sql/1694244000000.sql +11 -0
- package/dist/templates/next-app/package.json +7 -3
- package/dist/templates/next-app/public/locales/en.json +172 -207
- package/dist/templates/next-app/public/locales/zh.json +172 -207
- package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +153 -0
- package/dist/templates/next-app/src/app/[locale]/admin/users/page.tsx +48 -50
- package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +2 -2
- package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +34 -0
- package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +40 -0
- package/dist/templates/next-app/src/app/api/admin/locales/route.ts +42 -0
- package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +32 -0
- package/dist/templates/next-app/src/app/api/locales/json/route.ts +44 -0
- package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +1 -13
- package/dist/templates/next-app/src/base/cases/Datetime.ts +18 -0
- package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +12 -6
- package/dist/templates/next-app/src/base/cases/ResourceState.ts +17 -0
- package/dist/templates/next-app/src/base/cases/TranslateI18nInterface.ts +25 -0
- package/dist/templates/next-app/src/base/cases/ZodColumnBuilder.ts +200 -0
- package/dist/templates/next-app/src/base/port/ZodBuilderInterface.ts +8 -0
- package/dist/templates/next-app/src/base/services/AdminLocalesService.ts +20 -0
- package/dist/templates/next-app/src/base/services/AdminPageEvent.ts +26 -0
- package/dist/templates/next-app/src/base/services/AdminPageScheduler.ts +42 -0
- package/dist/templates/next-app/src/base/services/ResourceService.ts +122 -0
- package/dist/templates/next-app/src/base/services/adminApi/AdminLocalesApi.ts +104 -0
- package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +38 -5
- package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +1 -1
- package/dist/templates/next-app/src/i18n/request.ts +30 -1
- package/dist/templates/next-app/src/server/PageParams.ts +2 -10
- package/dist/templates/next-app/src/server/port/DBBridgeInterface.ts +5 -0
- package/dist/templates/next-app/src/server/port/DBTableInterface.ts +2 -0
- package/dist/templates/next-app/src/server/port/LocalesRepositoryInterface.ts +43 -0
- package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +197 -0
- package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +122 -0
- package/dist/templates/next-app/src/server/sqlBridges/SupabaseBridge.ts +60 -11
- package/dist/templates/next-app/src/server/validators/ExtendedExecutorError.ts +6 -0
- package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +131 -0
- package/dist/templates/next-app/src/server/validators/LoginValidator.ts +2 -5
- package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +32 -16
- package/dist/templates/next-app/src/styles/css/antd-themes/pagination/_default.css +2 -1
- package/dist/templates/next-app/src/styles/css/antd-themes/pagination/dark.css +28 -29
- package/dist/templates/next-app/src/styles/css/antd-themes/pagination/pink.css +2 -1
- package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +17 -3
- package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +5 -4
- package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +5 -4
- package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +3 -2
- package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +1 -1
- package/dist/templates/next-app/src/uikit/components/EditableCell.tsx +118 -0
- package/dist/templates/next-app/src/uikit/components/LogoutButton.tsx +5 -6
- package/dist/templates/next-app/src/uikit/components/ThemeSwitcher.tsx +1 -1
- package/dist/templates/next-app/src/uikit/components/With.tsx +2 -2
- package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportButton.tsx +62 -0
- package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportEvent.ts +28 -0
- package/dist/templates/next-app/src/uikit/components/localesImportButton/import.module.css +6 -0
- package/dist/templates/next-app/src/uikit/hook/useI18nInterface.ts +8 -14
- package/dist/templates/next-app/src/uikit/hook/useWarnTranslations.ts +25 -0
- package/dist/templates/react-app/.prettierignore +17 -0
- package/dist/templates/react-app/README.en.md +71 -54
- package/dist/templates/react-app/README.md +35 -18
- package/dist/templates/react-app/__tests__/__mocks__/BootstrapTest.ts +14 -0
- package/dist/templates/react-app/__tests__/__mocks__/MockAppConfit.ts +1 -1
- package/dist/templates/react-app/__tests__/__mocks__/MockDialogHandler.ts +2 -2
- package/dist/templates/react-app/__tests__/__mocks__/MockLogger.ts +1 -1
- package/dist/templates/react-app/__tests__/__mocks__/components/TestApp.tsx +45 -0
- package/dist/templates/react-app/__tests__/__mocks__/components/TestBootstrapsProvider.tsx +34 -0
- package/dist/templates/react-app/__tests__/__mocks__/components/TestRouter.tsx +46 -0
- package/dist/templates/react-app/__tests__/__mocks__/components/index.ts +12 -0
- package/dist/templates/react-app/__tests__/__mocks__/createMockGlobals.ts +1 -2
- package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOC.ts +51 -0
- package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOCRegister.ts +69 -0
- package/dist/templates/react-app/__tests__/setup/index.ts +1 -51
- package/dist/templates/react-app/__tests__/setup/setupGlobal.ts +51 -0
- package/dist/templates/react-app/__tests__/src/App.structure.test.tsx +115 -0
- package/dist/templates/react-app/__tests__/src/base/cases/AppConfig.test.ts +2 -2
- package/dist/templates/react-app/__tests__/src/base/cases/AppError.test.ts +1 -1
- package/dist/templates/react-app/__tests__/src/base/cases/DialogHandler.test.ts +3 -5
- package/dist/templates/react-app/__tests__/src/base/cases/I18nKeyErrorPlugin.test.ts +13 -2
- package/dist/templates/react-app/__tests__/src/base/cases/InversifyContainer.test.ts +1 -1
- package/dist/templates/react-app/__tests__/src/base/cases/PublicAssetsPath.test.ts +1 -1
- package/dist/templates/react-app/__tests__/src/base/cases/RequestLogger.test.ts +5 -5
- package/dist/templates/react-app/__tests__/src/base/cases/RequestStatusCatcher.test.ts +1 -2
- package/dist/templates/react-app/__tests__/src/base/cases/RouterLoader.test.ts +25 -15
- package/dist/templates/react-app/__tests__/src/base/services/I18nService.test.ts +29 -15
- package/dist/templates/react-app/__tests__/src/core/IOC.test.ts +19 -9
- package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapClient.test.ts +153 -0
- package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapsApp.test.ts +9 -7
- package/dist/templates/react-app/__tests__/src/main.integration.test.tsx +4 -5
- package/dist/templates/react-app/__tests__/src/main.test.tsx +4 -4
- package/dist/templates/react-app/__tests__/src/uikit/components/BaseHeader.test.tsx +68 -59
- package/dist/templates/react-app/config/IOCIdentifier.ts +8 -8
- package/dist/templates/react-app/config/Identifier/{common.error.ts → common/common.error.ts} +5 -5
- package/dist/templates/react-app/config/Identifier/{common.ts → common/common.ts} +9 -9
- package/dist/templates/react-app/config/Identifier/common/index.ts +2 -0
- package/dist/templates/react-app/config/Identifier/index.ts +1 -9
- package/dist/templates/react-app/config/Identifier/pages/index.ts +8 -0
- package/dist/templates/react-app/config/Identifier/{page.about.ts → pages/page.about.ts} +34 -26
- package/dist/templates/react-app/config/Identifier/{page.executor.ts → pages/page.executor.ts} +47 -39
- package/dist/templates/{next-app/config/Identifier → react-app/config/Identifier/pages}/page.home.ts +24 -23
- package/dist/templates/react-app/config/Identifier/pages/page.identifiter.ts +102 -0
- package/dist/templates/react-app/config/Identifier/{page.jsonStorage.ts → pages/page.jsonStorage.ts} +18 -11
- package/dist/templates/react-app/config/Identifier/{page.login.ts → pages/page.login.ts} +37 -27
- package/dist/templates/react-app/config/Identifier/{page.register.ts → pages/page.register.ts} +37 -25
- package/dist/templates/react-app/config/Identifier/{page.request.ts → pages/page.request.ts} +34 -44
- package/dist/templates/react-app/config/app.router.ts +66 -69
- package/dist/templates/react-app/config/i18n/PageI18nInterface.ts +51 -0
- package/dist/templates/react-app/config/i18n/aboutI18n.ts +42 -0
- package/dist/templates/react-app/config/i18n/executorI18n.ts +51 -0
- package/dist/templates/react-app/config/i18n/homeI18n.ts +24 -0
- package/dist/templates/react-app/config/i18n/i18nConfig.ts +30 -0
- package/dist/templates/react-app/config/i18n/identifiter18n.ts +30 -0
- package/dist/templates/react-app/config/i18n/jsonStorage18n.ts +27 -0
- package/dist/templates/react-app/config/i18n/login18n.ts +42 -0
- package/dist/templates/react-app/config/i18n/notFoundI18n.ts +34 -0
- package/dist/templates/react-app/config/i18n/register18n.ts +40 -0
- package/dist/templates/react-app/config/i18n/request18n.ts +41 -0
- package/dist/templates/react-app/config/theme.ts +14 -4
- package/dist/templates/react-app/docs/en/bootstrap.md +1670 -341
- package/dist/templates/react-app/docs/en/development-guide.md +1021 -345
- package/dist/templates/react-app/docs/en/env.md +1132 -278
- package/dist/templates/react-app/docs/en/i18n.md +858 -147
- package/dist/templates/react-app/docs/en/index.md +733 -104
- package/dist/templates/react-app/docs/en/ioc.md +1228 -287
- package/dist/templates/react-app/docs/en/playwright/e2e-tests.md +321 -0
- package/dist/templates/react-app/docs/en/playwright/index.md +19 -0
- package/dist/templates/react-app/docs/en/playwright/installation-summary.md +332 -0
- package/dist/templates/react-app/docs/en/playwright/overview.md +222 -0
- package/dist/templates/react-app/docs/en/playwright/quickstart.md +325 -0
- package/dist/templates/react-app/docs/en/playwright/reorganization-notes.md +340 -0
- package/dist/templates/react-app/docs/en/playwright/setup-complete.md +290 -0
- package/dist/templates/react-app/docs/en/playwright/testing-guide.md +565 -0
- package/dist/templates/react-app/docs/en/store.md +1194 -184
- package/dist/templates/react-app/docs/en/why-no-globals.md +797 -0
- package/dist/templates/react-app/docs/zh/bootstrap.md +1670 -341
- package/dist/templates/react-app/docs/zh/development-guide.md +1021 -345
- package/dist/templates/react-app/docs/zh/env.md +1132 -275
- package/dist/templates/react-app/docs/zh/i18n.md +858 -147
- package/dist/templates/react-app/docs/zh/index.md +717 -104
- package/dist/templates/react-app/docs/zh/ioc.md +1229 -287
- package/dist/templates/react-app/docs/zh/playwright/e2e-tests.md +321 -0
- package/dist/templates/react-app/docs/zh/playwright/index.md +19 -0
- package/dist/templates/react-app/docs/zh/playwright/installation-summary.md +332 -0
- package/dist/templates/react-app/docs/zh/playwright/overview.md +222 -0
- package/dist/templates/react-app/docs/zh/playwright/quickstart.md +325 -0
- package/dist/templates/react-app/docs/zh/playwright/reorganization-notes.md +340 -0
- package/dist/templates/react-app/docs/zh/playwright/setup-complete.md +290 -0
- package/dist/templates/react-app/docs/zh/playwright/testing-guide.md +565 -0
- package/dist/templates/react-app/docs/zh/store.md +1192 -184
- package/dist/templates/react-app/docs/zh/why-no-globals.md +797 -0
- package/dist/templates/react-app/e2e/App.spec.ts +319 -0
- package/dist/templates/react-app/e2e/fixtures/base.fixture.ts +40 -0
- package/dist/templates/react-app/e2e/main.spec.ts +20 -0
- package/dist/templates/react-app/e2e/utils/test-helpers.ts +19 -0
- package/dist/templates/react-app/eslint.config.mjs +247 -0
- package/dist/templates/react-app/makes/eslint-utils.mjs +195 -0
- package/dist/templates/react-app/makes/generateTs2LocalesOptions.ts +26 -0
- package/dist/templates/react-app/package.json +31 -3
- package/dist/templates/react-app/playwright.config.ts +79 -0
- package/dist/templates/react-app/public/locales/en/common.json +190 -179
- package/dist/templates/react-app/public/locales/zh/common.json +190 -179
- package/dist/templates/react-app/src/App.tsx +15 -42
- package/dist/templates/react-app/src/base/apis/AiApi.ts +5 -5
- package/dist/templates/react-app/src/base/apis/feApi/FeApi.ts +1 -1
- package/dist/templates/react-app/src/base/apis/feApi/FeApiAdapter.ts +1 -1
- package/dist/templates/react-app/src/base/apis/feApi/FeApiBootstarp.ts +8 -8
- package/dist/templates/react-app/src/base/apis/feApi/FeApiType.ts +1 -1
- package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +6 -6
- package/dist/templates/react-app/src/base/apis/userApi/UserApiAdapter.ts +1 -1
- package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +12 -14
- package/dist/templates/react-app/src/base/apis/userApi/UserApiType.ts +1 -1
- package/dist/templates/react-app/src/base/cases/DialogHandler.ts +5 -2
- package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +3 -3
- package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +3 -3
- package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +2 -2
- package/dist/templates/react-app/src/base/cases/RequestLogger.ts +4 -4
- package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +1 -1
- package/dist/templates/react-app/src/base/cases/ResourceState.ts +23 -0
- package/dist/templates/react-app/src/base/cases/RouterLoader.ts +4 -4
- package/dist/templates/react-app/src/base/cases/TranslateI18nInterface.ts +26 -0
- package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +2 -3
- package/dist/templates/react-app/src/base/port/I18nServiceInterface.ts +1 -1
- package/dist/templates/react-app/src/base/port/IOCInterface.ts +36 -0
- package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +2 -1
- package/dist/templates/react-app/src/base/port/ProcesserExecutorInterface.ts +1 -1
- package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +2 -2
- package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +9 -5
- package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +1 -1
- package/dist/templates/react-app/src/base/services/I18nService.ts +29 -29
- package/dist/templates/react-app/src/base/services/IdentifierService.ts +143 -0
- package/dist/templates/react-app/src/base/services/ProcesserExecutor.ts +3 -3
- package/dist/templates/react-app/src/base/services/RouteService.ts +27 -8
- package/dist/templates/react-app/src/base/services/UserService.ts +8 -8
- package/dist/templates/react-app/src/base/types/Page.ts +14 -2
- package/dist/templates/react-app/src/base/types/global.d.ts +1 -1
- package/dist/templates/react-app/src/core/IOC.ts +5 -46
- package/dist/templates/react-app/src/core/bootstraps/{BootstrapApp.ts → BootstrapClient.ts} +44 -17
- package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +14 -7
- package/dist/templates/react-app/src/core/bootstraps/IocIdentifierTest.ts +1 -1
- package/dist/templates/react-app/src/core/bootstraps/PrintBootstrap.ts +1 -1
- package/dist/templates/react-app/src/core/clientIoc/ClientIOC.ts +40 -0
- package/dist/templates/react-app/src/core/{IocRegisterImpl.ts → clientIoc/ClientIOCRegister.ts} +35 -24
- package/dist/templates/react-app/src/core/globals.ts +9 -9
- package/dist/templates/react-app/src/main.tsx +4 -4
- package/dist/templates/react-app/src/pages/404.tsx +6 -3
- package/dist/templates/react-app/src/pages/500.tsx +5 -2
- package/dist/templates/react-app/src/pages/NoRouteFound.tsx +5 -0
- package/dist/templates/react-app/src/pages/auth/Layout.tsx +9 -6
- package/dist/templates/react-app/src/pages/auth/LoginPage.tsx +46 -56
- package/dist/templates/react-app/src/pages/auth/RegisterPage.tsx +46 -58
- package/dist/templates/react-app/src/pages/base/AboutPage.tsx +35 -40
- package/dist/templates/react-app/src/pages/base/ExecutorPage.tsx +51 -51
- package/dist/templates/react-app/src/pages/base/HomePage.tsx +14 -15
- package/dist/templates/react-app/src/pages/base/IdentifierPage.tsx +70 -11
- package/dist/templates/react-app/src/pages/base/JSONStoragePage.tsx +24 -25
- package/dist/templates/react-app/src/pages/base/Layout.tsx +2 -2
- package/dist/templates/react-app/src/pages/base/RedirectPathname.tsx +3 -2
- package/dist/templates/react-app/src/pages/base/RequestPage.tsx +41 -59
- package/dist/templates/react-app/src/styles/css/antd-themes/{_default.css → _common/_default.css} +85 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/{dark.css → _common/dark.css} +99 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/_common/index.css +3 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/{pink.css → _common/pink.css} +86 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/index.css +4 -3
- package/dist/templates/react-app/src/styles/css/antd-themes/menu/_default.css +108 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/menu/dark.css +67 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/menu/index.css +3 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/menu/pink.css +67 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/pagination/_default.css +34 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/pagination/dark.css +31 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/pagination/index.css +3 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/pagination/pink.css +36 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/table/_default.css +44 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/table/dark.css +43 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/table/index.css +3 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/table/pink.css +43 -0
- package/dist/templates/react-app/src/styles/css/page.css +4 -3
- package/dist/templates/react-app/src/styles/css/themes/_default.css +1 -0
- package/dist/templates/react-app/src/styles/css/themes/dark.css +1 -0
- package/dist/templates/react-app/src/styles/css/themes/pink.css +1 -0
- package/dist/templates/react-app/src/styles/css/zIndex.css +1 -1
- package/dist/templates/react-app/src/uikit/bridges/ExecutorPageBridge.ts +3 -3
- package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +2 -2
- package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +1 -1
- package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +3 -3
- package/dist/templates/react-app/src/uikit/components/AppRouterProvider.tsx +35 -0
- package/dist/templates/react-app/src/uikit/components/BaseHeader.tsx +15 -11
- package/dist/templates/react-app/src/uikit/components/BaseRouteProvider.tsx +14 -11
- package/dist/templates/react-app/src/uikit/components/BaseRouteSeo.tsx +18 -0
- package/dist/templates/react-app/src/uikit/components/BootstrapsProvider.tsx +13 -0
- package/dist/templates/react-app/src/uikit/components/ClientSeo.tsx +62 -0
- package/dist/templates/react-app/src/uikit/components/ComboProvider.tsx +38 -0
- package/dist/templates/react-app/src/uikit/components/LanguageSwitcher.tsx +48 -27
- package/dist/templates/react-app/src/uikit/components/Loading.tsx +4 -2
- package/dist/templates/react-app/src/uikit/components/LocaleLink.tsx +4 -5
- package/dist/templates/react-app/src/uikit/components/LogoutButton.tsx +34 -11
- package/dist/templates/react-app/src/uikit/components/ProcessExecutorProvider.tsx +9 -5
- package/dist/templates/react-app/src/uikit/components/RouterRenderComponent.tsx +6 -3
- package/dist/templates/react-app/src/uikit/components/ThemeSwitcher.tsx +97 -40
- package/dist/templates/react-app/src/uikit/components/UserAuthProvider.tsx +5 -5
- package/dist/templates/react-app/src/uikit/components/With.tsx +17 -0
- package/dist/templates/react-app/src/uikit/contexts/BaseRouteContext.ts +17 -11
- package/dist/templates/react-app/src/uikit/contexts/IOCContext.ts +13 -0
- package/dist/templates/react-app/src/uikit/hooks/useAppTranslation.ts +26 -0
- package/dist/templates/react-app/src/uikit/hooks/useI18nGuard.ts +8 -11
- package/dist/templates/react-app/src/uikit/hooks/useI18nInterface.ts +25 -0
- package/dist/templates/react-app/src/uikit/hooks/useIOC.ts +35 -0
- package/dist/templates/react-app/src/uikit/hooks/useNavigateBridge.ts +3 -3
- package/dist/templates/react-app/src/uikit/hooks/useStrictEffect.ts +0 -1
- package/dist/templates/react-app/tsconfig.e2e.json +21 -0
- package/dist/templates/react-app/tsconfig.json +8 -1
- package/dist/templates/react-app/tsconfig.node.json +1 -1
- package/dist/templates/react-app/tsconfig.test.json +3 -1
- package/dist/templates/react-app/vite.config.ts +50 -34
- package/package.json +2 -1
- package/dist/configs/react-app/eslint.config.js +0 -94
- package/dist/templates/next-app/config/Identifier/common.error.ts +0 -41
- package/dist/templates/next-app/config/Identifier/common.ts +0 -69
- package/dist/templates/next-app/config/Identifier/page.about.ts +0 -181
- package/dist/templates/next-app/config/Identifier/page.admin.ts +0 -48
- package/dist/templates/next-app/config/Identifier/page.executor.ts +0 -272
- package/dist/templates/next-app/config/Identifier/page.identifiter.ts +0 -39
- package/dist/templates/next-app/config/Identifier/page.jsonStorage.ts +0 -72
- package/dist/templates/next-app/config/Identifier/page.request.ts +0 -182
- package/dist/templates/next-app/src/base/cases/ChatAction.ts +0 -21
- package/dist/templates/next-app/src/base/cases/FocusBarAction.ts +0 -36
- package/dist/templates/next-app/src/base/cases/RequestState.ts +0 -20
- package/dist/templates/next-app/src/base/port/AdminPageInterface.ts +0 -85
- package/dist/templates/next-app/src/base/port/AsyncStateInterface.ts +0 -7
- package/dist/templates/next-app/src/base/services/AdminUserService.ts +0 -45
- package/dist/templates/next-app/src/uikit/components/ChatRoot.tsx +0 -17
- package/dist/templates/next-app/src/uikit/components/chat/ChatActionInterface.ts +0 -30
- package/dist/templates/next-app/src/uikit/components/chat/ChatFocusBar.tsx +0 -65
- package/dist/templates/next-app/src/uikit/components/chat/ChatMessages.tsx +0 -59
- package/dist/templates/next-app/src/uikit/components/chat/ChatWrap.tsx +0 -28
- package/dist/templates/next-app/src/uikit/components/chat/FocusBarActionInterface.ts +0 -19
- package/dist/templates/next-app/src/uikit/hook/useMountedClient.ts +0 -17
- package/dist/templates/next-app/src/uikit/hook/useStore.ts +0 -15
- package/dist/templates/react-app/__tests__/__mocks__/I18nService.ts +0 -13
- package/dist/templates/react-app/__tests__/src/App.test.tsx +0 -139
- package/dist/templates/react-app/config/Identifier/page.identifiter.ts +0 -39
- package/dist/templates/react-app/config/i18n.ts +0 -15
- package/dist/templates/react-app/docs/en/project-structure.md +0 -434
- package/dist/templates/react-app/docs/zh/project-structure.md +0 -434
- package/dist/templates/react-app/src/base/cases/RequestState.ts +0 -20
- package/dist/templates/react-app/src/base/port/AsyncStateInterface.ts +0 -7
- package/dist/templates/react-app/src/uikit/hooks/useDocumentTitle.ts +0 -15
- 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,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
|
-
}
|