@gientech/modual 1.9.4-fix.1 → 1.9.4-fix.2

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 (432) hide show
  1. package/package.json +43 -106
  2. package/.editorconfig +0 -38
  3. package/.prettierignore +0 -16
  4. package/.prettierrc +0 -17
  5. package/USAGE.md +0 -247
  6. package/bash.exe.stackdump +0 -40
  7. package/components.json +0 -21
  8. package/dist/README.md +0 -643
  9. package/dist/package.json +0 -68
  10. package/doc_assets/2.png +0 -0
  11. package/doc_assets/demo.md +0 -27
  12. package/doc_assets/demos/dist-app/assets/index.Dh-ZAS9Z.css +0 -2
  13. package/doc_assets/demos/dist-app/assets/index.Dv8KVW18.js +0 -23699
  14. package/doc_assets/demos/dist-app/assets/index.Dv8KVW18.js.map +0 -1
  15. package/doc_assets/demos/dist-app/index.html +0 -14
  16. package/doc_assets/demos/dist-app/vite.svg +0 -1
  17. package/doc_assets/images/1.png +0 -0
  18. package/doc_assets/images/3.png +0 -0
  19. package/doc_assets/images/component-screenshot.png +0 -1
  20. package/doc_assets/install.md +0 -5
  21. package/doc_assets//346/226/271/346/241/210//344/274/230/345/214/226/346/226/271/346/241/210-/345/244/232/344/274/232/350/257/235SSE/350/277/236/346/216/245/347/256/241/347/220/206.md +0 -504
  22. package/eslint.config.js +0 -92
  23. package/index.html +0 -13
  24. package/package.json.demo-backup +0 -109
  25. package/postcss.config.cjs +0 -19
  26. package/public/icons/answerAwartar.png +0 -0
  27. package/public/icons/docx-file.png +0 -0
  28. package/public/icons/folder.png +0 -0
  29. package/public/icons/html.png +0 -0
  30. package/public/icons/image.png +0 -0
  31. package/public/icons/jpg-file.png +0 -0
  32. package/public/icons/json.png +0 -0
  33. package/public/icons/md.png +0 -0
  34. package/public/icons/pdf.png +0 -0
  35. package/public/icons/pptx.png +0 -0
  36. package/public/icons/questionAwartar.png +0 -0
  37. package/public/icons/sheets.png +0 -0
  38. package/public/icons/txt.png +0 -0
  39. package/public/icons/xlsx.png +0 -0
  40. package/public/vite.svg +0 -1
  41. package/public/worker/pdf.worker.min.js +0 -22
  42. package/rag/assets/Doris.3ZRHc3Fu.png +0 -0
  43. package/rag/assets/PostgreSQL.DuLqLAFX.png +0 -0
  44. package/rag/assets/SQLServer.CWyNu24v.png +0 -0
  45. package/rag/assets/empty.BfkDKJsb.png +0 -0
  46. package/rag/assets/homeBg.Mr_kGuA9.png +0 -0
  47. package/rag/assets/index.Bd0tNzw0.js +0 -2797
  48. package/rag/assets/index.D6t67hlu.css +0 -1
  49. package/rag/assets/left.KBHV5h7q.jpg +0 -0
  50. package/rag/assets/logoImg.Gmp_tdkD.png +0 -0
  51. package/rag/assets/worker-BbpylX7l.DptbXke_.js +0 -13
  52. package/rag/icons/answerAwartar.png +0 -0
  53. package/rag/icons/docx-file.png +0 -0
  54. package/rag/icons/folder.png +0 -0
  55. package/rag/icons/html.png +0 -0
  56. package/rag/icons/image.png +0 -0
  57. package/rag/icons/jpg-file.png +0 -0
  58. package/rag/icons/json.png +0 -0
  59. package/rag/icons/md.png +0 -0
  60. package/rag/icons/pdf.png +0 -0
  61. package/rag/icons/pptx.png +0 -0
  62. package/rag/icons/questionAwartar.png +0 -0
  63. package/rag/icons/sheets.png +0 -0
  64. package/rag/icons/txt.png +0 -0
  65. package/rag/icons/xlsx.png +0 -0
  66. package/scripts/README.md +0 -133
  67. package/scripts/build-demo.js +0 -88
  68. package/scripts/decrypt-api-key.js +0 -95
  69. package/scripts/demo-selector.js +0 -216
  70. package/scripts/dev-demo.js +0 -76
  71. package/scripts/preview-demo.js +0 -130
  72. package/scripts/run-demo.bat +0 -34
  73. package/src/assets/img/close.png +0 -0
  74. package/src/assets/img/database.png +0 -0
  75. package/src/assets/img/downArrow.png +0 -0
  76. package/src/assets/img/downLoad.png +0 -0
  77. package/src/assets/img/excel.png +0 -0
  78. package/src/assets/img/graphIcon.png +0 -0
  79. package/src/assets/img/img.png +0 -0
  80. package/src/assets/img/pdf.png +0 -0
  81. package/src/assets/img/ppt.png +0 -0
  82. package/src/assets/img/singleQa.png +0 -0
  83. package/src/assets/img/txt.png +0 -0
  84. package/src/assets/img/webSearch.png +0 -0
  85. package/src/assets/img/word.png +0 -0
  86. package/src/assets/login/homeBg.png +0 -0
  87. package/src/assets/login/left.jpg +0 -0
  88. package/src/assets/login/logoImg.png +0 -0
  89. package/src/examples/ConversationAssistantPage/index.tsx +0 -41
  90. package/src/examples/Demo/index.tsx +0 -12
  91. package/src/examples/LoginPage/index.tsx +0 -18
  92. package/src/examples/chat/components/DrawerGraphPreview.tsx +0 -78
  93. package/src/examples/chat/index.tsx +0 -162
  94. package/src/examples/chat/logo03.png +0 -0
  95. package/src/examples/gientechStreamFilesReader/index.tsx +0 -951
  96. package/src/examples/headlessChat/index.tsx +0 -218
  97. package/src/examples/ragDatabaseDataPage/index.tsx +0 -40
  98. package/src/examples/ragDatabaseIdPage/index.tsx +0 -47
  99. package/src/examples/ragDatabasePage/index.tsx +0 -36
  100. package/src/examples/ragModelManagePage/index.tsx +0 -37
  101. package/src/examples/ragSearchPage/index.tsx +0 -0
  102. package/src/examples/ragSensitiveWordsPage/index.tsx +0 -32
  103. package/src/examples/streamFiles/index.tsx +0 -417
  104. package/src/lib_enter.ts +0 -43
  105. package/src/main.tsx +0 -5
  106. package/src/main.tsx.backup +0 -5
  107. package/src/modules/assistantConfig/assets/databse.svg +0 -6
  108. package/src/modules/assistantConfig/assets/empty.png +0 -0
  109. package/src/modules/assistantConfig/assets/graph.svg +0 -4
  110. package/src/modules/assistantConfig/assets/knowledge.svg +0 -4
  111. package/src/modules/assistantConfig/assets/sensitive.svg +0 -5
  112. package/src/modules/assistantConfig/components/Database.tsx +0 -171
  113. package/src/modules/assistantConfig/components/Graph.tsx +0 -177
  114. package/src/modules/assistantConfig/components/Knowledge.tsx +0 -276
  115. package/src/modules/assistantConfig/components/NotFoundContent.tsx +0 -21
  116. package/src/modules/assistantConfig/components/Paragraph.tsx +0 -51
  117. package/src/modules/assistantConfig/components/ParamsItem.tsx +0 -39
  118. package/src/modules/assistantConfig/components/ResourceBinderItem.tsx +0 -133
  119. package/src/modules/assistantConfig/components/SearchableSelector.tsx +0 -500
  120. package/src/modules/assistantConfig/components/Sensitive.tsx +0 -221
  121. package/src/modules/assistantConfig/components/SliderInput.tsx +0 -65
  122. package/src/modules/assistantConfig/constants.tsx +0 -75
  123. package/src/modules/assistantConfig/index.tsx +0 -706
  124. package/src/modules/assistantConfig/server.ts +0 -262
  125. package/src/modules/chat/Conversations/Item.tsx +0 -167
  126. package/src/modules/chat/Conversations/List.tsx +0 -210
  127. package/src/modules/chat/Conversations/groupByTime.ts +0 -39
  128. package/src/modules/chat/Conversations/index.tsx +0 -252
  129. package/src/modules/chat/ReferenceBar.tsx +0 -622
  130. package/src/modules/chat/constants.tsx +0 -56
  131. package/src/modules/chat/data.txt +0 -82
  132. package/src/modules/chat/index.tsx +0 -2087
  133. package/src/modules/chat/referenceCom/DeleteModal.tsx +0 -75
  134. package/src/modules/chat/referenceCom/DrawerContent.tsx +0 -136
  135. package/src/modules/chat/referenceCom/DrawerDatabase.tsx +0 -102
  136. package/src/modules/chat/referenceCom/DrawerGraphPreview.tsx +0 -86
  137. package/src/modules/chat/referenceCom/DrawerPreview.tsx +0 -73
  138. package/src/modules/chat/referenceCom/DrawerTitle.tsx +0 -26
  139. package/src/modules/chat/referenceCom/RenameModal.tsx +0 -86
  140. package/src/modules/chat/referenceCom/TagCom.tsx +0 -30
  141. package/src/modules/chat/style.less +0 -3
  142. package/src/modules/chat/types.ts +0 -17
  143. package/src/modules/chat/utils/index.ts +0 -348
  144. package/src/modules/database/CreateModal.tsx +0 -403
  145. package/src/modules/database/assets/Doris.png +0 -0
  146. package/src/modules/database/assets/PostgreSQL.png +0 -0
  147. package/src/modules/database/assets/SQLServer.png +0 -0
  148. package/src/modules/database/assets/database.svg +0 -11
  149. package/src/modules/database/assets/database_add.svg +0 -53
  150. package/src/modules/database/assets/database_connect.svg +0 -66
  151. package/src/modules/database/assets/database_upload.svg +0 -29
  152. package/src/modules/database/assets/empty.png +0 -0
  153. package/src/modules/database/assets/mysql.svg +0 -14
  154. package/src/modules/database/index.tsx +0 -477
  155. package/src/modules/database/server.ts +0 -196
  156. package/src/modules/databaseId/CustomCom.tsx +0 -156
  157. package/src/modules/databaseId/EditConfig.tsx +0 -280
  158. package/src/modules/databaseId/UploadDrawer.tsx +0 -535
  159. package/src/modules/databaseId/assets/aiOptimize.svg +0 -10
  160. package/src/modules/databaseId/assets/empty.png +0 -0
  161. package/src/modules/databaseId/assets/template.svg +0 -6
  162. package/src/modules/databaseId/assets/upload.svg +0 -9
  163. package/src/modules/databaseId/assets/useTemp.svg +0 -6
  164. package/src/modules/databaseId/index.tsx +0 -769
  165. package/src/modules/databaseId/server.ts +0 -286
  166. package/src/modules/databaseId/style.css +0 -5
  167. package/src/modules/databaseTable/EditRowDrawer.tsx +0 -124
  168. package/src/modules/databaseTable/index.tsx +0 -359
  169. package/src/modules/databaseTable/server.ts +0 -180
  170. package/src/modules/headlessChat/ReferenceBar.tsx +0 -783
  171. package/src/modules/headlessChat/constants.tsx +0 -32
  172. package/src/modules/headlessChat/index.tsx +0 -1411
  173. package/src/modules/headlessChat/referenceCom/DeleteModal.tsx +0 -75
  174. package/src/modules/headlessChat/referenceCom/DrawerContent.tsx +0 -136
  175. package/src/modules/headlessChat/referenceCom/DrawerDatabase.tsx +0 -102
  176. package/src/modules/headlessChat/referenceCom/DrawerGraphPreview.tsx +0 -86
  177. package/src/modules/headlessChat/referenceCom/DrawerPreview.tsx +0 -73
  178. package/src/modules/headlessChat/referenceCom/DrawerTitle.tsx +0 -26
  179. package/src/modules/headlessChat/referenceCom/RenameModal.tsx +0 -86
  180. package/src/modules/headlessChat/referenceCom/TagCom.tsx +0 -30
  181. package/src/modules/headlessChat/style.less +0 -3
  182. package/src/modules/headlessChat/types.ts +0 -23
  183. package/src/modules/headlessChat/utils/index.ts +0 -348
  184. package/src/modules/login/components/Login/LoginBox/index.tsx +0 -102
  185. package/src/modules/login/components/Login/RegisterBox/index.tsx +0 -180
  186. package/src/modules/login/components/Login/index.tsx +0 -100
  187. package/src/modules/login/index.tsx +0 -106
  188. package/src/modules/login/style.css +0 -3
  189. package/src/modules/login/useServices.ts +0 -53
  190. package/src/modules/login/utils.ts +0 -42
  191. package/src/modules/modelManage/ConfigDrawer.tsx +0 -249
  192. package/src/modules/modelManage/ReplaceModal.tsx +0 -124
  193. package/src/modules/modelManage/assets/empty.png +0 -0
  194. package/src/modules/modelManage/const.ts +0 -51
  195. package/src/modules/modelManage/index.tsx +0 -599
  196. package/src/modules/modelManage/server.ts +0 -223
  197. package/src/modules/nodegraph/index.tsx +0 -1
  198. package/src/modules/search/assets/Icon-history.svg +0 -8
  199. package/src/modules/search/assets/answerAwartar.png +0 -0
  200. package/src/modules/search/assets/doc.png +0 -0
  201. package/src/modules/search/assets/genera.gif +0 -0
  202. package/src/modules/search/assets/icon-robot.svg +0 -9
  203. package/src/modules/search/assets/icon-search-bar.svg +0 -14
  204. package/src/modules/search/assets/icon-sub-title.svg +0 -3
  205. package/src/modules/search/assets/icon-title.svg +0 -9
  206. package/src/modules/search/assets/icon-zoomOut.svg +0 -9
  207. package/src/modules/search/assets/iconAi.svg +0 -9
  208. package/src/modules/search/assets/pdf.png +0 -0
  209. package/src/modules/search/assets/ppt.png +0 -0
  210. package/src/modules/search/assets/search.svg +0 -3
  211. package/src/modules/search/assets/selected.svg +0 -4
  212. package/src/modules/search/assets/txt.png +0 -0
  213. package/src/modules/search/assets/xls.png +0 -0
  214. package/src/modules/search/components/AssisSelect.tsx +0 -137
  215. package/src/modules/search/components/Editor/ChatViewEditor.tsx +0 -261
  216. package/src/modules/search/components/Editor/aichat.css +0 -1
  217. package/src/modules/search/components/Editor/constant.ts +0 -13
  218. package/src/modules/search/components/Editor/index.tsx +0 -113
  219. package/src/modules/search/components/Editor/plugins/autofomatRules.ts +0 -332
  220. package/src/modules/search/components/Editor/plugins/convertImgPlugins.tsx +0 -20
  221. package/src/modules/search/components/Editor/plugins/createIndexes.tsx +0 -38
  222. package/src/modules/search/components/Editor/plugins/displayer.ts +0 -298
  223. package/src/modules/search/components/Editor/plugins/imageClick.tsx +0 -32
  224. package/src/modules/search/components/Editor/plugins/myplugin.tsx +0 -98
  225. package/src/modules/search/components/Editor/ui/avatar.tsx +0 -19
  226. package/src/modules/search/components/Editor/ui/blockquote-element.tsx +0 -21
  227. package/src/modules/search/components/Editor/ui/button.tsx +0 -58
  228. package/src/modules/search/components/Editor/ui/calendar.tsx +0 -68
  229. package/src/modules/search/components/Editor/ui/caption.tsx +0 -46
  230. package/src/modules/search/components/Editor/ui/checkbox.tsx +0 -27
  231. package/src/modules/search/components/Editor/ui/code-block-combobox.tsx +0 -188
  232. package/src/modules/search/components/Editor/ui/code-block-element.css +0 -434
  233. package/src/modules/search/components/Editor/ui/code-block-element.tsx +0 -39
  234. package/src/modules/search/components/Editor/ui/code-leaf.tsx +0 -24
  235. package/src/modules/search/components/Editor/ui/code-line-element.tsx +0 -10
  236. package/src/modules/search/components/Editor/ui/code-syntax-leaf.tsx +0 -21
  237. package/src/modules/search/components/Editor/ui/column-element.tsx +0 -30
  238. package/src/modules/search/components/Editor/ui/column-group-element.tsx +0 -94
  239. package/src/modules/search/components/Editor/ui/command.tsx +0 -75
  240. package/src/modules/search/components/Editor/ui/comment-avatar.tsx +0 -22
  241. package/src/modules/search/components/Editor/ui/comment-create-form.tsx +0 -37
  242. package/src/modules/search/components/Editor/ui/comment-item.tsx +0 -74
  243. package/src/modules/search/components/Editor/ui/comment-leaf.tsx +0 -49
  244. package/src/modules/search/components/Editor/ui/comment-more-dropdown.tsx +0 -42
  245. package/src/modules/search/components/Editor/ui/comment-reply-items.tsx +0 -22
  246. package/src/modules/search/components/Editor/ui/comment-resolve-button.tsx +0 -32
  247. package/src/modules/search/components/Editor/ui/comment-value.tsx +0 -34
  248. package/src/modules/search/components/Editor/ui/comments-popover.tsx +0 -63
  249. package/src/modules/search/components/Editor/ui/date-element.tsx +0 -83
  250. package/src/modules/search/components/Editor/ui/dialog.tsx +0 -63
  251. package/src/modules/search/components/Editor/ui/draggable.tsx +0 -177
  252. package/src/modules/search/components/Editor/ui/dropdown-menu.tsx +0 -180
  253. package/src/modules/search/components/Editor/ui/emoji-input-element.tsx +0 -85
  254. package/src/modules/search/components/Editor/ui/excalidraw-element.tsx +0 -28
  255. package/src/modules/search/components/Editor/ui/fixed-toolbar-buttons.tsx +0 -76
  256. package/src/modules/search/components/Editor/ui/fixed-toolbar.tsx +0 -8
  257. package/src/modules/search/components/Editor/ui/floating-toolbar-buttons.tsx +0 -51
  258. package/src/modules/search/components/Editor/ui/floating-toolbar.tsx +0 -77
  259. package/src/modules/search/components/Editor/ui/heading-element.tsx +0 -48
  260. package/src/modules/search/components/Editor/ui/highlight-leaf.tsx +0 -17
  261. package/src/modules/search/components/Editor/ui/hr-element.tsx +0 -30
  262. package/src/modules/search/components/Editor/ui/icons.tsx +0 -267
  263. package/src/modules/search/components/Editor/ui/image-element.tsx +0 -74
  264. package/src/modules/search/components/Editor/ui/inline-combobox.tsx +0 -368
  265. package/src/modules/search/components/Editor/ui/input.tsx +0 -25
  266. package/src/modules/search/components/Editor/ui/insert-dropdown-menu.tsx +0 -218
  267. package/src/modules/search/components/Editor/ui/kbd-leaf.tsx +0 -20
  268. package/src/modules/search/components/Editor/ui/link-element.tsx +0 -29
  269. package/src/modules/search/components/Editor/ui/link-floating-toolbar.tsx +0 -161
  270. package/src/modules/search/components/Editor/ui/list-element.tsx +0 -30
  271. package/src/modules/search/components/Editor/ui/mark-toolbar-button.tsx +0 -24
  272. package/src/modules/search/components/Editor/ui/media-embed-element.tsx +0 -133
  273. package/src/modules/search/components/Editor/ui/media-popover.tsx +0 -97
  274. package/src/modules/search/components/Editor/ui/mention-element.tsx +0 -43
  275. package/src/modules/search/components/Editor/ui/mention-input-element.tsx +0 -141
  276. package/src/modules/search/components/Editor/ui/mode-dropdown-menu.tsx +0 -93
  277. package/src/modules/search/components/Editor/ui/more-dropdown-menu.tsx +0 -67
  278. package/src/modules/search/components/Editor/ui/paragraph-element.tsx +0 -4
  279. package/src/modules/search/components/Editor/ui/placeholder.tsx +0 -52
  280. package/src/modules/search/components/Editor/ui/popover.tsx +0 -32
  281. package/src/modules/search/components/Editor/ui/resizable.tsx +0 -66
  282. package/src/modules/search/components/Editor/ui/separator.tsx +0 -25
  283. package/src/modules/search/components/Editor/ui/style.less +0 -12
  284. package/src/modules/search/components/Editor/ui/table-cell-element.tsx +0 -143
  285. package/src/modules/search/components/Editor/ui/table-element.tsx +0 -243
  286. package/src/modules/search/components/Editor/ui/table-row-element.tsx +0 -22
  287. package/src/modules/search/components/Editor/ui/tableValue.tsx +0 -135
  288. package/src/modules/search/components/Editor/ui/todo-list-element.tsx +0 -43
  289. package/src/modules/search/components/Editor/ui/toggle-element.tsx +0 -31
  290. package/src/modules/search/components/Editor/ui/toolbar.tsx +0 -157
  291. package/src/modules/search/components/Editor/ui/tooltip.tsx +0 -65
  292. package/src/modules/search/components/Editor/ui/turn-into-dropdown-menu.tsx +0 -160
  293. package/src/modules/search/components/Editor/ui/with-draggables.tsx +0 -175
  294. package/src/modules/search/components/FileList.tsx +0 -287
  295. package/src/modules/search/components/ImageGroupView/index.tsx +0 -85
  296. package/src/modules/search/components/ResultContent.tsx +0 -232
  297. package/src/modules/search/components/SearchInput.tsx +0 -232
  298. package/src/modules/search/components/SearchLanding.tsx +0 -74
  299. package/src/modules/search/components/SearchView.tsx +0 -563
  300. package/src/modules/search/components/SimpleEditor.tsx +0 -158
  301. package/src/modules/search/components/SimpleFileList.tsx +0 -215
  302. package/src/modules/search/index.tsx +0 -10
  303. package/src/modules/search/reademe.md +0 -1
  304. package/src/modules/search/servers/apis.tsx +0 -19
  305. package/src/modules/search/servers/index.ts +0 -184
  306. package/src/modules/search/style.less +0 -503
  307. package/src/modules/search/type.ts +0 -22
  308. package/src/modules/search/utils.ts +0 -34
  309. package/src/modules/sensitive/index.tsx +0 -313
  310. package/src/modules/sensitive/server.ts +0 -122
  311. package/src/modules/streamFilesReader/GientechStreamReader.tsx +0 -1625
  312. package/src/modules/streamFilesReader/components/Header/Toolbar.tsx +0 -0
  313. package/src/modules/streamFilesReader/components/Header/index.tsx +0 -297
  314. package/src/modules/streamFilesReader/index.tsx +0 -3
  315. package/src/style.css +0 -6
  316. package/src/type.d.ts +0 -0
  317. package/src/utils/commonFn.tsx +0 -111
  318. package/src/utils/decryptApiKey.ts +0 -40
  319. package/src/utils/gientechCommon/components/AppError.tsx +0 -32
  320. package/src/utils/gientechCommon/components/AppLoading.tsx +0 -75
  321. package/src/utils/gientechCommon/components/DeleteModal.tsx +0 -75
  322. package/src/utils/gientechCommon/components/DisplayError.tsx +0 -33
  323. package/src/utils/gientechCommon/components/DisplayLoading.tsx +0 -38
  324. package/src/utils/gientechCommon/components/FeedBackModal.tsx +0 -318
  325. package/src/utils/gientechCommon/components/FileCardCommon.tsx +0 -82
  326. package/src/utils/gientechCommon/components/FileManager/index.tsx +0 -390
  327. package/src/utils/gientechCommon/components/FileManager/style.css +0 -5
  328. package/src/utils/gientechCommon/components/Messages/GientechNewChatWelcome.tsx +0 -581
  329. package/src/utils/gientechCommon/components/Messages/ReferenceCard.tsx +0 -339
  330. package/src/utils/gientechCommon/components/Messages/RetriveItem.tsx +0 -245
  331. package/src/utils/gientechCommon/components/Messages/WebRetriveItem.tsx +0 -209
  332. package/src/utils/gientechCommon/components/Messages/defaultBot.png +0 -0
  333. package/src/utils/gientechCommon/components/Messages/defaultStyleSet.tsx +0 -148
  334. package/src/utils/gientechCommon/components/Messages/defaultWeLogo.svg +0 -14
  335. package/src/utils/gientechCommon/components/RenameModal.tsx +0 -86
  336. package/src/utils/gientechCommon/components/style.less +0 -11
  337. package/src/utils/gientechCommon/configs/commonConfig.ts +0 -2
  338. package/src/utils/gientechCommon/configs/senderConfig.ts +0 -0
  339. package/src/utils/gientechCommon/configs/stylesConfig.ts +0 -142
  340. package/src/utils/gientechCommon/hooks/AichatUseController.tsx +0 -417
  341. package/src/utils/gientechCommon/slate/converters/deserializers.ts +0 -763
  342. package/src/utils/gientechCommon/slate/converters/mockData.ts +0 -232
  343. package/src/utils/gientechCommon/slate/converters/slateConverters.ts +0 -258
  344. package/src/utils/gientechCommon/slate/richElements/index.tsx +0 -499
  345. package/src/utils/gientechCommon/utils/request.ts +0 -37
  346. package/src/utils/gientechCommon/utils/serverFn.ts +0 -172
  347. package/src/utils/index.tsx +0 -132
  348. package/src/utils/testconfigs/demologin/index.tsx +0 -32
  349. package/src/utils/testconfigs/index.ts +0 -59
  350. package/src/vite-env.d.ts +0 -11
  351. package/stats.html +0 -4949
  352. package/tailwind.config.js +0 -170
  353. package/tsconfig.app.json +0 -30
  354. package/tsconfig.app.tsbuildinfo +0 -11
  355. package/tsconfig.json +0 -13
  356. package/tsconfig.node.json +0 -22
  357. package/tsconfig.node.tsbuildinfo +0 -1
  358. package/vite.config.app.ts +0 -93
  359. package/vite.config.ts +0 -231
  360. package/workflows/release.yml +0 -60
  361. package//346/215/242/350/241/214/346/240/274/345/274/217/344/277/235/346/214/201/344/274/230/345/214/226/346/226/271/346/241/210.md +0 -359
  362. /package/{dist/assets → assets}/Doris.png +0 -0
  363. /package/{dist/assets → assets}/GientechStreamReader-DydY9Vu3.js +0 -0
  364. /package/{dist/assets → assets}/PostgreSQL.png +0 -0
  365. /package/{dist/assets → assets}/SQLServer.png +0 -0
  366. /package/{dist/assets → assets}/database.svg +0 -0
  367. /package/{dist/assets → assets}/database_add.svg +0 -0
  368. /package/{dist/assets → assets}/database_connect.svg +0 -0
  369. /package/{dist/assets → assets}/database_upload.svg +0 -0
  370. /package/{dist/assets → assets}/databse.svg +0 -0
  371. /package/{dist/assets → assets}/defaultWeLogo.svg +0 -0
  372. /package/{dist/assets → assets}/empty.png +0 -0
  373. /package/{dist/assets → assets}/graph.svg +0 -0
  374. /package/{dist/assets → assets}/homeBg.png +0 -0
  375. /package/{dist/assets → assets}/index-4Ac00q5P.js +0 -0
  376. /package/{dist/assets → assets}/index-7FYeBShT.js +0 -0
  377. /package/{dist/assets → assets}/index-B2rczyCX.js +0 -0
  378. /package/{dist/assets → assets}/index-CQMGllKT.js +0 -0
  379. /package/{dist/assets → assets}/index-CpW6Dhpp.js +0 -0
  380. /package/{dist/assets → assets}/index-CwGOSlVC.js +0 -0
  381. /package/{dist/assets → assets}/index-DBPtDW8Y.js +0 -0
  382. /package/{dist/assets → assets}/index-DJPAws60.js +0 -0
  383. /package/{dist/assets → assets}/index-antI2hFx.js +0 -0
  384. /package/{dist/assets → assets}/index-q0nZjKAG.js +0 -0
  385. /package/{dist/assets → assets}/index-rkRJ-e_U.js +0 -0
  386. /package/{dist/assets → assets}/knowledge.svg +0 -0
  387. /package/{dist/assets → assets}/left.jpg +0 -0
  388. /package/{dist/assets → assets}/logoImg.png +0 -0
  389. /package/{dist/assets → assets}/mysql.svg +0 -0
  390. /package/{dist/assets → assets}/plus-qlmqrjBc.js +0 -0
  391. /package/{dist/assets → assets}/sensitive.svg +0 -0
  392. /package/{dist/assets → assets}/style-BeYL_E4J.js +0 -0
  393. /package/{dist/assets → assets}/style.css +0 -0
  394. /package/{dist/assets → assets}/style2.css +0 -0
  395. /package/{dist/assets → assets}/style3.css +0 -0
  396. /package/{dist/assets → assets}/style4.css +0 -0
  397. /package/{dist/assets → assets}/worker-BbpylX7l.js +0 -0
  398. /package/{dist/assets → assets}/x-DxuhxSb6.js +0 -0
  399. /package/{dist/assistantConfig.d.ts → assistantConfig.d.ts} +0 -0
  400. /package/{dist/assistantConfig.js → assistantConfig.js} +0 -0
  401. /package/{dist/chat.d.ts → chat.d.ts} +0 -0
  402. /package/{dist/chat.js → chat.js} +0 -0
  403. /package/{dist/database.d.ts → database.d.ts} +0 -0
  404. /package/{dist/database.js → database.js} +0 -0
  405. /package/{dist/databaseId.d.ts → databaseId.d.ts} +0 -0
  406. /package/{dist/databaseId.js → databaseId.js} +0 -0
  407. /package/{dist/databaseTable.d.ts → databaseTable.d.ts} +0 -0
  408. /package/{dist/databaseTable.js → databaseTable.js} +0 -0
  409. /package/{dist/icons → icons}/answerAwartar.png +0 -0
  410. /package/{dist/icons → icons}/docx-file.png +0 -0
  411. /package/{dist/icons → icons}/folder.png +0 -0
  412. /package/{dist/icons → icons}/html.png +0 -0
  413. /package/{dist/icons → icons}/image.png +0 -0
  414. /package/{dist/icons → icons}/jpg-file.png +0 -0
  415. /package/{dist/icons → icons}/json.png +0 -0
  416. /package/{dist/icons → icons}/md.png +0 -0
  417. /package/{dist/icons → icons}/pdf.png +0 -0
  418. /package/{dist/icons → icons}/pptx.png +0 -0
  419. /package/{dist/icons → icons}/questionAwartar.png +0 -0
  420. /package/{dist/icons → icons}/sheets.png +0 -0
  421. /package/{dist/icons → icons}/txt.png +0 -0
  422. /package/{dist/icons → icons}/xlsx.png +0 -0
  423. /package/{dist/index.d.ts → index.d.ts} +0 -0
  424. /package/{dist/index.js → index.js} +0 -0
  425. /package/{dist/modelManage.d.ts → modelManage.d.ts} +0 -0
  426. /package/{dist/modelManage.js → modelManage.js} +0 -0
  427. /package/{dist/sensitive.d.ts → sensitive.d.ts} +0 -0
  428. /package/{dist/sensitive.js → sensitive.js} +0 -0
  429. /package/{dist/streamFilesReader.d.ts → streamFilesReader.d.ts} +0 -0
  430. /package/{dist/streamFilesReader.js → streamFilesReader.js} +0 -0
  431. /package/{dist/vite.svg → vite.svg} +0 -0
  432. /package/{dist/worker → worker}/pdf.worker.min.js +0 -0
