@lobehub/lobehub 2.0.0-next.12 → 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 (212) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/changelog/v1.json +18 -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/features/PromptInput/index.tsx +1 -1
  14. package/src/app/[variants]/(main)/image/page.tsx +0 -2
  15. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
  16. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
  17. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
  18. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
  19. package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
  20. package/src/app/[variants]/loading/index.tsx +1 -10
  21. package/src/components/Link.tsx +12 -0
  22. package/src/envs/app.ts +5 -8
  23. package/src/features/DataImporter/index.tsx +15 -60
  24. package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
  25. package/src/hooks/useInterceptingRoutes.test.ts +21 -3
  26. package/src/libs/trpc/client/index.ts +0 -1
  27. package/src/libs/trpc/client/lambda.ts +8 -5
  28. package/src/libs/trpc/lambda/context.ts +4 -1
  29. package/src/server/routers/desktop/mcp.ts +1 -3
  30. package/src/server/routers/lambda/config/index.test.ts +2 -2
  31. package/src/server/routers/tools/mcp.ts +2 -3
  32. package/src/server/routers/tools/search.test.ts +1 -7
  33. package/src/server/routers/tools/search.ts +1 -4
  34. package/src/services/__tests__/tool.test.ts +0 -3
  35. package/src/services/aiModel/index.test.ts +0 -3
  36. package/src/services/aiModel/index.ts +1 -7
  37. package/src/services/aiProvider/index.test.ts +0 -3
  38. package/src/services/aiProvider/index.ts +1 -7
  39. package/src/services/chatGroup/index.ts +1 -10
  40. package/src/services/config.ts +1 -65
  41. package/src/services/export/index.ts +1 -4
  42. package/src/services/file/index.ts +1 -11
  43. package/src/services/import/index.ts +1 -7
  44. package/src/services/message/index.ts +1 -11
  45. package/src/services/plugin/index.ts +1 -11
  46. package/src/services/session/index.ts +1 -11
  47. package/src/services/tableViewer/client.ts +12 -15
  48. package/src/services/thread/index.ts +1 -7
  49. package/src/services/topic/index.ts +1 -11
  50. package/src/services/user/index.ts +1 -13
  51. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +0 -241
  52. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +26 -1
  53. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +3 -1
  54. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +1 -138
  55. package/src/store/user/slices/common/action.test.ts +1 -4
  56. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
  57. package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
  58. package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
  59. package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
  60. package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
  61. package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
  62. package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
  63. package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
  64. package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
  65. package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
  66. package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
  67. package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
  68. package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
  69. package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
  70. package/src/app/[variants]/loading/Client/Content.tsx +0 -48
  71. package/src/app/[variants]/loading/Client/Error.tsx +0 -27
  72. package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
  73. package/src/app/[variants]/loading/Client/index.tsx +0 -22
  74. package/src/components/InnerLink.tsx +0 -20
  75. package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
  76. package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
  77. package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
  78. package/src/database/_deprecated/core/db.ts +0 -246
  79. package/src/database/_deprecated/core/index.ts +0 -2
  80. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
  81. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
  82. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
  83. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
  84. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
  85. package/src/database/_deprecated/core/model.ts +0 -218
  86. package/src/database/_deprecated/core/schemas.ts +0 -88
  87. package/src/database/_deprecated/core/types/db.ts +0 -15
  88. package/src/database/_deprecated/models/__DEBUG.ts +0 -124
  89. package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
  90. package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
  91. package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
  92. package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
  93. package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
  94. package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
  95. package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
  96. package/src/database/_deprecated/models/file.ts +0 -51
  97. package/src/database/_deprecated/models/message.ts +0 -277
  98. package/src/database/_deprecated/models/plugin.ts +0 -62
  99. package/src/database/_deprecated/models/session.ts +0 -271
  100. package/src/database/_deprecated/models/sessionGroup.ts +0 -93
  101. package/src/database/_deprecated/models/topic.ts +0 -250
  102. package/src/database/_deprecated/models/user.ts +0 -69
  103. package/src/database/_deprecated/schemas/files.ts +0 -39
  104. package/src/database/_deprecated/schemas/message.ts +0 -50
  105. package/src/database/_deprecated/schemas/plugin.ts +0 -12
  106. package/src/database/_deprecated/schemas/session.ts +0 -54
  107. package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
  108. package/src/database/_deprecated/schemas/topic.ts +0 -12
  109. package/src/database/_deprecated/schemas/user.ts +0 -40
  110. package/src/features/DataImporter/_deprecated.ts +0 -43
  111. package/src/features/InitClientDB/EnableModal.tsx +0 -118
  112. package/src/features/InitClientDB/ErrorResult.tsx +0 -143
  113. package/src/features/InitClientDB/InitIndicator.tsx +0 -124
  114. package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
  115. package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
  116. package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
  117. package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
  118. package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
  119. package/src/features/InitClientDB/index.tsx +0 -37
  120. package/src/libs/trpc/client/edge.ts +0 -26
  121. package/src/libs/trpc/edge/context.ts +0 -71
  122. package/src/libs/trpc/edge/index.ts +0 -45
  123. package/src/libs/trpc/edge/init.ts +0 -26
  124. package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
  125. package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
  126. package/src/migrations/FromV0ToV1.ts +0 -10
  127. package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
  128. package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
  129. package/src/migrations/FromV1ToV2/index.ts +0 -82
  130. package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
  131. package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
  132. package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
  133. package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
  134. package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
  135. package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
  136. package/src/migrations/FromV2ToV3/index.ts +0 -30
  137. package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
  138. package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
  139. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
  140. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
  141. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
  142. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
  143. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
  144. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
  145. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
  146. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
  147. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
  148. package/src/migrations/FromV3ToV4/index.ts +0 -102
  149. package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
  150. package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
  151. package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
  152. package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
  153. package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
  154. package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
  155. package/src/migrations/FromV4ToV5/index.ts +0 -58
  156. package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
  157. package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
  158. package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
  159. package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
  160. package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
  161. package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
  162. package/src/migrations/FromV5ToV6/index.ts +0 -61
  163. package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
  164. package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
  165. package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
  166. package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
  167. package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
  168. package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
  169. package/src/migrations/FromV6ToV7/index.ts +0 -101
  170. package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
  171. package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
  172. package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
  173. package/src/migrations/VersionController.test.ts +0 -88
  174. package/src/migrations/VersionController.ts +0 -67
  175. package/src/migrations/index.ts +0 -61
  176. package/src/server/routers/edge/appStatus.ts +0 -3
  177. package/src/server/routers/edge/index.ts +0 -14
  178. package/src/server/routers/edge/upload.ts +0 -16
  179. package/src/services/aiModel/client.ts +0 -70
  180. package/src/services/aiProvider/client.ts +0 -58
  181. package/src/services/baseClientService/index.ts +0 -9
  182. package/src/services/chatGroup/client.ts +0 -63
  183. package/src/services/export/_deprecated.ts +0 -155
  184. package/src/services/export/client.ts +0 -15
  185. package/src/services/file/_deprecated.test.ts +0 -119
  186. package/src/services/file/_deprecated.ts +0 -80
  187. package/src/services/file/client.test.ts +0 -199
  188. package/src/services/file/client.ts +0 -85
  189. package/src/services/import/_deprecated.ts +0 -115
  190. package/src/services/import/client.test.ts +0 -1015
  191. package/src/services/import/client.ts +0 -64
  192. package/src/services/message/_deprecated.test.ts +0 -398
  193. package/src/services/message/_deprecated.ts +0 -168
  194. package/src/services/message/client.test.ts +0 -410
  195. package/src/services/message/client.ts +0 -192
  196. package/src/services/plugin/_deprecated.test.ts +0 -162
  197. package/src/services/plugin/_deprecated.ts +0 -42
  198. package/src/services/plugin/client.test.ts +0 -177
  199. package/src/services/plugin/client.ts +0 -46
  200. package/src/services/session/_deprecated.test.ts +0 -440
  201. package/src/services/session/_deprecated.ts +0 -190
  202. package/src/services/session/client.test.ts +0 -413
  203. package/src/services/session/client.ts +0 -193
  204. package/src/services/thread/client.ts +0 -51
  205. package/src/services/topic/_deprecated.test.ts +0 -245
  206. package/src/services/topic/_deprecated.ts +0 -75
  207. package/src/services/topic/client.ts +0 -89
  208. package/src/services/topic/pglite.test.ts +0 -212
  209. package/src/services/user/_deprecated.test.ts +0 -101
  210. package/src/services/user/_deprecated.ts +0 -70
  211. package/src/services/user/client.test.ts +0 -111
  212. package/src/services/user/client.ts +0 -104
