Jelajahi Sumber

更新打包

lex 1 tahun lalu
induk
melakukan
3c9ce109ee
61 mengubah file dengan 5800 tambahan dan 1 penghapusan
  1. 1 1
      .gitignore
  2. 17 0
      dist/assets/adv-arrow-1f1b1311.svg
  3. 21 0
      dist/assets/adv-im-16a8b82a.svg
  4. 31 0
      dist/assets/adv-more-21c360c3.svg
  5. 7 0
      dist/assets/arrow-left-center-06698007.svg
  6. 7 0
      dist/assets/at-8ae455a1.svg
  7. 16 0
      dist/assets/back-db002ea3.svg
  8. 20 0
      dist/assets/c2c-dc7637a9.svg
  9. 23 0
      dist/assets/cancel-cf661158.svg
  10. TEMPAT SAMPAH
      dist/assets/close-image-15985c26.png
  11. 4 0
      dist/assets/collapse-a8c8c720.svg
  12. 1 0
      dist/assets/double-arrow-a1a15b8b.svg
  13. TEMPAT SAMPAH
      dist/assets/downaload-image-285429cc.png
  14. 4 0
      dist/assets/expand-26853cc7.svg
  15. 6 0
      dist/assets/icon-close-h5-315670bb.svg
  16. 3 0
      dist/assets/icon-download-7044b081.svg
  17. 6 0
      dist/assets/icon-download-h5-1eeffe23.svg
  18. 14 0
      dist/assets/icon_search-8a6ade17.svg
  19. 16 0
      dist/assets/icon_searchActive-bf7fd0c6.svg
  20. 0 0
      dist/assets/index-79cbc726.js
  21. 0 0
      dist/assets/index-ba341d89.css
  22. TEMPAT SAMPAH
      dist/assets/login-background-7fc990a0.png
  23. 14 0
      dist/assets/message-f58d68ba.svg
  24. 16 0
      dist/assets/message-real-37c71d79.svg
  25. 16 0
      dist/assets/message-selected-65e48d26.svg
  26. 30 0
      dist/assets/msg-copy-014df696.svg
  27. 33 0
      dist/assets/msg-del-ccbe2554.svg
  28. 31 0
      dist/assets/msg-forward-2deabb90.svg
  29. 30 0
      dist/assets/msg-play-a7ea6868.svg
  30. 8 0
      dist/assets/msg-qnote-6ed4649b.svg
  31. 31 0
      dist/assets/msg-reply-0ff2473d.svg
  32. 29 0
      dist/assets/msg-revoke-40598264.svg
  33. 8 0
      dist/assets/mute-94c8513a.svg
  34. TEMPAT SAMPAH
      dist/assets/nomore-9da703ae.png
  35. 17 0
      dist/assets/profile-377bffb6.svg
  36. 32 0
      dist/assets/profile-selected-438c622c.svg
  37. 18 0
      dist/assets/relation-5549dca2.svg
  38. 19 0
      dist/assets/relation-real-c74746f6.svg
  39. 16 0
      dist/assets/relation-selected-63e77a46.svg
  40. 6 0
      dist/assets/replies-5e63d02d.svg
  41. 7 0
      dist/assets/rotate-left-502ede89.svg
  42. 7 0
      dist/assets/rotate-right-3fb9b23f.svg
  43. 27 0
      dist/assets/selected-ef05977c.svg
  44. 15 0
      dist/assets/star-519b0b7f.svg
  45. 55 0
      dist/assets/star-light-307ea8ac.svg
  46. 6 0
      dist/assets/startGroup-6d6b5fbb.svg
  47. 17 0
      dist/assets/warn-1dfd23b6.svg
  48. 9 0
      dist/assets/zoom-in-9b98305a.svg
  49. 9 0
      dist/assets/zoom-out-0ad1a1a9.svg
  50. 18 0
      dist/index.html
  51. 1 0
      dist/vite.svg
  52. 1661 0
      src/TUIKit/TUIComponents/container/TUIChat/dist/server.js
  53. 219 0
      src/TUIKit/TUIComponents/container/TUIChat/style/dist/h5.css
  54. 1078 0
      src/TUIKit/TUIComponents/container/TUIChat/utils/dist/utils.js
  55. 796 0
      src/TUIKit/TUIComponents/container/TUIContact/dist/server.js
  56. 429 0
      src/TUIKit/TUIComponents/container/TUIConversation/dist/server.js
  57. 324 0
      src/TUIKit/TUICore/server/dist/index.js
  58. 100 0
      src/TUIKit/TUICore/store/dist/index.js
  59. 13 0
      src/TUIKit/TUICore/tim/dist/index.dev.js
  60. 364 0
      src/TUIKit/TUIPlugin/TUINotification/dist/index.js
  61. 94 0
      src/TUIKit/TUIPlugin/TUIi18n/dist/index.js

+ 1 - 1
.gitignore

@@ -8,7 +8,7 @@ pnpm-debug.log*
 lerna-debug.log*
 
 node_modules
-dist
+# dist
 dist-ssr
 *.local
 

+ 17 - 0
dist/assets/adv-arrow-1f1b1311.svg

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21px" height="21px" viewBox="0 0 21 21" version="1.1">
+  <title>编组 5</title>
+  <g id="web" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="登录" transform="translate(-627.000000, -516.000000)" stroke="#FFFFFF" stroke-width="1.2">
+      <g id="编组-3" transform="translate(266.400000, 332.400000)">
+        <g id="编组-6" transform="translate(3.600000, 172.800000)">
+          <g id="编组-5" transform="translate(357.600000, 10.800000)">
+            <rect id="矩形" x="6.6" y="10.2" width="6" height="1" rx="0.5"></rect>
+            <circle id="椭圆形" cx="10.2" cy="10.2" r="9.6"></circle>
+            <polyline id="路径-2" stroke-linecap="round" stroke-linejoin="round" points="9.6 13.4662027 13.2 10.2 9.6 7.30762441"></polyline>
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

File diff ditekan karena terlalu besar
+ 21 - 0
dist/assets/adv-im-16a8b82a.svg


+ 31 - 0
dist/assets/adv-more-21c360c3.svg

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="230px" height="70px" viewBox="0 0 230 70" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>编组</title>
+    <defs>
+        <path d="M4,0 L226,0 C228.209139,-4.05812251e-16 230,1.790861 230,4 L230,66 C230,68.209139 228.209139,70 226,70 L4,70 C1.790861,70 2.705415e-16,68.209139 0,66 L0,4 C-2.705415e-16,1.790861 1.790861,4.05812251e-16 4,0 Z" id="path-1"></path>
+        <linearGradient x1="0%" y1="3.17377732%" x2="115.312974%" y2="115.99274%" id="linearGradient-3">
+            <stop stop-color="#D4E7FF" offset="0%"></stop>
+            <stop stop-color="#A9CBFF" offset="100%"></stop>
+        </linearGradient>
+        <linearGradient x1="50%" y1="0%" x2="50%" y2="72.5432672%" id="linearGradient-4">
+            <stop stop-color="#FFFFFF" offset="0%"></stop>
+            <stop stop-color="#F5F9FF" offset="100%"></stop>
+        </linearGradient>
+        <path d="M4,0 L226,0 C228.209139,-4.05812251e-16 230,1.790861 230,4 L230,66 C230,68.209139 228.209139,70 226,70 L4,70 C1.790861,70 2.705415e-16,68.209139 0,66 L0,4 C-2.705415e-16,1.790861 1.790861,4.05812251e-16 4,0 Z" id="path-5"></path>
+    </defs>
+    <g id="new" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="广告位" transform="translate(-318.000000, -123.000000)">
+            <g id="编组" transform="translate(318.000000, 123.000000)">
+                <mask id="mask-2" fill="white">
+                    <use xlink:href="#path-1"></use>
+                </mask>
+                <g id="v"></g>
+                <path d="M36.5081967,9.93488869 L36.5081967,32.4576271 L67,32.4576271 L67,5 L36.5081967,9.93488869 Z M36.5081967,60.1481125 L67,65 L67,37.5423729 L36.5081967,37.5423729 L36.5081967,60.1481125 Z M5,31.440678 L29.3934426,31.440678 L29.3934426,10.0847458 L5,14.1901801 L5,31.440678 Z M5,55.8947745 L29.3934426,59.9152542 L29.3934426,38.559322 L5,38.559322 L5,55.8947745 Z" id="形状" fill="url(#linearGradient-3)" mask="url(#mask-2)"></path>
+                <mask id="mask-6" fill="white">
+                    <use xlink:href="#path-5"></use>
+                </mask>
+                <use id="v" fill-opacity="0.5" fill="url(#linearGradient-4)" xlink:href="#path-5"></use>
+            </g>
+        </g>
+    </g>
+</svg>

+ 7 - 0
dist/assets/arrow-left-center-06698007.svg

@@ -0,0 +1,7 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg class="icon" width="32Px" height="32.00Px" viewBox="0 0 1024 1024" version="1.1"
+  xmlns="http://www.w3.org/2000/svg">
+  <path fill="#444444"
+    d="M384 512L731.733333 202.666667c17.066667-14.933333 19.2-42.666667 4.266667-59.733334-14.933333-17.066667-42.666667-19.2-59.733333-4.266666l-384 341.333333c-10.666667 8.533333-14.933333 19.2-14.933334 32s4.266667 23.466667 14.933334 32l384 341.333333c8.533333 6.4 19.2 10.666667 27.733333 10.666667 12.8 0 23.466667-4.266667 32-14.933333 14.933333-17.066667 14.933333-44.8-4.266667-59.733334L384 512z" />
+</svg>

File diff ditekan karena terlalu besar
+ 7 - 0
dist/assets/at-8ae455a1.svg


+ 16 - 0
dist/assets/back-db002ea3.svg

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48Px" height="48Px" viewBox="0 0 48 48" version="1.1">
+  <title>ic_back_white</title>
+  <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="02.-查看信息-示例好友" transform="translate(-32.000000, -200.000000)">
+      <g id="编组-6" transform="translate(0.000000, 176.000000)">
+        <g id="ic_back_white" transform="translate(32.000000, 24.000000)">
+          <g id="ic_back_black" fill="#444444" fill-rule="nonzero">
+            <path d="M9.51231071,24 L23.5198286,38.7290411 C23.785378,39.0082689 23.7753168,39.4496082 23.4973187,39.7164448 L21.6255915,41.5130226 C21.3466827,41.7807332 20.9035602,41.7716553 20.6358496,41.4927466 C20.6351032,41.491969 20.6343586,41.4911896 20.6336157,41.4904085 L4.45876399,24.4823948 C4.2017544,24.2121467 4.2017544,23.7878533 4.45876399,23.5176052 L20.6336157,6.50959152 C20.900035,6.22944906 21.3431109,6.21832422 21.6232533,6.48474351 C21.6240344,6.48548634 21.6248138,6.48623097 21.6255915,6.48697741 L23.4973187,8.28355524 C23.7753168,8.55039175 23.785378,8.99173114 23.5198286,9.27095893 L9.51231071,24 L9.51231071,24 Z" id="Path-2"></path>
+          </g>
+          <rect id="矩形" x="0" y="0" width="48" height="48"></rect>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

File diff ditekan karena terlalu besar
+ 20 - 0
dist/assets/c2c-dc7637a9.svg


+ 23 - 0
dist/assets/cancel-cf661158.svg

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16Px" height="16Px" viewBox="0 0 16 16" version="1.1">
+  <title>清除</title>
+  <g id="页面-2备份" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="创建群聊" transform="translate(-1243.000000, -413.000000)">
+      <g id="Group-1364" transform="translate(650.000000, 343.000000)">
+        <g id="Group-1363" transform="translate(290.000000, 46.000000)">
+          <g id="Group-1358" transform="translate(0.000000, 24.000000)">
+            <g id="清除" transform="translate(303.000000, 0.000000)">
+              <path d="M0,0 L16,0 L16,16 L0,16 L0,0 Z" id="矩形"></path>
+              <path d="M1,8 C1,11.8659999 4.13400006,15 8,15 C11.8659999,15 15,11.8659999 15,8 C15,4.13400006 11.8659999,1 8,1 L8,1 C4.13400006,1 1,4.13400006 1,8 Z" fill="#999999"></path>
+              <g id="编组" transform="translate(8.000000, 8.000000) rotate(-315.000000) translate(-8.000000, -8.000000) translate(4.000000, 4.000000)" fill="#FFFFFF">
+                <rect id="矩形备份" transform="translate(4.000000, 4.000000) rotate(-90.000000) translate(-4.000000, -4.000000) " x="1.8189894e-12" y="3.5" width="8" height="1" rx="0.5"></rect>
+                <rect id="矩形备份" transform="translate(4.000000, 4.000000) rotate(-360.000000) translate(-4.000000, -4.000000) " x="0" y="3.5" width="8" height="1" rx="0.5"></rect>
+              </g>
+              <rect id="矩形" x="0" y="0" width="16" height="16"></rect>
+            </g>
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

TEMPAT SAMPAH
dist/assets/close-image-15985c26.png


+ 4 - 0
dist/assets/collapse-a8c8c720.svg

@@ -0,0 +1,4 @@
+<svg width="17" height="18" viewBox="0 0 17 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect x="0.5" y="-0.5" width="15.8" height="15.8" rx="7.9" transform="matrix(1 0 0 -1 0 16.3999)" stroke="#666666"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M4.15745 10.4828C4.00124 10.3266 4.00124 10.0733 4.15745 9.91711L8.11724 5.95731C8.27345 5.8011 8.52672 5.8011 8.68293 5.95731L8.82435 6.09873C8.82645 6.10083 8.82852 6.10295 8.83057 6.10509L12.6427 9.91725C12.7989 10.0735 12.7989 10.3267 12.6427 10.4829L12.5013 10.6244C12.3451 10.7806 12.0918 10.7806 11.9356 10.6244L8.40002 7.08875L4.86455 10.6242C4.70834 10.7804 4.45508 10.7804 4.29887 10.6242L4.15745 10.4828Z" fill="#666666"/>
+</svg>

+ 1 - 0
dist/assets/double-arrow-a1a15b8b.svg

@@ -0,0 +1 @@
+<svg t="1660053550964" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3181" width="200" height="200"><path d="M95.658667 461.354667a71.637333 71.637333 0 0 0 0 101.290666l365.696 365.696a71.637333 71.637333 0 0 0 101.290666 0l365.696-365.696a71.637333 71.637333 0 1 0-101.248-101.290666L512 776.448l-315.093333-315.093333a71.594667 71.594667 0 0 0-101.248 0z" p-id="3182" fill="#bfbfbf"></path><path d="M95.658667 95.658667a71.637333 71.637333 0 0 0 0 101.248l365.696 365.738666a71.594667 71.594667 0 0 0 101.290666 0l365.696-365.738666a71.637333 71.637333 0 0 0-101.248-101.248L512 410.709333 196.906667 95.658667a71.637333 71.637333 0 0 0-101.248 0z" p-id="3183" fill="#bfbfbf"></path></svg>

TEMPAT SAMPAH
dist/assets/downaload-image-285429cc.png


+ 4 - 0
dist/assets/expand-26853cc7.svg

@@ -0,0 +1,4 @@
+<svg width="17" height="18" viewBox="0 0 17 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect x="0.5" y="-0.5" width="15.8" height="15.8" rx="7.9" transform="matrix(1 0 0 -1 0 16.3999)" stroke="#666666"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.6427 7.24255C12.7989 7.39876 12.7989 7.65202 12.6427 7.80823L8.68293 11.768C8.52672 11.9242 8.27345 11.9242 8.11724 11.768L7.97582 11.6266C7.97408 11.6249 7.97236 11.6231 7.97067 11.6214L4.15744 7.80814C4.00123 7.65193 4.00123 7.39867 4.15744 7.24246L4.29887 7.10103C4.45508 6.94482 4.70834 6.94482 4.86455 7.10103L8.40013 10.6366L11.9356 7.10113C12.0918 6.94492 12.3451 6.94492 12.5013 7.10113L12.6427 7.24255Z" fill="#666666"/>
+</svg>

+ 6 - 0
dist/assets/icon-close-h5-315670bb.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 62 62" class="design-iconfont">
+  <g fill="none" fill-rule="evenodd">
+    <path fill="#4D4D4D" d="M31 0A31 31 0 1 0 31 62A31 31 0 1 0 31 0Z"/>
+    <path d="M20.768687,18.3379271 L31,28.569 L41.231313,18.3379271 C41.5917969,17.9774431 42.159028,17.9497136 42.5513192,18.2547385 L42.6455265,18.3379271 L43.6620729,19.3544735 C44.0525972,19.7449978 44.0525972,20.3781627 43.6620729,20.768687 L43.6620729,20.768687 L33.431,31 L43.6620729,41.231313 C44.0525972,41.6218373 44.0525972,42.2550022 43.6620729,42.6455265 L42.6455265,43.6620729 C42.2550022,44.0525972 41.6218373,44.0525972 41.231313,43.6620729 L31,33.431 L20.768687,43.6620729 C20.4082031,44.0225569 19.840972,44.0502864 19.4486808,43.7452615 L19.3544735,43.6620729 L18.3379271,42.6455265 C17.9474028,42.2550022 17.9474028,41.6218373 18.3379271,41.231313 L18.3379271,41.231313 L28.569,31 L18.3379271,20.768687 C17.9474028,20.3781627 17.9474028,19.7449978 18.3379271,19.3544735 L19.3544735,18.3379271 C19.7449978,17.9474028 20.3781627,17.9474028 20.768687,18.3379271 Z" fill="#FFF" fill-rule="nonzero"/>
+  </g>
+</svg>

+ 3 - 0
dist/assets/icon-download-7044b081.svg

@@ -0,0 +1,3 @@
+<svg width="22" height="20" viewBox="0 0 22 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M3.09661 19.8415C1.38654 19.8415 0 18.4764 0 16.7919V12.9796C0 12.5587 0.346831 12.2173 0.774001 12.2173H2.3226C2.75004 12.2173 3.0966 12.5587 3.0966 12.9796V15.267C3.0966 16.1093 3.78974 16.7919 4.6449 16.7919H17.0317C17.8869 16.7919 18.58 16.1093 18.58 15.267V12.9796C18.58 12.5587 18.9266 12.2173 19.3543 12.2173H20.9026C21.3301 12.2173 21.6766 12.5587 21.6766 12.9796V16.7919C21.6766 18.4764 20.2904 19.8415 18.58 19.8415H18.58H3.09661ZM5.67942 4.88325L9.2903 8.43944V0.762639C9.2903 0.341674 9.63693 0 10.0643 0H11.6126C12.0401 0 12.3869 0.341674 12.3869 0.762639V8.43944L15.9978 4.88325C16.311 4.57485 16.8189 4.57485 17.1321 4.88325L18.2668 6.00088C18.58 6.30935 18.58 6.80951 18.2668 7.11823L11.8728 13.4154C11.8452 13.4426 11.3477 13.7421 10.8471 13.7423C10.3411 13.7425 9.83204 13.4429 9.80436 13.4154L3.41009 7.11823C3.09687 6.80949 3.09687 6.30935 3.41009 6.00088L4.54488 4.88325H4.54487C4.85807 4.57485 5.3662 4.57485 5.67942 4.88325Z" fill="white"/>
+</svg>

+ 6 - 0
dist/assets/icon-download-h5-1eeffe23.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 62 62" class="design-iconfont">
+  <g fill="none" fill-rule="evenodd">
+    <path fill="#4D4D4D" d="M31 0A31 31 0 1 0 31 62A31 31 0 1 0 31 0Z"/>
+    <path d="M14.7359124,0 C15.2881971,-1.01453063e-16 15.7359124,0.44771525 15.7359124,1 L15.735,21.344 L23.7580265,13.6968792 C24.1578097,13.3158576 24.790775,13.3310181 25.1718581,13.7307426 L26.5518275,15.1783906 C26.9328955,15.5781475 26.9177451,16.2111312 26.5179882,16.5921992 L14.4478609,28.0980396 C14.0646983,28.463289 13.4632705,28.466657 13.0760413,28.1057217 L0.731506115,16.5994137 C0.327506443,16.2228467 0.305267874,15.5900724 0.68183488,15.1860727 L2.04550464,13.7230605 C2.42208199,13.3190823 3.05484394,13.2968371 3.45886079,13.673373 L11.735,21.388 L11.7359124,1 C11.7359124,0.44771525 12.1836276,1.01453063e-16 12.7359124,0 L14.7359124,0 Z" transform="translate(17 17)" fill="#FFF" fill-rule="nonzero"/>
+  </g>
+</svg>

+ 14 - 0
dist/assets/icon_search-8a6ade17.svg

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>切片</title>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.399879092" stroke-linejoin="round">
+        <g id="67、小酷AI" transform="translate(-1507.000000, -138.000000)" stroke="#2089FF" stroke-width="1.81438256">
+            <g id="编组-17" transform="translate(1495.000000, 126.000000)">
+                <g id="搜索" transform="translate(12.000000, 12.000000)">
+                    <path d="M7.53172346,13.9386396 C11.0702243,13.9386396 13.9384469,11.0703739 13.9384469,7.53181981 C13.9384469,3.99444998 11.0702243,1.125 7.53172346,1.125 C3.99440683,1.125 1.125,3.99444998 1.125,7.53181981 C1.125,11.0703739 3.99440683,13.9386396 7.53172346,13.9386396 Z" id="Stroke-1"></path>
+                    <line x1="12.138051" y1="12.1379798" x2="16.5200841" y2="16.5203156" id="Stroke-3" stroke-linecap="round"></line>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 16 - 0
dist/assets/icon_searchActive-bf7fd0c6.svg

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>切片</title>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linejoin="round">
+        <g id="65、布置作业-选择曲目" transform="translate(-1247.000000, -182.000000)" stroke="#2089FF" stroke-width="1.81438256">
+            <g id="矩形" transform="translate(284.000000, 76.000000)">
+                <g id="编组-18" transform="translate(951.000000, 94.000000)">
+                    <g id="搜索" transform="translate(12.000000, 12.000000)">
+                        <path d="M7.53172346,13.9386396 C11.0702243,13.9386396 13.9384469,11.0703739 13.9384469,7.53181981 C13.9384469,3.99444998 11.0702243,1.125 7.53172346,1.125 C3.99440683,1.125 1.125,3.99444998 1.125,7.53181981 C1.125,11.0703739 3.99440683,13.9386396 7.53172346,13.9386396 Z" id="Stroke-1"></path>
+                        <line x1="12.138051" y1="12.1379798" x2="16.5200841" y2="16.5203156" id="Stroke-3" stroke-linecap="round"></line>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

File diff ditekan karena terlalu besar
+ 0 - 0
dist/assets/index-79cbc726.js


File diff ditekan karena terlalu besar
+ 0 - 0
dist/assets/index-ba341d89.css


TEMPAT SAMPAH
dist/assets/login-background-7fc990a0.png


+ 14 - 0
dist/assets/message-f58d68ba.svg

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24px" height="24px" viewBox="0 0 24 24" version="1.1">
+  <title>编组 8</title>
+  <g id="new" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="ICON" transform="translate(-58.000000, -20.000000)">
+      <g id="编组-8" transform="translate(58.000000, 20.000000)">
+        <g id="编组-18" transform="translate(3.000000, 3.000000)" stroke="#999999">
+          <path d="M9,0.5 C11.3472102,0.5 13.4722102,1.45139491 15.0104076,2.98959236 C16.5486051,4.52778981 17.5,6.65278981 17.5,9 C17.5,11.2679988 16.6117526,13.3285462 15.1641141,14.8526931 C13.7116662,16.3819037 11.6961744,17.3713309 9.44969786,17.4883204 L9.44969786,17.4883204 L1.33333333,17.5 C1.10321469,17.5 0.894881354,17.406726 0.744077682,17.2559223 C0.59327401,17.1051186 0.5,16.8967853 0.5,16.6666667 L0.5,16.6666667 L0.5,8.53977783 C0.62256394,6.29760907 1.61581474,4.28394186 3.14775549,2.83262957 C4.67315258,1.38751653 6.73292542,0.5 9,0.5 Z" id="形状结合"></path>
+        </g>
+        <rect id="矩形" x="0" y="0" width="24" height="24"></rect>
+      </g>
+    </g>
+  </g>
+</svg>

+ 16 - 0
dist/assets/message-real-37c71d79.svg

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48px" height="48px" viewBox="0 0 48 48" version="1.1">
+  <title>编组 8</title>
+  <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="通讯页" transform="translate(-123.000000, -1406.000000)">
+      <g id="编组-15" transform="translate(0.000000, 1378.000000)">
+        <g id="编组-12备份-5" transform="translate(32.000000, 12.000000)">
+          <g id="编组-8" transform="translate(91.000000, 16.000000)">
+            <rect id="矩形" x="0" y="0" width="48" height="48"></rect>
+            <path d="M24,5 C34.4934102,5 43,13.5065898 43,24 C43,34.1653543 35.0169798,42.4661744 24.9781429,42.9752568 L25.004234,43 L7,43 C5.8954305,43 5,42.1045695 5,41 L5,23 L5.02459166,23.0248508 C5.53217539,12.9846073 13.8336352,5 24,5 Z M24,25 L14,25 C13.4477153,25 13,25.4477153 13,26 L13,26 L13,28 C13,28.5522847 13.4477153,29 14,29 L14,29 L24,29 C24.5522847,29 25,28.5522847 25,28 L25,28 L25,26 C25,25.4477153 24.5522847,25 24,25 L24,25 Z M34,17 L14,17 C13.4477153,17 13,17.4477153 13,18 L13,18 L13,20 C13,20.5522847 13.4477153,21 14,21 L14,21 L34,21 C34.5522847,21 35,20.5522847 35,20 L35,20 L35,18 C35,17.4477153 34.5522847,17 34,17 L34,17 Z" id="形状结合" fill="#A0A3A6"></path>
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

+ 16 - 0
dist/assets/message-selected-65e48d26.svg

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24px" height="24px" viewBox="0 0 24 24" version="1.1">
+  <title>编组 8</title>
+  <g id="页面-2备份" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="更多" transform="translate(-498.000000, -339.000000)">
+      <g id="左侧边栏" transform="translate(480.000000, 220.000000)">
+        <g id="编组-8" transform="translate(18.000000, 119.000000)">
+          <rect id="矩形" x="0" y="0" width="24" height="24"></rect>
+          <g id="编组-18" transform="translate(3.000000, 3.000000)" fill="#147AFF">
+            <path d="M1.33333333,18 C0.596953667,18 -7.9799792e-16,17.4030463 0,16.6666667 L0,8.52631579 L0.0116474743,8.53811106 C0.252069935,3.78219505 4.18434547,0 9,0 C13.9705627,0 18,4.02943725 18,9 C18,13.815317 14.2183351,17.7473789 9.46288884,17.9883019 L9.47568977,18 L1.33333333,18 Z" id="形状结合"></path>
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

+ 30 - 0
dist/assets/msg-copy-014df696.svg

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="40Px" height="40Px" viewBox="0 0 40 40" version="1.1">
+  <title>编组 14</title>
+  <defs>
+    <path d="M467,0 C474.731986,-2.71135202e-14 481,6.2680135 481,14 L481,247 C481,254.731986 474.731986,261 467,261 L353.036,261 L340.862492,273.204941 C339.302377,274.769018 336.769719,274.77223 335.205642,273.212116 C335.203247,273.209727 335.200856,273.207335 335.198467,273.204941 L323.024,261 L14,261 C6.2680135,261 2.72325209e-15,254.731986 0,247 L0,14 C8.29461588e-16,6.2680135 6.2680135,3.19669972e-15 14,0 L467,0 Z" id="path-1"></path>
+    <filter x="-10.1%" y="-14.0%" width="120.2%" height="135.4%" filterUnits="objectBoundingBox" id="filter-2">
+      <feOffset dx="0" dy="10" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+      <feGaussianBlur stdDeviation="14.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+      <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.06 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
+    </filter>
+  </defs>
+  <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="消息状态" transform="translate(-541.000000, -196.000000)">
+      <g id="编组-11" transform="translate(499.000000, 163.000000)">
+        <g id="形状结合">
+          <use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
+          <use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-1"></use>
+        </g>
+        <g id="编组-19" transform="translate(8.000000, 1.000000)" fill-rule="nonzero">
+          <g id="编组-17" transform="translate(34.000000, 32.000000)">
+            <g id="编组-14" transform="translate(0.000000, 0.249660)">
+              <rect id="矩形" stroke="#444444" stroke-width="4" x="6" y="11.7115453" width="20.4869565" height="24.5849258" rx="1"></rect>
+              <path d="M36,2.01560374 L36,28.7262543 C36,29.0023967 35.7761424,29.2262543 35.5,29.2262543 L32.4652074,29.2262543 C32.1890657,29.2262525 31.9652084,29.002396 31.9652057,28.7262543 L31.9651258,6.04681123 L31.9651258,6.04681123 L12.2913043,6.04719144 C12.015162,6.04720643 11.7913,5.82335314 11.7912947,5.54721076 C11.7912947,5.54720754 11.7912947,5.54720432 11.7913043,5.5472011 L11.7913043,2.51560374 C11.7913043,2.23946137 12.015162,2.01560374 12.2913043,2.01560374 L36,2.01560374 L36,2.01560374 Z" id="路径-3" fill="#444444"></path>
+            </g>
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

