@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,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;