@lobehub/lobehub 2.0.0-next.13 → 2.0.0-next.14

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 (210) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/changelog/v1.json +9 -0
  3. package/package.json +1 -1
  4. package/packages/const/src/version.ts +3 -3
  5. package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
  6. package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
  7. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
  8. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
  9. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
  10. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
  11. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
  12. package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
  13. package/src/app/[variants]/(main)/image/page.tsx +0 -2
  14. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
  15. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
  16. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
  17. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
  18. package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
  19. package/src/app/[variants]/loading/index.tsx +1 -10
  20. package/src/components/Link.tsx +12 -0
  21. package/src/envs/app.ts +5 -8
  22. package/src/features/DataImporter/index.tsx +15 -60
  23. package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
  24. package/src/hooks/useInterceptingRoutes.test.ts +21 -3
  25. package/src/libs/trpc/client/index.ts +0 -1
  26. package/src/libs/trpc/client/lambda.ts +8 -5
  27. package/src/server/routers/desktop/mcp.ts +1 -3
  28. package/src/server/routers/lambda/config/index.test.ts +2 -2
  29. package/src/server/routers/tools/mcp.ts +2 -3
  30. package/src/server/routers/tools/search.test.ts +1 -7
  31. package/src/server/routers/tools/search.ts +1 -4
  32. package/src/services/__tests__/tool.test.ts +0 -3
  33. package/src/services/aiModel/index.test.ts +0 -3
  34. package/src/services/aiModel/index.ts +1 -7
  35. package/src/services/aiProvider/index.test.ts +0 -3
  36. package/src/services/aiProvider/index.ts +1 -7
  37. package/src/services/chatGroup/index.ts +1 -10
  38. package/src/services/config.ts +1 -65
  39. package/src/services/export/index.ts +1 -4
  40. package/src/services/file/index.ts +1 -11
  41. package/src/services/import/index.ts +1 -7
  42. package/src/services/message/index.ts +1 -11
  43. package/src/services/plugin/index.ts +1 -11
  44. package/src/services/session/index.ts +1 -11
  45. package/src/services/tableViewer/client.ts +12 -15
  46. package/src/services/thread/index.ts +1 -7
  47. package/src/services/topic/index.ts +1 -11
  48. package/src/services/user/index.ts +1 -13
  49. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +0 -241
  50. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +26 -1
  51. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +3 -1
  52. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +1 -138
  53. package/src/store/user/slices/common/action.test.ts +1 -4
  54. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
  55. package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
  56. package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
  57. package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
  58. package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
  59. package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
  60. package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
  61. package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
  62. package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
  63. package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
  64. package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
  65. package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
  66. package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
  67. package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
  68. package/src/app/[variants]/loading/Client/Content.tsx +0 -48
  69. package/src/app/[variants]/loading/Client/Error.tsx +0 -27
  70. package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
  71. package/src/app/[variants]/loading/Client/index.tsx +0 -22
  72. package/src/components/InnerLink.tsx +0 -20
  73. package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
  74. package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
  75. package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
  76. package/src/database/_deprecated/core/db.ts +0 -246
  77. package/src/database/_deprecated/core/index.ts +0 -2
  78. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
  79. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
  80. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
  81. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
  82. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
  83. package/src/database/_deprecated/core/model.ts +0 -218
  84. package/src/database/_deprecated/core/schemas.ts +0 -88
  85. package/src/database/_deprecated/core/types/db.ts +0 -15
  86. package/src/database/_deprecated/models/__DEBUG.ts +0 -124
  87. package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
  88. package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
  89. package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
  90. package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
  91. package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
  92. package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
  93. package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
  94. package/src/database/_deprecated/models/file.ts +0 -51
  95. package/src/database/_deprecated/models/message.ts +0 -277
  96. package/src/database/_deprecated/models/plugin.ts +0 -62
  97. package/src/database/_deprecated/models/session.ts +0 -271
  98. package/src/database/_deprecated/models/sessionGroup.ts +0 -93
  99. package/src/database/_deprecated/models/topic.ts +0 -250
  100. package/src/database/_deprecated/models/user.ts +0 -69
  101. package/src/database/_deprecated/schemas/files.ts +0 -39
  102. package/src/database/_deprecated/schemas/message.ts +0 -50
  103. package/src/database/_deprecated/schemas/plugin.ts +0 -12
  104. package/src/database/_deprecated/schemas/session.ts +0 -54
  105. package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
  106. package/src/database/_deprecated/schemas/topic.ts +0 -12
  107. package/src/database/_deprecated/schemas/user.ts +0 -40
  108. package/src/features/DataImporter/_deprecated.ts +0 -43
  109. package/src/features/InitClientDB/EnableModal.tsx +0 -118
  110. package/src/features/InitClientDB/ErrorResult.tsx +0 -143
  111. package/src/features/InitClientDB/InitIndicator.tsx +0 -124
  112. package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
  113. package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
  114. package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
  115. package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
  116. package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
  117. package/src/features/InitClientDB/index.tsx +0 -37
  118. package/src/libs/trpc/client/edge.ts +0 -26
  119. package/src/libs/trpc/edge/context.ts +0 -71
  120. package/src/libs/trpc/edge/index.ts +0 -45
  121. package/src/libs/trpc/edge/init.ts +0 -26
  122. package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
  123. package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
  124. package/src/migrations/FromV0ToV1.ts +0 -10
  125. package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
  126. package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
  127. package/src/migrations/FromV1ToV2/index.ts +0 -82
  128. package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
  129. package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
  130. package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
  131. package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
  132. package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
  133. package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
  134. package/src/migrations/FromV2ToV3/index.ts +0 -30
  135. package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
  136. package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
  137. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
  138. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
  139. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
  140. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
  141. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
  142. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
  143. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
  144. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
  145. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
  146. package/src/migrations/FromV3ToV4/index.ts +0 -102
  147. package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
  148. package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
  149. package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
  150. package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
  151. package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
  152. package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
  153. package/src/migrations/FromV4ToV5/index.ts +0 -58
  154. package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
  155. package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
  156. package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
  157. package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
  158. package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
  159. package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
  160. package/src/migrations/FromV5ToV6/index.ts +0 -61
  161. package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
  162. package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
  163. package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
  164. package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
  165. package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
  166. package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
  167. package/src/migrations/FromV6ToV7/index.ts +0 -101
  168. package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
  169. package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
  170. package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
  171. package/src/migrations/VersionController.test.ts +0 -88
  172. package/src/migrations/VersionController.ts +0 -67
  173. package/src/migrations/index.ts +0 -61
  174. package/src/server/routers/edge/appStatus.ts +0 -3
  175. package/src/server/routers/edge/index.ts +0 -14
  176. package/src/server/routers/edge/upload.ts +0 -16
  177. package/src/services/aiModel/client.ts +0 -70
  178. package/src/services/aiProvider/client.ts +0 -58
  179. package/src/services/baseClientService/index.ts +0 -9
  180. package/src/services/chatGroup/client.ts +0 -63
  181. package/src/services/export/_deprecated.ts +0 -155
  182. package/src/services/export/client.ts +0 -15
  183. package/src/services/file/_deprecated.test.ts +0 -119
  184. package/src/services/file/_deprecated.ts +0 -80
  185. package/src/services/file/client.test.ts +0 -199
  186. package/src/services/file/client.ts +0 -85
  187. package/src/services/import/_deprecated.ts +0 -115
  188. package/src/services/import/client.test.ts +0 -1015
  189. package/src/services/import/client.ts +0 -64
  190. package/src/services/message/_deprecated.test.ts +0 -398
  191. package/src/services/message/_deprecated.ts +0 -168
  192. package/src/services/message/client.test.ts +0 -410
  193. package/src/services/message/client.ts +0 -192
  194. package/src/services/plugin/_deprecated.test.ts +0 -162
  195. package/src/services/plugin/_deprecated.ts +0 -42
  196. package/src/services/plugin/client.test.ts +0 -177
  197. package/src/services/plugin/client.ts +0 -46
  198. package/src/services/session/_deprecated.test.ts +0 -440
  199. package/src/services/session/_deprecated.ts +0 -190
  200. package/src/services/session/client.test.ts +0 -413
  201. package/src/services/session/client.ts +0 -193
  202. package/src/services/thread/client.ts +0 -51
  203. package/src/services/topic/_deprecated.test.ts +0 -245
  204. package/src/services/topic/_deprecated.ts +0 -75
  205. package/src/services/topic/client.ts +0 -89
  206. package/src/services/topic/pglite.test.ts +0 -212
  207. package/src/services/user/_deprecated.test.ts +0 -101
  208. package/src/services/user/_deprecated.ts +0 -70
  209. package/src/services/user/client.test.ts +0 -111
  210. package/src/services/user/client.ts +0 -104