+ 33 - 0
dist/assets/msg-del-ccbe2554.svg

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="40Px" height="40Px" viewBox="0 0 40 40" version="1.1">
+  <title>矩形</title>
+  <defs>
+    <path d="M467,0 C474.731986,-2.71135202e-14 481,6.2680135 481,14 L481,247 C481,254.731986 474.731986,261 467,261 L353.036,261 L340.862492,273.204941 C339.302377,274.769018 336.769719,274.77223 335.205642,273.212116 C335.203247,273.209727 335.200856,273.207335 335.198467,273.204941 L323.024,261 L14,261 C6.2680135,261 2.72325209e-15,254.731986 0,247 L0,14 C8.29461588e-16,6.2680135 6.2680135,3.19669972e-15 14,0 L467,0 Z" id="path-1"></path>
+    <filter x="-10.1%" y="-14.0%" width="120.2%" height="135.4%" filterUnits="objectBoundingBox" id="filter-2">
+      <feOffset dx="0" dy="10" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+      <feGaussianBlur stdDeviation="14.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+      <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.06 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
+    </filter>
+  </defs>
+  <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="消息状态" transform="translate(-779.000000, -326.000000)">
+      <g id="编组-11" transform="translate(499.000000, 163.000000)">
+        <g id="形状结合">
+          <use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
+          <use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-1"></use>
+        </g>
+        <g id="编组-13备份" transform="translate(246.000000, 131.583780)">
+          <g id="编组-17" transform="translate(34.000000, 31.416220)">
+            <g id="编组-18" transform="translate(4.000000, 2.847939)">
+              <path d="M27,8.04349833 L27,34.26099 L5,34.26099 L5,8.04349833 L27,8.04349833 Z" id="路径-5" stroke="#444444" stroke-width="4"></path>
+              <rect id="矩形" fill="#444444" x="9.14285714" y="0" width="14" height="4.02899889"></rect>
+              <rect id="矩形" fill="#444444" x="0" y="6.04349833" width="32" height="4.02899889"></rect>
+              <path d="M14,15.1087458 L14,27.1957425 L10,27.1957425 L10,15.1087458 L14,15.1087458 Z M22,15.1087458 L22,27.1957425 L18,27.1957425 L18,15.1087458 L22,15.1087458 Z" id="形状结合" fill="#444444"></path>
+            </g>
+          </g>
+        </g>
+        <g id="编组-19" transform="translate(8.000000, 1.000000)"></g>
+      </g>
+    </g>
+  </g>
+</svg>

+ 31 - 0
dist/assets/msg-forward-2deabb90.svg

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="40Px" height="40Px" viewBox="0 0 40 40" version="1.1">
+  <title>编组</title>
+  <defs>
+    <path d="M467,0 C474.731986,-2.71135202e-14 481,6.2680135 481,14 L481,247 C481,254.731986 474.731986,261 467,261 L353.036,261 L340.862492,273.204941 C339.302377,274.769018 336.769719,274.77223 335.205642,273.212116 C335.203247,273.209727 335.200856,273.207335 335.198467,273.204941 L323.024,261 L14,261 C6.2680135,261 2.72325209e-15,254.731986 0,247 L0,14 C8.29461588e-16,6.2680135 6.2680135,3.19669972e-15 14,0 L467,0 Z" id="path-1"></path>
+    <filter x="-10.1%" y="-14.0%" width="120.2%" height="135.4%" filterUnits="objectBoundingBox" id="filter-2">
+      <feOffset dx="0" dy="10" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+      <feGaussianBlur stdDeviation="14.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+      <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.06 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
+    </filter>
+  </defs>
+  <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="消息状态" transform="translate(-660.000000, -196.000000)">
+      <g id="编组-11" transform="translate(499.000000, 163.000000)">
+        <g id="形状结合">
+          <use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
+          <use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-1"></use>
+        </g>
+        <g id="编组-19" transform="translate(8.000000, 1.000000)" fill-rule="nonzero" stroke="#444444" stroke-width="4">
+          <g id="编组-13" transform="translate(119.000000, 0.000000)">
+            <g id="编组-17" transform="translate(34.000000, 32.000000)">
+              <g id="编组" transform="translate(0.000000, 0.249660)">
+                <path d="M23.1265517,6.28055724 L35.7271185,19.5748426 L23.0577232,32.8831329 L23.0577232,25.1147287 C22.2832234,25.0144246 21.6206186,24.9731478 21.1119625,24.9593482 C19.8469875,24.9250298 17.622079,25.0087745 15.0567889,25.7301995 C10.5501298,27.0035633 6.83444935,29.6335962 4.00998374,33.593477 C3.98525766,32.7188606 3.9976824,31.6416134 4.10230378,30.4471653 C4.26498285,28.6221312 4.60551504,26.8911737 5.12965716,25.3080362 C5.77312173,23.3656805 6.68732788,21.6451437 7.85433875,20.1962611 C11.1297915,16.1439451 16.3122766,14.2888953 23.1265517,14.4503809 L23.1265517,14.4503809 L23.1265517,6.28055724 Z" id="路径"></path>
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

+ 30 - 0
dist/assets/msg-play-a7ea6868.svg

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="130Px" height="130Px" viewBox="0 0 130 130" version="1.1">
+  <title>编组</title>
+  <defs>
+    <filter x="-20.0%" y="-20.0%" width="140.0%" height="140.0%" filterUnits="objectBoundingBox" id="filter-1">
+      <feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+      <feGaussianBlur stdDeviation="5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+      <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.15 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+      <feMerge>
+        <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+        <feMergeNode in="SourceGraphic"></feMergeNode>
+      </feMerge>
+    </filter>
+  </defs>
+  <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="消息状态" transform="translate(-1210.000000, -966.000000)">
+      <g id="编组-3" transform="translate(1055.000000, 783.000000)">
+        <g id="编组-17" transform="translate(60.000000, 37.996517)">
+          <g id="编组-14" transform="translate(0.000000, 0.003483)">
+            <g id="编组" transform="translate(110.000000, 160.000000)" filter="url(#filter-1)">
+              <rect id="矩形" x="0" y="0" width="100" height="100"></rect>
+              <path d="M67.4424727,46.9165576 L41.2606545,30.5526788 C40.1396848,29.8520727 38.7265939,29.8147394 37.5704727,30.4557091 C36.4143515,31.0966788 35.6970182,32.3143758 35.6970182,33.6363152 L35.6970182,66.3635879 C35.6970182,67.6855273 36.4143515,68.9032242 37.5704727,69.5441939 C38.1198061,69.8486788 38.7268364,69.9999515 39.3331394,69.9999515 C40.0029576,69.9999515 40.6720485,69.8152242 41.2604121,69.4472242 L67.4422303,53.0838303 C68.505503,52.4193455 69.1513213,51.2540121 69.1513213,50.0001939 C69.1513213,48.7463758 68.5057455,47.5810424 67.4424727,46.9165576" id="Fill-1" fill="#FFFFFF"></path>
+              <path d="M50,10 C27.944,10 10,27.944 10,50 C10,72.0557576 27.944,90 50,90 C72.056,90 90,72.0557576 90,50 C90,27.944 72.056,10 50,10" id="路径" stroke="#FFFFFF" stroke-width="6"></path>
+            </g>
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

+ 8 - 0
dist/assets/msg-qnote-6ed4649b.svg

@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 41" class="design-iconfont">
+  <g fill="none" fill-rule="evenodd">
+    <path d="M34,2 L34,28.6209709 L20.7153357,28.6209709 L17.9993455,31.4022694 L15.2847485,28.6219998 L2,28.6219998 L2,2 L34,2 Z" transform="translate(2 3.273066)" fill-rule="nonzero" stroke="#444" stroke-width="4"/>
+    <path fill="#444" d="M11 16.12483H15V20.15603749H11z" transform="translate(0 .24966)"/>
+    <path fill="#444" d="M18 16.12483H22V20.15603749H18z" transform="translate(0 .24966)"/>
+    <path fill="#444" d="M25 16.12483H29V20.15603749H25z" transform="translate(0 .24966)"/>
+  </g>
+</svg>

+ 31 - 0
dist/assets/msg-reply-0ff2473d.svg

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="40Px" height="40Px" viewBox="0 0 40 40" version="1.1">
+  <title>编组 12</title>
+  <defs>
+    <path d="M467,0 C474.731986,-2.71135202e-14 481,6.2680135 481,14 L481,247 C481,254.731986 474.731986,261 467,261 L353.036,261 L340.862492,273.204941 C339.302377,274.769018 336.769719,274.77223 335.205642,273.212116 C335.203247,273.209727 335.200856,273.207335 335.198467,273.204941 L323.024,261 L14,261 C6.2680135,261 2.72325209e-15,254.731986 0,247 L0,14 C8.29461588e-16,6.2680135 6.2680135,3.19669972e-15 14,0 L467,0 Z" id="path-1"></path>
+    <filter x="-10.1%" y="-14.0%" width="120.2%" height="135.4%" filterUnits="objectBoundingBox" id="filter-2">
+      <feOffset dx="0" dy="10" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+      <feGaussianBlur stdDeviation="14.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+      <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.06 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
+    </filter>
+  </defs>
+  <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="消息状态" transform="translate(-541.000000, -328.000000)">
+      <g id="编组-11" transform="translate(499.000000, 163.000000)">
+        <g id="形状结合">
+          <use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
+          <use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-1"></use>
+        </g>
+        <g id="编辑功能" transform="translate(8.000000, 131.583780)" fill-rule="nonzero">
+          <g id="编组-17" transform="translate(34.000000, 32.416220)">
+            <g id="编组" transform="translate(0.000000, 3.000000)">
+              <path d="M30,2 L30,24.7410578 L11.7126857,24.7410578 L8.99940621,27.5321142 L6.28736501,24.7420913 L2,24.7420913 L2,2 L30,2 Z" id="路径" stroke="#444444" stroke-width="4"></path>
+              <path d="M38,12.0541319 C38.5522847,12.0541319 39,12.5038667 39,13.0586428 L39,13.0586428 L39,32.7691572 C39,33.3239333 38.5522847,33.7736682 38,33.7736682 L38,33.7736682 L33.5577151,33.7736682 L30.6995611,36.7141728 C30.3044253,37.101771 29.671305,37.0942155 29.2854474,36.6972972 L29.2854474,36.6972972 L26.4422849,33.7726347 L15,33.7726347 C14.4477153,33.7726347 14,33.3228998 14,32.7681237 L14,32.7681237 L14,26.7401319 L18,26.7401319 L18,29.7536155 L28.1270436,29.7545907 L30.001,31.6812721 L31.8726235,29.7556243 L35,29.75462 L35,16.0721758 L32,16.0721319 L32,12.0541319 Z" id="形状结合" fill="#444444"></path>
+            </g>
+          </g>
+        </g>
+        <g id="编组-19" transform="translate(8.000000, 1.000000)"></g>
+      </g>
+    </g>
+  </g>
+</svg>

+ 29 - 0
dist/assets/msg-revoke-40598264.svg

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="40Px" height="40Px" viewBox="0 0 40 40" version="1.1">
+  <title>矩形</title>
+  <defs>
+    <path d="M467,0 C474.731986,-2.71135202e-14 481,6.2680135 481,14 L481,247 C481,254.731986 474.731986,261 467,261 L353.036,261 L340.862492,273.204941 C339.302377,274.769018 336.769719,274.77223 335.205642,273.212116 C335.203247,273.209727 335.200856,273.207335 335.198467,273.204941 L323.024,261 L14,261 C6.2680135,261 2.72325209e-15,254.731986 0,247 L0,14 C8.29461588e-16,6.2680135 6.2680135,3.19669972e-15 14,0 L467,0 Z" id="path-1"></path>
+    <filter x="-10.1%" y="-14.0%" width="120.2%" height="135.4%" filterUnits="objectBoundingBox" id="filter-2">
+      <feOffset dx="0" dy="10" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+      <feGaussianBlur stdDeviation="14.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+      <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.06 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
+    </filter>
+  </defs>
+  <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="消息状态" transform="translate(-660.000000, -327.000000)">
+      <g id="编组-11" transform="translate(499.000000, 163.000000)">
+        <g id="形状结合">
+          <use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
+          <use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-1"></use>
+        </g>
+        <g id="编组-19" transform="translate(8.000000, 1.000000)" fill="#444444" fill-rule="nonzero">
+          <g id="编组-13" transform="translate(119.000000, 131.000000)">
+            <g id="编组-21" transform="translate(34.000000, 32.000000)">
+              <path d="M9.94902685,18.825399 C9.94902685,19.1015414 9.72516923,19.325399 9.44902685,19.325399 C9.31552791,19.325399 9.18757266,19.2720125 9.09366105,19.1771306 L2.13687841,12.1484693 C1.94403281,11.9536312 1.94403281,11.6398441 2.13687841,11.445006 L9.09366105,4.41634471 C9.28791708,4.2200816 9.60449539,4.21845454 9.8007585,4.41271056 C9.89564042,4.50662217 9.94902685,4.63457741 9.94902685,4.76807636 L9.94824421,9.73507632 L22.6994692,9.73558854 C31.0812313,9.73558854 38,15.6504194 38,23.1330579 C38,30.5145797 31.2669616,36.3703807 23.0384554,36.5272976 L22.6994692,36.5305273 L10.4390092,36.5305273 C9.88672441,36.5305273 9.43900916,36.082812 9.43900916,35.5305273 L9.43900916,33.408229 C9.43900916,32.8559443 9.88672441,32.408229 10.4390092,32.408229 L22.6994692,32.408229 C28.9648068,32.408229 33.9198585,28.1721729 33.9198585,23.1330579 C33.9198585,18.1779281 29.1285988,13.9993117 23.0116273,13.861401 L22.6994692,13.8578868 L9.94824421,13.8570763 L9.94902685,18.825399 Z" id="路径"></path>
+            </g>
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

+ 8 - 0
dist/assets/mute-94c8513a.svg

@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" class="design-iconfont">
+  <g fill="none" fill-rule="evenodd">
+    <path d="M4.13744611,6.61713753 L20.551,23 L0,23 L0,21 L3,21 L3,11 C3,9.40883362 3.41291862,7.91410954 4.13744611,6.61713753 Z M21.481,21 L24,21 L24,23 L23.485,23 L21.481,21 Z M12,2 C16.9705627,2 21,6.02943725 21,11 L21,20.52 L5.36684476,4.91705738 C7.01203082,3.12402075 9.37475086,2 12,2 Z" fill="#CCC" transform="translate(4 3)"/>
+    <path fill="#CCC" fill-rule="nonzero" d="M13 0L13 4 11 4 11 0z" transform="translate(4 3)"/>
+    <path stroke="#CCC" d="M8.5 24.5H15.5V25.5H8.5z" transform="translate(4 3)"/>
+    <path stroke="#CCC" stroke-width="2" transform="matrix(-1 0 0 1 31.089472 3)" d="M25.4499982 0.1546001L1.63947409 23.8855564"/>
+  </g>
+</svg>

TEMPAT SAMPAH
dist/assets/nomore-9da703ae.png


+ 17 - 0
dist/assets/profile-377bffb6.svg

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48px" height="48px" viewBox="0 0 48 48" version="1.1">
+  <title>编组 8</title>
+  <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="消息页" transform="translate(-580.000000, -1405.000000)" fill="#B0B4B8">
+      <g id="编组-15" transform="translate(0.000000, 1378.000000)">
+        <g id="编组-12备份-5" transform="translate(32.000000, 12.000000)">
+          <g id="编组-6" transform="translate(457.000000, 0.000000)">
+            <g id="编组-8" transform="translate(91.000000, 15.000000)">
+              <path d="M31,26 C35.418278,26 39,29.581722 39,34 L39,40 C39,41.1045695 38.1045695,42 37,42 L11,42 C9.8954305,42 9,41.1045695 9,40 L9,34 C9,29.581722 12.581722,26 17,26 L31,26 Z M24.0020419,6 C28.9737572,6 33.0040839,10.0294125 33.0040839,15 C33.0040839,19.9705875 28.9737572,24 24.0020419,24 C19.0303267,24 15,19.9705875 15,15 C15,10.0294125 19.0303267,6 24.0020419,6 Z" id="形状结合"></path>
+            </g>
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

+ 32 - 0
dist/assets/profile-selected-438c622c.svg

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48px" height="48px" viewBox="0 0 48 48" version="1.1">
+  <title>编组 8</title>
+  <defs>
+    <path d="M16,0 L670,0 C678.836556,-1.623249e-15 686,7.163444 686,16 L686,94 C686,102.836556 678.836556,110 670,110 L16,110 C7.163444,110 1.082166e-15,102.836556 0,94 L0,16 C-1.082166e-15,7.163444 7.163444,1.623249e-15 16,0 Z" id="path-1"></path>
+    <filter x="-7.0%" y="-43.6%" width="114.0%" height="187.3%" filterUnits="objectBoundingBox" id="filter-2">
+      <feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+      <feGaussianBlur stdDeviation="16" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+      <feColorMatrix values="0 0 0 0 0.941176471   0 0 0 0 0.964705882   0 0 0 0 1  0 0 0 1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
+    </filter>
+  </defs>
+  <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="个人信息" transform="translate(-580.000000, -1405.000000)">
+      <rect fill="#F7F8FA" x="0" y="0" width="750" height="1624"></rect>
+      <g id="编组-17" transform="translate(0.000000, 1378.000000)">
+        <polygon id="矩形" fill="#FFFFFF" points="0 -1.15130128e-13 750 -1.15130128e-13 750 122 0 122"></polygon>
+        <g id="编组-12备份-5" transform="translate(32.000000, 12.000000)">
+          <g id="矩形备份-22">
+            <use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
+            <use fill="#EBF0F6" fill-rule="evenodd" xlink:href="#path-1"></use>
+          </g>
+          <g id="编组-6" transform="translate(457.000000, 0.000000)">
+            <polygon id="矩形" points="0 3.55965257e-14 229 3.55965257e-14 229 110 0 110"></polygon>
+            <g id="编组-8" transform="translate(91.000000, 15.000000)" fill="#006EFF">
+              <path d="M31,26 C35.418278,26 39,29.581722 39,34 L39,40 C39,41.1045695 38.1045695,42 37,42 L11,42 C9.8954305,42 9,41.1045695 9,40 L9,34 C9,29.581722 12.581722,26 17,26 L31,26 Z M24.0020419,6 C28.9737572,6 33.0040839,10.0294125 33.0040839,15 C33.0040839,19.9705875 28.9737572,24 24.0020419,24 C19.0303267,24 15,19.9705875 15,15 C15,10.0294125 19.0303267,6 24.0020419,6 Z" id="形状结合"></path>
+            </g>
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

+ 18 - 0
dist/assets/relation-5549dca2.svg

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24px" height="24px" viewBox="0 0 24 24" version="1.1">
+  <title>编组 8</title>
+  <g id="页面-2备份" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="更多" transform="translate(-498.000000, -389.000000)">
+      <g id="左侧边栏" transform="translate(480.000000, 220.000000)">
+        <g id="编组-8" transform="translate(18.000000, 169.000000)">
+          <rect id="矩形" x="0" y="0" width="24" height="24"></rect>
+          <rect id="矩形" stroke="#999999" transform="translate(19.000000, 8.500000) scale(1, -1) translate(-19.000000, -8.500000) " x="16.5" y="8.5" width="5" height="1" rx="0.5"></rect>
+          <rect id="矩形备份-2" stroke="#999999" x="16.5" y="11.5" width="5" height="1" rx="0.5"></rect>
+          <rect id="矩形备份-3" stroke="#999999" x="18.5" y="14.5" width="3" height="1" rx="0.5"></rect>
+          <path d="M9,3.5 C9.9652364,3.5 10.8385592,3.90102188 11.4709238,4.54775835 C12.1073095,5.19860738 12.5,6.09799921 12.5,7.09090909 C12.5,8.1638596 12.0512293,9.33155704 11.3410312,10.2031638 C10.7279048,10.9556371 9.91231344,11.5 9,11.5 C8.08768656,11.5 7.27209516,10.9556371 6.65896878,10.2031638 C5.94877068,9.33155704 5.5,8.1638596 5.5,7.09090909 C5.5,6.09799921 5.89269049,5.19860738 6.52907621,4.54775835 C7.16144075,3.90102188 8.0347636,3.5 9,3.5 L9,3.5 Z" id="椭圆形" stroke="#999999"></path>
+          <path d="M12,13.5 C12.9664983,13.5 13.8414983,13.8917508 14.4748737,14.5251263 C15.1082492,15.1585017 15.5,16.0335017 15.5,17 L15.5,17 L15.5,20 L3,20.5 L2.5,17 C2.5,16.0335017 2.89175084,15.1585017 3.52512627,14.5251263 C4.15850169,13.8917508 5.03350169,13.5 6,13.5 L6,13.5 Z" id="矩形" stroke="#999999"></path>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

+ 19 - 0
dist/assets/relation-real-c74746f6.svg

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48px" height="48px" viewBox="0 0 48 48" version="1.1">
+  <title>编组 8</title>
+  <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="消息页" transform="translate(-351.000000, -1405.000000)" fill="#B0B4B8">
+      <g id="编组-15" transform="translate(0.000000, 1378.000000)">
+        <g id="编组-12备份-5" transform="translate(32.000000, 12.000000)">
+          <g id="编组-6" transform="translate(229.000000, 0.000000)">
+            <g id="编组-2" transform="translate(84.000000, 15.000000)">
+              <g id="编组-8" transform="translate(6.000000, 0.000000)">
+                <path d="M25,26 C29.418278,26 33,29.581722 33,34 L33,40 C33,41.1045695 32.1045695,42 31,42 L5,42 C3.8954305,42 3,41.1045695 3,40 L3,34 C3,29.581722 6.581722,26 11,26 L25,26 Z M43.9994591,26 C44.5517438,26 44.9994591,26.4477153 44.9994591,27 L44.9994591,29 C44.9994591,29.5522847 44.5517438,30 43.9994591,30 L36.9994591,30 C36.4471743,30 35.9994591,29.5522847 35.9994591,29 L35.9994591,27 C35.9994591,26.4477153 36.4471743,26 36.9994591,26 L43.9994591,26 Z M18.0020419,6 C22.9737572,6 27.0040839,10.0294125 27.0040839,15 C27.0040839,19.9705875 22.9737572,24 18.0020419,24 C13.0303267,24 9,19.9705875 9,15 C9,10.0294125 13.0303267,6 18.0020419,6 Z M43.9994591,18 C44.5517438,18 44.9994591,18.4477153 44.9994591,19 L44.9994591,21 C44.9994591,21.5522847 44.5517438,22 43.9994591,22 L31.9994591,22 C31.4471743,22 30.9994591,21.5522847 30.9994591,21 L30.9994591,19 C30.9994591,18.4477153 31.4471743,18 31.9994591,18 L43.9994591,18 Z" id="形状结合"></path>
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

+ 16 - 0
dist/assets/relation-selected-63e77a46.svg

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24px" height="24px" viewBox="0 0 24 24" version="1.1">
+  <title>编组 8</title>
+  <g id="new" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="ICON" transform="translate(-19.000000, -60.000000)">
+      <g id="编组-8" transform="translate(19.000000, 60.000000)">
+        <rect id="矩形" x="0" y="0" width="24" height="24"></rect>
+        <rect id="矩形" stroke="#006EFF" transform="translate(19.000000, 8.500000) scale(1, -1) translate(-19.000000, -8.500000) " x="16.5" y="8.5" width="5" height="1" rx="0.5"></rect>
+        <rect id="矩形备份-2" stroke="#006EFF" x="16.5" y="11.5" width="5" height="1" rx="0.5"></rect>
+        <rect id="矩形备份-3" stroke="#006EFF" x="18.5" y="14.5" width="3" height="1" rx="0.5"></rect>
+        <path d="M9,12 C11.209139,12 13,9.35025579 13,7.09090909 C13,4.83156239 11.209139,3 9,3 C6.790861,3 5,4.83156239 5,7.09090909 C5,9.35025579 6.790861,12 9,12 Z" id="椭圆形" fill="#006EFF"></path>
+        <path d="M6,13 L12,13 C14.209139,13 16,14.790861 16,17 L16,20 C16,20.5522847 15.5522847,21 15,21 L3,21 C2.44771525,21 2,20.5522847 2,20 L2,17 C2,14.790861 3.790861,13 6,13 Z" id="矩形" fill="#006EFF"></path>
+      </g>
+    </g>
+  </g>
+</svg>

+ 6 - 0
dist/assets/replies-5e63d02d.svg

@@ -0,0 +1,6 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="6" cy="6" r="6" fill="#006EFF"/>
+  <circle cx="3" cy="6" r="1" fill="white"/>
+  <circle cx="6" cy="6" r="1" fill="white"/>
+  <circle cx="9" cy="6" r="1" fill="white"/>
+</svg>

+ 7 - 0
dist/assets/rotate-left-502ede89.svg

@@ -0,0 +1,7 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg class="icon" width="200Px" height="200.00Px" viewBox="0 0 1024 1024" version="1.1"
+  xmlns="http://www.w3.org/2000/svg">
+  <path fill="#444444"
+    d="M672 418H144c-17.7 0-32 14.3-32 32v414c0 17.7 14.3 32 32 32h528c17.7 0 32-14.3 32-32V450c0-17.7-14.3-32-32-32z m-44 402H188V494h440v326zM819.3 328.5c-78.8-100.7-196-153.6-314.6-154.2l-0.2-64c0-6.5-7.6-10.1-12.6-6.1l-128 101c-4 3.1-3.9 9.1 0 12.3L492 318.6c5.1 4 12.7 0.4 12.6-6.1v-63.9c12.9 0.1 25.9 0.9 38.8 2.5 42.1 5.2 82.1 18.2 119 38.7 38.1 21.2 71.2 49.7 98.4 84.3 27.1 34.7 46.7 73.7 58.1 115.8 11 40.7 14 82.7 8.9 124.8-0.7 5.4-1.4 10.8-2.4 16.1h74.9c14.8-103.6-11.3-213-81-302.3z" />
+</svg>

+ 7 - 0
dist/assets/rotate-right-3fb9b23f.svg

@@ -0,0 +1,7 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg class="icon" width="200Px" height="200.00Px" viewBox="0 0 1024 1024" version="1.1"
+  xmlns="http://www.w3.org/2000/svg">
+  <path fill="#444444"
+    d="M480.5 251.2c13-1.6 25.9-2.4 38.8-2.5v63.9c0 6.5 7.5 10.1 12.6 6.1L660 217.6c4-3.2 4-9.2 0-12.3l-128-101c-5.1-4-12.6-0.4-12.6 6.1l-0.2 64c-118.6 0.5-235.8 53.4-314.6 154.2-69.6 89.2-95.7 198.6-81.1 302.4h74.9c-0.9-5.3-1.7-10.7-2.4-16.1-5.1-42.1-2.1-84.1 8.9-124.8 11.4-42.2 31-81.1 58.1-115.8 27.2-34.7 60.3-63.2 98.4-84.3 37-20.6 76.9-33.6 119.1-38.8zM880 418H352c-17.7 0-32 14.3-32 32v414c0 17.7 14.3 32 32 32h528c17.7 0 32-14.3 32-32V450c0-17.7-14.3-32-32-32z m-44 402H396V494h440v326z" />
+</svg>

+ 27 - 0
dist/assets/selected-ef05977c.svg

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16Px" height="16Px" viewBox="0 0 16 16" version="1.1">
+  <title>编组 14</title>
+  <defs>
+    <filter x="-10.6%" y="-5.4%" width="121.2%" height="110.9%" filterUnits="objectBoundingBox" id="filter-1">
+      <feOffset dx="0" dy="7" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+      <feGaussianBlur stdDeviation="10" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+      <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.1 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+      <feMerge>
+        <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+        <feMergeNode in="SourceGraphic"></feMergeNode>
+      </feMerge>
+    </filter>
+  </defs>
+  <g id="new" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="自定义消息" transform="translate(-458.000000, -318.000000)">
+      <g id="编组-32" filter="url(#filter-1)" transform="translate(44.000000, 60.000000)">
+        <g id="编组-24" transform="translate(30.000000, 250.000000)">
+          <g id="编组-14" transform="translate(384.000000, 8.000000)">
+            <circle id="椭圆形" fill="#006EFF" fill-rule="nonzero" cx="8" cy="8" r="8"></circle>
+            <polyline id="路径-4" stroke="#FFFFFF" stroke-width="2" transform="translate(8.042641, 6.242641) rotate(-315.000000) translate(-8.042641, -6.242641) " points="6.04264069 10.2426407 10.0426407 10.2426407 10.0426407 2.24264069"></polyline>
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

