cd-aichat 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/README.md +188 -0
  2. package/dist/ailogo.png +0 -0
  3. package/dist/cd-aichat.css +1 -0
  4. package/dist/cd-aichat.es.js +32223 -0
  5. package/dist/cd-aichat.umd.js +279 -0
  6. package/dist/index.css +1 -0
  7. package/package.json +61 -0
  8. package/src/ailogo.png +0 -0
  9. package/src/components/AiChat.test.js +538 -0
  10. package/src/components/AiChat.vue +2206 -0
  11. package/src/components/AiChatWidget.test.js +312 -0
  12. package/src/components/AiChatWidget.vue +963 -0
  13. package/src/components/BurnAfterReadDialog.test.js +121 -0
  14. package/src/components/BurnAfterReadDialog.vue +511 -0
  15. package/src/components/BurnAfterReadMessage.test.js +188 -0
  16. package/src/components/BurnAfterReadMessage.vue +193 -0
  17. package/src/components/BurnIndicator.test.js +101 -0
  18. package/src/components/BurnIndicator.vue +164 -0
  19. package/src/components/ChatWindow.vue +0 -0
  20. package/src/components/MentionList.vue +163 -0
  21. package/src/components/ResourceList.vue +194 -0
  22. package/src/components/RichTextEditor.vue +437 -0
  23. package/src/components/ScheduledSendDialog.vue +476 -0
  24. package/src/components/ScreenshotOverlay.vue +78 -0
  25. package/src/components/SendButtonGroup.test.js +174 -0
  26. package/src/components/SendButtonGroup.vue +166 -0
  27. package/src/components/UserDrawer.vue +0 -0
  28. package/src/components/screenshot/ScreenshotsBackground/getBoundsByPoints.ts +41 -0
  29. package/src/components/screenshot/ScreenshotsBackground/index.scss +27 -0
  30. package/src/components/screenshot/ScreenshotsBackground/index.tsx +145 -0
  31. package/src/components/screenshot/ScreenshotsButton/index.scss +29 -0
  32. package/src/components/screenshot/ScreenshotsButton/index.tsx +58 -0
  33. package/src/components/screenshot/ScreenshotsCanvas/getBoundsByPoints.ts +55 -0
  34. package/src/components/screenshot/ScreenshotsCanvas/getPoints.ts +60 -0
  35. package/src/components/screenshot/ScreenshotsCanvas/index.scss +84 -0
  36. package/src/components/screenshot/ScreenshotsCanvas/index.tsx +277 -0
  37. package/src/components/screenshot/ScreenshotsCanvas/isPointInDraw.ts +35 -0
  38. package/src/components/screenshot/ScreenshotsColor/index.scss +45 -0
  39. package/src/components/screenshot/ScreenshotsColor/index.tsx +39 -0
  40. package/src/components/screenshot/ScreenshotsContext.ts +56 -0
  41. package/src/components/screenshot/ScreenshotsMagnifier/index.scss +61 -0
  42. package/src/components/screenshot/ScreenshotsMagnifier/index.tsx +126 -0
  43. package/src/components/screenshot/ScreenshotsOperations/index.scss +25 -0
  44. package/src/components/screenshot/ScreenshotsOperations/index.tsx +118 -0
  45. package/src/components/screenshot/ScreenshotsOption/index.scss +50 -0
  46. package/src/components/screenshot/ScreenshotsOption/index.tsx +150 -0
  47. package/src/components/screenshot/ScreenshotsSize/index.scss +28 -0
  48. package/src/components/screenshot/ScreenshotsSize/index.tsx +41 -0
  49. package/src/components/screenshot/ScreenshotsSizeColor/index.scss +8 -0
  50. package/src/components/screenshot/ScreenshotsSizeColor/index.tsx +25 -0
  51. package/src/components/screenshot/ScreenshotsTextarea/calculateNodeSize.ts +117 -0
  52. package/src/components/screenshot/ScreenshotsTextarea/index.scss +19 -0
  53. package/src/components/screenshot/ScreenshotsTextarea/index.tsx +96 -0
  54. package/src/components/screenshot/composeImage.ts +57 -0
  55. package/src/components/screenshot/exports.ts +4 -0
  56. package/src/components/screenshot/hooks/useBounds.ts +35 -0
  57. package/src/components/screenshot/hooks/useCall.ts +17 -0
  58. package/src/components/screenshot/hooks/useCanvasContextRef.ts +8 -0
  59. package/src/components/screenshot/hooks/useCanvasMousedown.ts +13 -0
  60. package/src/components/screenshot/hooks/useCanvasMousemove.ts +13 -0
  61. package/src/components/screenshot/hooks/useCanvasMouseup.ts +13 -0
  62. package/src/components/screenshot/hooks/useCursor.ts +34 -0
  63. package/src/components/screenshot/hooks/useDispatcher.ts +8 -0
  64. package/src/components/screenshot/hooks/useDrawSelect.ts +16 -0
  65. package/src/components/screenshot/hooks/useEmiter.ts +61 -0
  66. package/src/components/screenshot/hooks/useHistory.ts +160 -0
  67. package/src/components/screenshot/hooks/useLang.ts +8 -0
  68. package/src/components/screenshot/hooks/useOperation.ts +37 -0
  69. package/src/components/screenshot/hooks/useReset.ts +26 -0
  70. package/src/components/screenshot/hooks/useStore.ts +8 -0
  71. package/src/components/screenshot/icons/iconfont.scss +88 -0
  72. package/src/components/screenshot/icons/iconfont.ttf +0 -0
  73. package/src/components/screenshot/icons/iconfont.woff +0 -0
  74. package/src/components/screenshot/icons/iconfont.woff2 +0 -0
  75. package/src/components/screenshot/index.tsx +169 -0
  76. package/src/components/screenshot/operations/Arrow/draw.ts +56 -0
  77. package/src/components/screenshot/operations/Arrow/index.tsx +193 -0
  78. package/src/components/screenshot/operations/Brush/draw.ts +45 -0
  79. package/src/components/screenshot/operations/Brush/index.tsx +169 -0
  80. package/src/components/screenshot/operations/Cancel/index.tsx +18 -0
  81. package/src/components/screenshot/operations/Ellipse/draw.ts +96 -0
  82. package/src/components/screenshot/operations/Ellipse/index.tsx +245 -0
  83. package/src/components/screenshot/operations/Mosaic/index.tsx +223 -0
  84. package/src/components/screenshot/operations/Ok/index.tsx +37 -0
  85. package/src/components/screenshot/operations/Pin/index.tsx +37 -0
  86. package/src/components/screenshot/operations/Rectangle/draw.ts +80 -0
  87. package/src/components/screenshot/operations/Rectangle/index.tsx +245 -0
  88. package/src/components/screenshot/operations/Redo/index.tsx +22 -0
  89. package/src/components/screenshot/operations/Save/index.tsx +37 -0
  90. package/src/components/screenshot/operations/Scan/index.tsx +46 -0
  91. package/src/components/screenshot/operations/Search/index.tsx +39 -0
  92. package/src/components/screenshot/operations/Text/index.tsx +307 -0
  93. package/src/components/screenshot/operations/Undo/index.tsx +22 -0
  94. package/src/components/screenshot/operations/index.ts +34 -0
  95. package/src/components/screenshot/operations/utils.ts +34 -0
  96. package/src/components/screenshot/screenshots.scss +13 -0
  97. package/src/components/screenshot/types.ts +53 -0
  98. package/src/components/screenshot/useGetLoadedImage.ts +29 -0
  99. package/src/components/screenshot/var.scss +107 -0
  100. package/src/components/screenshot/zh_CN.ts +37 -0
  101. package/src/emoji/100.gif +0 -0
  102. package/src/emoji/101.gif +0 -0
  103. package/src/emoji/102.gif +0 -0
  104. package/src/emoji/103.gif +0 -0
  105. package/src/emoji/104.gif +0 -0
  106. package/src/emoji/105.gif +0 -0
  107. package/src/emoji/106.gif +0 -0
  108. package/src/emoji/107.gif +0 -0
  109. package/src/emoji/108.gif +0 -0
  110. package/src/emoji/109.gif +0 -0
  111. package/src/emoji/110.gif +0 -0
  112. package/src/emoji/111.gif +0 -0
  113. package/src/emoji/112.gif +0 -0
  114. package/src/emoji/113.gif +0 -0
  115. package/src/emoji/114.gif +0 -0
  116. package/src/emoji/115.gif +0 -0
  117. package/src/emoji/116.gif +0 -0
  118. package/src/emoji/117.gif +0 -0
  119. package/src/emoji/118.gif +0 -0
  120. package/src/emoji/119.gif +0 -0
  121. package/src/emoji/120.gif +0 -0
  122. package/src/emoji/121.gif +0 -0
  123. package/src/emoji/122.gif +0 -0
  124. package/src/emoji/123.gif +0 -0
  125. package/src/emoji/124.gif +0 -0
  126. package/src/emoji/125.gif +0 -0
  127. package/src/emoji/126.gif +0 -0
  128. package/src/emoji/127.gif +0 -0
  129. package/src/emoji/128.gif +0 -0
  130. package/src/emoji/129.gif +0 -0
  131. package/src/emoji/130.gif +0 -0
  132. package/src/emoji/131.gif +0 -0
  133. package/src/emoji/132.gif +0 -0
  134. package/src/emoji/133.gif +0 -0
  135. package/src/emoji/134.gif +0 -0
  136. package/src/emoji/135.gif +0 -0
  137. package/src/emoji/136.gif +0 -0
  138. package/src/emoji/137.gif +0 -0
  139. package/src/emoji/138.gif +0 -0
  140. package/src/emoji/139.gif +0 -0
  141. package/src/emoji/140.gif +0 -0
  142. package/src/emoji/141.gif +0 -0
  143. package/src/emoji/142.gif +0 -0
  144. package/src/emoji/143.gif +0 -0
  145. package/src/emoji/144.gif +0 -0
  146. package/src/emoji/145.gif +0 -0
  147. package/src/emoji/146.gif +0 -0
  148. package/src/emoji/147.gif +0 -0
  149. package/src/emoji/148.gif +0 -0
  150. package/src/emoji/149.gif +0 -0
  151. package/src/emoji/150.gif +0 -0
  152. package/src/emoji/151.gif +0 -0
  153. package/src/emoji/152.gif +0 -0
  154. package/src/emoji/153.gif +0 -0
  155. package/src/emoji/154.gif +0 -0
  156. package/src/emoji/155.gif +0 -0
  157. package/src/emoji/156.gif +0 -0
  158. package/src/emoji/157.gif +0 -0
  159. package/src/emoji/158.gif +0 -0
  160. package/src/emoji/159.gif +0 -0
  161. package/src/emoji/160.gif +0 -0
  162. package/src/emoji/161.gif +0 -0
  163. package/src/emoji/162.gif +0 -0
  164. package/src/emoji/163.gif +0 -0
  165. package/src/emoji/164.gif +0 -0
  166. package/src/emoji/165.gif +0 -0
  167. package/src/emoji/166.gif +0 -0
  168. package/src/emoji/167.gif +0 -0
  169. package/src/emoji/168.gif +0 -0
  170. package/src/emoji/169.gif +0 -0
  171. package/src/emoji/170.gif +0 -0
  172. package/src/emoji/171.gif +0 -0
  173. package/src/emoji/172.gif +0 -0
  174. package/src/emoji/173.gif +0 -0
  175. package/src/emoji/174.gif +0 -0
  176. package/src/emoji/175.gif +0 -0
  177. package/src/emoji/176.gif +0 -0
  178. package/src/emoji/177.gif +0 -0
  179. package/src/emoji/178.gif +0 -0
  180. package/src/emoji/179.gif +0 -0
  181. package/src/emoji/180.gif +0 -0
  182. package/src/emoji/181.gif +0 -0
  183. package/src/emoji/182.gif +0 -0
  184. package/src/emoji/183.gif +0 -0
  185. package/src/emoji/184.gif +0 -0
  186. package/src/emoji/185.gif +0 -0
  187. package/src/emoji/186.gif +0 -0
  188. package/src/emoji/187.gif +0 -0
  189. package/src/emoji/188.gif +0 -0
  190. package/src/emoji/189.gif +0 -0
  191. package/src/emoji/190.gif +0 -0
  192. package/src/emoji/191.gif +0 -0
  193. package/src/emoji/192.gif +0 -0
  194. package/src/emoji/193.gif +0 -0
  195. package/src/emoji/194.gif +0 -0
  196. package/src/emoji/195.gif +0 -0
  197. package/src/emoji/196.gif +0 -0
  198. package/src/emoji/197.gif +0 -0
  199. package/src/emoji/198.gif +0 -0
  200. package/src/emoji/199.gif +0 -0
  201. package/src/emoji/200.png +0 -0
  202. package/src/emoji/201.png +0 -0
  203. package/src/emoji/202.png +0 -0
  204. package/src/emoji/203.png +0 -0
  205. package/src/emoji/204.png +0 -0
  206. package/src/emoji/205.png +0 -0
  207. package/src/emoji/206.png +0 -0
  208. package/src/emoji/207.png +0 -0
  209. package/src/emoji/208.png +0 -0
  210. package/src/emoji/209.png +0 -0
  211. package/src/emoji/210.png +0 -0
  212. package/src/emoji/211.png +0 -0
  213. package/src/emoji/212.png +0 -0
  214. package/src/emoji/213.png +0 -0
  215. package/src/emoji/214.png +0 -0
  216. package/src/emoji/215.png +0 -0
  217. package/src/emoji/216.png +0 -0
  218. package/src/emoji/217.png +0 -0
  219. package/src/emoji/218.png +0 -0
  220. package/src/emoji/219.png +0 -0
  221. package/src/emoji2/101--Streamline-The-Team.png +0 -0
  222. package/src/emoji2/128--Streamline-The-Team.png +0 -0
  223. package/src/emoji2/134--Streamline-The-Team.png +0 -0
  224. package/src/emoji2/173--Streamline-The-Team.png +0 -0
  225. package/src/emoji2/Airplane--Streamline-Emoji.svg +24 -0
  226. package/src/emoji2/Alien--Streamline-Emoji.svg +21 -0
  227. package/src/emoji2/Amazed-Face--Streamline-Emoji.svg +16 -0
  228. package/src/emoji2/Amusing-Face--Streamline-Emoji.svg +20 -0
  229. package/src/emoji2/Anguished-Face--Streamline-Emoji.svg +19 -0
  230. package/src/emoji2/Anxious-Face--Streamline-Emoji.svg +17 -0
  231. package/src/emoji2/Astonished-Face--Streamline-Emoji.svg +20 -0
  232. package/src/emoji2/Backhand-Index-Pointing-Down-1--Streamline-Emoji.svg +12 -0
  233. package/src/emoji2/Backhand-Index-Pointing-Left-1--Streamline-Emoji.svg +13 -0
  234. package/src/emoji2/Backhand-Index-Pointing-Right-1--Streamline-Emoji.svg +13 -0
  235. package/src/emoji2/Backhand-Index-Pointing-Up-1--Streamline-Emoji.svg +14 -0
  236. package/src/emoji2/Bar-Chart--Streamline-Emoji.svg +22 -0
  237. package/src/emoji2/Beaming-Face-With-Smiling-Eyes--Streamline-Emoji.svg +20 -0
  238. package/src/emoji2/Boy-1--Streamline-Emoji.svg +17 -0
  239. package/src/emoji2/Boy-2--Streamline-Emoji.svg +17 -0
  240. package/src/emoji2/Boy-3--Streamline-Emoji.svg +17 -0
  241. package/src/emoji2/Broken-Heart--Streamline-Emoji.svg +12 -0
  242. package/src/emoji2/Clapping-Hands-1--Streamline-Emoji.svg +23 -0
  243. package/src/emoji2/Clinking-Glasses-2--Streamline-Emoji.svg +43 -0
  244. package/src/emoji2/Confounded-Face--Streamline-Emoji.svg +17 -0
  245. package/src/emoji2/Confused-Face--Streamline-Emoji.svg +15 -0
  246. package/src/emoji2/Construction-Worker--Streamline-Emoji.svg +21 -0
  247. package/src/emoji2/Couple-With-Heart-Woman-Man-1--Streamline-Emoji.svg +40 -0
  248. package/src/emoji2/Couple-With-Heart-Woman-Man-2--Streamline-Emoji.svg +40 -0
  249. package/src/emoji2/Cowboy-Hat-Face--Streamline-Emoji.svg +22 -0
  250. package/src/emoji2/Crazy-Face--Streamline-Emoji.svg +25 -0
  251. package/src/emoji2/Crossed-Fingers-1--Streamline-Emoji.svg +25 -0
  252. package/src/emoji2/Crown--Streamline-Emoji.svg +35 -0
  253. package/src/emoji2/Crying-Face--Streamline-Emoji.svg +26 -0
  254. package/src/emoji2/Delivery-Truck--Streamline-Emoji.svg +31 -0
  255. package/src/emoji2/Determined-Face--Streamline-Emoji.svg +25 -0
  256. package/src/emoji2/Disappointed-Face--Streamline-Emoji.svg +15 -0
  257. package/src/emoji2/Dizzy-Face--Streamline-Emoji.svg +20 -0
  258. package/src/emoji2/Downcast-Face-With-Sweat--Streamline-Emoji.svg +18 -0
  259. package/src/emoji2/Drooling-Face-1--Streamline-Emoji.svg +19 -0
  260. package/src/emoji2/Drooling-Face-2--Streamline-Emoji.svg +18 -0
  261. package/src/emoji2/Ear--Streamline-Emoji.svg +14 -0
  262. package/src/emoji2/Exclamation-Mark--Streamline-Emoji.svg +12 -0
  263. package/src/emoji2/Exploding-Head--Streamline-Emoji.svg +24 -0
  264. package/src/emoji2/Expressionless-Face--Streamline-Emoji.svg +15 -0
  265. package/src/emoji2/Face-Blowing-A-Kiss--Streamline-Emoji.svg +18 -0
  266. package/src/emoji2/Face-Savoring-Food--Streamline-Emoji.svg +18 -0
  267. package/src/emoji2/Face-Screaming-In-Fear--Streamline-Emoji.svg +18 -0
  268. package/src/emoji2/Face-Vomiting--Streamline-Emoji.svg +28 -0
  269. package/src/emoji2/Face-With-Head-Bandage--Streamline-Emoji.svg +25 -0
  270. package/src/emoji2/Face-With-Medical-Mask--Streamline-Emoji.svg +23 -0
  271. package/src/emoji2/Face-With-Monocle--Streamline-Emoji.svg +26 -0
  272. package/src/emoji2/Face-With-Raised-Eyebrow--Streamline-Emoji.svg +17 -0
  273. package/src/emoji2/Face-With-Rolling-Eyes--Streamline-Emoji.svg +17 -0
  274. package/src/emoji2/Face-With-Steam-From-Nose--Streamline-Emoji.svg +19 -0
  275. package/src/emoji2/Face-With-Symbols-On-Mouth--Streamline-Emoji.svg +22 -0
  276. package/src/emoji2/Face-With-Tears-Of-Joy--Streamline-Emoji.svg +34 -0
  277. package/src/emoji2/Face-With-Thermometer--Streamline-Emoji.svg +31 -0
  278. package/src/emoji2/Face-With-Tongue--Streamline-Emoji.svg +18 -0
  279. package/src/emoji2/Face-Without-Mouth--Streamline-Emoji.svg +14 -0
  280. package/src/emoji2/Fearful-Face--Streamline-Emoji.svg +18 -0
  281. package/src/emoji2/Flexed-Biceps-1--Streamline-Emoji.svg +13 -0
  282. package/src/emoji2/Flushed-Face--Streamline-Emoji.svg +19 -0
  283. package/src/emoji2/Folded-Hands-1--Streamline-Emoji.svg +29 -0
  284. package/src/emoji2/Frowning-Face--Streamline-Emoji.svg +15 -0
  285. package/src/emoji2/Fuel-Pump--Streamline-Emoji.svg +30 -0
  286. package/src/emoji2/Girl-1--Streamline-Emoji.svg +23 -0
  287. package/src/emoji2/Glasses-1--Streamline-Emoji.svg +27 -0
  288. package/src/emoji2/Grimacing-Face--Streamline-Emoji.svg +19 -0
  289. package/src/emoji2/Grinning-Cat-Face--Streamline-Emoji.svg +32 -0
  290. package/src/emoji2/Grinning-Face--Streamline-Emoji.svg +16 -0
  291. package/src/emoji2/Grinning-Face-With-Sweat--Streamline-Emoji.svg +19 -0
  292. package/src/emoji2/Grinning-Squinting-Face--Streamline-Emoji.svg +16 -0
  293. package/src/emoji2/Hand-With-Fingers-Splayed-1--Streamline-Emoji.svg +14 -0
  294. package/src/emoji2/Heart-Suit--Streamline-Emoji.svg +9 -0
  295. package/src/emoji2/Hushed-Face-1--Streamline-Emoji.svg +17 -0
  296. package/src/emoji2/Hushed-Face-2--Streamline-Emoji.svg +15 -0
  297. package/src/emoji2/Index-Pointing-Up-1--Streamline-Emoji.svg +17 -0
  298. package/src/emoji2/Kissing-Face-With-Closed-Eyes--Streamline-Emoji.svg +18 -0
  299. package/src/emoji2/Loudly-Crying-Face--Streamline-Emoji.svg +16 -0
  300. package/src/emoji2/Lying-Face--Streamline-Emoji.svg +15 -0
  301. package/src/emoji2/Man-1--Streamline-Emoji.svg +17 -0
  302. package/src/emoji2/Man-Facepalming-1--Streamline-Emoji.svg +21 -0
  303. package/src/emoji2/Man-Gesturing-No-1--Streamline-Emoji.svg +34 -0
  304. package/src/emoji2/Man-Gesturing-Ok-1--Streamline-Emoji.svg +25 -0
  305. package/src/emoji2/Man-Health-Worker-1--Streamline-Emoji.svg +41 -0
  306. package/src/emoji2/Man-Raising-Hand-1--Streamline-Emoji.svg +26 -0
  307. package/src/emoji2/Man-Shrugging-1--Streamline-Emoji.svg +31 -0
  308. package/src/emoji2/Money-Mouth-Face-2--Streamline-Emoji.svg +30 -0
  309. package/src/emoji2/Mouth--Streamline-Emoji.svg +12 -0
  310. package/src/emoji2/Nauseated-Face-2--Streamline-Emoji.svg +19 -0
  311. package/src/emoji2/Neutral-Face--Streamline-Emoji.svg +15 -0
  312. package/src/emoji2/Ok-Hand-1--Streamline-Emoji.svg +14 -0
  313. package/src/emoji2/Old-Man-1--Streamline-Emoji.svg +27 -0
  314. package/src/emoji2/Old-Woman-1--Streamline-Emoji.svg +23 -0
  315. package/src/emoji2/Oncoming-Fist-1--Streamline-Emoji.svg +15 -0
  316. package/src/emoji2/Person-Wearing-Turban-2--Streamline-Emoji.svg +20 -0
  317. package/src/emoji2/Pile-Of-Poo--Streamline-Emoji.svg +15 -0
  318. package/src/emoji2/Police-Car-Light--Streamline-Emoji.svg +26 -0
  319. package/src/emoji2/Rocket--Streamline-Emoji.svg +32 -0
  320. package/src/emoji2/Sailboat--Streamline-Emoji.svg +18 -0
  321. package/src/emoji2/Shaved-Ice--Streamline-Emoji.svg +21 -0
  322. package/src/emoji2/Shortcake-2--Streamline-Emoji.svg +18 -0
  323. package/src/emoji2/Shushing-Face--Streamline-Emoji.svg +21 -0
  324. package/src/emoji2/Sign-Of-The-Horns-1--Streamline-Emoji.svg +19 -0
  325. package/src/emoji2/Sleeping-Face--Streamline-Emoji.svg +21 -0
  326. package/src/emoji2/Slightly-Smiling-Face--Streamline-Emoji.svg +15 -0
  327. package/src/emoji2/Smiling-Face-With-Halo--Streamline-Emoji.svg +20 -0
  328. package/src/emoji2/Smiling-Face-With-Heart-Eyes--Streamline-Emoji.svg +21 -0
  329. package/src/emoji2/Smirking-Face--Streamline-Emoji.svg +17 -0
  330. package/src/emoji2/Sun-With-Face--Streamline-Emoji.svg +24 -0
  331. package/src/emoji2/Thumbs-Down-1--Streamline-Emoji.svg +20 -0
  332. package/src/emoji2/Thumbs-Up-1--Streamline-Emoji.svg +19 -0
  333. package/src/emoji2/Winking-Face--Streamline-Emoji.svg +18 -0
  334. package/src/emoji2/Woman-Gesturing-No-1--Streamline-Emoji.svg +34 -0
  335. package/src/emoji2/Woman-Gesturing-Ok-2--Streamline-Emoji.svg +25 -0
  336. package/src/emoji2/Woman-Raising-Hand-1--Streamline-Emoji.svg +26 -0
  337. package/src/emoji2/Womans-Sandal--Streamline-Emoji.svg +13 -0
  338. package/src/emoji2/Worried-Face--Streamline-Emoji.svg +17 -0
  339. package/src/emoji2/Writing-Hand-1--Streamline-Emoji.svg +17 -0
  340. package/src/emoji2/Zipper-Mouth-Face--Streamline-Emoji.svg +21 -0
  341. package/src/index.js +19 -0
  342. package/src/services/burn-after-read-service.js +313 -0
  343. package/src/services/burn-after-read-service.test.js +325 -0
  344. package/src/services/dify-api.js +338 -0
  345. package/src/services/dify-api.test.js +376 -0
  346. package/src/services/scheduled-send-service.js +311 -0
  347. package/src/services/scheduled-send-service.test.js +317 -0
  348. package/src/styles/index.css +2368 -0
  349. package/src/utils/emoji.js +125 -0
  350. package/src/utils/emojiData.js +267 -0
  351. package/src/utils/eventEmitter.js +114 -0
  352. package/src/utils/state.js +224 -0
  353. package/src/utils/state.test.js +198 -0
  354. package/src/utils/storage.js +122 -0
  355. package/src/utils/storage.test.js +162 -0
  356. package/src/utils/validation.js +249 -0