@@ -1,290 +0,0 @@
1
- import {
2
- ImportMessage,
3
- ImportSession,
4
- ImportSessionGroup,
5
- ImportTopic,
6
- ImporterEntryData,
7
- } from '@/types/importer';
8
-
9
- interface V2DB_File {
10
- /**
11
- * create Time
12
- */
13
- createdAt: number;
14
- /**
15
- * file data array buffer
16
- */
17
- data: ArrayBuffer;
18
- /**
19
- * file type
20
- * @example 'image/png'
21
- */
22
- fileType: string;
23
- id: string;
24
- metadata: any;
25
- /**
26
- * file name
27
- * @example 'test.png'
28
- */
29
- name: string;
30
- /**
31
- * the mode database save the file
32
- * local mean save the raw file into data
33
- * url mean upload the file to a cdn and then save the url
34
- */
35
- saveMode: 'local' | 'url';
36
- /**
37
- * file size
38
- */
39
- size: number;
40
- /**
41
- * file url if saveMode is url
42
- */
43
- url: string;
44
- }
45
-
46
- interface V2DB_MESSAGE {
47
- content: string;
48
- createdAt: number;
49
- error?: any;
50
- favorite: 0 | 1;
51
- files?: string[];
52
- fromModel?: string;
53
- fromProvider?: string;
54
- id: string;
55
- observationId?: string;
56
- // foreign keys
57
- parentId?: string;
58
- plugin?: any;
59
- pluginError?: any;
60
- pluginState?: any;
61
-
62
- quotaId?: string;
63
- role: string;
64
- sessionId?: string;
65
- tool_call_id?: string;
66
- tools?: object[];
67
- topicId?: string;
68
-
69
- traceId?: string;
70
- translate?: object | false;
71
- tts?: any;
72
- updatedAt: number;
73
- }
74
-
75
- interface DB_Plugin {
76
- createdAt: number;
77
- id: string;
78
- identifier: string;
79
- manifest?: object;
80
- settings?: object;
81
- type: 'plugin' | 'customPlugin';
82
- updatedAt: number;
83
- }
84
-
85
- interface DB_Session {
86
- config: object;
87
- createdAt: number;
88
- group?: string;
89
- // 原 Agent 类型
90
- id: string;
91
- meta: object;
92
- pinned?: number;
93
- type?: 'agent' | 'group';
94
- updatedAt: number;
95
- }
96
-
97
- interface DB_SessionGroup {
98
- createdAt: number;
99
- id: string;
100
- name: string;
101
- sort?: number;
102
- updatedAt: number;
103
- }
104
-
105
- interface DB_Topic {
106
- createdAt: number;
107
- favorite?: number;
108
- id: string;
109
- sessionId?: string;
110
- title: string;
111
- updatedAt: number;
112
- }
113
-
114
- interface DB_User {
115
- avatar?: string;
116
- createdAt: number;
117
- id: string;
118
- settings: object;
119
- updatedAt: number;
120
- uuid: string;
121
- }
122
-
123
- interface MigrationData {
124
- files: V2DB_File[];
125
- messages: V2DB_MESSAGE[];
126
- plugins: DB_Plugin[];
127
- sessionGroups: DB_SessionGroup[];
128
- sessions: DB_Session[];
129
- topics: DB_Topic[];
130
- users: DB_User[];
131
- }
132
-
133
- const LOBE_CHAT_LOCAL_DB_NAME = 'LOBE_CHAT_DB';
134
-
135
- const V2DB_LASET_SCHEMA_VERSION = 7;
136
- export class V2DBReader {
137
- private dbName: string = LOBE_CHAT_LOCAL_DB_NAME;
138
- private storeNames: string[];
139
-
140
- constructor(storeNames: string[]) {
141
- this.storeNames = storeNames;
142
- }
143
-
144
- /**
145
- * 读取所有数据
146
- */
147
- async readAllData(): Promise<MigrationData> {
148
- try {
149
- // 打开数据库连接
150
- const db = await this.openDB();
151
-
152
- // 并行读取所有表的数据
153
- const results = await Promise.all(
154
- this.storeNames.map((storeName) => this.readStore(db, storeName)),
155
- );
156
-
157
- // 构建返回结果
158
- const migrationData = this.storeNames.reduce((acc, storeName, index) => {
159
- // @ts-expect-error
160
- acc[storeName] = results[index];
161
- return acc;
162
- }, {} as MigrationData);
163
-
164
- // 关闭数据库连接
165
- db.close();
166
-
167
- return migrationData;
168
- } catch (error) {
169
- console.error('读取数据库失败:', error);
170
- throw error;
171
- }
172
- }
173
-
174
- async convertToImportData(data: MigrationData): Promise<ImporterEntryData> {
175
- // 转换 messages
176
- const messages = data.messages.map(
177
- (msg): ImportMessage => ({
178
- // 使用原有的 id
179
- content: msg.content,
180
- createdAt: msg.createdAt,
181
- // 处理 error
182
- error: msg.error || msg.pluginError,
183
-
184
- // 处理额外信息
185
- extra: {
186
- fromModel: msg.fromModel,
187
- fromProvider: msg.fromProvider,
188
- translate: msg.translate as any,
189
- tts: msg.tts,
190
- },
191
-
192
- files: msg.files,
193
- id: msg.id,
194
-
195
- // 复制原有字段
196
- observationId: msg.observationId,
197
- parentId: msg.parentId,
198
- plugin: msg.plugin,
199
- pluginState: msg.pluginState,
200
- quotaId: msg.quotaId,
201
- role: msg.role as any,
202
- sessionId: msg.sessionId,
203
- tool_call_id: msg.tool_call_id,
204
- tools: msg.tools as any,
205
-
206
- topicId: msg.topicId,
207
-
208
- traceId: msg.traceId,
209
-
210
- updatedAt: msg.updatedAt,
211
- }),
212
- );
213
-
214
- // 转换 sessionGroups
215
- const sessionGroups = data.sessionGroups.map(
216
- (group): ImportSessionGroup => ({
217
- createdAt: group.createdAt,
218
- id: group.id,
219
- // 使用原有的 id
220
- name: group.name,
221
- sort: group.sort || null,
222
- updatedAt: group.updatedAt,
223
- }),
224
- );
225
-
226
- // 转换 sessions
227
- const sessions = data.sessions.map(
228
- (session): ImportSession => ({
229
- // 使用原有的 id
230
- config: session.config as any,
231
- createdAt: new Date(session.createdAt).toString(),
232
- group: session.group,
233
- id: session.id,
234
- meta: session.meta as any,
235
- pinned: session.pinned ? true : undefined,
236
- type: session.type || 'agent',
237
- updatedAt: new Date(session.updatedAt).toString(),
238
- }),
239
- );
240
-
241
- const topics = data.topics.map(
242
- (topic): ImportTopic => ({
243
- ...topic,
244
- favorite: topic.favorite ? true : undefined,
245
- }),
246
- );
247
-
248
- return {
249
- messages,
250
- sessionGroups,
251
- sessions,
252
- topics,
253
- version: V2DB_LASET_SCHEMA_VERSION,
254
- };
255
- }
256
-
257
- /**
258
- * 打开数据库
259
- */
260
- private openDB(): Promise<IDBDatabase> {
261
- return new Promise((resolve, reject) => {
262
- const request = indexedDB.open(this.dbName);
263
-
264
- // eslint-disable-next-line unicorn/prefer-add-event-listener
265
- request.onerror = () => {
266
- reject(request.error);
267
- };
268
- request.onsuccess = () => resolve(request.result);
269
- });
270
- }
271
-
272
- /**
273
- * 读取单个存储对象的所有数据
274
- */
275
- private readStore(db: IDBDatabase, storeName: string): Promise<any[]> {
276
- return new Promise((resolve, reject) => {
277
- try {
278
- const transaction = db.transaction(storeName, 'readonly');
279
- const store = transaction.objectStore(storeName);
280
- const request = store.getAll();
281
-
282
- // eslint-disable-next-line unicorn/prefer-add-event-listener
283
- request.onerror = () => reject(request.error);
284
- request.onsuccess = () => resolve(request.result);
285
- } catch (error) {
286
- reject(error);
287
- }
288
- });
289
- }
290
- }
@@ -1,35 +0,0 @@
1
- import { Button } from '@lobehub/ui';
2
- import { memo } from 'react';
3
- import { useTranslation } from 'react-i18next';
4
-
5
- import { BRANDING_NAME } from '@/const/branding';
6
-
7
- const ExportConfigButton = memo<{ primary?: boolean; state: any }>(({ state, primary }) => {
8
- const { t } = useTranslation('migration');
9
-
10
- const exportData = () => {
11
- const config = { exportType: 'sessions', state, version: 1 };
12
-
13
- const url = URL.createObjectURL(
14
- new Blob([JSON.stringify(config)], { type: 'application/json' }),
15
- );
16
-
17
- const a = document.createElement('a');
18
- a.href = url;
19
- a.download = `${BRANDING_NAME}-backup-v1.json`;
20
-
21
- document.body.append(a);
22
- a.click();
23
-
24
- URL.revokeObjectURL(url);
25
- a.remove();
26
- };
27
-
28
- return (
29
- <Button onClick={exportData} size={'large'} type={primary ? 'primary' : undefined}>
30
- {t('dbV1.action.downloadBackup')}
31
- </Button>
32
- );
33
- });
34
-
35
- export default ExportConfigButton;
@@ -1,120 +0,0 @@
1
- import { Alert, Button, Highlighter, Icon } from '@lobehub/ui';
2
- import { Popconfirm, Result } from 'antd';
3
- import { useTheme } from 'antd-style';
4
- import { createStore, del, get, set } from 'idb-keyval';
5
- import { ShieldAlert } from 'lucide-react';
6
- import Link from 'next/link';
7
- import { lighten } from 'polished';
8
- import { memo } from 'react';
9
- import { Trans, useTranslation } from 'react-i18next';
10
- import { Flexbox } from 'react-layout-kit';
11
- import Balancer from 'react-wrap-balancer';
12
-
13
- import { GITHUB_ISSUES } from '@/const/url';
14
- import { githubService } from '@/services/github';
15
-
16
- import ExportConfigButton from './ExportConfigButton';
17
- import UpgradeButton from './UpgradeButton';
18
- import { MigrationError, UpgradeStatus, V1DB_NAME, V1DB_TABLE_NAME } from './const';
19
-
20
- const clearLocal = async () => {
21
- const store = createStore(V1DB_NAME, V1DB_TABLE_NAME);
22
- // delete the state key and back it up to state_backup for reproduce
23
- const state = await get('state', store);
24
- await del('state');
25
- await set('state_backup', state, store);
26
- location.reload();
27
- };
28
-
29
- interface FailedProps {
30
- error?: MigrationError;
31
- setError: (error: MigrationError) => void;
32
- setUpgradeStatus: (status: UpgradeStatus) => void;
33
- state: any;
34
- upgradeStatus: UpgradeStatus;
35
- }
36
- const Failed = memo<FailedProps>(({ error, state, setUpgradeStatus, setError, upgradeStatus }) => {
37
- const { t } = useTranslation('migration');
38
- const theme = useTheme();
39
-
40
- return (
41
- <Result
42
- extra={
43
- <Flexbox gap={24}>
44
- {!!error && (
45
- <Alert
46
- extra={
47
- <Highlighter actionIconSize={'small'} language={'json'}>
48
- {JSON.stringify(error)}
49
- </Highlighter>
50
- }
51
- message={error.message}
52
- style={{ flex: 1 }}
53
- type={'error'}
54
- />
55
- )}
56
- <Flexbox
57
- gap={16}
58
- horizontal
59
- justify={'center'}
60
- style={{
61
- alignSelf: 'center',
62
- flexWrap: 'wrap',
63
- }}
64
- >
65
- <ExportConfigButton primary state={state} />
66
- <Popconfirm
67
- arrow={false}
68
- okButtonProps={{
69
- danger: true,
70
- type: 'primary',
71
- }}
72
- onConfirm={clearLocal}
73
- styles={{
74
- body: { background: lighten(0.03, theme.colorBgElevated) },
75
- root: { width: 340 },
76
- }}
77
- title={t('dbV1.clear.confirm')}
78
- >
79
- <Button size={'large'}>{t('dbV1.action.clearDB')}</Button>
80
- </Popconfirm>
81
- <UpgradeButton
82
- primary={false}
83
- setError={setError}
84
- setUpgradeStatus={setUpgradeStatus}
85
- state={state}
86
- upgradeStatus={upgradeStatus}
87
- >
88
- {t('dbV1.action.reUpgrade')}
89
- </UpgradeButton>
90
- </Flexbox>
91
- </Flexbox>
92
- }
93
- icon={<Icon icon={ShieldAlert} />}
94
- status={'error'}
95
- style={{ paddingBlock: 24, width: 450 }}
96
- subTitle={
97
- <Balancer>
98
- <Trans i18nKey="dbV1.upgrade.error.subTitle" ns={'migration'}>
99
- 非常抱歉,数据库升级过程发生异常。请重试升级,或
100
- <Link
101
- aria-label={'issue'}
102
- href={GITHUB_ISSUES}
103
- onClick={(e) => {
104
- e.preventDefault();
105
- githubService.submitDBV1UpgradeError(1, error!);
106
- }}
107
- target="_blank"
108
- >
109
- 提交问题
110
- </Link>
111
- 我们将会第一时间帮你排查问题。
112
- </Trans>
113
- </Balancer>
114
- }
115
- title={t('dbV1.upgrade.error.title')}
116
- />
117
- );
118
- });
119
-
120
- export default Failed;
@@ -1,81 +0,0 @@
1
- import { Button, Icon } from '@lobehub/ui';
2
- import { Result } from 'antd';
3
- import { CheckCircle, CpuIcon } from 'lucide-react';
4
- import { memo, useState } from 'react';
5
- import { useTranslation } from 'react-i18next';
6
- import { Center } from 'react-layout-kit';
7
-
8
- import DataStyleModal from '@/components/DataStyleModal';
9
- import { BRANDING_NAME } from '@/const/branding';
10
-
11
- import Failed from './Failed';
12
- import MigrationStart from './Start';
13
- import { MigrationError, UpgradeStatus } from './const';
14
-
15
- interface MigrationModalProps {
16
- open: boolean;
17
- setOpen: (open: boolean) => void;
18
- state: any;
19
- }
20
-
21
- const MigrationModal = memo<MigrationModalProps>(({ setOpen, open, state: dbState }) => {
22
- const { t } = useTranslation('migration');
23
- const [upgradeStatus, setUpgradeStatus] = useState<UpgradeStatus>(UpgradeStatus.START);
24
-
25
- const [error, setError] = useState<MigrationError>();
26
-
27
- const close = () => {
28
- setOpen(false);
29
- };
30
-
31
- const renderContent = () => {
32
- switch (upgradeStatus) {
33
- case UpgradeStatus.START:
34
- case UpgradeStatus.UPGRADING: {
35
- return (
36
- <MigrationStart
37
- setError={setError}
38
- setUpgradeStatus={setUpgradeStatus}
39
- state={dbState}
40
- upgradeStatus={upgradeStatus}
41
- />
42
- );
43
- }
44
- case UpgradeStatus.UPGRADED: {
45
- return (
46
- <Result
47
- extra={
48
- <Button onClick={close} size={'large'} type={'primary'}>
49
- {t('dbV1.action.start')}
50
- </Button>
51
- }
52
- icon={<Icon icon={CheckCircle} />}
53
- status={'success'}
54
- style={{ paddingBlock: 24 }}
55
- subTitle={t('dbV1.upgrade.success.subTitle', { appName: BRANDING_NAME })}
56
- title={t('dbV1.upgrade.success.title')}
57
- />
58
- );
59
- }
60
- case UpgradeStatus.UPGRADE_FAILED: {
61
- return (
62
- <Failed
63
- error={error}
64
- setError={setError}
65
- setUpgradeStatus={setUpgradeStatus}
66
- state={dbState}
67
- upgradeStatus={upgradeStatus}
68
- />
69
- );
70
- }
71
- }
72
- };
73
-
74
- return (
75
- <DataStyleModal icon={CpuIcon} open={open} title={t('dbV1.title', { appName: BRANDING_NAME })}>
76
- <Center gap={48}>{renderContent()}</Center>
77
- </DataStyleModal>
78
- );
79
- });
80
-
81
- export default MigrationModal;
@@ -1,108 +0,0 @@
1
- import { Icon } from '@lobehub/ui';
2
- import { createStyles } from 'antd-style';
3
- import { Database, SearchCheck, Zap } from 'lucide-react';
4
- import { memo } from 'react';
5
- import { useTranslation } from 'react-i18next';
6
- import { Center, Flexbox } from 'react-layout-kit';
7
- import Balancer from 'react-wrap-balancer';
8
-
9
- import { BRANDING_NAME } from '@/const/branding';
10
-
11
- import ExportConfigButton from './ExportConfigButton';
12
- import UpgradeButton, { UpgradeButtonProps } from './UpgradeButton';
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
- font-size: ${token.fontSizeLG}px;
47
- font-weight: bold;
48
- `,
49
- }));
50
-
51
- const MigrationStart = memo<UpgradeButtonProps>((props) => {
52
- const { t } = useTranslation('migration');
53
- const { styles } = useStyles();
54
-
55
- const features = [
56
- {
57
- avatar: Database,
58
- desc: t('dbV1.features.capability.desc'),
59
- title: t('dbV1.features.capability.title'),
60
- },
61
- {
62
- avatar: Zap,
63
- desc: t('dbV1.features.performance.desc'),
64
- title: t('dbV1.features.performance.title'),
65
- },
66
- {
67
- avatar: SearchCheck,
68
- desc: t('dbV1.features.use.desc'),
69
- title: t('dbV1.features.use.title'),
70
- },
71
- ];
72
-
73
- return (
74
- <>
75
- <Flexbox>
76
- <Flexbox className={styles.intro} style={{ textAlign: 'center' }} width={460}>
77
- {t('dbV1.description', { appName: BRANDING_NAME })}
78
- </Flexbox>
79
- </Flexbox>
80
- <Flexbox gap={32}>
81
- {features.map((item) => {
82
- return (
83
- <Flexbox align={'flex-start'} gap={24} horizontal key={item.title}>
84
- <Center className={styles.iconCtn}>
85
- <Icon className={styles.icon} icon={item.avatar} size={36} />
86
- </Center>
87
- <Flexbox gap={8}>
88
- <p className={styles.title}>{item.title}</p>
89
- <p className={styles.desc}>{item.desc}</p>
90
- </Flexbox>
91
- </Flexbox>
92
- );
93
- })}
94
- </Flexbox>
95
- <Flexbox align={'center'} gap={16} style={{ paddingBottom: 16 }}>
96
- <Flexbox gap={16} horizontal justify={'center'} style={{ flexWrap: 'wrap' }}>
97
- <ExportConfigButton state={props.state} />
98
- <UpgradeButton {...props} />
99
- </Flexbox>
100
- <Flexbox align={'center'} className={styles.hint}>
101
- <Balancer>{t('dbV1.upgradeTip', { appName: BRANDING_NAME })}</Balancer>
102
- </Flexbox>
103
- </Flexbox>
104
- </>
105
- );
106
- });
107
-
108
- export default MigrationStart;
@@ -1,71 +0,0 @@
1
- import { Button } from '@lobehub/ui';
2
- import { ReactNode, memo } from 'react';
3
- import { useTranslation } from 'react-i18next';
4
-
5
- import { ClientService } from '@/services/import/_deprecated';
6
- import { useChatStore } from '@/store/chat';
7
- import { useSessionStore } from '@/store/session';
8
-
9
- import { MigrationError, UpgradeStatus } from './const';
10
-
11
- export interface UpgradeButtonProps {
12
- children?: ReactNode;
13
- primary?: boolean;
14
- setError: (error: MigrationError) => void;
15
- setUpgradeStatus: (status: UpgradeStatus) => void;
16
- state: any;
17
- upgradeStatus: UpgradeStatus;
18
- }
19
-
20
- const UpgradeButton = memo<UpgradeButtonProps>(
21
- ({ setUpgradeStatus, upgradeStatus, state, setError, primary = true, children }) => {
22
- const { t } = useTranslation('migration');
23
-
24
- const refreshSession = useSessionStore((s) => s.refreshSessions);
25
- const [refreshMessages, refreshTopic] = useChatStore((s) => [
26
- s.refreshMessages,
27
- s.refreshTopic,
28
- ]);
29
-
30
- const upgrade = async () => {
31
- try {
32
- setUpgradeStatus(UpgradeStatus.UPGRADING);
33
-
34
- const configService = new ClientService();
35
- await configService.importConfigState({
36
- exportType: 'sessions',
37
- state: state,
38
- version: 7,
39
- });
40
-
41
- await refreshSession();
42
- await refreshMessages();
43
- await refreshTopic();
44
-
45
- localStorage.setItem('V2DB_IS_MIGRATED', '1');
46
-
47
- setUpgradeStatus(UpgradeStatus.UPGRADED);
48
-
49
- return { success: true };
50
- } catch (error) {
51
- setUpgradeStatus(UpgradeStatus.UPGRADE_FAILED);
52
- const err = error as { message: string; stack: string };
53
-
54
- setError({ message: err.message, stack: err.stack });
55
- }
56
- };
57
-
58
- return (
59
- <Button
60
- color={primary ? undefined : 'default'}
61
- loading={upgradeStatus === UpgradeStatus.UPGRADING}
62
- onClick={upgrade}
63
- size={'large'}
64
- >
65
- {children ?? t('dbV1.action.upgrade')}
66
- </Button>
67
- );
68
- },
69
- );
70
-
71
- export default UpgradeButton;