+ 15 - 0
dist/assets/star-519b0b7f.svg

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24Px" height="23Px" viewBox="0 0 24 23" version="1.1">
+  <title>路径</title>
+  <g id="页面-2备份" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="评价" transform="translate(-1145.000000, -442.000000)" fill="#E5E7E9" fill-rule="nonzero">
+      <g id="编组-12" transform="translate(954.000000, 401.000000)">
+        <g id="编组-25" transform="translate(20.000000, 41.000000)">
+          <g id="编组-9" transform="translate(54.000000, 0.000000)">
+            <path d="M140.958975,8.69899984 C140.859347,8.39163419 140.59508,8.16747802 140.276778,8.12077882 L133.008172,7.05943334 L129.757605,0.434939378 C129.473074,-0.144979793 128.527455,-0.144979793 128.242925,0.434939378 L124.992357,7.05943334 L117.723751,8.12077882 C117.405449,8.16747802 117.141182,8.39163419 117.041554,8.69899984 C116.941926,9.00636549 117.024668,9.34344882 117.255163,9.56930313 L122.514327,14.7248949 L121.272357,22.006574 C121.218322,22.3249777 121.348345,22.6467776 121.60839,22.8369707 C121.86928,23.028862 122.213755,23.0526361 122.497441,22.9015005 L129.000265,19.4644393 L135.502243,22.9015005 C135.625512,22.9668794 135.7606,22.9991443 135.894844,22.9991443 C136.069615,22.9991443 136.244386,22.9448034 136.391295,22.8369707 C136.65134,22.6467776 136.781363,22.3249777 136.727327,22.006574 L135.485357,14.7248949 L140.744522,9.56930313 C140.975017,9.34344882 141.057758,9.00636549 140.958975,8.69899984 L140.958975,8.69899984 Z" id="路径"></path>
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

+ 55 - 0
dist/assets/star-light-307ea8ac.svg

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="34Px" height="33Px" viewBox="0 0 34 33" version="1.1">
+  <title>编组 10</title>
+  <defs>
+    <filter x="-27.3%" y="-28.6%" width="154.5%" height="157.1%" filterUnits="objectBoundingBox" id="filter-1">
+      <feGaussianBlur stdDeviation="2" in="SourceGraphic"></feGaussianBlur>
+    </filter>
+    <linearGradient x1="72.4956041%" y1="27.6077921%" x2="39.6032421%" y2="74.5944688%" id="linearGradient-2">
+      <stop stop-color="#FFF235" offset="0%"></stop>
+      <stop stop-color="#F9C600" offset="100%"></stop>
+    </linearGradient>
+    <path d="M23.276778,8.12077882 L16.0081718,7.05943334 L12.7576045,0.434939378 C12.4730744,-0.144979793 11.5274548,-0.144979793 11.2429246,0.434939378 L7.99235731,7.05943334 L0.72375111,8.12077882 C0.405448806,8.16747802 0.141181906,8.39163419 0.0415541289,8.69899984 C-0.0580736481,9.00636549 0.024668065,9.34344882 0.255162837,9.56930313 L5.51432744,14.7248949 L4.27235744,22.006574 C4.21832203,22.3249777 4.34834472,22.6467776 4.60839011,22.8369707 C4.8692798,23.028862 5.2137555,23.0526361 5.49744137,22.9015005 L12.0002646,19.4644393 L18.5022435,22.9015005 C18.6255117,22.9668794 18.7606003,22.9991443 18.8948445,22.9991443 C19.0696152,22.9991443 19.244386,22.9448034 19.3912947,22.8369707 C19.6513401,22.6467776 19.7813628,22.3249777 19.7273274,22.006574 L18.4853574,14.7248949 L23.744522,9.56930313 C23.9750168,9.34344882 24.0577585,9.00636549 23.958975,8.69899984 C23.8593472,8.39163419 23.5950803,8.16747802 23.276778,8.12077882 Z" id="path-3"></path>
+    <filter x="-15.1%" y="-10.7%" width="128.1%" height="131.2%" filterUnits="objectBoundingBox" id="filter-5">
+      <feMorphology radius="0.2" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
+      <feOffset dx="0" dy="1" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
+      <feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+      <feComposite in="shadowBlurOuter1" in2="SourceAlpha" operator="out" result="shadowBlurOuter1"></feComposite>
+      <feColorMatrix values="0 0 0 0 1   0 0 0 0 1   0 0 0 0 1  0 0 0 0.495153147 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
+    </filter>
+    <filter x="-25.5%" y="-21.5%" width="149.0%" height="153.0%" filterUnits="objectBoundingBox" id="filter-6">
+      <feGaussianBlur stdDeviation="2" in="SourceAlpha" result="shadowBlurInner1"></feGaussianBlur>
+      <feOffset dx="0" dy="-2" in="shadowBlurInner1" result="shadowOffsetInner1"></feOffset>
+      <feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
+      <feColorMatrix values="0 0 0 0 1   0 0 0 0 0.735756187   0 0 0 0 0  0 0 0 0.782696064 0" type="matrix" in="shadowInnerInner1" result="shadowMatrixInner1"></feColorMatrix>
+      <feGaussianBlur stdDeviation="2.5" in="SourceAlpha" result="shadowBlurInner2"></feGaussianBlur>
+      <feOffset dx="0" dy="3" in="shadowBlurInner2" result="shadowOffsetInner2"></feOffset>
+      <feComposite in="shadowOffsetInner2" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner2"></feComposite>
+      <feColorMatrix values="0 0 0 0 1   0 0 0 0 0.977846179   0 0 0 0 0.736284656  0 0 0 0.709552898 0" type="matrix" in="shadowInnerInner2" result="shadowMatrixInner2"></feColorMatrix>
+      <feMerge>
+        <feMergeNode in="shadowMatrixInner1"></feMergeNode>
+        <feMergeNode in="shadowMatrixInner2"></feMergeNode>
+      </feMerge>
+    </filter>
+  </defs>
+  <g id="页面-2备份" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="评价" transform="translate(-1023.000000, -440.000000)">
+      <g id="编组-12" transform="translate(954.000000, 401.000000)">
+        <g id="编组-25" transform="translate(20.000000, 41.000000)">
+          <g id="编组-10" transform="translate(54.000000, 0.000000)">
+            <path d="M22.3370465,11.4146241 L15.6741575,10.4455696 L12.6944708,4.39711856 C12.4336515,3.86762715 11.5668336,3.86762715 11.3060142,4.39711856 L8.32632754,10.4455696 L1.66343852,11.4146241 C1.37166141,11.4572625 1.12941675,11.6619269 1.03809128,11.9425651 C0.946765823,12.2232033 1.02261239,12.530975 1.23389927,12.7371898 L6.05480015,17.4444693 L4.91632765,24.0929589 C4.8667952,24.3836753 4.98598266,24.6774926 5.2243576,24.8511472 C5.46350648,25.0263523 5.77927587,25.0480591 6.03932126,24.9100657 L12.0002425,21.7718794 L17.9603899,24.9100657 C18.0733858,24.9697595 18.1972169,24.9992187 18.3202741,24.9992187 C18.4804806,24.9992187 18.6406872,24.9496031 18.7753535,24.8511472 C19.0137284,24.6774926 19.1329159,24.3836753 19.0833835,24.0929589 L17.944911,17.4444693 L22.7658118,12.7371898 C22.9770987,12.530975 23.0529453,12.2232033 22.9623938,11.9425651 C22.8710683,11.6619269 22.6288237,11.4572625 22.3370465,11.4146241 Z" id="路径" fill-opacity="0.6957231" fill="#FFCA23" fill-rule="nonzero" filter="url(#filter-1)"></path>
+            <mask id="mask-4" fill="white">
+              <use xlink:href="#path-3"></use>
+            </mask>
+            <g id="路径" fill-rule="nonzero">
+              <use fill="black" fill-opacity="1" filter="url(#filter-5)" xlink:href="#path-3"></use>
+              <use fill="url(#linearGradient-2)" xlink:href="#path-3"></use>
+              <use fill="black" fill-opacity="1" filter="url(#filter-6)" xlink:href="#path-3"></use>
+              <path stroke-opacity="0.8" stroke="#FFFFFF" stroke-width="0.2" d="M11.2266591,0.241080187 L16.0645854,6.96661028 L23.454788,8.045711 L18.5910086,14.7495608 L19.8315027,22.0225866 C19.2622565,23.1360849 19.0671242,23.0979502 18.8707721,23.099179 L18.8707721,23.099179 L12.0009684,19.5771763 L5.39709804,23.0676459 L5.41424065,14.766815 L0.0672527664,9.52512944 L7.92123191,6.97737585 L11.2266591,0.241080187 Z"></path>
+            </g>
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

+ 6 - 0
dist/assets/startGroup-6d6b5fbb.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14" fill="none">
+  <circle r="2.61111" transform="matrix(1 0 0 -1 8.55545 3.88889)" stroke="#4C5059"></circle>
+  <circle r="2.61111" transform="matrix(1 0 0 -1 4.66678 3.88889)" fill="#F4F5F9" stroke="#4C5059"></circle>
+  <path d="M5.16675 11.7778C5.16675 9.84484 6.73375 8.27783 8.66675 8.27783H10.0001C11.9331 8.27783 13.5001 9.84484 13.5001 11.7778V12.7223H5.16675V11.7778Z" stroke="#4C5059"></path>
+  <path d="M0.5 11.7778C0.5 9.84484 2.067 8.27783 4 8.27783H5.33333C7.26633 8.27783 8.83333 9.84484 8.83333 11.7778V12.7223H0.5V11.7778Z" fill="#F4F5F9" stroke="#4C5059"></path>
+</svg>

+ 17 - 0
dist/assets/warn-1dfd23b6.svg

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="116px" height="116px" viewBox="0 0 116 116" version="1.1">
+  <title>椭圆形</title>
+  <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+    <g id="注销账户" transform="translate(-317.000000, -427.000000)">
+      <rect fill="#F7F8FA" x="0" y="0" width="750" height="1624"></rect>
+      <g id="编组-24" transform="translate(0.000000, 268.000000)" fill="#FFFFFF">
+        <polygon id="矩形" points="0 -8.32003216e-12 750 -8.32003216e-12 750 1356 0 1356"></polygon>
+      </g>
+      <g id="编组-9" transform="translate(317.000000, 427.000000)">
+        <circle id="椭圆形" fill="#FF9C19" cx="58" cy="58" r="58"></circle>
+        <rect id="矩形" fill="#FFFFFF" x="54.4848485" y="26.3636364" width="7.03030303" height="47.4545455" rx="3.51515152"></rect>
+        <rect id="矩形备份-9" fill="#FFFFFF" x="54.4848485" y="80.8484848" width="7.03030303" height="7.03030303" rx="3.51515152"></rect>
+      </g>
+    </g>
+  </g>
+</svg>

+ 9 - 0
dist/assets/zoom-in-9b98305a.svg

@@ -0,0 +1,9 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg class="icon" width="200Px" height="200.00Px" viewBox="0 0 1024 1024" version="1.1"
+  xmlns="http://www.w3.org/2000/svg">
+  <path fill="#444444"
+    d="M945.066667 898.133333l-189.866667-189.866666c55.466667-64 87.466667-149.333333 87.466667-241.066667 0-204.8-168.533333-373.333333-373.333334-373.333333S96 264.533333 96 469.333333 264.533333 842.666667 469.333333 842.666667c91.733333 0 174.933333-34.133333 241.066667-87.466667l189.866667 189.866667c6.4 6.4 14.933333 8.533333 23.466666 8.533333s17.066667-2.133333 23.466667-8.533333c8.533333-12.8 8.533333-34.133333-2.133333-46.933334zM469.333333 778.666667C298.666667 778.666667 160 640 160 469.333333S298.666667 160 469.333333 160 778.666667 298.666667 778.666667 469.333333 640 778.666667 469.333333 778.666667z" />
+  <path fill="#444444"
+    d="M597.333333 437.333333h-96V341.333333c0-17.066667-14.933333-32-32-32s-32 14.933333-32 32v96H341.333333c-17.066667 0-32 14.933333-32 32s14.933333 32 32 32h96V597.333333c0 17.066667 14.933333 32 32 32s32-14.933333 32-32v-96H597.333333c17.066667 0 32-14.933333 32-32s-14.933333-32-32-32z" />
+</svg>

+ 9 - 0
dist/assets/zoom-out-0ad1a1a9.svg

@@ -0,0 +1,9 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg class="icon" width="200Px" height="200.00Px" viewBox="0 0 1024 1024" version="1.1"
+  xmlns="http://www.w3.org/2000/svg">
+  <path fill="#444444"
+    d="M945.066667 898.133333l-189.866667-189.866666c55.466667-64 87.466667-149.333333 87.466667-241.066667 0-204.8-168.533333-373.333333-373.333334-373.333333S96 264.533333 96 469.333333 264.533333 842.666667 469.333333 842.666667c91.733333 0 174.933333-34.133333 241.066667-87.466667l189.866667 189.866667c6.4 6.4 14.933333 8.533333 23.466666 8.533333s17.066667-2.133333 23.466667-8.533333c8.533333-12.8 8.533333-34.133333-2.133333-46.933334zM469.333333 778.666667C298.666667 778.666667 160 640 160 469.333333S298.666667 160 469.333333 160 778.666667 298.666667 778.666667 469.333333 640 778.666667 469.333333 778.666667z" />
+  <path fill="#444444"
+    d="M597.333333 437.333333H341.333333c-17.066667 0-32 14.933333-32 32s14.933333 32 32 32h256c17.066667 0 32-14.933333 32-32s-14.933333-32-32-32z" />
+</svg>

+ 18 - 0
dist/index.html

@@ -0,0 +1,18 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+  <meta charset="UTF-8" />
+  <link rel="icon" type="image/svg+xml" href="/vite.svg" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+  <title>IM</title>
+  <script type="module" crossorigin src="/assets/index-79cbc726.js"></script>
+  <link rel="stylesheet" href="/assets/index-ba341d89.css">
+</head>
+
+<body>
+  <div id="app"></div>
+  
+</body>
+
+</html>

+ 1 - 0
dist/vite.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

+ 1661 - 0
src/TUIKit/TUIComponents/container/TUIChat/dist/server.js