@@ -0,0 +1,437 @@
1
+ <template>
2
+ <div class="rich-text-editor">
3
+ <editor-content :editor="editor" class="editor-content" />
4
+ </div>
5
+ </template>
6
+
7
+ <script>
8
+ import { defineComponent, ref, watch, onMounted, onBeforeUnmount } from 'vue';
9
+ import { useEditor, EditorContent } from '@tiptap/vue-3';
10
+ import StarterKit from '@tiptap/starter-kit';
11
+ import Image from '@tiptap/extension-image';
12
+ import Link from '@tiptap/extension-link';
13
+ import Placeholder from '@tiptap/extension-placeholder';
14
+ import Mention from '@tiptap/extension-mention';
15
+ import { VueRenderer } from '@tiptap/vue-3';
16
+ import tippy from 'tippy.js';
17
+ import 'tippy.js/dist/tippy.css';
18
+ import MentionList from './MentionList.vue';
19
+ import ResourceList from './ResourceList.vue';
20
+
21
+ export default defineComponent({
22
+ name: 'RichTextEditor',
23
+ components: {
24
+ EditorContent,
25
+ },
26
+ props: {
27
+ modelValue: {
28
+ type: String,
29
+ default: ''
30
+ },
31
+ placeholder: {
32
+ type: String,
33
+ default: '输入消息...'
34
+ },
35
+ members: {
36
+ type: Array,
37
+ default: () => []
38
+ },
39
+ resources: {
40
+ type: Array,
41
+ default: () => []
42
+ },
43
+ chatType: {
44
+ type: String,
45
+ default: 'ai'
46
+ }
47
+ },
48
+ emits: ['update:modelValue', 'submit', 'openPersonSelector', 'openResourceSelector'],
49
+ setup(props, { emit }) {
50
+ const editorDom = ref(null);
51
+
52
+ const editor = useEditor({
53
+ content: props.modelValue,
54
+ extensions: [
55
+ StarterKit.configure({
56
+ heading: false,
57
+ codeBlock: false,
58
+ horizontalRule: false,
59
+ blockquote: false,
60
+ }),
61
+ Placeholder.configure({
62
+ placeholder: props.placeholder,
63
+ }),
64
+ Image.configure({
65
+ inline: true,
66
+ allowBase64: true,
67
+ }),
68
+ Link.extend({
69
+ inclusive: false,
70
+ }).configure({
71
+ openOnClick: false,
72
+ HTMLAttributes: {
73
+ target: '_blank',
74
+ rel: 'noopener noreferrer',
75
+ },
76
+ }),
77
+ // @ 提及人员
78
+ Mention.configure({
79
+ HTMLAttributes: {
80
+ class: 'mention',
81
+ },
82
+ suggestion: {
83
+ items: ({ query }) => {
84
+ // AI聊天模式:不显示成员列表,触发打开人员选择器
85
+ if (props.chatType === 'ai') {
86
+ return [];
87
+ }
88
+
89
+ // 群聊模式:显示过滤后的成员列表
90
+ return props.members
91
+ .filter(member =>
92
+ member.name.toLowerCase().includes(query.toLowerCase()) ||
93
+ (member.account && member.account.toLowerCase().includes(query.toLowerCase()))
94
+ )
95
+ .slice(0, 8);
96
+ },
97
+ render: () => {
98
+ let component;
99
+ let popup;
100
+
101
+ return {
102
+ onStart: (suggestionProps) => {
103
+ // AI聊天模式:触发打开"选择人员"对话框(用于分享)
104
+ if (props.chatType === 'ai') {
105
+ emit('openPersonSelector');
106
+ return;
107
+ }
108
+
109
+ // 群聊模式:显示成员列表
110
+ component = new VueRenderer(MentionList, {
111
+ props: suggestionProps,
112
+ editor: suggestionProps.editor,
113
+ });
114
+
115
+ if (!suggestionProps.clientRect) {
116
+ return;
117
+ }
118
+
119
+ popup = tippy('body', {
120
+ getReferenceClientRect: suggestionProps.clientRect,
121
+ appendTo: () => document.body,
122
+ content: component.element,
123
+ showOnCreate: true,
124
+ interactive: true,
125
+ trigger: 'manual',
126
+ placement: 'top-start',
127
+ zIndex: 99999,
128
+ });
129
+ },
130
+ onUpdate(suggestionProps) {
131
+ if (!component) return;
132
+
133
+ component.updateProps(suggestionProps);
134
+
135
+ if (!suggestionProps.clientRect) {
136
+ return;
137
+ }
138
+
139
+ if (popup && popup[0]) {
140
+ popup[0].setProps({
141
+ getReferenceClientRect: suggestionProps.clientRect,
142
+ });
143
+ }
144
+ },
145
+ onKeyDown(suggestionProps) {
146
+ if (suggestionProps.event.key === 'Escape') {
147
+ if (popup && popup[0]) {
148
+ popup[0].hide();
149
+ }
150
+ return true;
151
+ }
152
+
153
+ return component?.ref?.onKeyDown(suggestionProps);
154
+ },
155
+ onExit() {
156
+ if (popup && popup[0]) {
157
+ popup[0].destroy();
158
+ }
159
+ if (component) {
160
+ component.destroy();
161
+ }
162
+ },
163
+ };
164
+ },
165
+ },
166
+ }),
167
+ // # 引用资源
168
+ Mention.extend({
169
+ name: 'hashtag',
170
+ }).configure({
171
+ HTMLAttributes: {
172
+ class: 'hashtag',
173
+ },
174
+ suggestion: {
175
+ char: '#',
176
+ items: ({ query }) => {
177
+ // AI聊天模式:不显示资源列表,触发打开资源选择器
178
+ if (props.chatType === 'ai') {
179
+ return [];
180
+ }
181
+
182
+ // 显示过滤后的资源列表
183
+ return props.resources
184
+ .filter(resource =>
185
+ resource.name.toLowerCase().includes(query.toLowerCase()) ||
186
+ (resource.code && resource.code.toLowerCase().includes(query.toLowerCase()))
187
+ )
188
+ .slice(0, 8);
189
+ },
190
+ render: () => {
191
+ let component;
192
+ let popup;
193
+
194
+ return {
195
+ onStart: (suggestionProps) => {
196
+ // AI聊天模式:触发打开资源选择器
197
+ if (props.chatType === 'ai') {
198
+ emit('openResourceSelector');
199
+ return;
200
+ }
201
+
202
+ // 显示资源列表
203
+ component = new VueRenderer(ResourceList, {
204
+ props: suggestionProps,
205
+ editor: suggestionProps.editor,
206
+ });
207
+
208
+ if (!suggestionProps.clientRect) {
209
+ return;
210
+ }
211
+
212
+ popup = tippy('body', {
213
+ getReferenceClientRect: suggestionProps.clientRect,
214
+ appendTo: () => document.body,
215
+ content: component.element,
216
+ showOnCreate: true,
217
+ interactive: true,
218
+ trigger: 'manual',
219
+ placement: 'top-start',
220
+ zIndex: 99999,
221
+ });
222
+ },
223
+ onUpdate(suggestionProps) {
224
+ if (!component) return;
225
+
226
+ component.updateProps(suggestionProps);
227
+
228
+ if (!suggestionProps.clientRect) {
229
+ return;
230
+ }
231
+
232
+ if (popup && popup[0]) {
233
+ popup[0].setProps({
234
+ getReferenceClientRect: suggestionProps.clientRect,
235
+ });
236
+ }
237
+ },
238
+ onKeyDown(suggestionProps) {
239
+ if (suggestionProps.event.key === 'Escape') {
240
+ if (popup && popup[0]) {
241
+ popup[0].hide();
242
+ }
243
+ return true;
244
+ }
245
+
246
+ return component?.ref?.onKeyDown(suggestionProps);
247
+ },
248
+ onExit() {
249
+ if (popup && popup[0]) {
250
+ popup[0].destroy();
251
+ }
252
+ if (component) {
253
+ component.destroy();
254
+ }
255
+ },
256
+ };
257
+ },
258
+ },
259
+ }),
260
+ ],
261
+ editorProps: {
262
+ handlePaste: (view, event) => {
263
+ // 处理图片粘贴
264
+ const items = Array.from(event.clipboardData?.items || []);
265
+ const imageItem = items.find(item => item.type.indexOf('image') !== -1);
266
+
267
+ if (imageItem) {
268
+ event.preventDefault();
269
+ const file = imageItem.getAsFile();
270
+ if (file) {
271
+ const reader = new FileReader();
272
+ reader.onload = (e) => {
273
+ editor.value?.chain().focus().setImage({ src: e.target?.result }).run();
274
+ };
275
+ reader.readAsDataURL(file);
276
+ }
277
+ return true;
278
+ }
279
+
280
+ return false;
281
+ },
282
+ handleDrop: (view, event) => {
283
+ // 处理图片拖放
284
+ const hasFiles = event.dataTransfer?.files?.length;
285
+
286
+ if (!hasFiles) {
287
+ return false;
288
+ }
289
+
290
+ const images = Array.from(event.dataTransfer.files).filter(file =>
291
+ /image/i.test(file.type)
292
+ );
293
+
294
+ if (images.length === 0) {
295
+ return false;
296
+ }
297
+
298
+ event.preventDefault();
299
+
300
+ images.forEach(image => {
301
+ const reader = new FileReader();
302
+ reader.onload = (e) => {
303
+ editor.value?.chain().focus().setImage({ src: e.target?.result }).run();
304
+ };
305
+ reader.readAsDataURL(image);
306
+ });
307
+
308
+ return true;
309
+ },
310
+ },
311
+ onUpdate: ({ editor }) => {
312
+ emit('update:modelValue', editor.getHTML());
313
+ },
314
+ });
315
+
316
+ // 监听外部值变化
317
+ watch(() => props.modelValue, (value) => {
318
+ const isSame = editor.value?.getHTML() === value;
319
+ if (!isSame && editor.value) {
320
+ editor.value.commands.setContent(value, false);
321
+ }
322
+ });
323
+
324
+ // Enter 键提交
325
+ const handleKeyDown = (e) => {
326
+ if (e.key === 'Enter' && !e.shiftKey) {
327
+ e.preventDefault();
328
+ emit('submit');
329
+ }
330
+ };
331
+
332
+ onMounted(() => {
333
+ if (editor.value?.view?.dom) {
334
+ editorDom.value = editor.value.view.dom;
335
+ editorDom.value.addEventListener('keydown', handleKeyDown);
336
+ }
337
+ });
338
+
339
+ onBeforeUnmount(() => {
340
+ if (editorDom.value) {
341
+ editorDom.value.removeEventListener('keydown', handleKeyDown);
342
+ }
343
+ if (editor.value) {
344
+ editor.value.destroy();
345
+ }
346
+ });
347
+
348
+ // 暴露方法
349
+ const focus = () => {
350
+ editor.value?.commands.focus();
351
+ };
352
+
353
+ const clear = () => {
354
+ editor.value?.commands.clearContent();
355
+ };
356
+
357
+ return {
358
+ editor,
359
+ focus,
360
+ clear,
361
+ };
362
+ },
363
+ });
364
+ </script>
365
+
366
+ <style scoped>
367
+ .rich-text-editor {
368
+ width: 100%;
369
+ border: 1px solid #dcdcdc;
370
+ border-radius: 4px;
371
+ background: white;
372
+ }
373
+
374
+ .editor-content {
375
+ min-height: 60px;
376
+ max-height: 200px;
377
+ overflow-y: auto;
378
+ padding: 10px;
379
+ }
380
+
381
+ :deep(.ProseMirror) {
382
+ outline: none;
383
+ min-height: 60px;
384
+ font-size: 14px;
385
+ line-height: 1.5;
386
+ }
387
+
388
+ :deep(.ProseMirror p.is-editor-empty:first-child::before) {
389
+ color: #adb5bd;
390
+ content: attr(data-placeholder);
391
+ float: left;
392
+ height: 0;
393
+ pointer-events: none;
394
+ }
395
+
396
+ :deep(.mention) {
397
+ background-color: #e3f2fd;
398
+ border-radius: 4px;
399
+ padding: 2px 6px;
400
+ color: #1976d2;
401
+ font-weight: 500;
402
+ cursor: pointer;
403
+ }
404
+
405
+ :deep(.mention:hover) {
406
+ background-color: #bbdefb;
407
+ }
408
+
409
+ :deep(.hashtag) {
410
+ background-color: #fff3e0;
411
+ border-radius: 4px;
412
+ padding: 2px 6px;
413
+ color: #e65100;
414
+ font-weight: 500;
415
+ cursor: pointer;
416
+ }
417
+
418
+ :deep(.hashtag:hover) {
419
+ background-color: #ffe0b2;
420
+ }
421
+
422
+ :deep(img) {
423
+ max-width: 100%;
424
+ height: auto;
425
+ border-radius: 4px;
426
+ margin: 4px 0;
427
+ }
428
+
429
+ :deep(a) {
430
+ color: #1890ff;
431
+ text-decoration: none;
432
+ }
433
+
434
+ :deep(a:hover) {
435
+ text-decoration: underline;
436
+ }
437
+ </style>