@@ -1,1625 +0,0 @@
1
- import React, { useState, useCallback, useEffect, useRef, useMemo } from 'react';
2
- import styled from 'styled-components';
3
- import axios from 'axios';
4
- import { Fviewer, parseFile, registerPDFWorker } from '@mxmweb/fviewer';
5
- import type { ParseResult } from '@mxmweb/fviewer';
6
- import Header from './components/Header';
7
- export { registerPDFWorker };
8
- import type { Annotation, ToolsConfig } from '@mxmweb/fviewer';
9
-
10
- import { Styles } from '@mxmweb/zui';
11
- // Stream接口参数类型
12
- interface StreamRequestParams {
13
- convertedFilePath: string;
14
- pageNo: number;
15
- pageSize: number;
16
- }
17
-
18
- // Markdown完整内容缓存类型
19
- interface MarkdownContentCache {
20
- data: string; // markdown完整内容
21
- timestamp: number;
22
- }
23
-
24
- // GientechStreamReader组件属性接口
25
- export interface GientechStreamReaderProps {
26
- // 文件相关
27
- convertedFilePath: string;
28
- csrfToken?: string;
29
- fileName?: string;
30
- fileType: string;
31
- initialPage?: number;
32
- initialZoom?: number; // 初始缩放比例
33
- totalPages?: number; // 添加总页数参数
34
- annotations?: (Annotation | any)[]; // 统一的标注数据
35
-
36
- // 用户信息
37
- userName?: string;
38
- userId?: string;
39
- pageSize?: number;
40
-
41
- // API配置
42
- streamApiUrl?: string;
43
- authorization?: string;
44
-
45
- // 事件回调
46
- eventsEmit?: (name: string, data?: any, innerFn?: any) => void;
47
-
48
- // 工具配置 - 用户可自定义,与默认配置合并
49
- tools?: Partial<ToolsConfig>;
50
-
51
- // 样式配置
52
- styles?: Styles;
53
-
54
- // 自定义组件
55
- customComponents?: {
56
- LoadingComponent?: React.ComponentType<{
57
- status: string;
58
- theme: Styles;
59
- }>;
60
- ErrorComponent?: React.ComponentType<{
61
- error: string;
62
- theme: Styles;
63
- }>;
64
- };
65
-
66
- // 自定义类名
67
- className?: string;
68
- headerClass?: string;
69
- contentClass?: string;
70
- }
71
-
72
- // 页面缓存类型 - 重新设计支持分页chunk缓存
73
- interface PageChunkCache {
74
- [chunkKey: string]: {
75
- data: ArrayBuffer;
76
- pages: number[]; // 这个chunk包含的页面范围
77
- timestamp: number;
78
- totalPages?: number; // 从响应头获取的总页数
79
- pdfDocument?: any; // 缓存解析后的PDF文档
80
- };
81
- }
82
-
83
- // 单个页面缓存类型
84
- interface PageCache {
85
- [pageNo: number]: {
86
- data: ArrayBuffer;
87
- timestamp: number;
88
- pdfDocument?: any; // 缓存解析后的PDF文档
89
- };
90
- }
91
-
92
- // 样式组件
93
- const ReaderContainer = styled.div<{ $theme: Styles }>`
94
- display: flex;
95
- flex-direction: column;
96
- height: 100%;
97
- width: 100%;
98
- background: ${props => props.$theme.colors.background};
99
- border: 1px solid ${props => props.$theme.colors.border};
100
- border-radius: ${props => props.$theme.space.radius};
101
- overflow: hidden;
102
- min-height: 0;
103
- position: relative; // 添加相对定位,用于loading遮罩的绝对定位
104
-
105
- /* 添加动画样式 */
106
- @keyframes spin {
107
- 0% {
108
- transform: rotate(0deg);
109
- }
110
- 100% {
111
- transform: rotate(360deg);
112
- }
113
- }
114
- `;
115
-
116
- /**
117
- * 默认文件加载动画组件
118
- * 提供美观的文件加载动画效果,支持状态文本显示
119
- */
120
- const DefaultLoadingComponent: React.FC<{
121
- status: string;
122
- theme: Styles;
123
- }> = ({ status, theme }) => {
124
- return (
125
- <div
126
- style={{
127
- display: 'flex',
128
- flexDirection: 'column',
129
- alignItems: 'center',
130
- justifyContent: 'center',
131
- height: '100%',
132
- padding: '40px',
133
- background: theme.colors.background,
134
- }}
135
- >
136
- {/* 文件图标动画 */}
137
- <div
138
- style={{
139
- position: 'relative',
140
- width: '80px',
141
- height: '80px',
142
- marginBottom: '24px',
143
- }}
144
- >
145
- {/* 文件图标背景 */}
146
- <div
147
- style={{
148
- width: '60px',
149
- height: '80px',
150
- background: theme.colors.primary,
151
- borderRadius: '8px 8px 0 0',
152
- position: 'relative',
153
- margin: '0 auto',
154
- }}
155
- >
156
- {/* 文件折角 */}
157
- <div
158
- style={{
159
- position: 'absolute',
160
- top: '0',
161
- right: '0',
162
- width: '0',
163
- height: '0',
164
- borderStyle: 'solid',
165
- borderWidth: '0 20px 20px 0',
166
- borderColor: `transparent ${theme.colors.background} transparent transparent`,
167
- }}
168
- />
169
- </div>
170
-
171
- {/* 加载动画圆点 */}
172
- <div
173
- style={{
174
- position: 'absolute',
175
- top: '50%',
176
- left: '50%',
177
- transform: 'translate(-50%, -50%)',
178
- width: '20px',
179
- height: '20px',
180
- borderRadius: '50%',
181
- background: theme.colors.background,
182
- animation: 'pulse 1.5s ease-in-out infinite',
183
- }}
184
- />
185
- </div>
186
-
187
- {/* 状态文本 */}
188
- <div
189
- style={{
190
- fontSize: '16px',
191
- fontWeight: '500',
192
- color: theme.colors.text,
193
- marginBottom: '8px',
194
- textAlign: 'center',
195
- }}
196
- >
197
- {status}
198
- </div>
199
-
200
- {/* 进度指示器 */}
201
- <div
202
- style={{
203
- width: '200px',
204
- height: '4px',
205
- background: theme.colors.border,
206
- borderRadius: '2px',
207
- overflow: 'hidden',
208
- position: 'relative',
209
- }}
210
- >
211
- <div
212
- style={{
213
- width: '30%',
214
- height: '100%',
215
- background: theme.colors.primary,
216
- borderRadius: '2px',
217
- animation: 'loading-progress 2s ease-in-out infinite',
218
- }}
219
- />
220
- </div>
221
-
222
- {/* 动画样式 */}
223
- <style>{`
224
- @keyframes pulse {
225
- 0%, 100% {
226
- opacity: 1;
227
- transform: translate(-50%, -50%) scale(1);
228
- }
229
- 50% {
230
- opacity: 0.5;
231
- transform: translate(-50%, -50%) scale(1.1);
232
- }
233
- }
234
-
235
- @keyframes loading-progress {
236
- 0% {
237
- transform: translateX(-100%);
238
- }
239
- 50% {
240
- transform: translateX(0%);
241
- }
242
- 100% {
243
- transform: translateX(100%);
244
- }
245
- }
246
- `}</style>
247
- </div>
248
- );
249
- };
250
-
251
- // 移除未使用的 LoadingContainer
252
-
253
- const ErrorContainer = styled.div<{ $theme: Styles }>`
254
- display: flex;
255
- flex-direction: column;
256
- align-items: center;
257
- justify-content: center;
258
- height: 100%;
259
- color: ${props => props.$theme.colors.error};
260
- text-align: center;
261
- padding: 20px;
262
- `;
263
-
264
- // 默认配置
265
- const DEFAULT_STREAM_API_URL = 'http://10.15.12.13:9005/proxy/index/knowledgeBase/file/stream';
266
- const CACHE_EXPIRY_TIME = 5 * 60 * 1000; // 5分钟缓存过期
267
-
268
- // 默认主题
269
- const defaultTheme: Styles = {
270
- colors: {
271
- primary: '#007bff',
272
- secondary: '#6c757d',
273
- success: '#008000',
274
- warning: '#FFA500',
275
- error: '#FF0000',
276
- info: '#0000FF',
277
- background: '#f8f9fa',
278
- text: '#343a40',
279
- border: '#dee2e6',
280
- disabled: '#808080',
281
- disabledBackground: '#F5F5F5',
282
- disabledText: '#808080',
283
- },
284
- space: {
285
- sidebar: '12px',
286
- size: '12px',
287
- radius: '4px',
288
- padding: '8px 12px',
289
- margin: '4px',
290
- shadow: '0 2px 4px rgba(0,0,0,0.1)',
291
- lineHeight: '1.5',
292
- },
293
- };
294
-
295
- /**
296
- * GientechStreamReader组件
297
- * 基于stream接口的文件读取器,支持分页获取PDF数据并渲染
298
- * 遵循adopter_develop规范,使用HOC模式封装core组件
299
- *
300
- * @param props - 组件属性
301
- * @returns GientechStreamReader组件
302
- */
303
- const GientechStreamReader: React.FC<GientechStreamReaderProps> = ({
304
- convertedFilePath,
305
- fileName,
306
- fileType,
307
- csrfToken,
308
- initialPage = 1,
309
- initialZoom = 1, // 默认初始缩放比例为1
310
- totalPages: userTotalPages, // 接收用户传入的总页数
311
- annotations = [],
312
- pageSize = 5, // 更新默认值为5,与StreamPreview一致
313
- streamApiUrl = DEFAULT_STREAM_API_URL,
314
- authorization,
315
- eventsEmit = () => {},
316
- tools: userTools, // 接收用户传入的工具配置
317
- styles,
318
- customComponents,
319
- className,
320
- headerClass,
321
- contentClass,
322
- }) => {
323
- // 状态管理
324
- const [isLoading, setIsLoading] = useState(true); // 初始为loading状态
325
- const [loadingStatus, setLoadingStatus] = useState<string>('正在加载文档...'); // 加载提示文本
326
- const [error, setError] = useState<string | null>(null);
327
- const [currentPage, setCurrentPage] = useState(initialPage);
328
- const [totalPages, setTotalPages] = useState(userTotalPages || 0); // 使用用户传入的总页数,不自动覆盖
329
- const [scale, setScale] = useState(initialZoom);
330
- const [rotation, setRotation] = useState(0);
331
- const [pdfDocument, setPdfDocument] = useState<any>(null);
332
- const [imageContent, setImageContent] = useState<any>(null);
333
-
334
- // Markdown相关状态
335
- const [markdownContent, setMarkdownContent] = useState<string>('');
336
-
337
- // 通用文件内容状态
338
- const [textContent, setTextContent] = useState<any>(null);
339
- const [htmlContent, setHtmlContent] = useState<any>(null);
340
-
341
- // 通用文件缓存状态
342
- const [genericContentCache, setGenericContentCache] = useState<{
343
- [key: string]: { content: any; timestamp: number };
344
- }>({});
345
-
346
- // 防抖状态 - 防止重复请求
347
- const isGenericLoadingRef = useRef(false);
348
- const hasLoadedGenericRef = useRef(false);
349
-
350
- // 引用
351
- const pageCache = useRef<PageCache>({});
352
- const chunkCache = useRef<PageChunkCache>({});
353
- const markdownContentCache = useRef<MarkdownContentCache | null>(null);
354
- const scrollContainerRef = useRef<HTMLDivElement>(null);
355
- const currentPageRef = useRef<number>(initialPage); // 添加ref来跟踪当前页面
356
- // 调试:跟踪每次渲染计数(必须放在任何条件 return 之前,避免 Hook 次数不一致)
357
- const renderCountRef = useRef(0);
358
- renderCountRef.current += 1;
359
- console.log('[GientechStreamReader] render count:', renderCountRef.current);
360
- console.log('[GientechStreamReader] props snapshot (early):', {
361
- fileType,
362
- currentPage,
363
- totalPages,
364
- hasMarkdown: !!markdownContent,
365
- hasImage: !!imageContent,
366
- hasText: !!textContent,
367
- hasHtml: !!htmlContent,
368
- isLoading,
369
- error,
370
- });
371
-
372
- // 使用主题
373
- const mergedTheme = styles?.theme || defaultTheme;
374
-
375
- // 当文件类型或文件路径改变时,重置通用加载的防抖/已加载标记,避免影响其它文件类型
376
- useEffect(() => {
377
- isGenericLoadingRef.current = false;
378
- hasLoadedGenericRef.current = false;
379
- }, [fileType, convertedFilePath]);
380
-
381
- /**
382
- * 根据文件类型动态配置工具,并合并用户自定义配置
383
- */
384
- const getToolsConfig = useCallback((): ToolsConfig => {
385
- const baseTools = {
386
- annotation: true,
387
- download: true,
388
- zoom: true,
389
- close: true,
390
- navigation: true,
391
- rotate: false,
392
- };
393
-
394
- let defaultTools: ToolsConfig;
395
-
396
- switch (fileType) {
397
- case 'pdf':
398
- case 'pdf_slides':
399
- defaultTools = {
400
- ...baseTools,
401
- annotation: false, // PDF模式关闭标注功能
402
- download: false, // PDF模式关闭下载功能
403
- navigation: true, // PDF模式开启翻页导航
404
- rotate: false, // PDF模式关闭旋转功能
405
- };
406
- break;
407
- case 'image':
408
- defaultTools = {
409
- ...baseTools,
410
- annotation: false, // 图片模式关闭标注功能
411
- download: false, // 图片模式关闭下载功能
412
- navigation: false, // 图片模式关闭翻页导航
413
- rotate: true, // 图片模式开启旋转功能
414
- zoom: true,
415
- };
416
- break;
417
- case 'markdown':
418
- case 'markdown_table':
419
- defaultTools = {
420
- ...baseTools,
421
- annotation: false, // Markdown模式开启标注功能
422
- download: false, // Markdown模式关闭下载功能
423
- navigation: false, // Markdown模式关闭翻页导航
424
- rotate: false, // Markdown模式关闭旋转功能
425
- zoom: false, // Markdown模式关闭缩放功能
426
- };
427
- break;
428
- case 'text':
429
- case 'html':
430
- case 'unknown':
431
- defaultTools = {
432
- ...baseTools,
433
- annotation: false, // 其他模式关闭标注功能
434
- download: false, // 其他模式关闭下载功能
435
- navigation: false, // 其他模式关闭翻页导航
436
- rotate: false, // 其他模式关闭旋转功能
437
- zoom: false, // 其他模式关闭缩放功能
438
- };
439
- break;
440
- default:
441
- defaultTools = baseTools;
442
- }
443
-
444
- // 合并用户自定义配置,用户配置优先
445
- if (userTools) {
446
- return {
447
- ...defaultTools,
448
- ...userTools,
449
- };
450
- }
451
-
452
- return defaultTools;
453
- }, [fileType, userTools]);
454
-
455
- // 获取当前文件类型的工具配置
456
- const tools = getToolsConfig();
457
-
458
- /**
459
- * 计算chunk的key
460
- * @param pageNo 页码
461
- * @param pageSize 页面大小
462
- * @returns chunk key
463
- */
464
- const getChunkKey = useCallback((pageNo: number, pageSize: number): string => {
465
- const chunkStart = Math.floor((pageNo - 1) / pageSize) * pageSize + 1;
466
- return `${chunkStart}-${chunkStart + pageSize - 1}`;
467
- }, []);
468
-
469
- /**
470
- * 检查页面是否在缓存中,并返回解析后的PDF文档
471
- * @param pageNo 页码
472
- * @returns 缓存的PDF文档或null
473
- */
474
- const getCachedPage = useCallback(
475
- async (pageNo: number): Promise<any | null> => {
476
- // 根据文件类型决定处理方式
477
- const isPDF = fileType === 'pdf' || fileType === 'pdf_slides';
478
-
479
- if (!isPDF) {
480
- console.log(`文件类型 ${fileType} 不是PDF,跳过缓存检查`);
481
- return null;
482
- }
483
-
484
- console.log(`检查页面 ${pageNo} 是否在缓存中`);
485
-
486
- // 先检查单个页面缓存
487
- const pageCached = pageCache.current[pageNo];
488
- if (pageCached && Date.now() - pageCached.timestamp < CACHE_EXPIRY_TIME) {
489
- console.log(`使用单个页面缓存: ${pageNo}`);
490
- if (pageCached.pdfDocument) {
491
- console.log(`直接返回缓存的PDF文档: ${pageNo}`);
492
- return pageCached.pdfDocument;
493
- }
494
- // 如果没有缓存的PDF文档,需要重新解析
495
- return null;
496
- }
497
-
498
- // 检查chunk缓存
499
- const chunkKey = getChunkKey(pageNo, pageSize);
500
- const chunkCached = chunkCache.current[chunkKey];
501
- console.log(
502
- `检查chunk缓存: ${chunkKey}, 存在: ${!!chunkCached}, 包含页面: ${chunkCached?.pages?.join(', ') || '无'}`
503
- );
504
-
505
- if (chunkCached && Date.now() - chunkCached.timestamp < CACHE_EXPIRY_TIME) {
506
- // 验证页面是否真的在这个chunk中
507
- if (chunkCached.pages.includes(pageNo)) {
508
- console.log(`使用chunk缓存: ${pageNo} (chunk: ${chunkKey})`);
509
- if (chunkCached.pdfDocument) {
510
- console.log(`直接返回缓存的PDF文档: ${pageNo}`);
511
- return chunkCached.pdfDocument;
512
- }
513
- // 如果没有缓存的PDF文档,需要重新解析
514
- return null;
515
- } else {
516
- console.log(
517
- `页面 ${pageNo} 不在chunk ${chunkKey} 中,chunk包含: ${chunkCached.pages.join(', ')}`
518
- );
519
- }
520
- }
521
-
522
- console.log(`页面 ${pageNo} 不在任何缓存中,需要重新请求`);
523
- return null;
524
- },
525
- [pageSize, getChunkKey, fileType]
526
- );
527
-
528
- /**
529
- * 获取stream数据(仅用于PDF文件)
530
- * @param pageNo 页码
531
- * @returns Promise<ArrayBuffer>
532
- */
533
- const fetchStreamData = useCallback(
534
- async (pageNo: number): Promise<ArrayBuffer> => {
535
- try {
536
- // 根据文件类型决定是否传递分页参数
537
- const isPDF = fileType === 'pdf' || fileType === 'pdf_slides';
538
-
539
- if (!isPDF) {
540
- console.log(`文件类型 ${fileType} 不需要分页参数,获取完整内容`);
541
- throw new Error(`文件类型 ${fileType} 不支持分页加载`);
542
- }
543
-
544
- // 计算需要请求的chunk
545
- const chunkStart = Math.floor((pageNo - 1) / pageSize) * pageSize + 1;
546
- const chunkKey = getChunkKey(pageNo, pageSize);
547
-
548
- console.log(
549
- `请求PDF chunk数据: ${chunkStart} (包含页面 ${chunkStart}-${chunkStart + pageSize - 1})`
550
- );
551
-
552
- const headers: Record<string, string> = {
553
- 'Content-Type': 'application/json',
554
- };
555
-
556
- if (authorization) {
557
- headers['Authorization'] = authorization;
558
- }
559
-
560
- if (csrfToken) {
561
- headers['X-CSRF-TOKEN-IN'] = csrfToken;
562
- }
563
-
564
- // PDF文件类型传递分页参数
565
- const requestData = {
566
- convertedFilePath,
567
- pageNo: chunkStart, // 使用chunk的起始页
568
- pageSize,
569
- };
570
-
571
- const response = await axios.post<ArrayBuffer>(streamApiUrl, requestData, {
572
- headers,
573
- responseType: 'arraybuffer',
574
- });
575
-
576
- // 获取响应头中的CSRF Token并触发事件
577
- const responseCsrfToken =
578
- response.headers['x-csrf-token-out'] || response.headers['X-CSRF-TOKEN-OUT'];
579
- if (responseCsrfToken) {
580
- console.log('获取到响应头中的CSRF Token:', responseCsrfToken);
581
- eventsEmit('request_finish', responseCsrfToken);
582
- }
583
-
584
- // 缓存chunk数据
585
- const chunkPages = Array.from({ length: pageSize }, (_, i) => chunkStart + i);
586
- chunkCache.current[chunkKey] = {
587
- data: response.data,
588
- pages: chunkPages,
589
- timestamp: Date.now(),
590
- totalPages: userTotalPages, // 始终使用用户传入的总页数,不覆盖
591
- };
592
-
593
- console.log(
594
- `缓存PDF chunk数据: ${chunkKey}, 包含页面: ${chunkPages.join(', ')}, 请求的页面: ${pageNo}`
595
- );
596
- console.log(`当前所有缓存:`, Object.keys(chunkCache.current));
597
-
598
- return response.data;
599
- } catch (error: any) {
600
- console.error('获取PDF stream数据失败:', error);
601
- throw new Error(`PDF请求失败: ${error.response?.status || '网络错误'}`);
602
- }
603
- },
604
- [
605
- streamApiUrl,
606
- convertedFilePath,
607
- pageSize,
608
- authorization,
609
- getChunkKey,
610
- userTotalPages,
611
- totalPages,
612
- fileType,
613
- eventsEmit,
614
- ]
615
- );
616
-
617
- /**
618
- * 加载PDF文档(仅用于PDF文件类型)
619
- * @param pageNo 页码
620
- * @param isInitialLoad 是否为初始加载
621
- */
622
- const loadPDFDocument = useCallback(
623
- async (pageNo: number, isInitialLoad: boolean = false) => {
624
- if (!pageNo) return;
625
-
626
- // 根据文件类型决定处理方式
627
- const isPDF = fileType === 'pdf' || fileType === 'pdf_slides';
628
-
629
- if (!isPDF) {
630
- console.log(`文件类型 ${fileType} 不是PDF,跳过PDF加载逻辑`);
631
- return null; // 直接返回,不进行任何操作
632
- }
633
-
634
- try {
635
- if (isInitialLoad) {
636
- setIsLoading(true);
637
- setLoadingStatus('正在加载PDF文档...');
638
- } else {
639
- setIsLoading(true);
640
- setLoadingStatus(`正在加载第 ${pageNo} 页...`);
641
- }
642
- setError(null);
643
-
644
- console.log(`开始加载PDF页面: ${pageNo}, 初始加载: ${isInitialLoad}`);
645
-
646
- // 先检查缓存
647
- const cachedPdf = await getCachedPage(pageNo);
648
- if (cachedPdf) {
649
- // 如果缓存中有PDF文档,直接使用,无需重新解析
650
- console.log(`使用缓存的PDF文档: ${pageNo}`);
651
- setPdfDocument(cachedPdf);
652
- setIsLoading(false);
653
- setLoadingStatus('');
654
- console.log(`页面 ${pageNo} 加载完成(使用缓存)`);
655
- return cachedPdf;
656
- }
657
-
658
- // 获取stream数据
659
- const streamData = await fetchStreamData(pageNo);
660
-
661
- // 使用fileParser解析数据
662
- const parseResult: ParseResult = await parseFile(streamData, {
663
- fileName: fileName || 'Stream文档',
664
- fileType: 'pdf',
665
- token: authorization,
666
- });
667
-
668
- if (parseResult.error) {
669
- throw new Error(parseResult.error);
670
- }
671
-
672
- if (parseResult.type !== 'pdf' || !parseResult.content?.document) {
673
- throw new Error('解析结果不是有效的PDF文档');
674
- }
675
-
676
- const pdf = parseResult.content.document;
677
- console.log('设置PDF文档:', pdf);
678
- console.log('PDF文档类型:', typeof pdf);
679
- console.log(
680
- 'PDF文档方法:',
681
- pdf ? Object.getOwnPropertyNames(Object.getPrototypeOf(pdf)) : '无文档'
682
- );
683
- console.log('PDF文档页数:', pdf ? pdf.numPages : '无页数');
684
- console.log('当前请求的页面:', pageNo);
685
- console.log('PDF文档包含的页面范围:', pdf ? `1-${pdf.numPages}` : '无页数');
686
- setPdfDocument(pdf);
687
-
688
- // 缓存解析后的PDF文档
689
- const chunkKey = getChunkKey(pageNo, pageSize);
690
- if (chunkCache.current[chunkKey]) {
691
- chunkCache.current[chunkKey].pdfDocument = pdf;
692
- console.log(`缓存PDF文档到chunk: ${chunkKey}`);
693
- }
694
-
695
- // 设置总页数 - 优先使用用户传入的总页数,如果没有传入则使用PDF文档的实际页数
696
- if (userTotalPages) {
697
- console.log(`使用用户传入的总页数: ${userTotalPages}`);
698
- setTotalPages(userTotalPages);
699
- } else if (pdf && pdf.numPages) {
700
- const actualTotalPages = pdf.numPages;
701
- console.log(`用户未传入总页数,从PDF文档获取实际总页数: ${actualTotalPages}`);
702
- setTotalPages(actualTotalPages);
703
- }
704
-
705
- setIsLoading(false);
706
- setLoadingStatus('');
707
-
708
- console.log(`页面 ${pageNo} 加载完成`);
709
- return pdf;
710
- } catch (error: any) {
711
- console.error('PDF加载失败:', error);
712
- setError(error.message || 'PDF加载失败,请稍后重试');
713
- setIsLoading(false);
714
- setLoadingStatus('');
715
- throw error;
716
- }
717
- },
718
- [
719
- fetchStreamData,
720
- fileName,
721
- authorization,
722
- totalPages,
723
- getCachedPage,
724
- getChunkKey,
725
- pageSize,
726
- fileType,
727
- ]
728
- );
729
-
730
- /**
731
- * 检查页面是否在缓存中(用于调试)
732
- */
733
- const isPageInCache = useCallback(
734
- (pageNo: number): boolean => {
735
- // 根据文件类型决定处理方式
736
- const isPDF = fileType === 'pdf' || fileType === 'pdf_slides';
737
-
738
- if (!isPDF) {
739
- return false;
740
- }
741
-
742
- // 先检查单个页面缓存
743
- const pageCached = pageCache.current[pageNo];
744
- if (pageCached && Date.now() - pageCached.timestamp < CACHE_EXPIRY_TIME) {
745
- return !!pageCached.pdfDocument;
746
- }
747
-
748
- // 检查chunk缓存
749
- const chunkKey = getChunkKey(pageNo, pageSize);
750
- const chunkCached = chunkCache.current[chunkKey];
751
- if (chunkCached && Date.now() - chunkCached.timestamp < CACHE_EXPIRY_TIME) {
752
- return chunkCached.pages.includes(pageNo) && !!chunkCached.pdfDocument;
753
- }
754
-
755
- return false;
756
- },
757
- [pageSize, getChunkKey, fileType]
758
- );
759
-
760
- // ========== Markdown相关工具函数 ==========
761
-
762
- /**
763
- * 检查markdown内容是否在缓存中
764
- * @returns 缓存的内容或null
765
- */
766
- const getCachedMarkdownContent = useCallback((): string | null => {
767
- console.log('检查markdown内容是否在缓存中');
768
-
769
- const cached = markdownContentCache.current;
770
- if (cached && Date.now() - cached.timestamp < CACHE_EXPIRY_TIME) {
771
- console.log('使用markdown内容缓存');
772
- return cached.data;
773
- }
774
-
775
- console.log('markdown内容不在缓存中,需要重新请求');
776
- return null;
777
- }, []);
778
-
779
- /**
780
- * 获取完整markdown数据
781
- * @returns Promise<string>
782
- */
783
- const fetchMarkdownData = useCallback(async (): Promise<string> => {
784
- try {
785
- console.log('请求完整markdown数据');
786
-
787
- const headers: Record<string, string> = {
788
- 'Content-Type': 'application/json',
789
- };
790
-
791
- if (authorization) {
792
- headers['Authorization'] = authorization;
793
- }
794
-
795
- if (csrfToken) {
796
- headers['X-CSRF-TOKEN-IN'] = csrfToken;
797
- }
798
-
799
- const requestData = {
800
- convertedFilePath,
801
- // 不传pageNo和pageSize,获取完整文章
802
- };
803
-
804
- console.log('发送markdown请求:', requestData);
805
-
806
- const response = await axios.post(streamApiUrl, requestData, {
807
- headers,
808
- responseType: 'text', // markdown返回文本
809
- });
810
-
811
- // 获取响应头中的CSRF Token并触发事件
812
- const responseCsrfToken =
813
- response.headers['x-csrf-token-out'] || response.headers['X-CSRF-TOKEN-OUT'];
814
- if (responseCsrfToken) {
815
- console.log('获取到响应头中的CSRF Token:', responseCsrfToken);
816
- eventsEmit('request_finish', responseCsrfToken);
817
- }
818
-
819
- console.log('markdown响应状态:', response.status);
820
- console.log('markdown响应数据长度:', response.data?.length || 0);
821
-
822
- return response.data;
823
- } catch (error: any) {
824
- console.error('获取markdown数据失败:', error);
825
- throw new Error(`获取markdown数据失败: ${error.message}`);
826
- }
827
- }, [convertedFilePath, authorization, streamApiUrl, eventsEmit]);
828
-
829
- /**
830
- * 加载完整markdown文档
831
- * @returns Promise<string>
832
- */
833
- const loadMarkdownDocument = useCallback(async () => {
834
- try {
835
- setIsLoading(true);
836
- setLoadingStatus('正在加载markdown文档...');
837
- setError(null);
838
-
839
- console.log('开始加载完整markdown文档');
840
-
841
- // 先检查缓存
842
- const cachedContent = getCachedMarkdownContent();
843
- if (cachedContent) {
844
- console.log('使用缓存的markdown内容');
845
- setMarkdownContent(cachedContent);
846
- setIsLoading(false);
847
- setLoadingStatus('');
848
- return cachedContent;
849
- }
850
-
851
- // 获取完整数据
852
- const streamData = await fetchMarkdownData();
853
-
854
- // 缓存markdown内容
855
- markdownContentCache.current = {
856
- data: streamData,
857
- timestamp: Date.now(),
858
- };
859
-
860
- setMarkdownContent(streamData);
861
- setIsLoading(false);
862
- setLoadingStatus('');
863
- console.log('完整markdown文档加载完成');
864
- return streamData;
865
- } catch (error: any) {
866
- console.error('markdown加载失败:', error);
867
- setError(error.message || 'markdown加载失败,请稍后重试');
868
- setIsLoading(false);
869
- setLoadingStatus('');
870
- throw error;
871
- }
872
- }, [fetchMarkdownData, getCachedMarkdownContent]);
873
-
874
- /**
875
- * 获取完整图片数据(以与PDF/Markdown一致的请求方式)
876
- */
877
- const fetchImageData = useCallback(async (): Promise<ArrayBuffer> => {
878
- try {
879
- const headers: Record<string, string> = {
880
- 'Content-Type': 'application/json',
881
- };
882
-
883
- if (authorization) {
884
- headers['Authorization'] = authorization;
885
- }
886
-
887
- if (csrfToken) {
888
- headers['X-CSRF-TOKEN-IN'] = csrfToken;
889
- }
890
-
891
- const requestData = {
892
- convertedFilePath,
893
- // 不传 pageNo/pageSize,获取完整图片二进制
894
- };
895
-
896
- const response = await axios.post<ArrayBuffer>(streamApiUrl, requestData, {
897
- headers,
898
- responseType: 'arraybuffer',
899
- });
900
-
901
- // 获取响应头中的CSRF Token并触发事件
902
- const responseCsrfToken =
903
- response.headers['x-csrf-token-out'] || response.headers['X-CSRF-TOKEN-OUT'];
904
- if (responseCsrfToken) {
905
- console.log('获取到响应头中的CSRF Token:', responseCsrfToken);
906
- eventsEmit('request_finish', responseCsrfToken);
907
- }
908
-
909
- return response.data;
910
- } catch (error: any) {
911
- console.error('获取图片数据失败:', error);
912
- throw new Error(`获取图片数据失败: ${error.message}`);
913
- }
914
- }, [convertedFilePath, authorization, streamApiUrl, eventsEmit]);
915
-
916
- /**
917
- * 加载图片文档
918
- */
919
- const loadImageDocument = useCallback(async () => {
920
- try {
921
- setIsLoading(true);
922
- setLoadingStatus('正在加载图片...');
923
- setError(null);
924
-
925
- const imgBuffer = await fetchImageData();
926
-
927
- const parseResult: ParseResult = await parseFile(imgBuffer, {
928
- fileName: fileName || '图片',
929
- fileType: 'image',
930
- token: authorization,
931
- });
932
-
933
- if (parseResult.error) {
934
- throw new Error(parseResult.error);
935
- }
936
-
937
- if (parseResult.type !== 'image' || !parseResult.content) {
938
- throw new Error('解析结果不是有效的图片');
939
- }
940
-
941
- setImageContent(parseResult.content); // { type: 'image', url }
942
- setIsLoading(false);
943
- setLoadingStatus('');
944
- return parseResult.content;
945
- } catch (error: any) {
946
- console.error('图片加载失败:', error);
947
- setError(error.message || '图片加载失败,请稍后重试');
948
- setIsLoading(false);
949
- setLoadingStatus('');
950
- throw error;
951
- }
952
- }, [authorization, fileName, fetchImageData]);
953
-
954
- /**
955
- * 获取通用文件数据(用于html、text、unknown等文件类型)
956
- * 所有文件类型都使用同样的接口,只是非PDF类型不传分页参数
957
- * @returns Promise<ArrayBuffer>
958
- */
959
- const fetchGenericData = useCallback(async (): Promise<ArrayBuffer> => {
960
- try {
961
- console.log(`请求通用文件数据,文件类型: ${fileType}`);
962
-
963
- const headers: Record<string, string> = {
964
- 'Content-Type': 'application/json',
965
- };
966
-
967
- if (authorization) {
968
- headers['Authorization'] = authorization;
969
- }
970
-
971
- if (csrfToken) {
972
- headers['X-CSRF-TOKEN-IN'] = csrfToken;
973
- }
974
-
975
- const requestData = {
976
- convertedFilePath,
977
- // 非PDF文件类型不传pageNo和pageSize,获取完整文件内容
978
- };
979
-
980
- console.log('发送通用文件请求:', requestData);
981
-
982
- const response = await axios.post<ArrayBuffer>(streamApiUrl, requestData, {
983
- headers,
984
- responseType: 'arraybuffer',
985
- });
986
-
987
- // 获取响应头中的CSRF Token并触发事件
988
- const responseCsrfToken =
989
- response.headers['x-csrf-token-out'] || response.headers['X-CSRF-TOKEN-OUT'];
990
- if (responseCsrfToken) {
991
- console.log('获取到响应头中的CSRF Token:', responseCsrfToken);
992
- eventsEmit('request_finish', responseCsrfToken);
993
- }
994
-
995
- console.log('通用文件响应状态:', response.status);
996
- console.log('通用文件响应数据长度:', response.data?.byteLength || 0);
997
-
998
- return response.data;
999
- } catch (error: any) {
1000
- console.error('获取通用文件数据失败:', error);
1001
- throw new Error(`获取通用文件数据失败: ${error.message}`);
1002
- }
1003
- }, [convertedFilePath, authorization, streamApiUrl, eventsEmit]);
1004
-
1005
- /**
1006
- * 加载通用文件文档(用于html、text、unknown等文件类型)
1007
- */
1008
- const loadGenericDocument = useCallback(async () => {
1009
- try {
1010
- console.log(`=== loadGenericDocument 被调用 ===`);
1011
- console.log(`调用栈:`, new Error().stack);
1012
- console.log(`当前时间:`, new Date().toISOString());
1013
-
1014
- // 防抖检查 - 如果正在加载中,直接返回
1015
- if (isGenericLoadingRef.current) {
1016
- console.log(`通用文档正在加载中,忽略重复请求,文件类型: ${fileType}`);
1017
- return;
1018
- }
1019
-
1020
- // 如果已经加载过,直接返回
1021
- if (hasLoadedGenericRef.current) {
1022
- console.log(`通用文档已经加载过,忽略重复请求,文件类型: ${fileType}`);
1023
- return;
1024
- }
1025
-
1026
- // 检查缓存
1027
- const cacheKey = `${fileType}_${convertedFilePath}`;
1028
- const cached = genericContentCache[cacheKey];
1029
- console.log(
1030
- `检查通用文档缓存,key: ${cacheKey}, 缓存存在: ${!!cached}, 缓存时间: ${cached ? Date.now() - cached.timestamp : 'N/A'}ms`
1031
- );
1032
-
1033
- if (cached && Date.now() - cached.timestamp < CACHE_EXPIRY_TIME) {
1034
- console.log(`使用缓存的通用文档内容,文件类型: ${fileType}`);
1035
-
1036
- // 根据文件类型设置相应的状态
1037
- if (fileType === 'text' && cached.content) {
1038
- setTextContent(cached.content);
1039
- } else if (fileType === 'html' && cached.content) {
1040
- setHtmlContent(cached.content);
1041
- }
1042
-
1043
- setCurrentPage(1);
1044
- // 优先使用用户传入的总页数,如果没有则设为1
1045
- setTotalPages(userTotalPages || 1);
1046
- setIsLoading(false);
1047
- setLoadingStatus('');
1048
- return cached.content;
1049
- }
1050
-
1051
- // 设置防抖状态
1052
- isGenericLoadingRef.current = true;
1053
- setIsLoading(true);
1054
- setLoadingStatus(`正在加载${fileType}文档...`);
1055
- setError(null);
1056
-
1057
- console.log(`开始加载通用文档,文件类型: ${fileType}`);
1058
-
1059
- // 获取通用文件数据
1060
- const fileData = await fetchGenericData();
1061
-
1062
- // 使用fileParser解析数据
1063
- const parseResult: ParseResult = await parseFile(fileData, {
1064
- fileName: fileName || `${fileType}文档`,
1065
- fileType: fileType as any, // 传递实际的文件类型
1066
- token: authorization,
1067
- });
1068
-
1069
- if (parseResult.error) {
1070
- throw new Error(parseResult.error);
1071
- }
1072
-
1073
- // 根据解析结果设置相应的状态
1074
- let finalContent = null;
1075
- if (parseResult.type === 'text' && parseResult.content) {
1076
- setTextContent(parseResult.content);
1077
- finalContent = parseResult.content;
1078
- } else if (parseResult.type === 'html' && parseResult.content) {
1079
- setHtmlContent(parseResult.content);
1080
- finalContent = parseResult.content;
1081
- } else if (parseResult.type === 'image' && parseResult.content) {
1082
- setImageContent(parseResult.content);
1083
- finalContent = parseResult.content;
1084
- } else {
1085
- // 如果解析失败,尝试作为文本处理
1086
- const textDecoder = new TextDecoder('utf-8');
1087
- const textContent = textDecoder.decode(fileData);
1088
- setTextContent({ type: 'text', content: textContent });
1089
- finalContent = { type: 'text', content: textContent };
1090
- }
1091
-
1092
- // 保存到缓存
1093
- if (finalContent) {
1094
- const cacheKey = `${fileType}_${convertedFilePath}`;
1095
- const newCache = {
1096
- ...genericContentCache,
1097
- [cacheKey]: {
1098
- content: finalContent,
1099
- timestamp: Date.now(),
1100
- },
1101
- };
1102
- setGenericContentCache(newCache);
1103
- console.log(`通用文档内容已缓存,文件类型: ${fileType}, 缓存键: ${cacheKey}`);
1104
- console.log(`当前缓存状态:`, newCache);
1105
- }
1106
-
1107
- setIsLoading(false);
1108
- setLoadingStatus('');
1109
- isGenericLoadingRef.current = false; // 清除防抖状态
1110
- hasLoadedGenericRef.current = true; // 标记已加载
1111
- console.log(`通用文档加载完成,文件类型: ${fileType}`);
1112
- return parseResult;
1113
- } catch (error: any) {
1114
- console.error('通用文档加载失败:', error);
1115
- setError(error.message || '通用文档加载失败,请稍后重试');
1116
- setIsLoading(false);
1117
- setLoadingStatus('');
1118
- isGenericLoadingRef.current = false; // 清除防抖状态
1119
- hasLoadedGenericRef.current = true; // 标记已加载(即使失败也标记,避免无限重试)
1120
- throw error;
1121
- }
1122
- }, [fetchGenericData, fileName, authorization]);
1123
-
1124
- // 移除markdown滚动事件处理,不再支持分块加载
1125
-
1126
- /**
1127
- * 处理页面变化(仅用于PDF文件类型)
1128
- */
1129
- const handlePageChange = useCallback(
1130
- async (pageNumber: number) => {
1131
- if (pageNumber === currentPageRef.current) return;
1132
- if (isLoading) {
1133
- console.log('页面正在加载中,忽略翻页请求');
1134
- return;
1135
- }
1136
-
1137
- // 根据文件类型决定处理方式
1138
- const isPDF = fileType === 'pdf' || fileType === 'pdf_slides';
1139
-
1140
- if (!isPDF) {
1141
- console.log(`文件类型 ${fileType} 不支持翻页,忽略翻页请求`);
1142
- return; // 直接返回,不进行任何操作
1143
- }
1144
-
1145
- console.log('PDF页面变化:', pageNumber, '当前页:', currentPageRef.current);
1146
- console.log(`页面 ${pageNumber} 是否在缓存中:`, isPageInCache(pageNumber));
1147
-
1148
- // 更新ref和state
1149
- currentPageRef.current = pageNumber;
1150
- setCurrentPage(pageNumber);
1151
-
1152
- try {
1153
- await loadPDFDocument(pageNumber, false); // 非初始加载
1154
- // 优先使用用户传入的总页数
1155
- const finalTotalPages = userTotalPages || totalPages;
1156
- eventsEmit('pageChange', { pageNumber, totalPages: finalTotalPages });
1157
- } catch (error) {
1158
- console.error('PDF页面加载失败:', error);
1159
- // 加载失败时恢复当前页
1160
- const originalPage = currentPageRef.current;
1161
- setCurrentPage(originalPage);
1162
- }
1163
- },
1164
- [loadPDFDocument, totalPages, eventsEmit, isPageInCache, isLoading, fileType]
1165
- );
1166
-
1167
- // 添加useEffect来监听currentPage变化,确保状态同步
1168
- useEffect(() => {
1169
- currentPageRef.current = currentPage;
1170
- console.log('当前页状态更新:', currentPage);
1171
- }, [currentPage]);
1172
-
1173
- /**
1174
- * 处理缩放变化
1175
- */
1176
- const handleZoomChange = useCallback(
1177
- (newScale: number) => {
1178
- setScale(newScale);
1179
- eventsEmit('zoomChange', { scale: newScale });
1180
- },
1181
- [eventsEmit]
1182
- );
1183
-
1184
- /**
1185
- * 处理关闭
1186
- */
1187
- const handleClose = useCallback(() => {
1188
- eventsEmit('viewer:close');
1189
- }, [eventsEmit]);
1190
-
1191
- /**
1192
- * 处理放大
1193
- */
1194
- const handleZoomIn = useCallback(() => {
1195
- const newScale = Math.min(3, scale + 0.1);
1196
- handleZoomChange(newScale);
1197
- }, [scale, handleZoomChange]);
1198
-
1199
- /**
1200
- * 处理缩小
1201
- */
1202
- const handleZoomOut = useCallback(() => {
1203
- const newScale = Math.max(0.3, scale - 0.1);
1204
- handleZoomChange(newScale);
1205
- }, [scale, handleZoomChange]);
1206
-
1207
- /**
1208
- * 处理左旋转(仅图片)
1209
- */
1210
- const handleRotateLeft = useCallback(() => {
1211
- const newRotation = (rotation - 90 + 360) % 360;
1212
- setRotation(newRotation);
1213
- eventsEmit('rotateChange', { rotation: newRotation });
1214
- }, [rotation, eventsEmit]);
1215
-
1216
- /**
1217
- * 处理右旋转(仅图片)
1218
- */
1219
- const handleRotateRight = useCallback(() => {
1220
- const newRotation = (rotation + 90) % 360;
1221
- setRotation(newRotation);
1222
- eventsEmit('rotateChange', { rotation: newRotation });
1223
- }, [rotation, eventsEmit]);
1224
-
1225
- /**
1226
- * 处理上一页(仅用于PDF文件类型)
1227
- */
1228
- const handlePrevPage = useCallback(() => {
1229
- // 根据文件类型决定处理方式
1230
- const isPDF = fileType === 'pdf' || fileType === 'pdf_slides';
1231
-
1232
- if (!isPDF) {
1233
- console.log(`文件类型 ${fileType} 不支持翻页,忽略翻页请求`);
1234
- return; // 直接返回,不进行任何操作
1235
- }
1236
-
1237
- const prevPage = currentPageRef.current - 1;
1238
- if (prevPage >= 1) {
1239
- handlePageChange(prevPage);
1240
- }
1241
- }, [handlePageChange, fileType]);
1242
-
1243
- /**
1244
- * 处理下一页(仅用于PDF文件类型)
1245
- */
1246
- const handleNextPage = useCallback(() => {
1247
- // 根据文件类型决定处理方式
1248
- const isPDF = fileType === 'pdf' || fileType === 'pdf_slides';
1249
-
1250
- if (!isPDF) {
1251
- console.log(`文件类型 ${fileType} 不支持翻页,忽略翻页请求`);
1252
- return; // 直接返回,不进行任何操作
1253
- }
1254
-
1255
- const nextPage = currentPageRef.current + 1;
1256
- // 优先使用用户传入的总页数
1257
- const finalTotalPages = userTotalPages || totalPages;
1258
- if (finalTotalPages && nextPage <= finalTotalPages) {
1259
- handlePageChange(nextPage);
1260
- }
1261
- }, [totalPages, handlePageChange, fileType]);
1262
-
1263
- /**
1264
- * 清理过期缓存
1265
- */
1266
- const cleanupExpiredCache = useCallback(() => {
1267
- const now = Date.now();
1268
-
1269
- // 清理单个页面缓存
1270
- Object.keys(pageCache.current).forEach(pageNo => {
1271
- const page = pageCache.current[parseInt(pageNo)];
1272
- if (now - page.timestamp > CACHE_EXPIRY_TIME) {
1273
- delete pageCache.current[parseInt(pageNo)];
1274
- console.log(`清理过期页面缓存: ${pageNo}`);
1275
- }
1276
- });
1277
-
1278
- // 清理chunk缓存
1279
- Object.keys(chunkCache.current).forEach(chunkKey => {
1280
- const chunk = chunkCache.current[chunkKey];
1281
- if (now - chunk.timestamp > CACHE_EXPIRY_TIME) {
1282
- delete chunkCache.current[chunkKey];
1283
- console.log(`清理过期chunk缓存: ${chunkKey}`);
1284
- }
1285
- });
1286
-
1287
- // 清理markdown内容缓存
1288
- if (
1289
- markdownContentCache.current &&
1290
- now - markdownContentCache.current.timestamp > CACHE_EXPIRY_TIME
1291
- ) {
1292
- markdownContentCache.current = null;
1293
- console.log('清理过期markdown内容缓存');
1294
- }
1295
-
1296
- // 清理通用文件缓存
1297
- setGenericContentCache(prev => {
1298
- const newCache = { ...prev };
1299
- Object.keys(newCache).forEach(key => {
1300
- if (now - newCache[key].timestamp > CACHE_EXPIRY_TIME) {
1301
- delete newCache[key];
1302
- console.log(`清理过期通用文件缓存: ${key}`);
1303
- }
1304
- });
1305
- return newCache;
1306
- });
1307
- }, []);
1308
-
1309
- /**
1310
- * 获取文件名
1311
- */
1312
- const getFileName = useCallback(() => {
1313
- if (fileName) return fileName;
1314
- try {
1315
- const urlObj = new URL(convertedFilePath);
1316
- const fileNameFromUrl = decodeURIComponent(urlObj.pathname.split('/').pop() || '');
1317
- return fileNameFromUrl || 'Stream文档';
1318
- } catch {
1319
- const pathParts = convertedFilePath.split('/');
1320
- return decodeURIComponent(pathParts[pathParts.length - 1]) || 'Stream文档';
1321
- }
1322
- }, [convertedFilePath, fileName]);
1323
-
1324
- // 定期清理过期缓存
1325
- useEffect(() => {
1326
- const cleanupInterval = setInterval(cleanupExpiredCache, CACHE_EXPIRY_TIME);
1327
- return () => clearInterval(cleanupInterval);
1328
- }, [cleanupExpiredCache]);
1329
-
1330
- // 组件卸载时清理缓存
1331
- useEffect(() => {
1332
- return () => {
1333
- pageCache.current = {};
1334
- chunkCache.current = {};
1335
- markdownContentCache.current = null;
1336
- setGenericContentCache({});
1337
- console.log('组件卸载,清理所有缓存');
1338
- };
1339
- }, []);
1340
-
1341
- // 初始加载
1342
- useEffect(() => {
1343
- console.log(`=== useEffect 被触发 ===`);
1344
- console.log(`触发时间:`, new Date().toISOString());
1345
- console.log(`触发原因:`, { initialPage, fileType });
1346
-
1347
- const loadInitialPage = async () => {
1348
- try {
1349
- // 根据文件类型决定是否使用翻页参数
1350
- const isPDF = fileType === 'pdf' || fileType === 'pdf_slides';
1351
- const effectivePage = isPDF ? initialPage || 1 : 1;
1352
- console.log(
1353
- '开始初始加载,文件类型:',
1354
- fileType,
1355
- '有效页码:',
1356
- effectivePage,
1357
- '是否PDF:',
1358
- isPDF
1359
- );
1360
-
1361
- if (fileType === 'markdown' || fileType === 'markdown_table') {
1362
- // Markdown文件加载完整内容,忽略翻页参数
1363
- await loadMarkdownDocument();
1364
- setCurrentPage(1);
1365
- // 优先使用用户传入的总页数,如果没有则设为1
1366
- setTotalPages(userTotalPages || 1);
1367
- eventsEmit('pageChange', { pageNumber: 1, totalPages: userTotalPages || 1 });
1368
- } else if (fileType === 'image') {
1369
- // 图片文件加载,忽略翻页参数
1370
- await loadImageDocument();
1371
- setCurrentPage(1);
1372
- // 优先使用用户传入的总页数,如果没有则设为1
1373
- setTotalPages(userTotalPages || 1);
1374
- setRotation(0);
1375
- eventsEmit('pageChange', { pageNumber: 1, totalPages: userTotalPages || 1 });
1376
- } else if (isPDF) {
1377
- // 只有PDF文件使用页面加载和翻页参数
1378
- await loadPDFDocument(effectivePage, true);
1379
- setCurrentPage(effectivePage);
1380
- // 等待 totalPages 更新后再触发事件,优先使用用户传入的值
1381
- setTimeout(() => {
1382
- const finalTotalPages = userTotalPages || totalPages;
1383
- eventsEmit('pageChange', { pageNumber: effectivePage, totalPages: finalTotalPages });
1384
- }, 0);
1385
- } else {
1386
- // 其他文件类型(text, html, unknown等)使用通用加载函数,忽略翻页参数
1387
- console.log('=== 初始加载:使用通用加载函数处理文件类型 ===', fileType);
1388
- await loadGenericDocument();
1389
- setCurrentPage(1);
1390
- // 优先使用用户传入的总页数,如果没有则设为1
1391
- setTotalPages(userTotalPages || 1);
1392
- eventsEmit('pageChange', { pageNumber: 1, totalPages: userTotalPages || 1 });
1393
- }
1394
- } catch (error: any) {
1395
- console.error('初始加载失败:', error);
1396
- // 确保错误状态被正确设置,避免组件状态不一致
1397
- setError(error?.message || '文件加载失败,请稍后重试');
1398
- setIsLoading(false);
1399
- setLoadingStatus('');
1400
- }
1401
- };
1402
-
1403
- loadInitialPage();
1404
- }, [initialPage, fileType, convertedFilePath]);
1405
-
1406
- // 所有 hooks 必须在条件返回之前调用
1407
- const pdfStartPage = useMemo(() => {
1408
- return Math.floor((currentPage - 1) / pageSize) * pageSize + 1;
1409
- }, [currentPage, pageSize]);
1410
-
1411
- if (error) {
1412
- return (
1413
- <ReaderContainer $theme={mergedTheme} className={className}>
1414
- {customComponents?.ErrorComponent ? (
1415
- <customComponents.ErrorComponent error={error} theme={mergedTheme} />
1416
- ) : (
1417
- <ErrorContainer $theme={mergedTheme}>
1418
- <div>加载失败</div>
1419
- <div style={{ fontSize: '12px', marginTop: '8px' }}>{error}</div>
1420
- </ErrorContainer>
1421
- )}
1422
- </ReaderContainer>
1423
- );
1424
- }
1425
-
1426
- // 渲染加载状态
1427
- if (isLoading) {
1428
- return (
1429
- <ReaderContainer $theme={mergedTheme} className={className}>
1430
- {/* 头部工具栏 - 始终显示 */}
1431
- <Header
1432
- fileName={getFileName()}
1433
- currentPage={currentPage}
1434
- totalPage={totalPages}
1435
- scale={scale}
1436
- isAnnotating={false}
1437
- tools={tools}
1438
- styles={styles}
1439
- onPrevPage={() => {}}
1440
- onNextPage={() => {}}
1441
- onZoomIn={() => {}}
1442
- onZoomOut={() => {}}
1443
- onAnnotationToggle={() => {}}
1444
- onDownload={() => {}}
1445
- onClose={handleClose}
1446
- className={headerClass}
1447
- />
1448
-
1449
- {/* 内容区域 - 显示加载状态 */}
1450
- {customComponents?.LoadingComponent ? (
1451
- <customComponents.LoadingComponent status={loadingStatus} theme={mergedTheme} />
1452
- ) : (
1453
- <DefaultLoadingComponent status={loadingStatus} theme={mergedTheme} />
1454
- )}
1455
- </ReaderContainer>
1456
- );
1457
- }
1458
-
1459
- return (
1460
- <ReaderContainer $theme={mergedTheme} className={className}>
1461
- {/* Header组件 */}
1462
- <Header
1463
- fileName={getFileName()}
1464
- currentPage={currentPage}
1465
- totalPage={totalPages}
1466
- scale={scale}
1467
- isAnnotating={false}
1468
- tools={{
1469
- ...tools,
1470
- // 仅PDF和PDF幻灯片显示导航
1471
- navigation: fileType === 'pdf' || fileType === 'pdf_slides' ? tools.navigation : false,
1472
- // 仅图片显示旋转
1473
- rotate: fileType === 'image',
1474
- }}
1475
- styles={styles}
1476
- onPrevPage={handlePrevPage}
1477
- onNextPage={handleNextPage}
1478
- onZoomIn={handleZoomIn}
1479
- onZoomOut={handleZoomOut}
1480
- onRotateLeft={fileType === 'image' ? handleRotateLeft : undefined}
1481
- onRotateRight={fileType === 'image' ? handleRotateRight : undefined}
1482
- onAnnotationToggle={() => {}}
1483
- onDownload={() => {}}
1484
- onClose={handleClose}
1485
- className={headerClass}
1486
- />
1487
-
1488
- {fileType === 'markdown' || fileType === 'markdown_table' ? (
1489
- // Markdown内容渲染 - 使用Fviewer的markdown渲染逻辑
1490
- <div
1491
- ref={scrollContainerRef}
1492
- style={{
1493
- flex: 1,
1494
- overflow: 'auto', // 改为auto,允许滚动条显示
1495
- position: 'relative',
1496
- }}
1497
- className={contentClass}
1498
- >
1499
- <Fviewer
1500
- data={{
1501
- content: markdownContent, // 直接传递markdown内容字符串
1502
- ...(getFileName() && { fileName: getFileName() }),
1503
- ...(fileType && { fileType }),
1504
- ...(totalPages && { totalPages }),
1505
- }}
1506
- annotationData={annotations}
1507
- totalPage={totalPages}
1508
- currentPage={currentPage}
1509
- scale={scale}
1510
- eventsEmit={(name, data) => {
1511
- console.log('Fviewer事件:', name, data);
1512
- // 处理markdown标注事件
1513
- if (name === 'md_annotation_add') {
1514
- eventsEmit('md_annotation_add', data);
1515
- } else if (name === 'table_annotation_add') {
1516
- eventsEmit('table_annotation_add', data);
1517
- } else {
1518
- // 传递其他事件
1519
- eventsEmit(name, data);
1520
- }
1521
- }}
1522
- styles={styles}
1523
- tools={tools}
1524
- customComponents={customComponents}
1525
- contentClass={contentClass}
1526
- />
1527
- {(() => {
1528
- console.log('=== 传递给Fviewer的markdown内容 ===');
1529
- console.log('markdownContent:', markdownContent);
1530
- console.log('markdownContent长度:', markdownContent.length);
1531
- console.log('markdownContent前100字符:', markdownContent.substring(0, 100));
1532
- console.log(
1533
- 'markdownContent后100字符:',
1534
- markdownContent.substring(markdownContent.length - 100)
1535
- );
1536
- return null;
1537
- })()}
1538
-
1539
- {/* 移除加载更多指示器,不再支持分块加载 */}
1540
- </div>
1541
- ) : fileType === 'image' ? (
1542
- // 图片内容渲染
1543
- <Fviewer
1544
- data={{
1545
- content: imageContent, // { type: 'image', url }
1546
- ...(getFileName() && { fileName: getFileName() }),
1547
- ...(fileType && { fileType }),
1548
- }}
1549
- annotationData={annotations}
1550
- totalPage={1}
1551
- currentPage={1}
1552
- scale={scale}
1553
- rotation={rotation}
1554
- eventsEmit={eventsEmit}
1555
- styles={styles}
1556
- tools={{
1557
- ...tools,
1558
- navigation: false,
1559
- rotate: true,
1560
- }}
1561
- customComponents={customComponents}
1562
- contentClass={contentClass}
1563
- />
1564
- ) : fileType === 'pdf' || fileType === 'pdf_slides' ? (
1565
- // PDF内容渲染
1566
- <Fviewer
1567
- data={{
1568
- content: { document: pdfDocument }, // 修复:包装成期望的数据结构
1569
- ...(getFileName() && { fileName: getFileName() }),
1570
- ...(fileType && { fileType }),
1571
- ...(totalPages && { totalPages }),
1572
- // 添加PDF起始页信息,用于分页PDF的页码映射
1573
- pdfStartPage,
1574
- }}
1575
- annotationData={annotations}
1576
- totalPage={totalPages}
1577
- currentPage={currentPage}
1578
- scale={scale}
1579
- initialZoom={initialZoom}
1580
- eventsEmit={(name, data) => {
1581
- console.log('Fviewer事件:', name, data);
1582
- // 处理缩放变化事件
1583
- if (name === 'scaleChange') {
1584
- console.log('收到缩放变化事件:', data);
1585
- // 这里需要更新scale状态,但是我们需要一个回调来更新scale
1586
- // 暂时先传递事件
1587
- eventsEmit(name, data);
1588
- } else {
1589
- // 传递其他事件
1590
- eventsEmit(name, data);
1591
- }
1592
- }}
1593
- styles={styles}
1594
- tools={tools}
1595
- customComponents={customComponents}
1596
- contentClass={contentClass}
1597
- setScale={setScale}
1598
- />
1599
- ) : (
1600
- // 通用文件类型渲染(html、text、unknown等)
1601
- <Fviewer
1602
- data={{
1603
- content: textContent || htmlContent || { type: 'text', content: '文件内容加载中...' },
1604
- ...(getFileName() && { fileName: getFileName() }),
1605
- ...(fileType && { fileType }),
1606
- }}
1607
- annotationData={annotations}
1608
- totalPage={1}
1609
- currentPage={1}
1610
- scale={scale}
1611
- eventsEmit={eventsEmit}
1612
- styles={styles}
1613
- tools={{
1614
- ...tools,
1615
- navigation: false, // 通用文件类型不支持翻页
1616
- }}
1617
- customComponents={customComponents}
1618
- contentClass={contentClass}
1619
- />
1620
- )}
1621
- </ReaderContainer>
1622
- );
1623
- };
1624
-
1625
- export default GientechStreamReader;