@@ -1,118 +0,0 @@
1
- import { Button, Icon } from '@lobehub/ui';
2
- import { createStyles } from 'antd-style';
3
- import { CpuIcon, LibraryBig, ShieldCheck } from 'lucide-react';
4
- import { memo } from 'react';
5
- import { useTranslation } from 'react-i18next';
6
- import { Center, Flexbox } from 'react-layout-kit';
7
-
8
- import DataStyleModal from '@/components/DataStyleModal';
9
- import { useGlobalStore } from '@/store/global';
10
- import { useServerConfigStore } from '@/store/serverConfig';
11
-
12
- import PGliteIcon from './PGliteIcon';
13
-
14
- const useStyles = createStyles(({ css, token, isDarkMode, responsive }) => ({
15
- desc: css`
16
- width: 280px;
17
- color: ${token.colorTextSecondary};
18
-
19
- ${responsive.mobile} {
20
- line-height: ${token.lineHeight};
21
- }
22
- `,
23
- hint: css`
24
- font-size: ${token.fontSizeSM}px;
25
- color: ${token.colorTextTertiary};
26
- text-align: center;
27
- `,
28
- icon: css`
29
- color: ${isDarkMode ? token.blue : token.geekblue};
30
- `,
31
- iconCtn: css`
32
- width: 72px;
33
- height: 72px;
34
- border-radius: 50%;
35
- background: ${isDarkMode ? token.blue1 : token.geekblue1};
36
- `,
37
- intro: css`
38
- ${responsive.mobile} {
39
- width: 350px;
40
- margin-block-start: 24px;
41
- line-height: ${token.lineHeight};
42
- }
43
- `,
44
-
45
- title: css`
46
- margin-block-end: 0;
47
- font-size: ${token.fontSizeLG}px;
48
- font-weight: bold;
49
- `,
50
- }));
51
-
52
- interface EnableClientDBModalProps {
53
- open: boolean;
54
- }
55
-
56
- const EnableClientDBModal = memo<EnableClientDBModalProps>(({ open }) => {
57
- const { t } = useTranslation('common');
58
- const { styles } = useStyles();
59
- const isMobile = useServerConfigStore((s) => s.isMobile);
60
-
61
- const markPgliteEnabled = useGlobalStore((s) => s.markPgliteEnabled);
62
- const features = [
63
- {
64
- avatar: PGliteIcon,
65
- desc: t('clientDB.modal.features.pglite.desc'),
66
- title: t('clientDB.modal.features.pglite.title'),
67
- },
68
- {
69
- avatar: ShieldCheck,
70
- desc: t('clientDB.modal.features.localFirst.desc'),
71
- title: t('clientDB.modal.features.localFirst.title'),
72
- },
73
- {
74
- avatar: LibraryBig,
75
- desc: t('clientDB.modal.features.knowledgeBase.desc'),
76
- title: t('clientDB.modal.features.knowledgeBase.title'),
77
- },
78
- ];
79
-
80
- return (
81
- <DataStyleModal
82
- height={isMobile ? '80vh' : undefined}
83
- icon={CpuIcon}
84
- open={open}
85
- title={t('clientDB.modal.title')}
86
- >
87
- <Center gap={48}>
88
- <Flexbox>
89
- <Flexbox className={styles.intro} style={{ textAlign: 'center' }} width={460}>
90
- {t('clientDB.modal.desc')}
91
- </Flexbox>
92
- </Flexbox>
93
- <Flexbox gap={32}>
94
- {features.map((item) => (
95
- <Flexbox align={'flex-start'} gap={24} horizontal key={item.title}>
96
- <Center className={styles.iconCtn}>
97
- <Icon className={styles.icon} icon={item.avatar} size={36} />
98
- </Center>
99
- <Flexbox gap={8}>
100
- <p className={styles.title}>{item.title}</p>
101
- <p className={styles.desc}>{item.desc}</p>
102
- </Flexbox>
103
- </Flexbox>
104
- ))}
105
- </Flexbox>
106
- <Flexbox align={'center'} gap={16} style={{ paddingBottom: 16 }}>
107
- <Flexbox gap={16} horizontal justify={'center'} style={{ flexWrap: 'wrap' }}>
108
- <Button onClick={markPgliteEnabled} size={'large'} type={'primary'}>
109
- {t('clientDB.modal.enable')}
110
- </Button>
111
- </Flexbox>
112
- </Flexbox>
113
- </Center>
114
- </DataStyleModal>
115
- );
116
- });
117
-
118
- export default EnableClientDBModal;
@@ -1,143 +0,0 @@
1
- import { Alert, Button, Highlighter, Icon, Modal } from '@lobehub/ui';
2
- import { Spin } from 'antd';
3
- import { createStyles } from 'antd-style';
4
- import isEqual from 'fast-deep-equal';
5
- import { PenToolIcon, TriangleAlert } from 'lucide-react';
6
- import dynamic from 'next/dynamic';
7
- import { ReactNode, memo, useState } from 'react';
8
- import { useTranslation } from 'react-i18next';
9
- import { Center, Flexbox } from 'react-layout-kit';
10
-
11
- import { githubService } from '@/services/github';
12
- import { useGlobalStore } from '@/store/global';
13
-
14
- const DatabaseRepair = dynamic(() => import('./features/DatabaseRepair'), {
15
- loading: () => <Spin fullscreen />,
16
- ssr: false,
17
- });
18
-
19
- const useStyles = createStyles(({ css, token }) => ({
20
- bg: css`
21
- cursor: pointer;
22
-
23
- padding-block: 8px;
24
- padding-inline: 24px;
25
- border-radius: 40px;
26
-
27
- background: ${token.red6};
28
-
29
- transition: transform 0.2s;
30
-
31
- :hover {
32
- transform: scale(1.05);
33
- }
34
-
35
- :active {
36
- transform: scale(1);
37
- }
38
- `,
39
- text: css`
40
- font-size: 15px;
41
- color: ${token.colorText};
42
- `,
43
- }));
44
-
45
- interface MigrationError {
46
- message: string;
47
- stack: string;
48
- }
49
-
50
- interface FailedModalProps {
51
- children?: (props: { setOpen: (open: boolean) => void }) => ReactNode;
52
- error?: MigrationError;
53
- }
54
-
55
- const ErrorResult = memo<FailedModalProps>(({ children }) => {
56
- const { t } = useTranslation('common');
57
- const { styles } = useStyles();
58
- const initializeClientDB = useGlobalStore((s) => s.initializeClientDB);
59
- const error = useGlobalStore((s) => s.initClientDBError, isEqual);
60
- const [open, setOpen] = useState(false);
61
- const [showRepair, setShowRepair] = useState(true);
62
-
63
- return (
64
- <>
65
- {children ? (
66
- children({ setOpen })
67
- ) : (
68
- <Flexbox
69
- align={'center'}
70
- className={styles.bg}
71
- gap={12}
72
- horizontal
73
- onClick={() => {
74
- setOpen(true);
75
- }}
76
- >
77
- <Center height={40} width={24}>
78
- <Icon icon={TriangleAlert} size={20} />
79
- </Center>
80
- <span className={styles.text}>{t('clientDB.initing.error')}</span>
81
- </Flexbox>
82
- )}
83
- <Modal
84
- footer={null}
85
- onCancel={() => {
86
- setOpen(false);
87
- }}
88
- open={open}
89
- title={t('clientDB.error.title')}
90
- >
91
- {showRepair ? (
92
- <DatabaseRepair setShowRepair={setShowRepair} />
93
- ) : (
94
- <Center gap={24}>
95
- <div>{t('clientDB.error.desc')}</div>
96
- <Flexbox width={'100%'}>
97
- <Alert
98
- description={`[${error?.name}] ${error?.message}`}
99
- extra={
100
- <Flexbox gap={8} style={{ marginTop: 8, overflow: 'scroll' }} width={'100%'}>
101
- <Highlighter actionIconSize={'small'} language={'json'}>
102
- {JSON.stringify(error, null, 2)}
103
- </Highlighter>
104
- </Flexbox>
105
- }
106
- message={t('clientDB.error.detailTitle')}
107
- type={'error'}
108
- />
109
- </Flexbox>
110
-
111
- <Flexbox horizontal justify={'space-between'}>
112
- <Button
113
- onClick={(e) => {
114
- e.preventDefault();
115
- githubService.submitPgliteInitError(error);
116
- }}
117
- target={'_blank'}
118
- type={'text'}
119
- >
120
- {t('clientDB.error.report')}
121
- </Button>
122
- <Flexbox gap={8} horizontal>
123
- <Button
124
- icon={<Icon icon={PenToolIcon} />}
125
- onClick={() => {
126
- setShowRepair(true);
127
- }}
128
- >
129
- {t('clientDB.error.selfSolve')}
130
- </Button>
131
- <Button onClick={() => initializeClientDB()} type={'primary'}>
132
- {t('clientDB.error.retry')}
133
- </Button>
134
- </Flexbox>
135
- </Flexbox>
136
- </Center>
137
- )}
138
- </Modal>
139
- </>
140
- );
141
- });
142
-
143
- export default ErrorResult;
@@ -1,124 +0,0 @@
1
- 'use client';
2
-
3
- import { Progress } from 'antd';
4
- import { createStyles } from 'antd-style';
5
- import { AnimatePresence, motion } from 'framer-motion';
6
- import { rgba } from 'polished';
7
- import { memo } from 'react';
8
- import { useTranslation } from 'react-i18next';
9
- import { Center, Flexbox } from 'react-layout-kit';
10
-
11
- import { useGlobalStore } from '@/store/global';
12
- import { ClientDatabaseInitStages, DatabaseLoadingState } from '@/types/clientDB';
13
-
14
- import ErrorResult from './ErrorResult';
15
-
16
- const useStyles = createStyles(({ css, token, prefixCls }) => ({
17
- bg: css`
18
- padding-block: 8px;
19
- padding-inline: 8px 32px;
20
- border-radius: 40px;
21
- background: ${token.colorText};
22
- `,
23
- container: css`
24
- position: fixed;
25
- z-index: 1000;
26
- `,
27
- progress: css`
28
- .${prefixCls}-progress-text {
29
- font-size: 12px;
30
- color: ${token.colorBgContainer} !important;
31
- }
32
- `,
33
- progressReady: css`
34
- .${prefixCls}-progress-text {
35
- color: ${token.colorSuccessBorder} !important;
36
- }
37
- `,
38
-
39
- text: css`
40
- font-size: 15px;
41
- color: ${token.colorBgContainer};
42
- `,
43
- }));
44
-
45
- interface InitClientDBProps {
46
- bottom?: number;
47
- show: boolean;
48
- }
49
-
50
- const InitClientDB = memo<InitClientDBProps>(({ bottom = 80, show }) => {
51
- const { styles, theme, cx } = useStyles();
52
- const currentStage = useGlobalStore((s) => s.initClientDBStage || DatabaseLoadingState.Idle);
53
- const { t } = useTranslation('common');
54
- const useInitClientDB = useGlobalStore((s) => s.useInitClientDB);
55
-
56
- useInitClientDB();
57
-
58
- const getStateMessage = (state: DatabaseLoadingState) => {
59
- switch (state) {
60
- case DatabaseLoadingState.Finished:
61
- case DatabaseLoadingState.Ready: {
62
- return t('clientDB.initing.ready');
63
- }
64
-
65
- case DatabaseLoadingState.Idle: {
66
- return t('clientDB.initing.idle');
67
- }
68
- case DatabaseLoadingState.Initializing: {
69
- return t('clientDB.initing.initializing');
70
- }
71
- case DatabaseLoadingState.LoadingDependencies: {
72
- return t('clientDB.initing.loadingDependencies');
73
- }
74
-
75
- case DatabaseLoadingState.LoadingWasm: {
76
- return t('clientDB.initing.loadingWasmModule');
77
- }
78
-
79
- case DatabaseLoadingState.Migrating: {
80
- return t('clientDB.initing.migrating');
81
- }
82
- }
83
- };
84
-
85
- const currentStageIndex = ClientDatabaseInitStages.indexOf(currentStage);
86
- const isReady = currentStage === DatabaseLoadingState.Finished;
87
- const isError = currentStage === DatabaseLoadingState.Error;
88
- return (
89
- <AnimatePresence>
90
- {show && (
91
- <Center className={styles.container} style={{ bottom }} width={'100%'}>
92
- <motion.div
93
- animate={{ opacity: 1, y: 0 }}
94
- exit={{ opacity: 0, y: 30 }}
95
- initial={{ opacity: 0, y: 30 }}
96
- transition={{ duration: 0.3 }}
97
- >
98
- {isError ? (
99
- <ErrorResult />
100
- ) : (
101
- <Flexbox align={'center'} className={styles.bg} gap={12} horizontal>
102
- <Progress
103
- className={cx(styles.progress, isReady && styles.progressReady)}
104
- format={isReady ? undefined : (percent) => percent}
105
- percent={parseInt(
106
- ((currentStageIndex / (ClientDatabaseInitStages.length - 1)) * 100).toFixed(0),
107
- )}
108
- size={40}
109
- strokeColor={isReady ? theme.colorSuccessActive : theme.colorBgContainer}
110
- strokeLinecap={'round'}
111
- strokeWidth={10}
112
- trailColor={rgba(theme.colorBgContainer, 0.1)}
113
- type={'circle'}
114
- />
115
- <span className={styles.text}>{getStateMessage(currentStage)}</span>
116
- </Flexbox>
117
- )}
118
- </motion.div>
119
- </Center>
120
- )}
121
- </AnimatePresence>
122
- );
123
- });
124
- export default InitClientDB;
@@ -1,28 +0,0 @@
1
- 'use client';
2
-
3
- import type { IconType } from '@lobehub/icons';
4
- import { forwardRef } from 'react';
5
-
6
- const PGliteIcon: IconType = forwardRef(({ size = '1em', style }, ref) => {
7
- return (
8
- <svg
9
- fill="currentColor"
10
- fillRule="evenodd"
11
- height={size}
12
- ref={ref}
13
- style={{ flex: 'none', lineHeight: 1, ...style }}
14
- viewBox="0 0 1024 1024"
15
- width={size}
16
- xmlns="http://www.w3.org/2000/svg"
17
- >
18
- <title>PGlite</title>
19
- <path
20
- clipRule="evenodd"
21
- d="M941.581 335.737v460.806c0 15.926-12.913 28.836-28.832 28.818l-115.283-.137c-15.243-.018-27.706-11.88-28.703-26.877.011-.569.018-1.138.018-1.711l-.004-172.904c0-47.745-38.736-86.451-86.454-86.451-46.245 0-84.052-36.359-86.342-82.068V191.496l201.708.149c79.484.058 143.892 64.553 143.892 144.092zm-576-144.281v201.818c0 47.746 38.682 86.456 86.4 86.456h86.4v-5.796c0 66.816 54.13 120.98 120.902 120.98 28.617 0 51.815 23.213 51.815 51.848v149.644c0 .688.011 1.372.025 2.057-.943 15.065-13.453 26.992-28.746 26.992l-144.982-.007.986-201.586c.079-15.915-12.755-28.88-28.66-28.959-15.904-.079-28.861 12.763-28.94 28.678l-.986 201.741v.118l-172.174-.01V623.722c0-15.915-12.895-28.819-28.8-28.819-15.906 0-28.8 12.904-28.8 28.819v201.704l-143.642-.007c-15.905-.004-28.798-12.904-28.798-28.819V335.547c0-79.58 64.471-144.093 144.001-144.092l143.999.001zm446.544 173.693c0-23.874-19.343-43.228-43.2-43.228-23.861 0-43.2 19.354-43.2 43.228 0 23.875 19.339 43.226 43.2 43.226 23.857 0 43.2-19.351 43.2-43.226z"
22
- fillRule="evenodd"
23
- />
24
- </svg>
25
- );
26
- });
27
-
28
- export default PGliteIcon;
@@ -1,75 +0,0 @@
1
- import { Alert, Button, Text } from '@lobehub/ui';
2
- import { App, Card } from 'antd';
3
- import { createStyles } from 'antd-style';
4
- import { AlertCircle } from 'lucide-react';
5
- import { useTranslation } from 'react-i18next';
6
- import { Flexbox } from 'react-layout-kit';
7
-
8
- import { resetClientDatabase } from '@/database/client/db';
9
-
10
- const useStyles = createStyles(({ css, token }) => ({
11
- card: css`
12
- border-radius: ${token.borderRadiusLG}px;
13
- `,
14
- }));
15
-
16
- const Backup = () => {
17
- const { t } = useTranslation('common');
18
- const { styles } = useStyles();
19
-
20
- const { modal } = App.useApp();
21
- return (
22
- <Flexbox gap={24}>
23
- <Card
24
- className={styles.card}
25
- extra={<Text type="secondary">{t('clientDB.solve.backup.desc')}</Text>}
26
- title={t('clientDB.solve.backup.title')}
27
- >
28
- <Text as={'p'}>{t('clientDB.solve.backup.exportDesc')}</Text>
29
- <Button block type={'primary'}>
30
- {t('clientDB.solve.backup.export')}
31
- </Button>
32
- </Card>
33
-
34
- <Card
35
- className={styles.card}
36
- extra={<Text type="secondary">{t('clientDB.solve.backup.reset.desc')}</Text>}
37
- title={t('clientDB.solve.backup.reset.title')}
38
- >
39
- <Flexbox gap={24}>
40
- <Alert
41
- description={t('clientDB.solve.backup.reset.alertDesc')}
42
- icon={<AlertCircle size={16} />}
43
- message={t('clientDB.solve.backup.reset.alert')}
44
- showIcon
45
- type="error"
46
- variant={'borderless'}
47
- />
48
-
49
- <Button
50
- block
51
- danger
52
- onClick={() => {
53
- modal.confirm({
54
- content: t('clientDB.solve.backup.reset.confirm.desc'),
55
- okButtonProps: {
56
- danger: true,
57
- },
58
- onOk: async () => {
59
- await resetClientDatabase();
60
-
61
- location.reload();
62
- },
63
- title: t('clientDB.solve.backup.reset.confirm.title'),
64
- });
65
- }}
66
- >
67
- {t('clientDB.solve.backup.reset.button')}
68
- </Button>
69
- </Flexbox>
70
- </Card>
71
- </Flexbox>
72
- );
73
- };
74
-
75
- export default Backup;
@@ -1,98 +0,0 @@
1
- import { Highlighter, Tag } from '@lobehub/ui';
2
- import { Card, List, Popover } from 'antd';
3
- import { createStyles } from 'antd-style';
4
- import dayjs from 'dayjs';
5
- import isEqual from 'fast-deep-equal';
6
- import { useTranslation } from 'react-i18next';
7
- import { Flexbox } from 'react-layout-kit';
8
-
9
- import { useGlobalStore } from '@/store/global';
10
- import { clientDBSelectors } from '@/store/global/selectors';
11
-
12
- const useStyles = createStyles(({ css, token }) => ({
13
- card: css`
14
- margin-block-end: ${token.marginMD}px;
15
- border-radius: ${token.borderRadiusLG}px;
16
- `,
17
- hash: css`
18
- font-family: ${token.fontFamilyCode};
19
- `,
20
- sql: css`
21
- overflow: hidden;
22
- display: -webkit-box;
23
- -webkit-box-orient: vertical;
24
- -webkit-line-clamp: 3;
25
-
26
- font-size: 12px;
27
- `,
28
- time: css`
29
- font-size: 12px;
30
- color: ${token.colorTextTertiary};
31
- `,
32
- }));
33
-
34
- const Diagnosis = () => {
35
- const { t } = useTranslation('common');
36
- const { styles, cx } = useStyles();
37
-
38
- const migrations = useGlobalStore(clientDBSelectors.displayMigrationStatus, isEqual);
39
-
40
- return (
41
- <Card
42
- className={styles.card}
43
- styles={{ body: { padding: 0 } }}
44
- title={t('clientDB.solve.diagnosis.title')}
45
- >
46
- <List
47
- dataSource={migrations}
48
- renderItem={(migration) => (
49
- <List.Item
50
- key={migration.id}
51
- style={{ display: 'flex', gap: 12, justifyContent: 'space-between' }}
52
- >
53
- <Flexbox gap={4} horizontal>
54
- <Flexbox style={{ minWidth: 20 }} width={20}>
55
- {migration.index}
56
- </Flexbox>
57
- <Popover
58
- content={
59
- <Flexbox gap={8}>
60
- <div className={styles.hash}>Hash: {migration.id}</div>
61
- <Highlighter
62
- language={'sql'}
63
- style={{ maxHeight: '30vh', maxWidth: '70vw', overflow: 'scroll' }}
64
- >
65
- {migration.sql.join('\n')}
66
- </Highlighter>
67
- </Flexbox>
68
- }
69
- title={t('clientDB.solve.diagnosis.sql')}
70
- >
71
- <Flexbox gap={8}>
72
- <Flexbox
73
- className={cx(styles.sql, migration.status === 'success' && styles.time)}
74
- >
75
- {migration.desc}
76
- </Flexbox>
77
- <Flexbox>
78
- <Flexbox className={styles.time}>
79
- {t('clientDB.solve.diagnosis.createdAt')}
80
- {dayjs(migration.createdAt).format('YYYY-MM-DD hh:mm:ss')} ·{' '}
81
- {t('clientDB.solve.diagnosis.migratedAt')}{' '}
82
- {dayjs(migration.migratedAt).format('YYYY-MM-DD hh:mm:ss')}
83
- </Flexbox>
84
- </Flexbox>
85
- </Flexbox>
86
- </Popover>
87
- </Flexbox>
88
- <Tag bordered={false} color={migration.status}>
89
- {migration.status}
90
- </Tag>
91
- </List.Item>
92
- )}
93
- size="small"
94
- />
95
- </Card>
96
- );
97
- };
98
- export default Diagnosis;