@@ -0,0 +1,1661 @@
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+var __assign = (this && this.__assign) || function () {
+    __assign = Object.assign || function(t) {
+        for (var s, i = 1, n = arguments.length; i < n; i++) {
+            s = arguments[i];
+            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+                t[p] = s[p];
+        }
+        return t;
+    };
+    return __assign.apply(this, arguments);
+};
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __generator = (this && this.__generator) || function (thisArg, body) {
+    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+    function verb(n) { return function (v) { return step([n, v]); }; }
+    function step(op) {
+        if (f) throw new TypeError("Generator is already executing.");
+        while (_) try {
+            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+            if (y = 0, t) op = [op[0] & 2, t.value];
+            switch (op[0]) {
+                case 0: case 1: t = op; break;
+                case 4: _.label++; return { value: op[1], done: false };
+                case 5: _.label++; y = op[1]; op = [0]; continue;
+                case 7: op = _.ops.pop(); _.trys.pop(); continue;
+                default:
+                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+                    if (t[2]) _.ops.pop();
+                    _.trys.pop(); continue;
+            }
+            op = body.call(thisArg, _);
+        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+    }
+};
+var __spreadArrays = (this && this.__spreadArrays) || function () {
+    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
+    for (var r = Array(s), k = 0, i = 0; i < il; i++)
+        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
+            r[k] = a[j];
+    return r;
+};
+exports.__esModule = true;
+var TUIPlugin_1 = require("../../../TUIPlugin");
+var IComponentServer_1 = require("../IComponentServer");
+var utils_1 = require("./utils/utils");
+/**
+ * class TUIChatServer
+ *
+ * TUIChat 逻辑主体
+ */
+var TUIChatServer = /** @class */ (function (_super) {
+    __extends(TUIChatServer, _super);
+    function TUIChatServer(TUICore) {
+        var _this = _super.call(this) || this;
+        _this.currentStore = {};
+        _this.TUICore = TUICore;
+        _this.bindTIMEvent();
+        _this.store = TUICore.setComponentStore("TUIChat", {}, _this.updateStore.bind(_this));
+        return _this;
+    }
+    /**
+     * 组件销毁
+     * destroy
+     */
+    TUIChatServer.prototype.destroyed = function () {
+        this.unbindTIMEvent();
+    };
+    /**
+     * 数据监听回调
+     * data listener callback
+     *
+     * @param {any} newValue 新数据
+     * @param {any} oldValue 旧数据
+     *
+     */
+    TUIChatServer.prototype.updateStore = function (newValue, oldValue) {
+        Object.assign(this.currentStore, newValue);
+        if (!newValue.conversation.conversationID) {
+            this.currentStore.messageList = [];
+            return;
+        }
+        if (newValue.conversation.conversationID &&
+            newValue.conversation.conversationID !==
+                oldValue.conversation.conversationID) {
+            this.render(newValue.conversation);
+        }
+    };
+    TUIChatServer.prototype.render = function (conversation) {
+        var _this = this;
+        var _a, _b, _c;
+        var len = 15;
+        this.currentStore.isFirstRender = true;
+        this.currentStore.messageList = [];
+        this.currentStore.readSet.clear();
+        this.getMessageList({
+            conversationID: conversation.conversationID,
+            count: len
+        });
+        if (conversation.type === this.TUICore.TIM.TYPES.CONV_GROUP) {
+            this.currentStore.userInfo.isGroup = true;
+            var options = {
+                groupID: conversation.groupProfile.groupID,
+                userIDList: [conversation.groupProfile.selfInfo.userID]
+            };
+            this.getGroupProfile({ groupID: conversation.groupProfile.groupID });
+            this.getGroupMemberProfile(options).then(function (res) {
+                var memberList = res.data.memberList;
+                var selfInfo = memberList[0];
+                _this.currentStore.selfInfo = selfInfo;
+            });
+            (_c = (_b = (_a = this === null || this === void 0 ? void 0 : this.TUICore) === null || _a === void 0 ? void 0 : _a.TUIServer) === null || _b === void 0 ? void 0 : _b.TUIGroup) === null || _c === void 0 ? void 0 : _c.getGroupMemberList({
+                groupID: conversation.groupProfile.groupID,
+                count: 100,
+                offset: 0
+            }).then(function (res) {
+                var _a;
+                _this.currentStore.allMemberList = (_a = res.data) === null || _a === void 0 ? void 0 : _a.memberList;
+            });
+        }
+        else {
+            this.currentStore.userInfo.isGroup = false;
+            this.currentStore.userInfo.list = [conversation === null || conversation === void 0 ? void 0 : conversation.userProfile];
+        }
+    };
+    /**
+     * /////////////////////////////////////////////////////////////////////////////////
+     * //
+     * //                                    TIM 事件监听注册接口
+     * //                        TIM Event listener registration interface
+     * //
+     * /////////////////////////////////////////////////////////////////////////////////
+     */
+    TUIChatServer.prototype.bindTIMEvent = function () {
+        this.TUICore.tim.on(this.TUICore.TIM.EVENT.MESSAGE_RECEIVED, this.handleMessageReceived, this);
+        this.TUICore.tim.on(this.TUICore.TIM.EVENT.MESSAGE_MODIFIED, this.handleMessageModified, this);
+        this.TUICore.tim.on(this.TUICore.TIM.EVENT.MESSAGE_REVOKED, this.handleMessageRevoked, this);
+        this.TUICore.tim.on(this.TUICore.TIM.EVENT.MESSAGE_READ_BY_PEER, this.handleMessageReadByPeer, this);
+        this.TUICore.tim.on(this.TUICore.TIM.EVENT.GROUP_LIST_UPDATED, this.handleGroupListUpdated, this);
+        this.TUICore.tim.on(this.TUICore.TIM.EVENT.MESSAGE_READ_RECEIPT_RECEIVED, this.handleMessageReadReceiptReceived, this);
+    };
+    TUIChatServer.prototype.unbindTIMEvent = function () {
+        this.TUICore.tim.off(this.TUICore.TIM.EVENT.MESSAGE_RECEIVED, this.handleMessageReceived);
+        this.TUICore.tim.off(this.TUICore.TIM.EVENT.MESSAGE_MODIFIED, this.handleMessageModified);
+        this.TUICore.tim.off(this.TUICore.TIM.EVENT.MESSAGE_REVOKED, this.handleMessageRevoked);
+        this.TUICore.tim.off(this.TUICore.TIM.EVENT.MESSAGE_READ_BY_PEER, this.handleMessageReadByPeer);
+        this.TUICore.tim.off(this.TUICore.TIM.EVENT.GROUP_LIST_UPDATED, this.handleGroupListUpdated);
+        this.TUICore.tim.off(this.TUICore.TIM.EVENT.MESSAGE_READ_RECEIPT_RECEIVED, this.handleMessageReadReceiptReceived);
+    };
+    TUIChatServer.prototype.handleMessageReceived = function (event) {
+        var _this = this;
+        var _a;
+        (_a = event === null || event === void 0 ? void 0 : event.data) === null || _a === void 0 ? void 0 : _a.forEach(function (message) {
+            var _a, _b;
+            if ((message === null || message === void 0 ? void 0 : message.conversationID) === ((_b = (_a = _this === null || _this === void 0 ? void 0 : _this.store) === null || _a === void 0 ? void 0 : _a.conversation) === null || _b === void 0 ? void 0 : _b.conversationID)) {
+                _this.currentStore.messageList = __spreadArrays(_this.currentStore.messageList, [
+                    message,
+                ]);
+            }
+            TUIPlugin_1.TUINotification.getInstance().notify(message);
+        });
+    };
+    TUIChatServer.prototype.handleMessageModified = function (event) {
+        var middleData = this.currentStore.messageList;
+        this.currentStore.messageList = [];
+        this.currentStore.messageList = middleData;
+    };
+    TUIChatServer.prototype.handleMessageRevoked = function (event) {
+        var middleData = this.currentStore.messageList;
+        this.currentStore.messageList = [];
+        this.currentStore.messageList = middleData;
+    };
+    TUIChatServer.prototype.handleMessageReadByPeer = function (event) {
+        var middleData = this.currentStore.messageList;
+        this.currentStore.messageList = [];
+        this.currentStore.messageList = middleData;
+    };
+    TUIChatServer.prototype.handleGroupListUpdated = function (event) {
+        var _this = this;
+        event === null || event === void 0 ? void 0 : event.data.map(function (item) {
+            var _a, _b, _c;
+            if ((item === null || item === void 0 ? void 0 : item.groupID) === ((_c = (_b = (_a = _this === null || _this === void 0 ? void 0 : _this.store) === null || _a === void 0 ? void 0 : _a.conversation) === null || _b === void 0 ? void 0 : _b.groupProfile) === null || _c === void 0 ? void 0 : _c.groupID)) {
+                _this.store.conversation.groupProfile = item;
+                _this.currentStore.conversation = {};
+                _this.currentStore.conversation = _this.store.conversation;
+            }
+            return item;
+        });
+    };
+    TUIChatServer.prototype.handleMessageReadReceiptReceived = function (event) {
+        var middleData = this.currentStore.messageList;
+        this.currentStore.messageList = [];
+        this.currentStore.messageList = middleData;
+    };
+    /**
+     * /////////////////////////////////////////////////////////////////////////////////
+     * //
+     * //                                 处理 TIM 接口参数及回调
+     * //                     Handling TIM interface parameters and callbacks
+     * //
+     * /////////////////////////////////////////////////////////////////////////////////
+     */
+    /**
+     * 创建消息生成参数
+     * Create message generation parameters
+     *
+     * @param {Object} content 消息体
+     * @param {String} type 消息类型 text: 文本类型 file: 文件类型 face: 表情 location: 地址 custom: 自定义 merger: 合并 forward: 转发
+     * @param {Callback} callback 回调函数
+     * @param {any} to 发送的对象
+     * @returns {options} 消息参数
+     */
+    TUIChatServer.prototype.handleMessageOptions = function (content, type, callback, to) {
+        var _a, _b, _c, _d, _e, _f;
+        var options = {
+            to: "",
+            conversationType: (to === null || to === void 0 ? void 0 : to.type) || this.store.conversation.type,
+            payload: content,
+            needReadReceipt: this.currentStore.needReadReceipt
+        };
+        if (this.currentStore.needTyping) {
+            options.cloudCustomData = {
+                messageFeature: {
+                    needTyping: 1,
+                    version: 1
+                }
+            };
+            options.cloudCustomData = JSON.stringify(options.cloudCustomData);
+        }
+        if (type === "file" && callback) {
+            options.onProgress = callback;
+        }
+        switch (options.conversationType) {
+            case this.TUICore.TIM.TYPES.CONV_C2C:
+                options.to =
+                    ((_a = to === null || to === void 0 ? void 0 : to.userProfile) === null || _a === void 0 ? void 0 : _a.userID) || ((_c = (_b = this.store.conversation) === null || _b === void 0 ? void 0 : _b.userProfile) === null || _c === void 0 ? void 0 : _c.userID) ||
+                        "";
+                break;
+            case this.TUICore.TIM.TYPES.CONV_GROUP:
+                options.to =
+                    ((_d = to === null || to === void 0 ? void 0 : to.groupProfile) === null || _d === void 0 ? void 0 : _d.groupID) || ((_f = (_e = this.store.conversation) === null || _e === void 0 ? void 0 : _e.groupProfile) === null || _f === void 0 ? void 0 : _f.groupID) ||
+                        "";
+                break;
+            default:
+                break;
+        }
+        return options;
+    };
+    /**
+     * 处理异步函数
+     * Handling asynchronous functions
+     *
+     * @param {callback} callback 回调函数
+     * @returns {Promise} 返回异步函数
+     */
+    TUIChatServer.prototype.handlePromiseCallback = function (callback) {
+        var _this = this;
+        return new Promise(function (resolve, reject) {
+            var config = {
+                TUIName: "TUIChat",
+                callback: function () {
+                    callback && callback(resolve, reject);
+                }
+            };
+            _this.TUICore.setAwaitFunc(config.TUIName, config.callback);
+        });
+    };
+    /**
+     * 重试异步函数
+     * Retry asynchronous functions
+     * 默认执行一次,之后按时间间隔列表重复执行直到成功,重复次数完毕后仍失败则失败
+     * Execute once by default, and then repeat it according to the time interval list until it succeeds.
+     * If it still fails after the number of repetitions is complete, it will reject.
+     *
+     * @param {callback} callback 回调函数/callback function
+     * @param {Array<number>} intervalList 间隔时间列表/interval list
+     * @param {callback} retryBreakFn 强制重复结束条件函数/break retry function
+     * @returns {Promise} 返回异步函数/return
+     */
+    TUIChatServer.prototype.handlePromiseCallbackRetry = function (callback, intervalList, retryBreakFn) {
+        if (intervalList === void 0) { intervalList = []; }
+        if (retryBreakFn === void 0) { retryBreakFn = function () {
+            return false;
+        }; }
+        return new Promise(function (resolve, reject) {
+            var times = 0;
+            function tryFn() {
+                times++;
+                callback()
+                    .then(resolve)["catch"](function (error) {
+                    if (times > intervalList.length ||
+                        (retryBreakFn && retryBreakFn(error))) {
+                        reject(error);
+                        return;
+                    }
+                    setTimeout(tryFn, intervalList[times - 1]);
+                });
+            }
+            tryFn();
+        });
+    };
+    /**
+     * 文件上传进度函数处理
+     * File upload progress function processing
+     *
+     * @param {number} progress 文件上传进度 1表示完成
+     * @param {message} message 文件消息
+     */
+    TUIChatServer.prototype.handleUploadProgress = function (progress, message) {
+        this.currentStore.messageList.map(function (item) {
+            if (item.ID === message.ID) {
+                item.progress = progress;
+            }
+            return item;
+        });
+    };
+    /**
+     * /////////////////////////////////////////////////////////////////////////////////
+     * //
+     * //                                 TIM 方法
+     * //                               TIM methods
+     * //
+     * /////////////////////////////////////////////////////////////////////////////////
+     */
+    /**
+     * 发送表情消息
+     * Send face messages
+     *
+     * @param {Object} data 消息内容/message content
+     * @param {Number} data.index 表情索引/face index
+     * @param {String} data.data 额外数据/extra data
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.sendFaceMessage = function (data) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var options, message, imResponse_1, error_1, middleData;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        options = this.handleMessageOptions(data, "face");
+                        message = this.TUICore.tim.createFaceMessage(options);
+                        this.currentStore.messageList.push(message);
+                        return [4 /*yield*/, this.TUICore.tim.sendMessage(message)];
+                    case 1:
+                        imResponse_1 = _a.sent();
+                        this.currentStore.messageList = this.currentStore.messageList.map(function (item) {
+                            if (item.ID === imResponse_1.data.message.ID) {
+                                return imResponse_1.data.message;
+                            }
+                            return item;
+                        });
+                        resolve(imResponse_1);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_1 = _a.sent();
+                        reject(error_1);
+                        middleData = this.currentStore.messageList;
+                        this.currentStore.messageList = [];
+                        this.currentStore.messageList = middleData;
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 发送图片消息
+     * Send image message
+     *
+     * @param {Image} image 图片文件/image
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.sendImageMessage = function (image) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var options, message_1, imResponse_2, error_2, middleData;
+            var _this = this;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        options = this.handleMessageOptions({ file: image }, "file", function (progress) {
+                            _this.handleUploadProgress(progress, message_1);
+                        });
+                        message_1 = this.TUICore.tim.createImageMessage(options);
+                        message_1.progress = 0.01;
+                        this.currentStore.messageList.push(message_1);
+                        return [4 /*yield*/, this.TUICore.tim.sendMessage(message_1)];
+                    case 1:
+                        imResponse_2 = _a.sent();
+                        this.currentStore.messageList = this.currentStore.messageList.map(function (item) {
+                            if (item.ID === imResponse_2.data.message.ID) {
+                                return imResponse_2.data.message;
+                            }
+                            return item;
+                        });
+                        resolve(imResponse_2);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_2 = _a.sent();
+                        reject(error_2);
+                        middleData = this.currentStore.messageList;
+                        this.currentStore.messageList = [];
+                        this.currentStore.messageList = middleData;
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 发送视频消息
+     * Send video message
+     *
+     * @param {Video} video 视频文件/video
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.sendVideoMessage = function (video) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var options, message_2, imResponse_3, error_3, middleData;
+            var _this = this;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        options = this.handleMessageOptions({ file: video }, "file", function (progress) {
+                            _this.handleUploadProgress(progress, message_2);
+                        });
+                        message_2 = this.TUICore.tim.createVideoMessage(options);
+                        message_2.progress = 0.01;
+                        this.currentStore.messageList.push(message_2);
+                        return [4 /*yield*/, this.TUICore.tim.sendMessage(message_2)];
+                    case 1:
+                        imResponse_3 = _a.sent();
+                        this.currentStore.messageList = this.currentStore.messageList.map(function (item) {
+                            if (item.ID === imResponse_3.data.message.ID) {
+                                return imResponse_3.data.message;
+                            }
+                            return item;
+                        });
+                        resolve(imResponse_3);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_3 = _a.sent();
+                        reject(error_3);
+                        middleData = this.currentStore.messageList;
+                        this.currentStore.messageList = [];
+                        this.currentStore.messageList = middleData;
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 发送文件消息
+     * Send file message
+     *
+     * @param {File} file 文件/file
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.sendFileMessage = function (file) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var options, message_3, imResponse_4, error_4, middleData;
+            var _this = this;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        options = this.handleMessageOptions({ file: file }, "file", function (progress) {
+                            _this.handleUploadProgress(progress, message_3);
+                        });
+                        message_3 = this.TUICore.tim.createFileMessage(options);
+                        message_3.progress = 0.01;
+                        this.currentStore.messageList.push(message_3);
+                        return [4 /*yield*/, this.TUICore.tim.sendMessage(message_3)];
+                    case 1:
+                        imResponse_4 = _a.sent();
+                        this.currentStore.messageList = this.currentStore.messageList.map(function (item) {
+                            if (item.ID === imResponse_4.data.message.ID) {
+                                return imResponse_4.data.message;
+                            }
+                            return item;
+                        });
+                        resolve(imResponse_4);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_4 = _a.sent();
+                        reject(error_4);
+                        middleData = this.currentStore.messageList;
+                        this.currentStore.messageList = [];
+                        this.currentStore.messageList = middleData;
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 发送自定义消息
+     * Send Custom message
+     *
+     * @param {Object} data 消息内容/message content
+     * @param {String} data.data 自定义消息的数据字段/custom message data fields
+     * @param {String} data.description 自定义消息的说明字段/custom message description fields
+     * @param {String} data.extension 自定义消息的扩展字段/custom message extension fields
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.sendCustomMessage = function (data) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var options, message, imResponse_5, error_5, middleData;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        data.data = JSON.stringify(data.data);
+                        options = this.handleMessageOptions(data, "custom");
+                        message = this.TUICore.tim.createCustomMessage(options);
+                        this.currentStore.messageList.push(message);
+                        return [4 /*yield*/, this.TUICore.tim.sendMessage(message)];
+                    case 1:
+                        imResponse_5 = _a.sent();
+                        this.currentStore.messageList = this.currentStore.messageList.map(function (item) {
+                            if (item.ID === imResponse_5.data.message.ID) {
+                                return imResponse_5.data.message;
+                            }
+                            return item;
+                        });
+                        resolve(imResponse_5);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_5 = _a.sent();
+                        reject(error_5);
+                        middleData = this.currentStore.messageList;
+                        this.currentStore.messageList = [];
+                        this.currentStore.messageList = middleData;
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 发送地理位置消息
+     * Send location message
+     *
+     * @param {Object} data 消息内容/message content
+     * @param {String} data.description 地理位置描述信息/geographic descriptive information
+     * @param {Number} data.longitude 经度/longitude
+     * @param {Number} data.latitude 纬度/latitude
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.sendLocationMessage = function (data) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var options, message, imResponse, error_6, middleData;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        options = this.handleMessageOptions(data, "location");
+                        message = this.TUICore.tim.createLocationMessage(options);
+                        this.currentStore.messageList.push(message);
+                        return [4 /*yield*/, this.TUICore.tim.sendMessage(message)];
+                    case 1:
+                        imResponse = _a.sent();
+                        resolve(imResponse);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_6 = _a.sent();
+                        reject(error_6);
+                        middleData = this.currentStore.messageList;
+                        this.currentStore.messageList = [];
+                        this.currentStore.messageList = middleData;
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 转发消息
+     * forward message
+     *
+     * @param {message} message 消息实例/message
+     * @param {any} to 转发的对象/forward to
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.forwardMessage = function (message, to) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var options, imMessage, imResponse, error_7, middleData;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        options = this.handleMessageOptions(message, "forward", {}, to);
+                        imMessage = this.TUICore.tim.createForwardMessage(options);
+                        return [4 /*yield*/, this.TUICore.tim.sendMessage(imMessage)];
+                    case 1:
+                        imResponse = _a.sent();
+                        if (this.store.conversation.conversationID ===
+                            imResponse.data.message.conversationID) {
+                            this.currentStore.messageList.push(imResponse.data.message);
+                        }
+                        resolve(imResponse);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_7 = _a.sent();
+                        reject(error_7);
+                        middleData = this.currentStore.messageList;
+                        this.currentStore.messageList = [];
+                        this.currentStore.messageList = middleData;
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 发送消息已读回执
+     * Send message read receipt
+     *
+     * @param {Array} messageList 同一个 C2C 或 GROUP 会话的消息列表,最大长度为30/A list of messages for the same C2C or GROUP conversation, with a maximum length of 30
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.sendMessageReadReceipt = function (messageList) {
+        return __awaiter(this, void 0, void 0, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_8;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.sendMessageReadReceipt(messageList)];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_8 = _a.sent();
+                                    reject(error_8);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 拉取已读回执列表
+     * Pull read receipt list
+     *
+     * @param {Array} messageList 同一群会话的消息列表/The message list of the same group of the conversation
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.getMessageReadReceiptList = function (messageList) {
+        return __awaiter(this, void 0, void 0, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_9;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.getMessageReadReceiptList(messageList)];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_9 = _a.sent();
+                                    reject(error_9);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * /////////////////////////////////////////////////////////////////////////////////
+     * //
+     * //                                 对外方法
+     * //
+     * /////////////////////////////////////////////////////////////////////////////////
+     */
+    /**
+     * 获取 messageList
+     * get messagelist
+     *
+     * @param {any} options 获取 messageList 参数/messageList options
+     * @param {Boolean} history  是否获取历史消息/Whether to get historical information
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.getMessageList = function (options, history) {
+        return __awaiter(this, void 0, void 0, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_10;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 4, , 5]);
+                                    return [4 /*yield*/, this.TUICore.tim.getMessageList(options)];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    console.warn(imResponse.data.messageList);
+                                    if (!imResponse.data.messageList.length) return [3 /*break*/, 3];
+                                    return [4 /*yield*/, this.getMessageReadReceiptList(imResponse.data.messageList)];
+                                case 2:
+                                    _a.sent();
+                                    _a.label = 3;
+                                case 3:
+                                    if (!history) {
+                                        this.currentStore.messageList = imResponse.data.messageList;
+                                    }
+                                    else {
+                                        this.currentStore.messageList = __spreadArrays(imResponse.data.messageList, this.currentStore.messageList);
+                                    }
+                                    this.currentStore.nextReqMessageID = imResponse.data.nextReqMessageID;
+                                    this.currentStore.isCompleted = imResponse.data.isCompleted;
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 5];
+                                case 4:
+                                    error_10 = _a.sent();
+                                    reject(error_10);
+                                    return [3 /*break*/, 5];
+                                case 5: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 获取历史消息
+     * get history messagelist
+     *
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.getHistoryMessageList = function () {
+        return __awaiter(this, void 0, void 0, function () {
+            var options;
+            return __generator(this, function (_a) {
+                options = {
+                    conversationID: this.currentStore.conversation.conversationID,
+                    nextReqMessageID: this.currentStore.nextReqMessageID,
+                    count: 15
+                };
+                if (!this.currentStore.isCompleted) {
+                    this.getMessageList(options, true);
+                }
+                return [2 /*return*/];
+            });
+        });
+    };
+    /**
+     * 发送文本消息
+     * send text message
+     *
+     * @param {any} text 发送的消息/text message
+     * @param {object} data 被引用消息的内容/The content of the quoted message
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.sendTextMessage = function (text, data) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var options, cloudCustomDataObj, cloudCustomData, secondOptions, message, imResponse_6, error_11, middleData;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        options = this.handleMessageOptions({ text: text }, "text");
+                        cloudCustomDataObj = {};
+                        if (options.cloudCustomData) {
+                            try {
+                                cloudCustomDataObj = utils_1.JSONToObject(options.cloudCustomData);
+                            }
+                            catch (_b) {
+                                cloudCustomDataObj = {};
+                            }
+                        }
+                        cloudCustomData = JSON.stringify(data);
+                        secondOptions = Object.assign(options, __assign({ cloudCustomData: cloudCustomData }, cloudCustomDataObj));
+                        message = this.TUICore.tim.createTextMessage(secondOptions);
+                        this.currentStore.messageList.push(message);
+                        return [4 /*yield*/, this.TUICore.tim.sendMessage(message)];
+                    case 1:
+                        imResponse_6 = _a.sent();
+                        this.currentStore.messageList = this.currentStore.messageList.map(function (item) {
+                            if (item.ID === imResponse_6.data.message.ID) {
+                                return imResponse_6.data.message;
+                            }
+                            return item;
+                        });
+                        resolve(imResponse_6);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_11 = _a.sent();
+                        reject(error_11);
+                        middleData = this.currentStore.messageList;
+                        this.currentStore.messageList = [];
+                        this.currentStore.messageList = middleData;
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 发送【对方正在输入中】在线自定义消息
+     * send typing online custom message
+     *
+     * @param {Object} data 消息内容/message content
+     * @param {String} data.data 自定义消息的数据字段/custom message data field
+     * @param {String} data.description 自定义消息的说明字段/custom message description field
+     * @param {String} data.extension 自定义消息的扩展字段/custom message extension field
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.sendTypingMessage = function (data) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var options, message, imResponse, error_12, middleData;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        data.data = JSON.stringify(data.data);
+                        options = this.handleMessageOptions(data, "custom");
+                        message = this.TUICore.tim.createCustomMessage(options);
+                        return [4 /*yield*/, this.TUICore.tim.sendMessage(message, {
+                                onlineUserOnly: true
+                            })];
+                    case 1:
+                        imResponse = _a.sent();
+                        resolve(imResponse);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_12 = _a.sent();
+                        reject(error_12);
+                        middleData = this.currentStore.messageList;
+                        this.currentStore.messageList = [];
+                        this.currentStore.messageList = middleData;
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 发送@ 提醒功能的文本消息
+     * Send @ Reminder text message
+     *
+     * @param {any} data 消息内容/message content
+     * @param {String} data.text 文本消息/text message
+     * @param {Array} data.atUserList 需要 @ 的用户列表,如果需要 @ALL,请传入 TIM.TYPES.MSG_AT_ALL / List of users who need @, if you need @ALL, please pass in TIM.TYPES.MSG_AT_ALL
+     * @returns {message}
+     *
+     * - 注:此接口仅用于群聊/This interface is only used for group chat
+     */
+    TUIChatServer.prototype.sendTextAtMessage = function (data) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var options, message, imResponse_7, error_13, middleData;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        options = this.handleMessageOptions(data, "text");
+                        message = this.TUICore.tim.createTextAtMessage(options);
+                        this.currentStore.messageList.push(message);
+                        return [4 /*yield*/, this.TUICore.tim.sendMessage(message)];
+                    case 1:
+                        imResponse_7 = _a.sent();
+                        this.currentStore.messageList = this.currentStore.messageList.map(function (item) {
+                            if (item.ID === imResponse_7.data.message.ID) {
+                                return imResponse_7.data.message;
+                            }
+                            return item;
+                        });
+                        resolve(imResponse_7);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_13 = _a.sent();
+                        reject(error_13);
+                        middleData = this.currentStore.messageList;
+                        this.currentStore.messageList = [];
+                        this.currentStore.messageList = middleData;
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 发送合并消息
+     * send merger message
+     *
+     * @param {Object} data 消息内容/message content
+     * @param {Array.<Message>} data.messageList 合并的消息列表/merger message list
+     * @param {String} data.title 合并的标题/merger title
+     * @param {String} data.abstractList 摘要列表,不同的消息类型可以设置不同的摘要信息/Summary list, different message types can set different summary information
+     * @param {String} data.compatibleText 兼容文本/ompatible text
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.sendMergerMessage = function (data) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var options, message, imResponse_8, error_14, middleData;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        options = this.handleMessageOptions(data, "merger");
+                        message = this.TUICore.tim.createMergerMessage(options);
+                        this.currentStore.messageList.push(message);
+                        return [4 /*yield*/, this.TUICore.tim.sendMessage(message)];
+                    case 1:
+                        imResponse_8 = _a.sent();
+                        this.currentStore.messageList = this.currentStore.messageList.map(function (item) {
+                            if (item.ID === imResponse_8.data.message.ID) {
+                                return imResponse_8.data.message;
+                            }
+                            return item;
+                        });
+                        resolve(imResponse_8);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_14 = _a.sent();
+                        reject(error_14);
+                        middleData = this.currentStore.messageList;
+                        this.currentStore.messageList = [];
+                        this.currentStore.messageList = middleData;
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 消息撤回
+     * revoke message
+     *
+     * @param {message} message 消息实例/message
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.revokeMessage = function (message) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var imResponse, cloudCustomData, error_15, middleData;
+            var _a;
+            return __generator(this, function (_b) {
+                switch (_b.label) {
+                    case 0:
+                        _b.trys.push([0, 4, , 5]);
+                        return [4 /*yield*/, this.TUICore.tim.revokeMessage(message)];
+                    case 1:
+                        imResponse = _b.sent();
+                        cloudCustomData = utils_1.JSONToObject(message === null || message === void 0 ? void 0 : message.cloudCustomData);
+                        if (!((_a = cloudCustomData === null || cloudCustomData === void 0 ? void 0 : cloudCustomData.messageReply) === null || _a === void 0 ? void 0 : _a.messageRootID)) return [3 /*break*/, 3];
+                        return [4 /*yield*/, this.revokeReplyMessage(message)];
+                    case 2:
+                        _b.sent();
+                        _b.label = 3;
+                    case 3:
+                        resolve(imResponse);
+                        return [3 /*break*/, 5];
+                    case 4:
+                        error_15 = _b.sent();
+                        reject(error_15);
+                        middleData = this.currentStore.messageList;
+                        this.currentStore.messageList = [];
+                        this.currentStore.messageList = middleData;
+                        return [3 /*break*/, 5];
+                    case 5: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 重发消息
+     * resend message
+     *
+     * @param {message} message 消息实例/message
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.resendMessage = function (message) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var imResponse, error_16;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        return [4 /*yield*/, this.TUICore.tim.resendMessage(message)];
+                    case 1:
+                        imResponse = _a.sent();
+                        this.currentStore.messageList = this.currentStore.messageList.filter(function (item) { return item.ID !== message.ID; });
+                        this.currentStore.messageList.push(imResponse.data.message);
+                        resolve(imResponse);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_16 = _a.sent();
+                        reject(error_16);
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 删除消息
+     * delete message
+     *
+     * @param {Array.<message>} messages 消息实例/message
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.deleteMessage = function (messages) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var imResponse, middleData, error_17;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        return [4 /*yield*/, this.TUICore.tim.deleteMessage(messages)];
+                    case 1:
+                        imResponse = _a.sent();
+                        resolve(imResponse);
+                        middleData = this.currentStore.messageList;
+                        this.currentStore.messageList = [];
+                        this.currentStore.messageList = middleData;
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_17 = _a.sent();
+                        reject(error_17);
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 变更消息
+     * modify message
+     *
+     * @param {Array.<message>} message 消息实例/message
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.modifyMessage = function (message) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var imResponse, error_18, code, data;
+            var _a, _b;
+            return __generator(this, function (_c) {
+                switch (_c.label) {
+                    case 0:
+                        _c.trys.push([0, 2, , 3]);
+                        return [4 /*yield*/, this.TUICore.tim.modifyMessage(message)];
+                    case 1:
+                        imResponse = _c.sent();
+                        resolve(imResponse);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_18 = _c.sent();
+                        code = (_a = error_18) === null || _a === void 0 ? void 0 : _a.code;
+                        data = (_b = error_18) === null || _b === void 0 ? void 0 : _b.data;
+                        if (code === 2480) {
+                            console.warn("MODIFY_MESSAGE_ERROR", "修改消息发生冲突,data.message 是最新的消息", "data.message:", data === null || data === void 0 ? void 0 : data.message);
+                        }
+                        else if (code === 2481) {
+                            console.warn("MODIFY_MESSAGE_ERROR", "不支持修改直播群消息");
+                        }
+                        else if (code === 20026) {
+                            console.warn("MODIFY_MESSAGE_ERROR", "消息不存在");
+                        }
+                        reject(error_18);
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 回复消息
+     * reply message
+     * @param {Array.<message>} message 消息实例/message
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.replyMessage = function (message, messageRoot) {
+        var _this = this;
+        var replyFunction = function () {
+            return _this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                var repliesObject, cloudCustomData, messageRootID_1, rootCloudCustomData, imResponse, error_19;
+                var _a, _b, _c, _d, _e, _f;
+                return __generator(this, function (_g) {
+                    switch (_g.label) {
+                        case 0:
+                            _g.trys.push([0, 3, , 4]);
+                            repliesObject = {
+                                messageAbstract: (_a = message === null || message === void 0 ? void 0 : message.payload) === null || _a === void 0 ? void 0 : _a.text,
+                                messageSender: message === null || message === void 0 ? void 0 : message.from,
+                                messageID: message === null || message === void 0 ? void 0 : message.ID,
+                                messageType: message === null || message === void 0 ? void 0 : message.type,
+                                messageTime: message === null || message === void 0 ? void 0 : message.time,
+                                messageSequence: message === null || message === void 0 ? void 0 : message.sequence,
+                                version: 1
+                            };
+                            if (!!messageRoot) return [3 /*break*/, 2];
+                            cloudCustomData = utils_1.JSONToObject(message === null || message === void 0 ? void 0 : message.cloudCustomData);
+                            messageRootID_1 = (_b = cloudCustomData === null || cloudCustomData === void 0 ? void 0 : cloudCustomData.messageReply) === null || _b === void 0 ? void 0 : _b.messageRootID;
+                            return [4 /*yield*/, ((_d = (_c = this === null || this === void 0 ? void 0 : this.currentStore) === null || _c === void 0 ? void 0 : _c.messageList) === null || _d === void 0 ? void 0 : _d.find(function (item) { return (item === null || item === void 0 ? void 0 : item.ID) === messageRootID_1; }))];
+                        case 1:
+                            messageRoot =
+                                (_g.sent()) || this.findMessage(messageRootID_1);
+                            _g.label = 2;
+                        case 2:
+                            rootCloudCustomData = (messageRoot === null || messageRoot === void 0 ? void 0 : messageRoot.cloudCustomData) ? utils_1.JSONToObject(messageRoot === null || messageRoot === void 0 ? void 0 : messageRoot.cloudCustomData)
+                                : { messageReplies: {} };
+                            if ((_e = rootCloudCustomData === null || rootCloudCustomData === void 0 ? void 0 : rootCloudCustomData.messageReplies) === null || _e === void 0 ? void 0 : _e.replies) {
+                                rootCloudCustomData.messageReplies.replies = __spreadArrays((_f = rootCloudCustomData === null || rootCloudCustomData === void 0 ? void 0 : rootCloudCustomData.messageReplies) === null || _f === void 0 ? void 0 : _f.replies, [
+                                    repliesObject,
+                                ]);
+                            }
+                            else {
+                                rootCloudCustomData.messageReplies = {
+                                    replies: [repliesObject],
+                                    version: 1
+                                };
+                            }
+                            messageRoot.cloudCustomData = JSON.stringify(rootCloudCustomData);
+                            imResponse = this.modifyMessage(messageRoot);
+                            resolve(imResponse);
+                            return [3 /*break*/, 4];
+                        case 3:
+                            error_19 = _g.sent();
+                            reject(error_19);
+                            return [3 /*break*/, 4];
+                        case 4: return [2 /*return*/];
+                    }
+                });
+            }); });
+        };
+        var retryBreakFunction = function (error) {
+            if (error && (error === null || error === void 0 ? void 0 : error.code) === 2480)
+                return false;
+            return true;
+        };
+        return this.handlePromiseCallbackRetry(replyFunction, [500, 1000, 3000], retryBreakFunction);
+    };
+    /**
+     * 撤回回复消息
+     * revoke reply message
+     * @param {Array.<message>} message 消息实例/message
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.revokeReplyMessage = function (message, messageRoot) {
+        var _this = this;
+        var revokeReplyFunction = function () {
+            return _this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                var cloudCustomData, messageRootID_2, rootCloudCustomData, index, imResponse, error_20;
+                var _a, _b, _c, _d, _e, _f;
+                return __generator(this, function (_g) {
+                    switch (_g.label) {
+                        case 0:
+                            _g.trys.push([0, 3, , 4]);
+                            if (!!messageRoot) return [3 /*break*/, 2];
+                            cloudCustomData = utils_1.JSONToObject(message === null || message === void 0 ? void 0 : message.cloudCustomData);
+                            messageRootID_2 = (_a = cloudCustomData === null || cloudCustomData === void 0 ? void 0 : cloudCustomData.messageReply) === null || _a === void 0 ? void 0 : _a.messageRootID;
+                            return [4 /*yield*/, ((_c = (_b = this === null || this === void 0 ? void 0 : this.currentStore) === null || _b === void 0 ? void 0 : _b.messageList) === null || _c === void 0 ? void 0 : _c.find(function (item) { return (item === null || item === void 0 ? void 0 : item.ID) === messageRootID_2; }))];
+                        case 1:
+                            messageRoot =
+                                (_g.sent()) || this.findMessage(messageRootID_2);
+                            _g.label = 2;
+                        case 2:
+                            rootCloudCustomData = (messageRoot === null || messageRoot === void 0 ? void 0 : messageRoot.cloudCustomData) ? utils_1.JSONToObject(messageRoot === null || messageRoot === void 0 ? void 0 : messageRoot.cloudCustomData)
+                                : { messageReplies: {} };
+                            if ((_d = rootCloudCustomData === null || rootCloudCustomData === void 0 ? void 0 : rootCloudCustomData.messageReplies) === null || _d === void 0 ? void 0 : _d.replies) {
+                                index = rootCloudCustomData.messageReplies.replies.findIndex(function (item) { return (item === null || item === void 0 ? void 0 : item.messageID) === (message === null || message === void 0 ? void 0 : message.ID); });
+                                (_f = (_e = rootCloudCustomData === null || rootCloudCustomData === void 0 ? void 0 : rootCloudCustomData.messageReplies) === null || _e === void 0 ? void 0 : _e.replies) === null || _f === void 0 ? void 0 : _f.splice(index, 1);
+                            }
+                            messageRoot.cloudCustomData = JSON.stringify(rootCloudCustomData);
+                            imResponse = this.modifyMessage(messageRoot);
+                            resolve(imResponse);
+                            return [3 /*break*/, 4];
+                        case 3:
+                            error_20 = _g.sent();
+                            reject(error_20);
+                            return [3 /*break*/, 4];
+                        case 4: return [2 /*return*/];
+                    }
+                });
+            }); });
+        };
+        var retryBreakFunction = function (error) {
+            if (error && (error === null || error === void 0 ? void 0 : error.code) === 2480)
+                return false;
+            return true;
+        };
+        return this.handlePromiseCallbackRetry(revokeReplyFunction, [500, 1000, 3000], retryBreakFunction);
+    };
+    /**
+     * 表情回应
+     * emoji react
+     * @param {Array.<message>} message 消息实例/message
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.emojiReact = function (message, emojiID) {
+        var _this = this;
+        var emojiReactFunction = function () {
+            return _this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                var userID, cloudCustomData, index, imResponse, error_21;
+                var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
+                return __generator(this, function (_u) {
+                    switch (_u.label) {
+                        case 0:
+                            _u.trys.push([0, 2, , 3]);
+                            if (!message || !(message === null || message === void 0 ? void 0 : message.ID) || !emojiID)
+                                reject();
+                            userID = (_e = (_d = (_c = (_b = (_a = this.TUICore) === null || _a === void 0 ? void 0 : _a.TUIServer) === null || _b === void 0 ? void 0 : _b.TUIProfile) === null || _c === void 0 ? void 0 : _c.store) === null || _d === void 0 ? void 0 : _d.profile) === null || _e === void 0 ? void 0 : _e.userID;
+                            return [4 /*yield*/, ((_g = (_f = this === null || this === void 0 ? void 0 : this.currentStore) === null || _f === void 0 ? void 0 : _f.messageList) === null || _g === void 0 ? void 0 : _g.find(function (item) { return (item === null || item === void 0 ? void 0 : item.ID) === (message === null || message === void 0 ? void 0 : message.ID); }))];
+                        case 1:
+                            message =
+                                (_u.sent()) || this.findMessage(message === null || message === void 0 ? void 0 : message.ID);
+                            cloudCustomData = (message === null || message === void 0 ? void 0 : message.cloudCustomData) ? utils_1.JSONToObject(message === null || message === void 0 ? void 0 : message.cloudCustomData)
+                                : { messageReact: {} };
+                            if ((_h = cloudCustomData === null || cloudCustomData === void 0 ? void 0 : cloudCustomData.messageReact) === null || _h === void 0 ? void 0 : _h.reacts) {
+                                if ((_j = cloudCustomData === null || cloudCustomData === void 0 ? void 0 : cloudCustomData.messageReact) === null || _j === void 0 ? void 0 : _j.reacts[emojiID]) {
+                                    index = (_l = (_k = cloudCustomData === null || cloudCustomData === void 0 ? void 0 : cloudCustomData.messageReact) === null || _k === void 0 ? void 0 : _k.reacts[emojiID]) === null || _l === void 0 ? void 0 : _l.indexOf(userID);
+                                    if (index === -1) {
+                                        (_o = (_m = cloudCustomData === null || cloudCustomData === void 0 ? void 0 : cloudCustomData.messageReact) === null || _m === void 0 ? void 0 : _m.reacts[emojiID]) === null || _o === void 0 ? void 0 : _o.push(userID);
+                                    }
+                                    else {
+                                        (_q = (_p = cloudCustomData === null || cloudCustomData === void 0 ? void 0 : cloudCustomData.messageReact) === null || _p === void 0 ? void 0 : _p.reacts[emojiID]) === null || _q === void 0 ? void 0 : _q.splice(index, 1);
+                                        if (((_s = (_r = cloudCustomData === null || cloudCustomData === void 0 ? void 0 : cloudCustomData.messageReact) === null || _r === void 0 ? void 0 : _r.reacts[emojiID]) === null || _s === void 0 ? void 0 : _s.length) === 0) {
+                                            (_t = cloudCustomData === null || cloudCustomData === void 0 ? void 0 : cloudCustomData.messageReact) === null || _t === void 0 ? true : delete _t.reacts[emojiID];
+                                        }
+                                    }
+                                }
+                                else {
+                                    cloudCustomData.messageReact.reacts[emojiID] = [userID];
+                                }
+                            }
+                            else {
+                                cloudCustomData.messageReact = {
+                                    reacts: {},
+                                    version: 1
+                                };
+                                cloudCustomData.messageReact.reacts[emojiID] = [userID];
+                            }
+                            message.cloudCustomData = JSON.stringify(cloudCustomData);
+                            imResponse = this.modifyMessage(message);
+                            resolve(imResponse);
+                            return [3 /*break*/, 3];
+                        case 2:
+                            error_21 = _u.sent();
+                            reject(error_21);
+                            return [3 /*break*/, 3];
+                        case 3: return [2 /*return*/];
+                    }
+                });
+            }); });
+        };
+        var retryBreakFunction = function (error) {
+            if (error && (error === null || error === void 0 ? void 0 : error.code) === 2480)
+                return false;
+            return true;
+        };
+        return this.handlePromiseCallbackRetry(emojiReactFunction, [500, 1000, 3000], retryBreakFunction);
+    };
+    /**
+     * 查询消息
+     * find message
+     * @param {String} messageID 消息实例ID/messageID
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.findMessage = function (messageID) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var imResponse, error_22;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        return [4 /*yield*/, this.TUICore.tim.findMessage(messageID)];
+                    case 1:
+                        imResponse = _a.sent();
+                        resolve(imResponse);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_22 = _a.sent();
+                        reject(error_22);
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 获取群组属性
+     * get group profile
+     *
+     * @param {any} options 参数
+     * @param {String} options.groupID 群组ID
+     * @param {Array.<String>} options.groupProfileFilter 群资料过滤器
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.getGroupProfile = function (options) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var imResponse, error_23;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        return [4 /*yield*/, this.TUICore.tim.getGroupProfile(options)];
+                    case 1:
+                        imResponse = _a.sent();
+                        this.currentStore.conversation.groupProfile = imResponse.data.group;
+                        resolve(imResponse);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_23 = _a.sent();
+                        reject(error_23);
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 获取群成员资料
+     * get group member profile
+     *
+     * @param {any} options 参数
+     * @param {String} options.groupID 群组ID
+     * @param {Array.<String>} options.userIDList 要查询的群成员用户 ID 列表
+     * @param {	Array.<String>} options.memberCustomFieldFilter 群成员自定义字段筛选
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.getGroupMemberProfile = function (options) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var imResponse, error_24;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        return [4 /*yield*/, this.TUICore.tim.getGroupMemberProfile(options)];
+                    case 1:
+                        imResponse = _a.sent();
+                        resolve(imResponse);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_24 = _a.sent();
+                        reject(error_24);
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 处理申请加群
+     * handling group application
+     * - 管理员
+     *   administrator
+     *
+     * @param {any} options 参数
+     * @param {String} options.handleAction 处理结果 Agree(同意) / Reject(拒绝)
+     * @param {String} options.handleMessage 附言
+     * @param {Message} options.message 对应【群系统通知】的消息实例
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.handleGroupApplication = function (options) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var imResponse, error_25;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        return [4 /*yield*/, this.TUICore.tim.handleGroupApplication(options)];
+                    case 1:
+                        imResponse = _a.sent();
+                        resolve(imResponse);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_25 = _a.sent();
+                        reject(error_25);
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 获取其他用户资料
+     * get user profile
+     *
+     * @param {Array<string>} userIDList 用户的账号列表/userID list
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.getUserProfile = function (userIDList) {
+        return __awaiter(this, void 0, void 0, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_26;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.getUserProfile({
+                                            userIDList: userIDList
+                                        })];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_26 = _a.sent();
+                                    reject(error_26);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 获取 SDK 缓存的好友列表
+     * Get the friend list cached by the SDK
+     *
+     * @param {Array<string>} userIDList 用户的账号列表
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.getFriendList = function () {
+        return __awaiter(this, void 0, Promise, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_27;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.getFriendList()];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_27 = _a.sent();
+                                    reject(error_27);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 校验好友关系
+     * check friend
+     *
+     * @param {string} userID 用户账号
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.checkFriend = function (userID, type) {
+        return __awaiter(this, void 0, Promise, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, isFriendShip, error_28;
+                        var _a, _b;
+                        return __generator(this, function (_c) {
+                            switch (_c.label) {
+                                case 0:
+                                    _c.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.checkFriend({
+                                            userIDList: [userID],
+                                            type: type
+                                        })];
+                                case 1:
+                                    imResponse = _c.sent();
+                                    isFriendShip = (_b = (_a = imResponse === null || imResponse === void 0 ? void 0 : imResponse.data) === null || _a === void 0 ? void 0 : _a.successUserIDList[0]) === null || _b === void 0 ? void 0 : _b.relation;
+                                    resolve(isFriendShip);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_28 = _c.sent();
+                                    reject(error_28);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 获取群消息已读成员列表
+     * Get the list of memebers who have read the group message.
+     *
+     * @param {message} message 消息实例/message
+     * @param {string} cursor 分页拉取的游标,第一次拉取传''/Paging pull the cursor,first pull pass ''
+     * @param {number} count 分页拉取的个数/The number of page pulls
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.getGroupReadMemberList = function (message, cursor, count) {
+        if (cursor === void 0) { cursor = ""; }
+        if (count === void 0) { count = 15; }
+        return __awaiter(this, void 0, Promise, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_29;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.getGroupMessageReadMemberList({
+                                            message: message,
+                                            filter: 0,
+                                            cursor: cursor,
+                                            count: count
+                                        })];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_29 = _a.sent();
+                                    reject(error_29);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 获取群消息未读成员列表
+     * Get the list of memebers who have not read the group message.
+     *
+     * @param {message} message 消息实例/message
+     * @param {string} cursor 分页拉取的游标,第一次拉取传''/Paging pull the cursor,first pull pass ''
+     * @param {number} count 分页拉取的个数/The number of page pulls
+     * @returns {Promise}
+     */
+    TUIChatServer.prototype.getGroupUnreadMemberList = function (message, cursor, count) {
+        if (cursor === void 0) { cursor = ""; }
+        if (count === void 0) { count = 15; }
+        return __awaiter(this, void 0, Promise, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_30;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.getGroupMessageReadMemberList({
+                                            message: message,
+                                            filter: 1,
+                                            cursor: cursor,
+                                            count: count
+                                        })];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_30 = _a.sent();
+                                    reject(error_30);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 自己发送消息上屏显示
+     *
+     * @param {message} message 消息实例/message
+     */
+    TUIChatServer.prototype.handleMessageSentByMeToView = function (message) {
+        var _a, _b;
+        return __awaiter(this, void 0, void 0, function () {
+            return __generator(this, function (_c) {
+                if ((message === null || message === void 0 ? void 0 : message.conversationID) === ((_b = (_a = this === null || this === void 0 ? void 0 : this.store) === null || _a === void 0 ? void 0 : _a.conversation) === null || _b === void 0 ? void 0 : _b.conversationID)) {
+                    this.currentStore.messageList.push(message);
+                }
+                return [2 /*return*/];
+            });
+        });
+    };
+    /**
+     * /////////////////////////////////////////////////////////////////////////////////
+     * //
+     * //                                    UI 数据绑定server数据同步
+     * //                           UI data binding server data synchronization
+     * //
+     * /////////////////////////////////////////////////////////////////////////////////
+     */
+    /**
+     * 赋值
+     * bind
+     *
+     * @param {Object} params 使用的数据/params
+     * @returns {Object} 数据/data
+     */
+    TUIChatServer.prototype.bind = function (params) {
+        return (this.currentStore = params);
+    };
+    return TUIChatServer;
+}(IComponentServer_1["default"]));
+exports["default"] = TUIChatServer;

+ 219 - 0
src/TUIKit/TUIComponents/container/TUIChat/style/dist/h5.css

@@ -0,0 +1,219 @@
+.TUIChat-H5 {
+  flex: 1;
+  position: static;
+}
+.TUIChat-H5 .TUIChat-header {
+  width: 100%;
+  box-sizing: border-box;
+  position: sticky;
+  top: 0;
+  z-index: 2;
+}
+.TUIChat-H5 .TUIChat-header .setting {
+  width: 27px;
+}
+.TUIChat-H5 .TUIChat-main .TUI-message-list {
+  height: auto;
+}
+.TUIChat-H5 .TUIChat-footer {
+  width: 100%;
+  box-sizing: border-box;
+  position: sticky;
+  bottom: 0;
+  flex-direction: column-reverse;
+  height: auto;
+  padding: 14px 23px 23px;
+  z-index: 1;
+}
+.TUIChat-H5 .TUIChat-footer .func {
+  display: flex;
+  flex-direction: column;
+}
+.TUIChat-H5 .TUIChat-footer .func-main {
+  display: flex;
+  justify-content: space-between;
+}
+.TUIChat-H5 .TUIChat-footer .reply {
+  order: 1;
+  padding-bottom: 10px;
+}
+.TUIChat-H5 .TUIChat-footer .reply-box {
+  padding: 0;
+}
+.TUIChat-H5 .TUIChat-footer .reply-box i {
+  display: none;
+}
+.TUIChat-H5 .TUIChat-footer .reply-box-show {
+  flex-direction: row;
+}
+.TUIChat-H5 .TUIChat-footer .reply-box-show span {
+  width: auto;
+}
+.TUIChat-H5 .TUIChat-footer .reply-box-show span:first-child {
+  padding-right: 2px;
+}
+.TUIChat-H5 .TUIChat-footer .reply-box-show span:last-child {
+  flex: 1;
+}
+.TUIChat-H5 .TUIChat-footer .input {
+  display: flex;
+  flex-wrap: wrap;
+  flex-direction: row;
+  align-items: flex-end;
+}
+.TUIChat-H5 .TUIChat-footer .input textarea {
+  width: auto;
+  height: auto;
+  padding: 0;
+  flex: 1;
+  background: #f4f5f9;
+  border-radius: 9.4px;
+  padding: 7px 18px;
+  font-size: 16px;
+  line-height: 18px;
+}
+.TUIChat-H5 .TUIChat-footer .input .reference {
+  overflow: hidden;
+  order: 1;
+  width: 100%;
+  max-width: 100%;
+  margin: 0;
+}
+.TUIChat-H5 .TUIChat-footer .input .reference-box {
+  overflow: hidden;
+  padding: 0;
+  width: 100%;
+  max-width: 100%;
+  padding: 10px;
+  margin: 5px 0;
+}
+.TUIChat-H5 .TUIChat-footer .input .reference-box-show {
+  overflow: hidden;
+  width: 0;
+  flex: 1;
+  display: flex;
+  flex-direction: row;
+  text-overflow: ellipsis;
+}
+.TUIChat-H5 .TUIChat-footer .input .reference-box-show span:last-child {
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.TUIChat-H5 .TUIChat-footer .input button {
+  position: static !important;
+  margin-left: 7px;
+  word-break: keep-all;
+  height: 32px;
+  flex: 0;
+}
+.TUIChat-H5 .TUIChat-footer .input .memberList {
+  position: fixed;
+  width: 100%;
+  height: 100%;
+  left: 0;
+  top: 0;
+  background: rgba(0, 0, 0, 0.5);
+  max-height: none;
+  display: flex;
+  align-items: flex-end;
+  z-index: 1;
+}
+.TUIChat-H5 .TUIChat-footer .input .memberList-box {
+  position: static;
+  flex: 1;
+  max-height: 90%;
+  border-radius: 12px 12px 0 0;
+  padding: 14px 23px;
+}
+.TUIChat-H5 .TUIChat-footer .input .memberList-box-title {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 12px 0;
+}
+.TUIChat-H5 .TUIChat-footer .input .memberList-box-title h1 {
+  font-family: PingFangSC-Medium;
+  font-weight: 500;
+  font-size: 20px;
+  color: #000000;
+  letter-spacing: 0;
+  line-height: 28px;
+}
+.TUIChat-H5 .TUIChat-footer .input .memberList-box-title .close {
+  font-family: PingFangSC-Regular;
+  font-weight: 400;
+  font-size: 18px;
+  color: #3370ff;
+  letter-spacing: 0;
+  line-height: 27px;
+}
+.TUIChat-H5 .TUIChat-footer .input .memberList-box li {
+  padding: 8px 0;
+}
+.TUIChat-H5 .TUIChat-footer .input .memberList-box li img {
+  width: 30px;
+  height: 30px;
+  border-radius: 6.4px;
+  padding: 0;
+}
+.TUIChat-H5 .TUIChat-footer .input .memberList-box li span {
+  font-size: 16px;
+  padding-left: 12px;
+}
+.TUIChat-H5 .TUIChat-footer .input .memberList-box-header span:last-child {
+  padding-left: 0;
+}
+.TUIChat-H5 .manage {
+  position: fixed;
+  height: 100%;
+  top: 0;
+}
+.TUIChat-H5 .mask {
+  position: fixed;
+  width: 100vw;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background: rgba(0, 0, 0, 0.5);
+  z-index: 9;
+}
+.TUIChat-H5 .mask-main {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  width: 150px;
+  background: white;
+  border-radius: 4px;
+}
+.TUIChat-H5 .mask header {
+  font-family: PingFangSC-Regular;
+  font-weight: 400;
+  font-size: 14px;
+  color: #000000;
+  letter-spacing: 0;
+  text-align: center;
+  padding: 20px 0;
+}
+.TUIChat-H5 .mask footer {
+  display: flex;
+  width: 100%;
+  justify-content: space-around;
+  border-top: 1px solid #dddddd;
+  height: 40px;
+  align-items: center;
+}
+.TUIChat-H5 .mask footer p {
+  font-family: PingFangSC-Regular;
+  font-weight: 400;
+  font-size: 14px;
+  color: #000000;
+  letter-spacing: 0;
+  text-align: center;
+}
+.TUIChat-H5 .mask footer i {
+  height: 40px;
+  width: 1px;
+  background: #dddddd;
+}

+ 1078 - 0
src/TUIKit/TUIComponents/container/TUIChat/utils/dist/utils.js

@@ -0,0 +1,1078 @@
+'use strict';
+var __assign =
+  (this && this.__assign) ||
+  function () {
+    __assign =
+      Object.assign ||
+      function (t) {
+        for (var s, i = 1, n = arguments.length; i < n; i++) {
+          s = arguments[i];
+          for (var p in s)
+            if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
+        }
+        return t;
+      };
+    return __assign.apply(this, arguments);
+  };
+var __spreadArrays =
+  (this && this.__spreadArrays) ||
+  function () {
+    for (var s = 0, i = 0, il = arguments.length; i < il; i++)
+      s += arguments[i].length;
+    for (var r = Array(s), k = 0, i = 0; i < il; i++)
+      for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
+        r[k] = a[j];
+    return r;
+  };
+var _this = this;
+exports.__esModule = true;
+exports.handleSkeletonSize =
+  exports.isMessageTip =
+  exports.throttle =
+  exports.deepCopy =
+  exports.isTypingMessage =
+  exports.JSONToObject =
+  exports.isJSON =
+  exports.handleOptions =
+  exports.isUrl =
+  exports.getImgLoad =
+  exports.translateGroupSystemNotice =
+  exports.handleCustomMessageShowContext =
+  exports.extractCallingInfoFromMessage =
+  exports.handleMergerMessageShowContext =
+  exports.handleFileMessageShowContext =
+  exports.handleAudioMessageShowContext =
+  exports.handleVideoMessageShowContext =
+  exports.handleImageMessageShowContext =
+  exports.handleLocationMessageShowContext =
+  exports.handleFaceMessageShowContext =
+  exports.handleTextMessageShowContext =
+  exports.handleTipMessageShowContext =
+  exports.handleShowLastMessage =
+  exports.handleReferenceForShow =
+  exports.handleAt =
+  exports.handleName =
+  exports.handleAvatar =
+    void 0;
+var date_1 = require('../../../utils/date');
+var decodeText_1 = require('./decodeText');
+var tim_1 = require('../../../../TUICore/tim');
+var constant_1 = require('../../constant');
+// Handling avatars
+function handleAvatar(item) {
+  var _a, _b, _c, _d, _e, _f;
+  var avatar = '';
+  switch (item.type) {
+    case tim_1['default'].TYPES.CONV_C2C:
+      avatar = isUrl(
+        (_a = item === null || item === void 0 ? void 0 : item.userProfile) ===
+          null || _a === void 0
+          ? void 0
+          : _a.avatar
+      )
+        ? (_b =
+            item === null || item === void 0 ? void 0 : item.userProfile) ===
+            null || _b === void 0
+          ? void 0
+          : _b.avatar
+        : 'https://news-info.ks3-cn-beijing.ksyuncs.com/07/1690787574969.png';
+      break;
+    case tim_1['default'].TYPES.CONV_GROUP:
+      avatar = isUrl(
+        (_c = item === null || item === void 0 ? void 0 : item.groupProfile) ===
+          null || _c === void 0
+          ? void 0
+          : _c.avatar
+      )
+        ? (_d =
+            item === null || item === void 0 ? void 0 : item.groupProfile) ===
+            null || _d === void 0
+          ? void 0
+          : _d.avatar
+        : 'https://news-info.ks3-cn-beijing.ksyuncs.com/07/1690775328089.png';
+      break;
+    case tim_1['default'].TYPES.CONV_SYSTEM:
+      avatar = isUrl(
+        (_e = item === null || item === void 0 ? void 0 : item.groupProfile) ===
+          null || _e === void 0
+          ? void 0
+          : _e.avatar
+      )
+        ? (_f =
+            item === null || item === void 0 ? void 0 : item.groupProfile) ===
+            null || _f === void 0
+          ? void 0
+          : _f.avatar
+        : 'https://web.sdk.qcloud.com/component/TUIKit/assets/group_avatar.png';
+      break;
+  }
+  return avatar;
+}
+exports.handleAvatar = handleAvatar;
+// Handling names
+function handleName(item) {
+  var _a, _b;
+  var t = window.TUIKitTUICore.config.i18n.useI18n().t;
+  var name = '';
+  switch (item.type) {
+    case tim_1['default'].TYPES.CONV_C2C:
+      name =
+        (item === null || item === void 0 ? void 0 : item.userProfile.nick) ||
+        ((_a = item === null || item === void 0 ? void 0 : item.userProfile) ===
+          null || _a === void 0
+          ? void 0
+          : _a.userID) ||
+        '';
+      break;
+    case tim_1['default'].TYPES.CONV_GROUP:
+      name =
+        item.groupProfile.name ||
+        ((_b =
+          item === null || item === void 0 ? void 0 : item.groupProfile) ===
+          null || _b === void 0
+          ? void 0
+          : _b.groupID) ||
+        '';
+      break;
+    case tim_1['default'].TYPES.CONV_SYSTEM:
+      name = t('系统通知');
+      break;
+  }
+  return name;
+}
+exports.handleName = handleName;
+// Handle whether there is someone@
+function handleAt(item) {
+  var t = window.TUIKitTUICore.config.i18n.useI18n().t;
+  var List = [
+    '[' + t('TUIConversation.有人@我') + ']',
+    '[' + t('TUIConversation.@所有人') + ']',
+    '[' +
+      t('TUIConversation.@所有人') +
+      '][' +
+      t('TUIConversation.有人@我') +
+      ']'
+  ];
+  var showAtType = '';
+  for (var index = 0; index < item.groupAtInfoList.length; index++) {
+    if (item.groupAtInfoList[index].atTypeArray[0] && item.unreadCount > 0) {
+      showAtType = List[item.groupAtInfoList[index].atTypeArray[0] - 1];
+    }
+  }
+  return showAtType;
+}
+exports.handleAt = handleAt;
+function handleReferenceForShow(message) {
+  var _a;
+  var data = {
+    referenceMessageForShow: '',
+    referenceMessageType: 0
+  };
+  if (
+    !message ||
+    !(message === null || message === void 0 ? void 0 : message.ID) ||
+    !(message === null || message === void 0 ? void 0 : message.type)
+  )
+    return data;
+  switch (message.type) {
+    case tim_1['default'].TYPES.MSG_TEXT:
+      data.referenceMessageForShow =
+        (_a =
+          message === null || message === void 0 ? void 0 : message.payload) ===
+          null || _a === void 0
+          ? void 0
+          : _a.text;
+      data.referenceMessageType = 1;
+      break;
+    case tim_1['default'].TYPES.MSG_CUSTOM:
+      data.referenceMessageForShow = '[自定义消息]';
+      data.referenceMessageType = 2;
+      break;
+    case tim_1['default'].TYPES.MSG_IMAGE:
+      data.referenceMessageForShow = '[图片]';
+      data.referenceMessageType = 3;
+      break;
+    case tim_1['default'].TYPES.MSG_AUDIO:
+      data.referenceMessageForShow = '[语音]';
+      data.referenceMessageType = 4;
+      break;
+    case tim_1['default'].TYPES.MSG_VIDEO:
+      data.referenceMessageForShow = '[视频]';
+      data.referenceMessageType = 5;
+      break;
+    case tim_1['default'].TYPES.MSG_FILE:
+      data.referenceMessageForShow = '[文件]';
+      data.referenceMessageType = 6;
+      break;
+    case tim_1['default'].TYPES.MSG_FACE:
+      data.referenceMessageForShow = '[表情]';
+      data.referenceMessageType = 8;
+      break;
+  }
+  return data;
+}
+exports.handleReferenceForShow = handleReferenceForShow;
+// Internal display of processing message box
+function handleShowLastMessage(item) {
+  var _a;
+  var t = window.TUIKitTUICore.config.i18n.useI18n().t;
+  var lastMessage = item.lastMessage;
+  var conversation = item;
+  var showNick = '';
+  var lastMessagePayload = '';
+  // Judge the number of unread messages and display them only when the message is enabled without interruption.
+  var showUnreadCount =
+    conversation.unreadCount > 0 &&
+    conversation.messageRemindType ===
+      tim_1['default'].TYPES.MSG_REMIND_ACPT_NOT_NOTE
+      ? '[' +
+        (conversation.unreadCount > 99 ? '99+' : conversation.unreadCount) +
+        t('TUIConversation.条') +
+        '] '
+      : '';
+  // Determine the lastmessage sender of the group. Namecard / Nick / userid is displayed by priority
+  if (conversation.type === tim_1['default'].TYPES.CONV_GROUP) {
+    if (lastMessage.fromAccount === conversation.groupProfile.selfInfo.userID) {
+      showNick = t('TUIConversation.我');
+    } else {
+      showNick =
+        lastMessage.nameCard || lastMessage.nick || lastMessage.fromAccount;
+    }
+  }
+  // Display content of lastmessage message body
+  if (lastMessage.type === tim_1['default'].TYPES.MSG_TEXT) {
+    lastMessagePayload = lastMessage.payload.text;
+  } else if (lastMessage.type === tim_1['default'].TYPES.MSG_CUSTOM) {
+    var data = JSONToObject(
+      (_a =
+        lastMessage === null || lastMessage === void 0
+          ? void 0
+          : lastMessage.payload) === null || _a === void 0
+        ? void 0
+        : _a.data
+    );
+    if ((data === null || data === void 0 ? void 0 : data.businessID) === 1) {
+      lastMessagePayload = extractCallingInfoFromMessage(lastMessage);
+      return lastMessagePayload;
+    }
+    lastMessagePayload = lastMessage.messageForShow;
+  } else {
+    lastMessagePayload = lastMessage.messageForShow;
+  }
+  if (lastMessage.isRevoked) {
+    lastMessagePayload = t('TUIChat.撤回了一条消息');
+  }
+  if (
+    conversation.type === tim_1['default'].TYPES.CONV_GROUP &&
+    lastMessage.type === tim_1['default'].TYPES.MSG_GRP_TIP
+  ) {
+    return lastMessagePayload;
+  }
+  // Specific display content of message box
+  return (
+    '' + showUnreadCount + (showNick ? showNick + ':' : '') + lastMessagePayload
+  );
+}
+exports.handleShowLastMessage = handleShowLastMessage;
+// Handling system tip message display
+function handleTipMessageShowContext(message) {
+  var _a, _b, _c, _d, _e, _f, _g, _h, _j;
+  var t = window.TUIKitTUICore.config.i18n.useI18n().t;
+  var options = {
+    message: message,
+    text: ''
+  };
+  var userName =
+    (message === null || message === void 0 ? void 0 : message.nick) ||
+    ((_b =
+      (_a =
+        message === null || message === void 0 ? void 0 : message.payload) ===
+        null || _a === void 0
+        ? void 0
+        : _a.userIDList) === null || _b === void 0
+      ? void 0
+      : _b.join(','));
+  if (
+    ((_d =
+      (_c =
+        message === null || message === void 0 ? void 0 : message.payload) ===
+        null || _c === void 0
+        ? void 0
+        : _c.memberList) === null || _d === void 0
+      ? void 0
+      : _d.length) > 0
+  ) {
+    userName = '';
+    (_f =
+      (_e =
+        message === null || message === void 0 ? void 0 : message.payload) ===
+        null || _e === void 0
+        ? void 0
+        : _e.memberList) === null || _f === void 0
+      ? void 0
+      : _f.map(function (user) {
+          userName +=
+            ((user === null || user === void 0 ? void 0 : user.nick) ||
+              (user === null || user === void 0 ? void 0 : user.userID)) + ',';
+        });
+    userName =
+      userName === null || userName === void 0 ? void 0 : userName.slice(0, -1);
+  }
+  if (
+    (message === null || message === void 0 ? void 0 : message.type) ===
+    ((_g =
+      tim_1['default'] === null || tim_1['default'] === void 0
+        ? void 0
+        : tim_1['default'].TYPES) === null || _g === void 0
+      ? void 0
+      : _g.MSG_GRP_TIP)
+  ) {
+    switch (message.payload.operationType) {
+      case tim_1['default'].TYPES.GRP_TIP_MBR_JOIN:
+        options.text = userName + ' ' + t('message.tip.加入群组');
+        break;
+      case tim_1['default'].TYPES.GRP_TIP_MBR_QUIT:
+        options.text =
+          t('message.tip.群成员') +
+          '\uFF1A' +
+          userName +
+          ' ' +
+          t('message.tip.退出群组');
+        break;
+      case tim_1['default'].TYPES.GRP_TIP_MBR_KICKED_OUT:
+        options.text =
+          t('message.tip.群成员') +
+          '\uFF1A' +
+          userName +
+          ' ' +
+          t('message.tip.被') +
+          message.payload.operatorID +
+          t('message.tip.踢出群组');
+        break;
+      case tim_1['default'].TYPES.GRP_TIP_MBR_SET_ADMIN:
+        options.text =
+          t('message.tip.群成员') +
+          '\uFF1A' +
+          userName +
+          ' ' +
+          t('message.tip.成为管理员');
+        break;
+      case tim_1['default'].TYPES.GRP_TIP_MBR_CANCELED_ADMIN:
+        options.text =
+          t('message.tip.群成员') +
+          '\uFF1A' +
+          userName +
+          ' ' +
+          t('message.tip.被撤销管理员');
+        break;
+      case tim_1['default'].TYPES.GRP_TIP_GRP_PROFILE_UPDATED:
+        // options.text =  `${userName} 修改群组资料`;
+        options.text = handleTipGrpUpdated(message);
+        break;
+      case tim_1['default'].TYPES.GRP_TIP_MBR_PROFILE_UPDATED:
+        for (
+          var _i = 0, _k = message.payload.memberList;
+          _i < _k.length;
+          _i++
+        ) {
+          var member = _k[_i];
+          if (member.muteTime > 0) {
+            options.text =
+              t('message.tip.群成员') +
+              '\uFF1A' +
+              member.userID +
+              t('message.tip.被禁言');
+          } else {
+            options.text =
+              t('message.tip.群成员') +
+              '\uFF1A' +
+              member.userID +
+              t('message.tip.被取消禁言');
+          }
+        }
+        break;
+      default:
+        options.text = '[' + t('message.tip.群提示消息') + ']';
+        break;
+    }
+  } else if (
+    ((_h =
+      message === null || message === void 0 ? void 0 : message.payload) ===
+      null || _h === void 0
+      ? void 0
+      : _h.data) === 'group_create'
+  ) {
+    options.text =
+      (_j =
+        message === null || message === void 0 ? void 0 : message.payload) ===
+        null || _j === void 0
+        ? void 0
+        : _j.extension;
+  } else {
+    options.text = extractCallingInfoFromMessage(message);
+  }
+  return options;
+}
+exports.handleTipMessageShowContext = handleTipMessageShowContext;
+function handleTipGrpUpdated(message) {
+  var t = window.TUIKitTUICore.config.i18n.useI18n().t;
+  var payload = message.payload;
+  var newGroupProfile = payload.newGroupProfile;
+  var operatorID = payload.operatorID;
+  var text = '';
+  if ('muteAllMembers' in newGroupProfile) {
+    if (newGroupProfile['muteAllMembers']) {
+      text =
+        t('message.tip.管理员') +
+        ' ' +
+        operatorID +
+        ' ' +
+        t('message.tip.开启全员禁言');
+    } else {
+      text =
+        t('message.tip.管理员') +
+        ' ' +
+        operatorID +
+        ' ' +
+        t('message.tip.取消全员禁言');
+    }
+  } else if ('ownerID' in newGroupProfile) {
+    text = newGroupProfile['ownerID'] + ' ' + t('message.tip.成为新的群主');
+  } else if ('groupName' in newGroupProfile) {
+    text =
+      operatorID +
+      ' ' +
+      t('message.tip.修改群名为') +
+      ' ' +
+      newGroupProfile['groupName'];
+  } else if ('notification' in newGroupProfile) {
+    text = operatorID + ' ' + t('message.tip.发布新公告');
+  }
+  return text;
+}
+// Parsing and handling text message display
+function handleTextMessageShowContext(item) {
+  var options = {
+    text: decodeText_1.decodeText(item.payload)
+  };
+  return options;
+}
+exports.handleTextMessageShowContext = handleTextMessageShowContext;
+// Parsing and handling face message display
+function handleFaceMessageShowContext(item) {
+  var face = {
+    message: item,
+    name: '',
+    url: ''
+  };
+  face.name = item.payload.data;
+  if (item.payload.data.indexOf('@2x') < 0) {
+    face.name = face.name + '@2x';
+  }
+  face.url =
+    'https://web.sdk.qcloud.com/im/assets/face-elem/' + face.name + '.png';
+  return face;
+}
+exports.handleFaceMessageShowContext = handleFaceMessageShowContext;
+// Parsing and handling location message display
+function handleLocationMessageShowContext(item) {
+  var location = {
+    lon: '',
+    lat: '',
+    href: '',
+    url: '',
+    description: '',
+    message: item
+  };
+  location.lon = item.payload.longitude.toFixed(6);
+  location.lat = item.payload.latitude.toFixed(6);
+  location.href =
+    'https://map.qq.com/?type=marker&isopeninfowin=1&markertype=1&' +
+    ('pointx=' +
+      location.lon +
+      '&pointy=' +
+      location.lat +
+      '&name=' +
+      item.payload.description);
+  location.url =
+    'https://apis.map.qq.com/ws/staticmap/v2/?' +
+    ('center=' +
+      location.lat +
+      ',' +
+      location.lon +
+      '&zoom=10&size=300*150&maptype=roadmap&') +
+    ('markers=size:large|color:0xFFCCFF|label:k|' +
+      location.lat +
+      ',' +
+      location.lon +
+      '&') +
+    'key=UBNBZ-PTP3P-TE7DB-LHRTI-Y4YLE-VWBBD';
+  location.description = item.payload.description;
+  return location;
+}
+exports.handleLocationMessageShowContext = handleLocationMessageShowContext;
+// Parsing and handling image message display
+function handleImageMessageShowContext(item) {
+  return {
+    progress:
+      (item === null || item === void 0 ? void 0 : item.status) === 'unSend' &&
+      item.progress,
+    url: item.payload.imageInfoArray[1].url,
+    width: item.payload.imageInfoArray[0].width,
+    height: item.payload.imageInfoArray[0].height,
+    message: item
+  };
+}
+exports.handleImageMessageShowContext = handleImageMessageShowContext;
+// Parsing and handling video message display
+function handleVideoMessageShowContext(item) {
+  var _a, _b, _c, _d;
+  return {
+    progress:
+      (item === null || item === void 0 ? void 0 : item.status) === 'unSend' &&
+      (item === null || item === void 0 ? void 0 : item.progress),
+    url:
+      (_a = item === null || item === void 0 ? void 0 : item.payload) ===
+        null || _a === void 0
+        ? void 0
+        : _a.videoUrl,
+    snapshotUrl:
+      (_b = item === null || item === void 0 ? void 0 : item.payload) ===
+        null || _b === void 0
+        ? void 0
+        : _b.snapshotUrl,
+    snapshotWidth:
+      (_c = item === null || item === void 0 ? void 0 : item.payload) ===
+        null || _c === void 0
+        ? void 0
+        : _c.snapshotWidth,
+    snapshotHeight:
+      (_d = item === null || item === void 0 ? void 0 : item.payload) ===
+        null || _d === void 0
+        ? void 0
+        : _d.snapshotHeight,
+    message: item
+  };
+}
+exports.handleVideoMessageShowContext = handleVideoMessageShowContext;
+// Parsing and handling audio message display
+function handleAudioMessageShowContext(item) {
+  return {
+    progress:
+      (item === null || item === void 0 ? void 0 : item.status) === 'unSend' &&
+      item.progress,
+    url: item.payload.url,
+    message: item,
+    second: item.payload.second
+  };
+}
+exports.handleAudioMessageShowContext = handleAudioMessageShowContext;
+// Parsing and handling file message display
+function handleFileMessageShowContext(item) {
+  var size = '';
+  if (item.payload.fileSize >= 1024 * 1024) {
+    size = (item.payload.fileSize / (1024 * 1024)).toFixed(2) + ' Mb';
+  } else if (item.payload.fileSize >= 1024) {
+    size = (item.payload.fileSize / 1024).toFixed(2) + ' Kb';
+  } else {
+    size = item.payload.fileSize.toFixed(2) + 'B';
+  }
+  return {
+    progress:
+      (item === null || item === void 0 ? void 0 : item.status) === 'unSend' &&
+      item.progress,
+    url: item.payload.fileUrl,
+    message: item,
+    name: item.payload.fileName,
+    size: size
+  };
+}
+exports.handleFileMessageShowContext = handleFileMessageShowContext;
+// Parsing and handling merger message display
+function handleMergerMessageShowContext(item) {
+  return __assign({ message: item }, item.payload);
+}
+exports.handleMergerMessageShowContext = handleMergerMessageShowContext;
+// Parse audio and video call messages
+function extractCallingInfoFromMessage(message) {
+  var _a, _b;
+  var t = window.TUIKitTUICore.config.i18n.useI18n().t;
+  var callingMessage = {};
+  var objectData = {};
+  try {
+    callingMessage = JSONToObject(
+      (_a =
+        message === null || message === void 0 ? void 0 : message.payload) ===
+        null || _a === void 0
+        ? void 0
+        : _a.data
+    );
+  } catch (error) {
+    callingMessage = {};
+  }
+  if (callingMessage.businessID !== 1) {
+    return '';
+  }
+  try {
+    objectData = JSONToObject(callingMessage.data);
+  } catch (error) {
+    objectData = {};
+  }
+  var inviteeList = '';
+  (_b =
+    callingMessage === null || callingMessage === void 0
+      ? void 0
+      : callingMessage.inviteeList) === null || _b === void 0
+    ? void 0
+    : _b.forEach(function (userID, index) {
+        var _a;
+        if (
+          index <
+          ((_a =
+            callingMessage === null || callingMessage === void 0
+              ? void 0
+              : callingMessage.inviteeList) === null || _a === void 0
+            ? void 0
+            : _a.length) -
+            1
+        ) {
+          inviteeList += '"' + userID + '"\u3001';
+        } else {
+          inviteeList += '"' + userID + '" ';
+        }
+      });
+  var inviter =
+    '"' +
+    (callingMessage === null || callingMessage === void 0
+      ? void 0
+      : callingMessage.inviter) +
+    '" ';
+  switch (callingMessage.actionType) {
+    case 1: {
+      if (objectData.call_end >= 0 && !callingMessage.groupID) {
+        return (
+          t('message.custom.通话时长') +
+          '\uFF1A' +
+          date_1.formatTime(objectData.call_end)
+        );
+      }
+      if (callingMessage.groupID && callingMessage.timeout > 0) {
+        return '' + inviter + t('message.custom.发起通话');
+      }
+      if (callingMessage.groupID) {
+        return '' + t('message.custom.结束群聊');
+      }
+      if (objectData.data && objectData.data.cmd === 'switchToAudio') {
+        return '' + t('message.custom.切换语音通话');
+      }
+      if (objectData.data && objectData.data.cmd === 'switchToVideo') {
+        return '' + t('message.custom.切换视频通话');
+      }
+      return '' + t('message.custom.发起通话');
+    }
+    case 2:
+      return (
+        '' +
+        (callingMessage.groupID ? inviter : '') +
+        t('message.custom.取消通话')
+      );
+    case 3:
+      if (objectData.data && objectData.data.cmd === 'switchToAudio') {
+        return '' + t('message.custom.切换语音通话');
+      }
+      if (objectData.data && objectData.data.cmd === 'switchToVideo') {
+        return '' + t('message.custom.切换视频通话');
+      }
+      return (
+        '' +
+        (callingMessage.groupID ? inviteeList : '') +
+        t('message.custom.已接听')
+      );
+    case 4:
+      return (
+        '' +
+        (callingMessage.groupID ? inviteeList : '') +
+        t('message.custom.拒绝通话')
+      );
+    case 5:
+      if (objectData.data && objectData.data.cmd === 'switchToAudio') {
+        return '' + t('message.custom.切换语音通话');
+      }
+      if (objectData.data && objectData.data.cmd === 'switchToVideo') {
+        return '' + t('message.custom.切换视频通话');
+      }
+      return (
+        '' +
+        (callingMessage.groupID ? inviteeList : '') +
+        t('message.custom.无应答')
+      );
+    default:
+      return '';
+  }
+}
+exports.extractCallingInfoFromMessage = extractCallingInfoFromMessage;
+// Parsing and handling custom message display
+function handleCustomMessageShowContext(item) {
+  var _a;
+  var t = window.TUIKitTUICore.config.i18n.useI18n().t;
+  var payloadObj = JSONToObject(
+    (_a = item === null || item === void 0 ? void 0 : item.payload) === null ||
+      _a === void 0
+      ? void 0
+      : _a.data
+  );
+  if (
+    (payloadObj === null || payloadObj === void 0
+      ? void 0
+      : payloadObj.businessID) === constant_1['default'].typeEvaluate
+  ) {
+    if (
+      !(
+        (payloadObj === null || payloadObj === void 0
+          ? void 0
+          : payloadObj.score) > 0
+      )
+    ) {
+      payloadObj.score = 1;
+      item.payload.data = JSON.stringify(payloadObj);
+    }
+  }
+  return {
+    message: item,
+    custom:
+      extractCallingInfoFromMessage(item) ||
+      '[' + t('message.custom.自定义消息') + ']'
+  };
+}
+exports.handleCustomMessageShowContext = handleCustomMessageShowContext;
+// Parsing and handling system message display
+function translateGroupSystemNotice(message) {
+  var t = window.TUIKitTUICore.config.i18n.useI18n().t;
+  var groupName =
+    message.payload.groupProfile.name || message.payload.groupProfile.groupID;
+  switch (message.payload.operationType) {
+    case 1:
+      return (
+        message.payload.operatorID +
+        ' ' +
+        t('message.tip.申请加入群组') +
+        '\uFF1A' +
+        groupName
+      );
+    case 2:
+      return t('message.tip.成功加入群组') + '\uFF1A' + groupName;
+    case 3:
+      return (
+        t('message.tip.申请加入群组') +
+        '\uFF1A' +
+        groupName +
+        ' ' +
+        t('message.tip.被拒绝')
+      );
+    case 4:
+      return (
+        '' +
+        t('message.tip.你被管理员') +
+        message.payload.operatorID +
+        ' ' +
+        t('message.tip.踢出群组') +
+        '\uFF1A' +
+        groupName
+      );
+    case 5:
+      return (
+        t('message.tip.群') +
+        '\uFF1A' +
+        groupName +
+        ' ' +
+        t('message.tip.被') +
+        ' ' +
+        message.payload.operatorID +
+        ' ' +
+        t('message.tip.解散')
+      );
+    case 6:
+      return (
+        message.payload.operatorID +
+        ' ' +
+        t('message.tip.创建群') +
+        '\uFF1A' +
+        groupName
+      );
+    case 7:
+      return (
+        message.payload.operatorID +
+        ' ' +
+        t('message.tip.邀请你加群') +
+        '\uFF1A' +
+        groupName
+      );
+    case 8:
+      return t('message.tip.你退出群组') + '\uFF1A' + groupName;
+    case 9:
+      return (
+        '' +
+        t('message.tip.你被') +
+        message.payload.operatorID +
+        ' ' +
+        t('message.tip.设置为群') +
+        '\uFF1A' +
+        groupName +
+        ' ' +
+        t('message.tip.的管理员')
+      );
+    case 10:
+      return (
+        '' +
+        t('message.tip.你被') +
+        message.payload.operatorID +
+        ' ' +
+        t('message.tip.撤销群') +
+        '\uFF1A' +
+        groupName +
+        ' ' +
+        t('message.tip.的管理员身份')
+      );
+    case 12:
+      return (
+        message.payload.operatorID +
+        ' ' +
+        t('message.tip.邀请你加群') +
+        '\uFF1A' +
+        groupName
+      );
+    case 13:
+      return (
+        message.payload.operatorID +
+        ' ' +
+        t('message.tip.同意加群') +
+        '\uFF1A' +
+        groupName
+      );
+    case 14:
+      return (
+        message.payload.operatorID +
+        ' ' +
+        t('message.tip.拒接加群') +
+        '\uFF1A' +
+        groupName
+      );
+    case 255:
+      return (
+        t('message.tip.自定义群系统通知') +
+        ': ' +
+        message.payload.userDefinedField
+      );
+  }
+}
+exports.translateGroupSystemNotice = translateGroupSystemNotice;
+// Image loading complete
+function getImgLoad(container, className, callback) {
+  var images =
+    (container === null || container === void 0
+      ? void 0
+      : container.querySelectorAll('.' + className)) || [];
+  var promiseList = Array.prototype.slice.call(images).map(function (node) {
+    return new Promise(function (resolve, reject) {
+      node.onload = function () {
+        resolve(node);
+      };
+      node.onloadeddata = function () {
+        resolve(node);
+      };
+      node.onprogress = function () {
+        resolve(node);
+      };
+      if (node.complete) {
+        resolve(node);
+      }
+    });
+  });
+  return Promise.all(promiseList)
+    .then(function () {
+      callback && callback();
+    })
+    ['catch'](function (e) {
+      console.error('网络异常', e);
+    });
+}
+exports.getImgLoad = getImgLoad;
+// Determine whether it is url
+function isUrl(url) {
+  return /^(https?:\/\/(([a-zA-Z0-9]+-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+)(:\d+)?(\/.*)?(\?.*)?(#.*)?$/.test(
+    url
+  );
+}
+exports.isUrl = isUrl;
+// Handling custom message options
+function handleOptions(businessID, version, other) {
+  return __assign({ businessID: businessID, version: version }, other);
+}
+exports.handleOptions = handleOptions;
+// Determine if it is a JSON string
+function isJSON(str) {
+  // eslint-disable-next-line no-useless-escape
+  if (typeof str === 'string') {
+    try {
+      var data = JSON.parse(str);
+      if (data) {
+        return true;
+      }
+      return false;
+    } catch (error) {
+      return false;
+    }
+  }
+  return false;
+}
+exports.isJSON = isJSON;
+// Determine if it is a JSON string
+function JSONToObject(str) {
+  if (!str || !isJSON(str)) {
+    return str;
+  }
+  return JSON.parse(str);
+}
+exports.JSONToObject = JSONToObject;
+// Determine if it is a typing message
+function isTypingMessage(item) {
+  var _a;
+  if (!item) return false;
+  try {
+    var businessID = JSONToObject(
+      (_a = item === null || item === void 0 ? void 0 : item.payload) ===
+        null || _a === void 0
+        ? void 0
+        : _a.data
+    ).businessID;
+    if (businessID === constant_1['default'].typeUserTyping) return true;
+  } catch (_b) {
+    return false;
+  }
+  return false;
+}
+exports.isTypingMessage = isTypingMessage;
+function deepCopy(data, hash) {
+  if (hash === void 0) {
+    hash = new WeakMap();
+  }
+  if (typeof data !== 'object' || data === null) {
+    throw new TypeError('传入参数不是对象');
+  }
+  if (hash.has(data)) {
+    return hash.get(data);
+  }
+  var newData = Object.create(Object.getPrototypeOf(data));
+  var dataKeys = Object.keys(data);
+  dataKeys.forEach(function (value) {
+    var currentDataValue = data[value];
+    if (typeof currentDataValue !== 'object' || currentDataValue === null) {
+      newData[value] = currentDataValue;
+    } else if (Array.isArray(currentDataValue)) {
+      newData[value] = __spreadArrays(currentDataValue);
+    } else if (currentDataValue instanceof Set) {
+      newData[value] = new Set(__spreadArrays(currentDataValue));
+    } else if (currentDataValue instanceof Map) {
+      newData[value] = new Map(__spreadArrays(currentDataValue));
+    } else {
+      hash.set(data, data);
+      newData[value] = deepCopy(currentDataValue, hash);
+    }
+  });
+  return newData;
+}
+exports.deepCopy = deepCopy;
+exports.throttle = function (fn) {
+  var isRunning = false;
+  return function () {
+    var args = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+      args[_i] = arguments[_i];
+    }
+    if (isRunning) return;
+    setTimeout(function () {
+      fn.apply(_this, args);
+      isRunning = false;
+    }, 100);
+  };
+};
+exports.isMessageTip = function (message) {
+  var _a, _b, _c, _d, _e, _f, _g, _h;
+  if (
+    (message === null || message === void 0 ? void 0 : message.type) ===
+      ((_a =
+        tim_1['default'] === null || tim_1['default'] === void 0
+          ? void 0
+          : tim_1['default'].TYPES) === null || _a === void 0
+        ? void 0
+        : _a.MSG_GRP_TIP) ||
+    ((message === null || message === void 0 ? void 0 : message.type) ===
+      ((_b =
+        tim_1['default'] === null || tim_1['default'] === void 0
+          ? void 0
+          : tim_1['default'].TYPES) === null || _b === void 0
+        ? void 0
+        : _b.MSG_CUSTOM) &&
+      (message === null || message === void 0
+        ? void 0
+        : message.conversationType) ===
+        ((_c =
+          tim_1['default'] === null || tim_1['default'] === void 0
+            ? void 0
+            : tim_1['default'].TYPES) === null || _c === void 0
+          ? void 0
+          : _c.CONV_GROUP) &&
+      ((_e = JSONToObject(
+        (_d =
+          message === null || message === void 0 ? void 0 : message.payload) ===
+          null || _d === void 0
+          ? void 0
+          : _d.data
+      )) === null || _e === void 0
+        ? void 0
+        : _e.businessID) ===
+        (constant_1['default'] === null || constant_1['default'] === void 0
+          ? void 0
+          : constant_1['default'].TYPE_CALL_MESSAGE)) ||
+    ((message === null || message === void 0 ? void 0 : message.type) ===
+      ((_f =
+        tim_1['default'] === null || tim_1['default'] === void 0
+          ? void 0
+          : tim_1['default'].TYPES) === null || _f === void 0
+        ? void 0
+        : _f.MSG_CUSTOM) &&
+      (message === null || message === void 0
+        ? void 0
+        : message.conversationType) ===
+        ((_g =
+          tim_1['default'] === null || tim_1['default'] === void 0
+            ? void 0
+            : tim_1['default'].TYPES) === null || _g === void 0
+          ? void 0
+          : _g.CONV_GROUP) &&
+      ((_h =
+        message === null || message === void 0 ? void 0 : message.payload) ===
+        null || _h === void 0
+        ? void 0
+        : _h.data) === 'group_create')
+  ) {
+    return true;
+  }
+  return false;
+};
+exports.handleSkeletonSize = function (width, height, maxWidth, maxHeight) {
+  var widthToHeight = width / height;
+  var maxWidthToHeight = maxWidth / maxHeight;
+  if (width <= maxWidth && height <= maxHeight) {
+    return { width: width, height: height };
+  } else if (
+    (width <= maxWidth && height > maxHeight) ||
+    (width > maxWidth &&
+      height > maxHeight &&
+      widthToHeight <= maxWidthToHeight)
+  ) {
+    return { width: width * (maxHeight / height), height: maxHeight };
+  } else {
+    return { width: maxWidth, height: height * (maxWidth / width) };
+  }
+};

+ 796 - 0
src/TUIKit/TUIComponents/container/TUIContact/dist/server.js

@@ -0,0 +1,796 @@
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __generator = (this && this.__generator) || function (thisArg, body) {
+    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+    function verb(n) { return function (v) { return step([n, v]); }; }
+    function step(op) {
+        if (f) throw new TypeError("Generator is already executing.");
+        while (_) try {
+            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+            if (y = 0, t) op = [op[0] & 2, t.value];
+            switch (op[0]) {
+                case 0: case 1: t = op; break;
+                case 4: _.label++; return { value: op[1], done: false };
+                case 5: _.label++; y = op[1]; op = [0]; continue;
+                case 7: op = _.ops.pop(); _.trys.pop(); continue;
+                default:
+                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+                    if (t[2]) _.ops.pop();
+                    _.trys.pop(); continue;
+            }
+            op = body.call(thisArg, _);
+        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+    }
+};
+exports.__esModule = true;
+var IComponentServer_1 = require("../IComponentServer");
+var store = {};
+/**
+ * class TUIContactServer
+ *
+ * TUIGroup 逻辑主体
+ */
+var TUIContactServer = /** @class */ (function (_super) {
+    __extends(TUIContactServer, _super);
+    function TUIContactServer(TUICore) {
+        var _this = _super.call(this) || this;
+        _this.currentStore = {};
+        _this.TUICore = TUICore;
+        _this.bindTIMEvent();
+        _this.store = TUICore.setComponentStore('TUIContact', store, _this.updateStore.bind(_this));
+        return _this;
+    }
+    /**
+     * 组件销毁
+     * destroy
+     */
+    TUIContactServer.prototype.destroyed = function () {
+        this.unbindTIMEvent();
+    };
+    /**
+     * 数据监听回调
+     * data listener callback
+     *
+     * @param {any} newValue 新数据/new value
+     * @param {any} oldValue 旧数据/old value
+     */
+    TUIContactServer.prototype.updateStore = function (newValue, oldValue) {
+        this.currentStore.groupList = newValue.groupList;
+        this.currentStore.searchGroup = newValue.searchGroup;
+        this.currentStore.systemConversation = newValue.systemConversation;
+        this.currentStore.systemMessageList = newValue.systemMessageList;
+    };
+    /**
+     * /////////////////////////////////////////////////////////////////////////////////
+     * //
+     * //                                    TIM 事件监听注册接口
+     * //                        TIM Event listener registration interface
+     * //
+     * /////////////////////////////////////////////////////////////////////////////////
+     */
+    TUIContactServer.prototype.bindTIMEvent = function () {
+        this.TUICore.tim.on(this.TUICore.TIM.EVENT.GROUP_LIST_UPDATED, this.handleGroupListUpdated, this);
+        this.TUICore.tim.on(this.TUICore.TIM.EVENT.GROUP_ATTRIBUTES_UPDATED, this.handleGroupAttributesUpdated, this);
+        this.TUICore.tim.on(this.TUICore.TIM.EVENT.CONVERSATION_LIST_UPDATED, this.handleConversationListUpdate, this);
+        this.TUICore.tim.on(this.TUICore.TIM.EVENT.FRIEND_LIST_UPDATED, this.handleFriendListUpdated, this);
+        this.TUICore.tim.on(this.TUICore.TIM.EVENT.USER_STATUS_UPDATED, this.handleUserStatusUpdated, this);
+    };
+    TUIContactServer.prototype.unbindTIMEvent = function () {
+        this.TUICore.tim.off(this.TUICore.TIM.EVENT.GROUP_LIST_UPDATED, this.handleGroupListUpdated);
+        this.TUICore.tim.off(this.TUICore.TIM.EVENT.GROUP_ATTRIBUTES_UPDATED, this.handleGroupAttributesUpdated);
+        this.TUICore.tim.off(this.TUICore.TIM.EVENT.CONVERSATION_LIST_UPDATED, this.handleConversationListUpdate);
+        this.TUICore.tim.off(this.TUICore.TIM.EVENT.FRIEND_LIST_UPDATED, this.handleFriendListUpdated);
+        this.TUICore.tim.off(this.TUICore.TIM.EVENT.USER_STATUS_UPDATED, this.handleUserStatusUpdated);
+    };
+    TUIContactServer.prototype.handleGroupListUpdated = function (event) {
+        this.store.groupList = event.data;
+    };
+    TUIContactServer.prototype.handleGroupAttributesUpdated = function (event) {
+        var _a = event.data, groupID = _a.groupID, groupAttributes = _a.groupAttributes;
+        console.log(groupID, groupAttributes);
+    };
+    TUIContactServer.prototype.handleConversationListUpdate = function (res) {
+        this.handleFilterSystem(res.data);
+    };
+    TUIContactServer.prototype.handleFriendListUpdated = function (event) {
+        this.currentStore.friendList = event.data;
+        this.currentStore.userIDList = this.currentStore.friendList.map(function (item) { return item.userID; });
+    };
+    TUIContactServer.prototype.handleUserStatusUpdated = function (event) {
+        var _this = this;
+        var userStatusList = event.data;
+        userStatusList.forEach(function (item) {
+            var _a, _b, _c, _d, _e, _f, _g;
+            var userID = item.userID, statusType = item.statusType, customStatus = item.customStatus;
+            (_b = (_a = _this.currentStore) === null || _a === void 0 ? void 0 : _a.userStatusList) === null || _b === void 0 ? void 0 : _b.set(userID, { statusType: statusType, customStatus: customStatus });
+            (_g = (_f = (_e = (_d = (_c = _this.TUICore) === null || _c === void 0 ? void 0 : _c.TUIServer) === null || _d === void 0 ? void 0 : _d.TUIConversation) === null || _e === void 0 ? void 0 : _e.currentStore) === null || _f === void 0 ? void 0 : _f.userStatusList) === null || _g === void 0 ? void 0 : _g.set(userID, { statusType: statusType, customStatus: customStatus });
+        });
+    };
+    /**
+     * /////////////////////////////////////////////////////////////////////////////////
+     * //
+     * //                                 处理 TIM 接口参数及回调
+     * //                     Handling TIM interface parameters and callbacks
+     * //
+     * /////////////////////////////////////////////////////////////////////////////////
+     */
+    /**
+     * 处理异步函数
+     * Handling asynchronous functions
+     *
+     * @param {callback} callback 回调函数/callback
+     * @returns {Promise} 返回异步函数/return callback
+     */
+    TUIContactServer.prototype.handlePromiseCallback = function (callback) {
+        var _this = this;
+        return new Promise(function (resolve, reject) {
+            var config = {
+                TUIName: 'TUIContact',
+                callback: function () {
+                    callback && callback(resolve, reject);
+                }
+            };
+            _this.TUICore.setAwaitFunc(config.TUIName, config.callback);
+        });
+    };
+    /**
+     * 处理conversationList
+     * Handle conversation list
+     *
+     * @param {Array} list conversationList
+     * @returns {Object}
+     */
+    TUIContactServer.prototype.handleFilterSystem = function (list) {
+        var _this = this;
+        var options = {
+            allConversationList: list,
+            systemConversationList: []
+        };
+        options.systemConversationList = list.filter(function (item) { return item.type === _this.TUICore.TIM.TYPES.CONV_SYSTEM; });
+        this.store.allConversationList = options.allConversationList;
+        this.store.systemConversationList = options.systemConversationList;
+        var systemConversation = options.systemConversationList[0];
+        this.store.systemConversation = systemConversation;
+        return options;
+    };
+    /**
+     * /////////////////////////////////////////////////////////////////////////////////
+     * //
+     * //                                 对外方法
+     * //                               TIM methods
+     * //
+     * /////////////////////////////////////////////////////////////////////////////////
+     */
+    /*
+     * 获取 conversationList
+     * Get conversation list
+     *
+     * @returns {Promise}
+     */
+    TUIContactServer.prototype.getConversationList = function () {
+        return __awaiter(this, void 0, void 0, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_1;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.getConversationList()];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    this.handleFilterSystem(imResponse.data.conversationList);
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_1 = _a.sent();
+                                    reject(error_1);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 获取系统通知 messageList
+     * Get system messages
+     *
+     * @returns {Promise}
+     */
+    TUIContactServer.prototype.getSystemMessageList = function () {
+        return __awaiter(this, void 0, void 0, function () {
+            var options;
+            var _this = this;
+            return __generator(this, function (_a) {
+                options = {
+                    conversationID: this.store.systemConversation.conversationID,
+                    count: 15
+                };
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_2;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.getMessageList(options)];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    this.store.systemMessageList = imResponse.data.messageList;
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_2 = _a.sent();
+                                    reject(error_2);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 设置已读
+     * Set message read
+     *
+     * @param {string} conversationID 会话ID/ conversation's ID
+     * @returns {Promise}
+     */
+    TUIContactServer.prototype.setMessageRead = function () {
+        return __awaiter(this, void 0, void 0, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_3;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.setMessageRead({
+                                            conversationID: this.store.systemConversation.conversationID
+                                        })];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_3 = _a.sent();
+                                    reject(error_3);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 获取群组列表
+     * Get group list
+     *
+     * @param {any} options 参数/options
+     * @param {Array.<String>} options.groupProfileFilter 群资料过滤器/group profile filter
+     * @returns {Promise}
+     */
+    TUIContactServer.prototype.getGroupList = function (options) {
+        return __awaiter(this, void 0, void 0, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_4;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 5, , 6]);
+                                    imResponse = {};
+                                    if (!!options) return [3 /*break*/, 2];
+                                    return [4 /*yield*/, this.TUICore.tim.getGroupList()];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    return [3 /*break*/, 4];
+                                case 2: return [4 /*yield*/, this.TUICore.tim.getGroupList(options)];
+                                case 3:
+                                    imResponse = _a.sent();
+                                    _a.label = 4;
+                                case 4:
+                                    this.store.groupList = imResponse.data.groupList;
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 6];
+                                case 5:
+                                    error_4 = _a.sent();
+                                    reject(error_4);
+                                    return [3 /*break*/, 6];
+                                case 6: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 获取群组属性
+     * Get group profile
+     *
+     * @param {any} options 参数/options
+     * @param {String} options.groupID 群组ID/group's ID
+     * @param {Array.<String>} options.groupProfileFilter 群资料过滤器/group profile filter
+     * @returns {Promise}
+     */
+    TUIContactServer.prototype.getGroupProfile = function (options) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var imResponse, error_5;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        return [4 /*yield*/, this.TUICore.tim.getGroupProfile(options)];
+                    case 1:
+                        imResponse = _a.sent();
+                        this.store.groupList = imResponse.data.groupList;
+                        resolve(imResponse);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_5 = _a.sent();
+                        reject(error_5);
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 删除群组
+     * Dismiss group
+     *
+     * @param {String} groupID 群组ID/group's ID
+     * @returns {Promise}
+     */
+    TUIContactServer.prototype.dismissGroup = function (groupID) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var imResponse, error_6;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        return [4 /*yield*/, this.TUICore.tim.dismissGroup(groupID)];
+                    case 1:
+                        imResponse = _a.sent();
+                        this.store.groupProfile = imResponse.data.group;
+                        resolve(imResponse);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_6 = _a.sent();
+                        reject(error_6);
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 修改群组资料
+     * Update group profile
+     *
+     * @param {any} options 参数/params options
+     * @param {String} options.groupID 群组ID/group's ID
+     * @param {String} options.name 群组名称/group's name
+     * @param {String} options.introduction 群简介/group's introduction
+     * @param {String} options.notification 群公告/group's notification
+     * @param {String} options.avatar 群头像 URL/group's avatar url
+     * @param {Number} options.maxMemberNum 最大群成员数量/the max number of group's member
+     * @param {Number} options.joinOption 申请加群处理方式/group's join options
+     * @param {Array.<Object>} options.groupCustomField 群组维度的自定义字段/custom fields for group dimensions
+     * @returns {Promise}
+     */
+    TUIContactServer.prototype.updateGroupProfile = function (options) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var imResponse, error_7;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        return [4 /*yield*/, this.TUICore.tim.updateGroupProfile(options)];
+                    case 1:
+                        imResponse = _a.sent();
+                        this.store.groupProfile = imResponse.data.group;
+                        resolve(imResponse);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_7 = _a.sent();
+                        reject(error_7);
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 申请加群
+     * Join group
+     *
+     * @param {any} options 参数/options
+     * @param {String} options.groupID 群组ID/group's ID
+     * @param {String} options.applyMessage 附言/apply message
+     * @param {String} options.type 群组类型/group's type
+     * @returns {Promise}
+     */
+    TUIContactServer.prototype.joinGroup = function (options) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var imResponse, error_8;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        return [4 /*yield*/, this.TUICore.tim.joinGroup(options)];
+                    case 1:
+                        imResponse = _a.sent();
+                        resolve(imResponse);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_8 = _a.sent();
+                        reject(error_8);
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 退出群组
+     * Quit group
+     *
+     * @param {String} groupID 群组ID/group's ID
+     * @returns {Promise}
+     */
+    TUIContactServer.prototype.quitGroup = function (groupID) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var imResponse, error_9;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        return [4 /*yield*/, this.TUICore.tim.quitGroup(groupID)];
+                    case 1:
+                        imResponse = _a.sent();
+                        resolve(imResponse);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_9 = _a.sent();
+                        reject(error_9);
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 通过 groupID 搜索群组
+     * Search group by group's ID
+     *
+     * @param {String} groupID 群组ID/group's ID
+     * @returns {Promise}
+     */
+    TUIContactServer.prototype.searchGroupByID = function (groupID) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var imResponse, error_10;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        return [4 /*yield*/, this.TUICore.tim.searchGroupByID(groupID)];
+                    case 1:
+                        imResponse = _a.sent();
+                        this.store.searchGroup = imResponse.data.group;
+                        resolve(imResponse);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_10 = _a.sent();
+                        this.store.searchGroup = {};
+                        reject(error_10);
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 处理申请加群
+     * Handle group application
+     * - 管理员/administrator
+     *
+     * @param {any} options 参数/options
+     * @param {String} options.handleAction 处理结果 Agree(同意) / Reject(拒绝)
+     * @param {String} options.handleMessage 附言/apply message
+     * @param {Message} options.message 对应【群系统通知】的消息实例/the message corresponding to 【group system notification】
+     * @returns {Promise}
+     */
+    TUIContactServer.prototype.handleGroupApplication = function (options) {
+        var _this = this;
+        return this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+            var imResponse, error_11;
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        _a.trys.push([0, 2, , 3]);
+                        return [4 /*yield*/, this.TUICore.tim.handleGroupApplication(options)];
+                    case 1:
+                        imResponse = _a.sent();
+                        resolve(imResponse);
+                        return [3 /*break*/, 3];
+                    case 2:
+                        error_11 = _a.sent();
+                        reject(error_11);
+                        return [3 /*break*/, 3];
+                    case 3: return [2 /*return*/];
+                }
+            });
+        }); });
+    };
+    /**
+     * 获取 SDK 缓存的好友列表
+     * Get friend list from SDK
+     *
+     * @param {Array<string>} userIDList 用户的账号列表/userID list
+     * @returns {Promise}
+     */
+    TUIContactServer.prototype.getFriendList = function () {
+        return __awaiter(this, void 0, Promise, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_12;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.getFriendList()];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    this.currentStore.friendList = imResponse.data;
+                                    this.currentStore.userIDList = this.currentStore.friendList.map(function (item) { return item.userID; }) || [];
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_12 = _a.sent();
+                                    reject(error_12);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 获取 用户状态
+     * Get users’ status
+     *
+     * @param {Array<string>} userIDList 用户 userID 列表 / userID list
+     * @returns {Promise}
+     */
+    TUIContactServer.prototype.getUserStatus = function (userIDList) {
+        return __awaiter(this, void 0, Promise, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_13;
+                        var _this = this;
+                        var _a, _b;
+                        return __generator(this, function (_c) {
+                            switch (_c.label) {
+                                case 0:
+                                    _c.trys.push([0, 2, , 3]);
+                                    if (!userIDList.length)
+                                        return [2 /*return*/];
+                                    return [4 /*yield*/, this.TUICore.tim.getUserStatus({ userIDList: userIDList })];
+                                case 1:
+                                    imResponse = _c.sent();
+                                    (_b = (_a = imResponse === null || imResponse === void 0 ? void 0 : imResponse.data) === null || _a === void 0 ? void 0 : _a.successUserList) === null || _b === void 0 ? void 0 : _b.forEach(function (item) {
+                                        var _a, _b, _c, _d, _e, _f, _g;
+                                        if (item && (item === null || item === void 0 ? void 0 : item.userID)) {
+                                            (_b = (_a = _this.currentStore) === null || _a === void 0 ? void 0 : _a.userStatusList) === null || _b === void 0 ? void 0 : _b.set(item === null || item === void 0 ? void 0 : item.userID, {
+                                                statusType: item === null || item === void 0 ? void 0 : item.statusType,
+                                                customStatus: item === null || item === void 0 ? void 0 : item.customStatus
+                                            });
+                                            (_g = (_f = (_e = (_d = (_c = _this.TUICore) === null || _c === void 0 ? void 0 : _c.TUIServer) === null || _d === void 0 ? void 0 : _d.TUIConversation) === null || _e === void 0 ? void 0 : _e.currentStore) === null || _f === void 0 ? void 0 : _f.userStatusList) === null || _g === void 0 ? void 0 : _g.set(item === null || item === void 0 ? void 0 : item.userID, {
+                                                statusType: item === null || item === void 0 ? void 0 : item.statusType,
+                                                customStatus: item === null || item === void 0 ? void 0 : item.customStatus
+                                            });
+                                        }
+                                    });
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_13 = _c.sent();
+                                    reject(error_13);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 订阅 用户状态
+     * Subscribe users' status
+     *
+     * @param {Array<string>} userIDList 用户 userID 列表 / userID list
+     * @returns {Promise}
+     */
+    TUIContactServer.prototype.subscribeUserStatus = function (userIDList) {
+        return __awaiter(this, void 0, Promise, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_14;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    if (!userIDList.length)
+                                        return [2 /*return*/];
+                                    return [4 /*yield*/, this.TUICore.tim.subscribeUserStatus({ userIDList: userIDList })];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_14 = _a.sent();
+                                    reject(error_14);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 取消订阅 用户状态
+     * Unscribe users' status
+     *
+     * @param {Array<string>} userIDList 用户 userID 列表 / userID list
+     * @returns {Promise}
+     */
+    TUIContactServer.prototype.unsubscribeUserStatus = function (userIDList) {
+        return __awaiter(this, void 0, Promise, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_15;
+                        var _a, _b;
+                        return __generator(this, function (_c) {
+                            switch (_c.label) {
+                                case 0:
+                                    _c.trys.push([0, 2, , 3]);
+                                    if (userIDList && !userIDList.length)
+                                        return [2 /*return*/];
+                                    return [4 /*yield*/, this.TUICore.tim.unsubscribeUserStatus({ userIDList: userIDList })];
+                                case 1:
+                                    imResponse = _c.sent();
+                                    (_b = (_a = this.currentStore) === null || _a === void 0 ? void 0 : _a.userStatusList) === null || _b === void 0 ? void 0 : _b.clear();
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_15 = _c.sent();
+                                    reject(error_15);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 处理 用户状态(订阅并获取用户状态 / 取消订阅用户状态)
+     * Handle users' status ( subscribe and get user status / unsubscribe user status )
+     *
+     * @param {boolean} displayOnlineStatus 是否展示用户在线状态 / whether to display the user's online status
+     * @param {Array<string>} userIDList 用户 userID 列表 / userID list
+     * @returns {Promise}
+     */
+    TUIContactServer.prototype.handleUserStatus = function (displayOnlineStatus, userIDList) {
+        return __awaiter(this, void 0, Promise, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var _this = this;
+                        return __generator(this, function (_a) {
+                            try {
+                                setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
+                                    return __generator(this, function (_a) {
+                                        switch (_a.label) {
+                                            case 0:
+                                                if (!displayOnlineStatus) return [3 /*break*/, 3];
+                                                return [4 /*yield*/, this.subscribeUserStatus(userIDList)];
+                                            case 1:
+                                                _a.sent();
+                                                return [4 /*yield*/, this.getUserStatus(userIDList)];
+                                            case 2:
+                                                _a.sent();
+                                                return [3 /*break*/, 5];
+                                            case 3: return [4 /*yield*/, this.unsubscribeUserStatus(userIDList)];
+                                            case 4:
+                                                _a.sent();
+                                                _a.label = 5;
+                                            case 5: return [2 /*return*/];
+                                        }
+                                    });
+                                }); }, 1000);
+                            }
+                            catch (error) {
+                                reject(error);
+                            }
+                            return [2 /*return*/];
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 赋值
+     * Bind
+     *
+     * @param {Object} params 使用的数据/params data
+     * @returns {Object} 数据/data
+     */
+    TUIContactServer.prototype.bind = function (params) {
+        return __awaiter(this, void 0, void 0, function () {
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        this.currentStore = params;
+                        return [4 /*yield*/, this.getGroupList()];
+                    case 1:
+                        _a.sent();
+                        return [4 /*yield*/, this.getConversationList()];
+                    case 2:
+                        _a.sent();
+                        return [4 /*yield*/, this.getFriendList()];
+                    case 3:
+                        _a.sent();
+                        return [2 /*return*/, this.currentStore];
+                }
+            });
+        });
+    };
+    return TUIContactServer;
+}(IComponentServer_1["default"]));
+exports["default"] = TUIContactServer;

+ 429 - 0
src/TUIKit/TUIComponents/container/TUIConversation/dist/server.js

@@ -0,0 +1,429 @@
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __generator = (this && this.__generator) || function (thisArg, body) {
+    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+    function verb(n) { return function (v) { return step([n, v]); }; }
+    function step(op) {
+        if (f) throw new TypeError("Generator is already executing.");
+        while (_) try {
+            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+            if (y = 0, t) op = [op[0] & 2, t.value];
+            switch (op[0]) {
+                case 0: case 1: t = op; break;
+                case 4: _.label++; return { value: op[1], done: false };
+                case 5: _.label++; y = op[1]; op = [0]; continue;
+                case 7: op = _.ops.pop(); _.trys.pop(); continue;
+                default:
+                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+                    if (t[2]) _.ops.pop();
+                    _.trys.pop(); continue;
+            }
+            op = body.call(thisArg, _);
+        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+    }
+};
+exports.__esModule = true;
+var IComponentServer_1 = require("../IComponentServer");
+/**
+ * class TUIConversationServer
+ *
+ * TUIConversation 逻辑主体
+ */
+var TUIConversationServer = /** @class */ (function (_super) {
+    __extends(TUIConversationServer, _super);
+    function TUIConversationServer(TUICore) {
+        var _this = _super.call(this) || this;
+        _this.currentStore = {};
+        _this.TUICore = TUICore;
+        _this.bindTIMEvent();
+        _this.store = TUICore.setComponentStore('TUIConversation', {}, _this.updateStore.bind(_this));
+        return _this;
+    }
+    /**
+     * 组件销毁
+     *
+     */
+    TUIConversationServer.prototype.destroyed = function () {
+        this.unbindTIMEvent();
+    };
+    /**
+     * 数据监听回调
+     *
+     * @param {any} newValue 新数据
+     * @param {any} oldValue 旧数据
+     */
+    TUIConversationServer.prototype.updateStore = function (newValue, oldValue) {
+        var _a, _b;
+        if (!((_a = this === null || this === void 0 ? void 0 : this.currentStore) === null || _a === void 0 ? void 0 : _a.conversationData)) {
+            return;
+        }
+        this.currentStore.conversationData.list = newValue.conversationList;
+        this.currentStore.userIDList = (_b = this.currentStore.conversationData.list) === null || _b === void 0 ? void 0 : _b.filter(function (item) { var _a; return (_a = item === null || item === void 0 ? void 0 : item.userProfile) === null || _a === void 0 ? void 0 : _a.userID; }).map(function (item) { var _a; return (_a = item === null || item === void 0 ? void 0 : item.userProfile) === null || _a === void 0 ? void 0 : _a.userID; });
+    };
+    /**
+     * 处理异步函数
+     *
+     * @param {callback} callback 回调函数
+     * @returns {Promise} 返回异步函数
+     */
+    TUIConversationServer.prototype.handlePromiseCallback = function (callback) {
+        var _this = this;
+        return new Promise(function (resolve, reject) {
+            var config = {
+                TUIName: 'TUIConversation',
+                callback: function () {
+                    callback && callback(resolve, reject);
+                }
+            };
+            _this.TUICore.setAwaitFunc(config.TUIName, config.callback);
+        });
+    };
+    /**
+     * /////////////////////////////////////////////////////////////////////////////////
+     * //
+     * //                                    TIM 事件监听注册接口
+     * //
+     * /////////////////////////////////////////////////////////////////////////////////
+     */
+    TUIConversationServer.prototype.bindTIMEvent = function () {
+        this.TUICore.tim.on(this.TUICore.TIM.EVENT.CONVERSATION_LIST_UPDATED, this.handleConversationListUpdate, this);
+        this.TUICore.tim.on(this.TUICore.TIM.EVENT.NET_STATE_CHANGE, this.handleNetStateChange, this);
+    };
+    TUIConversationServer.prototype.unbindTIMEvent = function () {
+        this.TUICore.tim.off(this.TUICore.TIM.EVENT.CONVERSATION_LIST_UPDATED, this.handleConversationListUpdate);
+        this.TUICore.tim.off(this.TUICore.TIM.EVENT.NET_STATE_CHANGE, this.handleNetStateChange);
+    };
+    TUIConversationServer.prototype.handleConversationListUpdate = function (res) {
+        this.handleFilterSystem(res.data);
+    };
+    TUIConversationServer.prototype.handleNetStateChange = function (res) {
+        var _a;
+        this.currentStore.netWork = ((_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.state) || '';
+    };
+    /**
+     * 处理conversationList
+     *
+     * @param {Array} list conversationList
+     * @returns {Object}
+     */
+    TUIConversationServer.prototype.handleFilterSystem = function (list) {
+        var _this = this;
+        var options = {
+            allConversationList: list,
+            conversationList: []
+        };
+        var currentList = list.filter(function (item) { var _a; return (item === null || item === void 0 ? void 0 : item.conversationID) === ((_a = _this === null || _this === void 0 ? void 0 : _this.currentStore) === null || _a === void 0 ? void 0 : _a.currentConversationID); });
+        if (currentList.length === 0) {
+            this.handleCurrentConversation({});
+        }
+        options.conversationList = list.filter(function (item) { return item.type !== _this.TUICore.TIM.TYPES.CONV_SYSTEM; });
+        this.store.allConversationList = options.allConversationList;
+        this.store.conversationList = options.conversationList;
+        return options;
+    };
+    /**
+     * /////////////////////////////////////////////////////////////////////////////////
+     * //
+     * //                                    TIM 方法
+     * //
+     * /////////////////////////////////////////////////////////////////////////////////
+     */
+    /**
+     * 设置会话内消息为已读状态
+     * Set the message within the conversation to read
+     *
+     * @param {string} conversationID 会话ID
+     * @returns {Promise}
+     */
+    TUIConversationServer.prototype.setMessageRead = function (conversationID) {
+        return __awaiter(this, void 0, void 0, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_1;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.setMessageRead({ conversationID: conversationID })];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_1 = _a.sent();
+                                    reject(error_1);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 删除会话
+     *
+     * @param {string} conversationID 会话ID
+     * @returns {Promise}
+     */
+    TUIConversationServer.prototype.deleteConversation = function (conversationID) {
+        return __awaiter(this, void 0, void 0, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_2;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.deleteConversation(conversationID)];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_2 = _a.sent();
+                                    reject(error_2);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 置顶会话
+     *
+     * @param {Object} options 置顶参数
+     * @returns {Promise}
+     */
+    TUIConversationServer.prototype.pinConversation = function (options) {
+        return __awaiter(this, void 0, void 0, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_3;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.pinConversation(options)];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_3 = _a.sent();
+                                    reject(error_3);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * C2C消息免打扰
+     *
+     * @param {Object} options 消息免打扰参数
+     * @returns {Promise}
+     */
+    TUIConversationServer.prototype.muteConversation = function (options) {
+        return __awaiter(this, void 0, void 0, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_4;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.setMessageRemindType(options)];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_4 = _a.sent();
+                                    reject(error_4);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 获取 conversationList
+     *
+     * @param {string} conversationID 会话ID
+     * @returns {Promise}
+     */
+    TUIConversationServer.prototype.getConversationProfile = function (conversationID) {
+        return __awaiter(this, void 0, void 0, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_5;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.getConversationProfile(conversationID)];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_5 = _a.sent();
+                                    reject(error_5);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /*
+     * 获取 conversationList
+     *
+     * @returns {Promise}
+     */
+    TUIConversationServer.prototype.getConversationList = function () {
+        return __awaiter(this, void 0, void 0, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_6;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.getConversationList()];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    this.handleFilterSystem(imResponse.data.conversationList);
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_6 = _a.sent();
+                                    reject(error_6);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * 获取其他用户资料
+     *
+     * @param {Array<string>} userIDList 用户的账号列表
+     * @returns {Promise}
+     */
+    TUIConversationServer.prototype.getUserProfile = function (userIDList) {
+        return __awaiter(this, void 0, void 0, function () {
+            var _this = this;
+            return __generator(this, function (_a) {
+                return [2 /*return*/, this.handlePromiseCallback(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
+                        var imResponse, error_7;
+                        return __generator(this, function (_a) {
+                            switch (_a.label) {
+                                case 0:
+                                    _a.trys.push([0, 2, , 3]);
+                                    return [4 /*yield*/, this.TUICore.tim.getUserProfile({ userIDList: userIDList })];
+                                case 1:
+                                    imResponse = _a.sent();
+                                    resolve(imResponse);
+                                    return [3 /*break*/, 3];
+                                case 2:
+                                    error_7 = _a.sent();
+                                    reject(error_7);
+                                    return [3 /*break*/, 3];
+                                case 3: return [2 /*return*/];
+                            }
+                        });
+                    }); })];
+            });
+        });
+    };
+    /**
+     * /////////////////////////////////////////////////////////////////////////////////
+     * //
+     * //                                    UI 数据绑定server数据同步
+     * //
+     * /////////////////////////////////////////////////////////////////////////////////
+     */
+    /**
+     * 赋值
+     *
+     * @param {Object} params 使用的数据
+     * @returns {Object} 数据
+     */
+    TUIConversationServer.prototype.bind = function (params) {
+        return __awaiter(this, void 0, void 0, function () {
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        this.currentStore = params;
+                        return [4 /*yield*/, this.getConversationList()];
+                    case 1:
+                        _a.sent();
+                        return [2 /*return*/, this.currentStore];
+                }
+            });
+        });
+    };
+    // 切换当前会话
+    TUIConversationServer.prototype.handleCurrentConversation = function (value) {
+        // 通知 TUIChat 切换会话或关闭会话
+        this.TUICore.getStore().TUIChat.conversation = value || {};
+        if (!(value === null || value === void 0 ? void 0 : value.conversationID)) {
+            this.currentStore.currentConversationID = '';
+            return;
+        }
+        // Prevent group chat that is currently open from entering from the address book, resulting in no jump.
+        if (this.currentStore.currentConversationID === (value === null || value === void 0 ? void 0 : value.conversationID)) {
+            this.currentStore.currentConversationID = '';
+        }
+        if (this.currentStore.currentConversationID) {
+            this.setMessageRead(this.currentStore.currentConversationID);
+        }
+        this.currentStore.currentConversationID = value === null || value === void 0 ? void 0 : value.conversationID;
+        this.setMessageRead(value.conversationID);
+    };
+    return TUIConversationServer;
+}(IComponentServer_1["default"]));
+exports["default"] = TUIConversationServer;

+ 324 - 0
src/TUIKit/TUICore/server/dist/index.js

@@ -0,0 +1,324 @@
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+exports.__esModule = true;
+var TUIPlugin_1 = require("../../TUIPlugin");
+var tim_1 = require("../tim");
+var tim_upload_plugin_1 = require("tim-upload-plugin");
+var tim_profanity_filter_plugin_1 = require("tim-profanity-filter-plugin");
+var ITUIServer_1 = require("../interfaces/ITUIServer");
+var store_1 = require("../store");
+var utils_1 = require("../utils");
+var TUICore = /** @class */ (function (_super) {
+    __extends(TUICore, _super);
+    function TUICore(params) {
+        var _this = _super.call(this) || this;
+        _this.isOfficial = false;
+        _this.isIntl = false;
+        _this.isSDKReady = false;
+        _this.installedPlugins = new Set();
+        _this.config = {};
+        _this.TUIComponents = new Set();
+        _this.loginResolveRejectCache = [];
+        _this.SDKAppID = params.SDKAppID;
+        _this.TUIServer = {};
+        _this.store = new store_1["default"]();
+        _this.TIM = tim_1["default"];
+        window.TIM = tim_1["default"];
+        if (!params.tim) {
+            window.TUIKit = tim_1["default"].create({ SDKAppID: _this.SDKAppID });
+        }
+        else {
+            window.TUIKit = params.tim;
+        }
+        _this.tim = window.TUIKit;
+        // 注册 COS SDK 插件
+        _this.tim.registerPlugin({ 'tim-upload-plugin': tim_upload_plugin_1["default"] });
+        _this.tim.registerPlugin({ 'tim-profanity-filter-plugin': tim_profanity_filter_plugin_1["default"] });
+        _this.bindTIMEvent();
+        _this.TUIEnv = TUIPlugin_1.TUIEnv();
+        _this.isOfficial = _this.SDKAppID === 1400187352 || _this.SDKAppID === 1400188366;
+        return _this;
+    }
+    /**
+     * 初始化TUICore
+     *
+     * @param {TUICoreParams} options 初始化参数
+     * @returns {TUICore} TUICore的实例
+     */
+    TUICore.init = function (options) {
+        if (!TUICore.instance) {
+            TUICore.instance = new TUICore(options);
+        }
+        var isH5 = TUIPlugin_1.TUIEnv().isH5;
+        window.TUIKitTUICore = TUICore.instance;
+        TUICore.instance.use(TUIPlugin_1.TUITheme);
+        TUICore.instance.use(TUIPlugin_1.TUIi18n);
+        return TUICore.instance;
+    };
+    /**
+     * TUICore 挂载vue方法
+     *
+     * @param {Vue} app vue createApp实例
+     */
+    TUICore.prototype.install = function (app) {
+        app.config.globalProperties.$TUIKit = this.getInstance();
+        var flag = true;
+        this.installedPlugins.forEach(function (element) {
+            app.use(element);
+            if (element.name === 'TUIComponents') {
+                flag = false;
+            }
+        });
+        flag &&
+            this.TUIComponents.forEach(function (element) {
+                app.component(element.name, element.component);
+            });
+        TUIPlugin_1.TUIDirective(app);
+    };
+    /**
+     * 获取TUICore实例
+     *
+     * @returns {TUICore} TUICore的实例
+     */
+    TUICore.prototype.getInstance = function () {
+        return TUICore.instance;
+    };
+    /**
+     * TUICore 登录
+     *
+     * @param {TUICoreLoginParams} options 登录参数
+     * @param {string} options.userID 当前用户名
+     * @param {string} options.userSig 当前用户名签名
+     * @returns {Promise}
+     */
+    TUICore.prototype.login = function (options) {
+        var _this = this;
+        return new Promise(function (resolve, reject) {
+            _this.tim
+                .login(options)
+                .then(function () {
+                var _a, _b, _c;
+                _this.loginResolveRejectCache.push({
+                    resolve: resolve,
+                    reject: reject
+                });
+                TUICore.isLogin = true;
+                window._isTIMCallKit = true;
+                (_c = (_b = (_a = TUICore === null || TUICore === void 0 ? void 0 : TUICore.instance) === null || _a === void 0 ? void 0 : _a.TUIServer) === null || _b === void 0 ? void 0 : _b.TUICallKit) === null || _c === void 0 ? void 0 : _c.init({
+                    SDKAppID: _this.SDKAppID,
+                    userID: options.userID,
+                    userSig: options.userSig,
+                    tim: _this.tim
+                });
+                return null;
+            })["catch"](function (error) {
+                reject(error);
+            });
+        });
+    };
+    /**
+     * TUICore 退出登录
+     *
+     * @returns {Promise}
+     */
+    TUICore.prototype.logout = function () {
+        var _this = this;
+        return new Promise(function (resolve, reject) {
+            _this.tim
+                .logout()
+                .then(function (imResponse) {
+                _this.isSDKReady = false;
+                TUICore.isLogin = false;
+                resolve(imResponse);
+            })["catch"](function (error) {
+                reject(error);
+            });
+        });
+    };
+    /**
+     * /////////////////////////////////////////////////////////////////////////////////
+     * //
+     * //                                    TIM 事件监听注册接口
+     * //
+     * /////////////////////////////////////////////////////////////////////////////////
+     */
+    TUICore.prototype.bindTIMEvent = function () {
+        this.tim.on(tim_1["default"].EVENT.SDK_READY, this.handleSDKReady, this);
+        // this.tim.on(TIM.EVENT.SDK_NOT_READY,)
+        // this.tim.on(TIM.EVENT.KICKED_OUT,)
+        // this.tim.on(TIM.EVENT.ERROR, )
+        // this.tim.on(TIM.EVENT.NET_STATE_CHANGE, )
+        // this.tim.on(TIM.EVENT.SDK_RELOAD, )
+    };
+    TUICore.prototype.unbindTIMEvent = function () {
+        this.tim.off(tim_1["default"].EVENT.SDK_READY, this.handleSDKReady);
+        // this.tim.off(TIM.EVENT.SDK_NOT_READY, )
+        // this.tim.off(TIM.EVENT.KICKED_OUT,)
+        // this.tim.off(TIM.EVENT.ERROR, )
+        // this.tim.off(TIM.EVENT.NET_STATE_CHANGE, )
+        // this.tim.off(TIM.EVENT.SDK_RELOAD, )
+    };
+    /**
+     * SDK ready 回调函数
+     */
+    TUICore.prototype.handleSDKReady = function () {
+        this.isSDKReady = true;
+        this.handelAwaitFunc(TUICore.TUIServerFunMap);
+        this.loginResolveRejectCache.forEach(function (_a) {
+            var resolve = _a.resolve;
+            resolve({
+                msg: '登录成功,且SDK Ready'
+            });
+        });
+    };
+    /**
+     * 处理等待函数
+     *
+     * @param {Map} awaitFunList 等待调用的函数
+     * @returns {Map} 执行完的数据
+     */
+    TUICore.prototype.handelAwaitFunc = function (awaitFunList) {
+        var keys = Object.keys(this.TUIServer);
+        for (var i = 0; i < keys.length; i++) {
+            var TUIServerFunList = (awaitFunList === null || awaitFunList === void 0 ? void 0 : awaitFunList.get(keys[i])) || [];
+            TUIServerFunList.length > 0 && TUIServerFunList.map(function (callback) { return callback(); });
+            awaitFunList === null || awaitFunList === void 0 ? void 0 : awaitFunList["delete"](keys[i]);
+        }
+        return awaitFunList;
+    };
+    /**
+     * TUICore 销毁
+     */
+    TUICore.prototype.destroyed = function () {
+        this.unbindTIMEvent();
+        this.isSDKReady = false;
+    };
+    /**
+     * 组件挂载
+     *
+     * @param {string} TUIName  挂载的组件名
+     * @param {any} TUIComponent 挂载的组件
+     * @returns {TUICore} 挂载后的实例
+     */
+    TUICore.prototype.component = function (TUIName, TUIComponent) {
+        var TUICore = this.getInstance();
+        if (!this.TUIServer) {
+            this.TUIServer = {};
+        }
+        // const Server = TUIComponent.server;
+        this.TUIServer[TUIName] = TUIComponent.server;
+        if (this.TUIComponents.has(TUIComponent)) {
+            console.warn(TUIName + " component has already been applied to target TUICore.");
+        }
+        else {
+            this.TUIComponents.add(TUIComponent);
+        }
+        return TUICore;
+    };
+    /**
+     * 插件注入
+     *
+     * @param {any} TUIPlugin 需要挂载模块的服务
+     * @param {any} options 其他参数
+     * @returns {TUICore} 挂载后的实例
+     */
+    TUICore.prototype.use = function (TUIPlugin, options) {
+        var TUICore = this.getInstance();
+        if (this.installedPlugins.has(TUIPlugin)) {
+            console.warn('Plugin has already been applied to target TUICore.');
+        }
+        else if (TUIPlugin && utils_1.isFunction(TUIPlugin === null || TUIPlugin === void 0 ? void 0 : TUIPlugin.plugin)) {
+            this.installedPlugins.add(TUIPlugin);
+            TUIPlugin === null || TUIPlugin === void 0 ? void 0 : TUIPlugin.plugin(TUICore, options);
+        }
+        else if (utils_1.isFunction(TUIPlugin)) {
+            this.installedPlugins.add(TUIPlugin);
+            TUIPlugin(TUICore, options);
+        }
+        else {
+            console.warn('A plugin must either be a function or an object with an "plugin" ' + 'function.');
+        }
+        return TUICore;
+    };
+    TUICore.prototype.usePlugin = function (TUIPluginName) {
+        var plugin = {};
+        this.installedPlugins.forEach(function (element) {
+            if (element.name === TUIPluginName) {
+                plugin = element;
+            }
+        });
+        return plugin;
+    };
+    /**
+     * 方法调用
+     *
+     * @param {string} TUIName 组件名
+     * @param {callback} callback 调用的方法
+     */
+    TUICore.prototype.setAwaitFunc = function (TUIName, callback) {
+        if (this.isSDKReady) {
+            callback();
+        }
+        else {
+            if (!TUICore.TUIServerFunMap) {
+                TUICore.TUIServerFunMap = new Map();
+            }
+            var TUIServerFunList = TUICore.TUIServerFunMap.get(TUIName) || [];
+            TUIServerFunList.push(callback);
+            TUICore.TUIServerFunMap.set(TUIName, TUIServerFunList);
+        }
+    };
+    /**
+     * 设置公共数据
+     *
+     * @param {object} store 设置全局的数据
+     * @returns {proxy} 设置完成的数据
+     */
+    TUICore.prototype.setCommonStore = function (store) {
+        return this.store.setCommonStore(store);
+    };
+    /**
+     * 挂载组件数据
+     *
+     * @param {string} TUIName 模块名
+     * @param {any} store  挂载的数据
+     * @param {callback} updateCallback 更新数据 callback
+     * @returns {proxy} 挂载完成的模块数据
+     */
+    TUICore.prototype.setComponentStore = function (TUIName, store, updateCallback) {
+        return this.store.setComponentStore(TUIName, store, updateCallback);
+    };
+    /**
+     * 获取 store 数据库
+     *
+     * @returns {any} store 数据库
+     */
+    TUICore.prototype.getStore = function () {
+        return this.store.store;
+    };
+    /**
+     * 监听全局数据
+     *
+     * @param {Array} keys 需要监听的数据key
+     * @param {callback} callback 数据变化回调
+     * @returns {addStoreUpdate}
+     */
+    TUICore.prototype.storeCommonListener = function (keys, callback) {
+        return this.store.storeCommonListener(keys, callback);
+    };
+    TUICore.isLogin = false;
+    return TUICore;
+}(ITUIServer_1["default"]));
+exports["default"] = TUICore;

+ 100 - 0
src/TUIKit/TUICore/store/dist/index.js

@@ -0,0 +1,100 @@
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+exports.__esModule = true;
+var ITUIStore_1 = require("../interfaces/ITUIStore");
+var TUIStore = /** @class */ (function (_super) {
+    __extends(TUIStore, _super);
+    function TUIStore() {
+        var _this = _super.call(this) || this;
+        _this.storeListener = {
+            keys: [],
+            // eslint-disable-next-line @typescript-eslint/no-empty-function
+            callback: function () { }
+        };
+        _this.store = {};
+        var commonStore = {};
+        _this.store.common = new Proxy(commonStore, {
+            get: function (target, name) { return target[name]; },
+            set: function (target, name, value) {
+                var oldValue = {};
+                Object.assign(oldValue, target);
+                // eslint-disable-next-line no-param-reassign
+                target[name] = value;
+                if (target[name] !== oldValue[name] &&
+                    _this.storeListener.keys.indexOf(name) >= 0) {
+                    _this.storeListener.callback(target[name], oldValue[name]);
+                }
+                return target[name];
+            }
+        });
+        return _this;
+    }
+    /**
+     * 设置全局数据
+     *
+     * @param {any} store 设置全局的数据
+     * @returns {proxy} 设置完成的数据
+     */
+    TUIStore.prototype.setCommonStore = function (store) {
+        var _this = this;
+        Object.keys(store).forEach(function (key) {
+            if (key in _this.store.common) {
+                return new Error(key + " \u5728\u516C\u5171\u6570\u636E\u5DF2\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u8BBE\u7F6E");
+            }
+            _this.store.common[key] = store[key];
+        });
+        return this.store;
+    };
+    /**
+     * 挂载组件数据
+     *
+     * @param {string} TUIName 模块名
+     * @param {any} store 挂载的数据
+     * @param {callback} updateCallback 更新数据 callback
+     * @returns {proxy} 挂载完成的模块数据
+     */
+    TUIStore.prototype.setComponentStore = function (TUIName, store, updateCallback) {
+        if (TUIName in this.store) {
+            return new Error(TUIName + " \u8BE5\u6570\u636E\u6A21\u5757\u5DF2\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u8BBE\u7F6E");
+        }
+        return (this.store[TUIName] = new Proxy(store, {
+            get: function (target, name) { return target[name]; },
+            set: function (target, name, value) {
+                var oldValue = {};
+                Object.assign(oldValue, target);
+                // eslint-disable-next-line no-param-reassign
+                target[name] = value;
+                if (target[name] !== oldValue[name]) {
+                    updateCallback && updateCallback(target, oldValue);
+                }
+                return target;
+            }
+        }));
+    };
+    /**
+     * 监听全局数据
+     *
+     * @param {Array} keys 需要监听的数据key
+     * @param {callback} callback 数据变化回调
+     */
+    TUIStore.prototype.storeCommonListener = function (keys, callback) {
+        this.storeListener = {
+            keys: keys,
+            callback: callback
+        };
+    };
+    return TUIStore;
+}(ITUIStore_1["default"]));
+exports["default"] = TUIStore;

+ 13 - 0
src/TUIKit/TUICore/tim/dist/index.dev.js

@@ -0,0 +1,13 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports["default"] = void 0;
+
+var _chat = _interopRequireDefault(require("@tencentcloud/chat"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
+
+var _default = _chat["default"];
+exports["default"] = _default;

+ 364 - 0
src/TUIKit/TUIPlugin/TUINotification/dist/index.js

@@ -0,0 +1,364 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __generator = (this && this.__generator) || function (thisArg, body) {
+    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+    function verb(n) { return function (v) { return step([n, v]); }; }
+    function step(op) {
+        if (f) throw new TypeError("Generator is already executing.");
+        while (_) try {
+            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+            if (y = 0, t) op = [op[0] & 2, t.value];
+            switch (op[0]) {
+                case 0: case 1: t = op; break;
+                case 4: _.label++; return { value: op[1], done: false };
+                case 5: _.label++; y = op[1]; op = [0]; continue;
+                case 7: op = _.ops.pop(); _.trys.pop(); continue;
+                default:
+                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+                    if (t[2]) _.ops.pop();
+                    _.trys.pop(); continue;
+            }
+            op = body.call(thisArg, _);
+        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+    }
+};
+exports.__esModule = true;
+var utils_1 = require("../../TUIComponents/container/TUIChat/utils/utils");
+var chat_1 = require("@tencentcloud/chat");
+var TUINotification = /** @class */ (function () {
+    function TUINotification(params) {
+        this.allowNotifications = true;
+        this.showPreviews = true;
+        this.notificationTitle = '腾讯云 IM ';
+        this.notificationIcon = 'https://web.sdk.qcloud.com/im/demo/latest/faviconnew.png';
+        if (!params)
+            return;
+        ((params === null || params === void 0 ? void 0 : params.allowNotifications) !== undefined) && (this.allowNotifications = params.allowNotifications);
+        ((params === null || params === void 0 ? void 0 : params.showPreviews) !== undefined) && (this.showPreviews = params.showPreviews);
+        ((params === null || params === void 0 ? void 0 : params.notificationTitle) !== undefined) && (this.notificationTitle = params.notificationTitle);
+        ((params === null || params === void 0 ? void 0 : params.notificationIcon) !== undefined) && (this.notificationIcon = params.notificationIcon);
+    }
+    /**
+   * 获取 TUINotification 实例
+   *
+   * @returns {TUINotification}
+   */
+    TUINotification.getInstance = function (options) {
+        if (!TUINotification.instance) {
+            TUINotification.instance = new TUINotification(options);
+        }
+        return TUINotification.instance;
+    };
+    /**
+   * 挂载到 TUICore
+   *
+   * @param {TUICore} TUICore TUICore实例
+   */
+    TUINotification.plugin = function (TUICore, options) {
+        TUICore.config.notification = this.getInstance(options);
+        this.TUICore = TUICore;
+    };
+    /**
+   * 挂载到 vue 实例的上
+   *
+   * @param {app} app vue的实例
+   */
+    TUINotification.install = function (app) {
+        app.use(this.getInstance());
+    };
+    TUINotification.prototype.setNotificationConfiguration = function (params) {
+        if (!params)
+            return;
+        ((params === null || params === void 0 ? void 0 : params.allowNotifications) !== undefined) && (this.allowNotifications = params.allowNotifications);
+        ((params === null || params === void 0 ? void 0 : params.showPreviews) !== undefined) && (this.showPreviews = params.showPreviews);
+        ((params === null || params === void 0 ? void 0 : params.notificationTitle) !== undefined) && (this.notificationTitle = params.notificationTitle);
+        ((params === null || params === void 0 ? void 0 : params.notificationIcon) !== undefined) && (this.notificationIcon = params.notificationIcon);
+    };
+    TUINotification.prototype.notify = function (message) {
+        return __awaiter(this, void 0, Promise, function () {
+            return __generator(this, function (_a) {
+                switch (_a.label) {
+                    case 0:
+                        if (!this.allowNotifications) {
+                            return [2 /*return*/];
+                        }
+                        if (!this.checkNotificationAbility()) {
+                            return [2 /*return*/];
+                        }
+                        return [4 /*yield*/, this.requestNotificationPermission()];
+                    case 1:
+                        if (!(_a.sent())) {
+                            return [2 /*return*/];
+                        }
+                        return [4 /*yield*/, this.handleNotification(message)];
+                    case 2:
+                        _a.sent();
+                        return [2 /*return*/];
+                }
+            });
+        });
+    };
+    TUINotification.prototype.checkNotificationAbility = function () {
+        if (!('Notification' in window) || window.Notification.permission === 'denied') {
+            return false;
+        }
+        return true;
+    };
+    TUINotification.prototype.requestNotificationPermission = function () {
+        return new Promise(function (resolve, reject) {
+            if (!(window === null || window === void 0 ? void 0 : window.Notification))
+                reject(false);
+            if (window.Notification.permission === 'granted') {
+                resolve(true);
+            }
+            window.Notification.requestPermission().then(function (permission) {
+                // 如果用户同意,就可以向他们发送通知
+                if (permission === 'granted') {
+                    resolve(true);
+                }
+            })["catch"](function () {
+                reject(false);
+            });
+        });
+    };
+    TUINotification.prototype.handleNotification = function (message) {
+        return __awaiter(this, void 0, Promise, function () {
+            var notificationType, content, options, _a, _b, notification;
+            return __generator(this, function (_c) {
+                switch (_c.label) {
+                    case 0:
+                        if (!this._isMessageNeedNotification(message))
+                            return [2 /*return*/];
+                        notificationType = this._handleNotificationType(message);
+                        options = {
+                            badge: this.notificationIcon,
+                            icon: this.notificationIcon,
+                            body: '',
+                            requireInteraction: false
+                        };
+                        _a = notificationType;
+                        switch (_a) {
+                            case 'call': return [3 /*break*/, 1];
+                            case 'chat': return [3 /*break*/, 2];
+                        }
+                        return [3 /*break*/, 4];
+                    case 1:
+                        content = this._handleCallNotificationContent(message);
+                        if (!(content === null || content === void 0 ? void 0 : content.content)) {
+                            return [2 /*return*/];
+                        }
+                        options.body = content.content;
+                        options.requireInteraction = !content.callEnd;
+                        return [3 /*break*/, 4];
+                    case 2:
+                        _b = options;
+                        return [4 /*yield*/, this._handleChatNotificationContent(message)];
+                    case 3:
+                        _b.body = _c.sent();
+                        options.requireInteraction = false;
+                        return [3 /*break*/, 4];
+                    case 4:
+                        notification = new Notification(this.notificationTitle, options);
+                        notification.onclick = function () {
+                            var _a, _b;
+                            window.focus();
+                            if (!message || !(message === null || message === void 0 ? void 0 : message.conversationID)) {
+                                return;
+                            }
+                            var TUIConversationServer = (_b = (_a = TUINotification === null || TUINotification === void 0 ? void 0 : TUINotification.TUICore) === null || _a === void 0 ? void 0 : _a.TUIServer) === null || _b === void 0 ? void 0 : _b.TUIConversation;
+                            if ((message === null || message === void 0 ? void 0 : message.conversationType) === chat_1["default"].TYPES.CONV_C2C || (message === null || message === void 0 ? void 0 : message.conversationType) === chat_1["default"].TYPES.CONV_GROUP) {
+                                TUIConversationServer === null || TUIConversationServer === void 0 ? void 0 : TUIConversationServer.getConversationProfile(message === null || message === void 0 ? void 0 : message.conversationID).then(function (imResponse) {
+                                    var _a, _b;
+                                    ((_a = imResponse === null || imResponse === void 0 ? void 0 : imResponse.data) === null || _a === void 0 ? void 0 : _a.conversation) && TUIConversationServer.handleCurrentConversation((_b = imResponse === null || imResponse === void 0 ? void 0 : imResponse.data) === null || _b === void 0 ? void 0 : _b.conversation);
+                                });
+                            }
+                            notification.close();
+                        };
+                        return [2 /*return*/];
+                }
+            });
+        });
+    };
+    TUINotification.prototype._isMessageNeedNotification = function (message) {
+        var _a, _b, _c, _d;
+        if (!message || !(message === null || message === void 0 ? void 0 : message.ID) || !(message === null || message === void 0 ? void 0 : message.type) || (message === null || message === void 0 ? void 0 : message.isRevoked) || (message === null || message === void 0 ? void 0 : message.isDeleted) ||
+            (utils_1.isTypingMessage && utils_1.isTypingMessage(message))) {
+            return false;
+        }
+        if ((message === null || message === void 0 ? void 0 : message.type) === chat_1["default"].TYPES.MSG_GRP_TIP || (message === null || message === void 0 ? void 0 : message.type) === chat_1["default"].TYPES.MSG_GRP_SYS_NOTICE) {
+            return false;
+        }
+        var currentConversationID = (_d = (_c = (_b = (_a = TUINotification === null || TUINotification === void 0 ? void 0 : TUINotification.TUICore) === null || _a === void 0 ? void 0 : _a.TUIServer) === null || _b === void 0 ? void 0 : _b.TUIConversation) === null || _c === void 0 ? void 0 : _c.currentStore) === null || _d === void 0 ? void 0 : _d.currentConversationID;
+        if (this.checkPageFocus() && (message === null || message === void 0 ? void 0 : message.conversationID) === currentConversationID) {
+            return false;
+        }
+        return true;
+    };
+    TUINotification.prototype._handleNotificationType = function (message) {
+        var _a;
+        if (message.type === chat_1["default"].TYPES.MSG_CUSTOM) {
+            var payloadData = utils_1.JSONToObject((_a = message === null || message === void 0 ? void 0 : message.payload) === null || _a === void 0 ? void 0 : _a.data);
+            if ((payloadData === null || payloadData === void 0 ? void 0 : payloadData.businessID) === 1 || (payloadData === null || payloadData === void 0 ? void 0 : payloadData.businessID) === 'av_call') {
+                return 'call';
+            }
+        }
+        return 'chat';
+    };
+    TUINotification.prototype._handleChatNotificationContent = function (message) {
+        var _a, _b;
+        return __awaiter(this, void 0, Promise, function () {
+            var content, _c, _d;
+            return __generator(this, function (_e) {
+                switch (_e.label) {
+                    case 0:
+                        content = '';
+                        if (!message || !(message === null || message === void 0 ? void 0 : message.ID) || !(message === null || message === void 0 ? void 0 : message.type)) {
+                            return [2 /*return*/, content];
+                        }
+                        _c = this.showPreviews;
+                        switch (_c) {
+                            case true: return [3 /*break*/, 1];
+                            case false: return [3 /*break*/, 3];
+                        }
+                        return [3 /*break*/, 5];
+                    case 1: return [4 /*yield*/, this._handleChatNotificationContentTitle(message)];
+                    case 2:
+                        content = _e.sent();
+                        content += this._handleChatNotificationContentText(message);
+                        return [3 /*break*/, 6];
+                    case 3:
+                        _d = '您有';
+                        return [4 /*yield*/, ((_b = (_a = TUINotification === null || TUINotification === void 0 ? void 0 : TUINotification.TUICore) === null || _a === void 0 ? void 0 : _a.tim) === null || _b === void 0 ? void 0 : _b.getTotalUnreadMessageCount())];
+                    case 4:
+                        content = _d + (_e.sent()) + '条新消息';
+                        return [3 /*break*/, 6];
+                    case 5: return [3 /*break*/, 6];
+                    case 6: return [2 /*return*/, content];
+                }
+            });
+        });
+    };
+    TUINotification.prototype._handleChatNotificationContentTitle = function (message) {
+        var _a, _b, _c;
+        return __awaiter(this, void 0, Promise, function () {
+            var title, _d;
+            return __generator(this, function (_e) {
+                switch (_e.label) {
+                    case 0:
+                        title = '';
+                        _d = message === null || message === void 0 ? void 0 : message.conversationType;
+                        switch (_d) {
+                            case chat_1["default"].TYPES.CONV_C2C: return [3 /*break*/, 1];
+                            case chat_1["default"].TYPES.CONV_GROUP: return [3 /*break*/, 2];
+                            case chat_1["default"].TYPES.CONV_SYSTEM: return [3 /*break*/, 4];
+                        }
+                        return [3 /*break*/, 5];
+                    case 1:
+                        title = ((message === null || message === void 0 ? void 0 : message.nick) || (message === null || message === void 0 ? void 0 : message.from)) + ': ';
+                        return [3 /*break*/, 6];
+                    case 2:
+                        title = (message === null || message === void 0 ? void 0 : message.conversationID) + ': ';
+                        return [4 /*yield*/, ((_c = (_b = (_a = TUINotification === null || TUINotification === void 0 ? void 0 : TUINotification.TUICore) === null || _a === void 0 ? void 0 : _a.tim) === null || _b === void 0 ? void 0 : _b.getConversationProfile(message === null || message === void 0 ? void 0 : message.conversationID)) === null || _c === void 0 ? void 0 : _c.then(function (imResponse) {
+                                var _a, _b, _c;
+                                title = (((_c = (_b = (_a = imResponse === null || imResponse === void 0 ? void 0 : imResponse.data) === null || _a === void 0 ? void 0 : _a.conversation) === null || _b === void 0 ? void 0 : _b.groupProfile) === null || _c === void 0 ? void 0 : _c.name) || (message === null || message === void 0 ? void 0 : message.conversationID)) + ': ';
+                            })["catch"](function () {
+                                title = (message === null || message === void 0 ? void 0 : message.conversationID) + ': ';
+                            }))];
+                    case 3:
+                        _e.sent();
+                        return [3 /*break*/, 6];
+                    case 4:
+                        title = '系统消息: ';
+                        return [3 /*break*/, 6];
+                    case 5: return [3 /*break*/, 6];
+                    case 6: return [2 /*return*/, title];
+                }
+            });
+        });
+    };
+    TUINotification.prototype._handleChatNotificationContentText = function (message) {
+        var _a;
+        var content = '';
+        switch (message.type) {
+            case chat_1["default"].TYPES.MSG_TEXT:
+                content += (_a = message === null || message === void 0 ? void 0 : message.payload) === null || _a === void 0 ? void 0 : _a.text;
+                break;
+            case chat_1["default"].TYPES.MSG_CUSTOM:
+                content += '[自定义消息]';
+                break;
+            case chat_1["default"].TYPES.MSG_IMAGE:
+                content += '[图片]';
+                break;
+            case chat_1["default"].TYPES.MSG_AUDIO:
+                content += '[语音]';
+                break;
+            case chat_1["default"].TYPES.MSG_VIDEO:
+                content += '[视频]';
+                break;
+            case chat_1["default"].TYPES.MSG_FILE:
+                content += '[文件]';
+                break;
+            case chat_1["default"].TYPES.MSG_FACE:
+                content += '[表情]';
+                break;
+            case chat_1["default"].TYPES.MSG_MERGER:
+                content += '[聊天记录]';
+                break;
+            case chat_1["default"].TYPES.MSG_LOCATION:
+                content += '[位置]';
+                break;
+            default:
+                break;
+        }
+        return content;
+    };
+    TUINotification.prototype._handleCallNotificationContent = function (message) {
+        var _a;
+        var content = '';
+        var callEnd = false;
+        try {
+            if (message.type === chat_1["default"].TYPES.MSG_CUSTOM) {
+                var callInfo = utils_1.JSONToObject((_a = message === null || message === void 0 ? void 0 : message.payload) === null || _a === void 0 ? void 0 : _a.data);
+                var callDataInfo = utils_1.JSONToObject(callInfo.data);
+                if ((callInfo === null || callInfo === void 0 ? void 0 : callInfo.businessID) === 1) {
+                    if (callInfo.actionType === 1 && ((callInfo.groupID && callInfo.timeout > 0) ||
+                        ((!callInfo.call_end && callInfo.call_end !== 0) &&
+                            !callInfo.groupID &&
+                            !((callDataInfo === null || callDataInfo === void 0 ? void 0 : callDataInfo.data) && ((callDataInfo === null || callDataInfo === void 0 ? void 0 : callDataInfo.data.cmd) === 'switchToAudio' || (callDataInfo === null || callDataInfo === void 0 ? void 0 : callDataInfo.data.cmd) === 'switchToVideo'))))) {
+                        content = this.showPreviews ? callInfo.inviter + " \u53D1\u8D77\u901A\u8BDD" : "\u60A8\u6709\u4E00\u4E2A\u901A\u8BDD\u8BF7\u6C42";
+                        callEnd = false;
+                    }
+                    else if (callInfo.actionType === 2) {
+                        content = this.showPreviews ? callInfo.inviter + " \u53D6\u6D88\u901A\u8BDD" : "\u901A\u8BDD\u53D6\u6D88";
+                        callEnd = true;
+                    }
+                }
+            }
+        }
+        catch (error) {
+            console.warn(error);
+        }
+        return {
+            content: content,
+            callEnd: callEnd
+        };
+    };
+    TUINotification.prototype.checkPageFocus = function () {
+        return document.hasFocus();
+    };
+    return TUINotification;
+}());
+exports["default"] = TUINotification;

+ 94 - 0
src/TUIKit/TUIPlugin/TUIi18n/dist/index.js

@@ -0,0 +1,94 @@
+"use strict";
+var __assign = (this && this.__assign) || function () {
+    __assign = Object.assign || function(t) {
+        for (var s, i = 1, n = arguments.length; i < n; i++) {
+            s = arguments[i];
+            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+                t[p] = s[p];
+        }
+        return t;
+    };
+    return __assign.apply(this, arguments);
+};
+exports.__esModule = true;
+exports.useI18nLocale = void 0;
+var vue_i18n_1 = require("vue-i18n");
+var locales_1 = require("../../locales");
+var TUIi18n = /** @class */ (function () {
+    function TUIi18n(messages) {
+        this.messages = {
+            en: {},
+            zh_cn: {}
+        };
+        this.messages = messages;
+    }
+    /**
+     * 获取 TUIi18n 实例
+     *
+     * @returns {TUIi18n}
+     */
+    TUIi18n.getInstance = function () {
+        if (!TUIi18n.instance) {
+            TUIi18n.instance = new TUIi18n(locales_1["default"]);
+        }
+        return TUIi18n.instance;
+    };
+    /**
+     * 注入需要国际化的词条
+     *
+     * @param {Object} messages 数据对象
+     * @returns {messages} 全部国际化词条
+     */
+    TUIi18n.prototype.provideMessage = function (messages) {
+        this.messages.en = __assign(__assign({}, this.messages.en), messages.en);
+        this.messages.zh_cn = __assign(__assign({}, this.messages.zh_cn), messages.zh_cn);
+        return this.messages;
+    };
+    /**
+     * 使用国际化
+     *
+     * @returns {useI18n} 国际化使用函数
+     */
+    TUIi18n.prototype.useI18n = function () {
+        return vue_i18n_1.useI18n();
+    };
+    /**
+     * 挂载到 vue 实例的上
+     *
+     * @param {app} app vue的实例
+     */
+    TUIi18n.install = function (app) {
+        var that = TUIi18n.getInstance();
+        // const lang = navigator.language.substr(0, 2);
+        var lang = 'zh';
+        that.i18n = vue_i18n_1.createI18n({
+            legacy: false,
+            globalInjection: true,
+            global: true,
+            locale: lang === 'zh' ? 'zh_cn' : lang,
+            fallbackLocale: 'zh_cn',
+            messages: that.messages
+        });
+        console.warn(that.messages);
+        app.use(that.i18n);
+    };
+    /**
+     * 挂载到 TUICore
+     *
+     * @param {TUICore} TUICore TUICore实例
+     */
+    TUIi18n.plugin = function (TUICore) {
+        TUICore.config.i18n = TUIi18n.getInstance();
+    };
+    return TUIi18n;
+}());
+/**
+ * 国际化标识
+ *
+ * @returns {locale} 国际化标识
+ */
+function useI18nLocale() {
+    return TUIi18n.getInstance().i18n.global.locale;
+}
+exports.useI18nLocale = useI18nLocale;
+exports["default"] = TUIi18n;

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini