@koushuang/im 0.1.1-preview.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/dist/_virtual/_plugin-vue_export-helper.cjs +2 -0
  2. package/dist/_virtual/_plugin-vue_export-helper.cjs.map +1 -0
  3. package/dist/_virtual/_plugin-vue_export-helper.mjs +10 -0
  4. package/dist/_virtual/_plugin-vue_export-helper.mjs.map +1 -0
  5. package/dist/api/auth.cjs +2 -0
  6. package/dist/api/auth.cjs.map +1 -0
  7. package/dist/api/auth.d.ts +48 -0
  8. package/dist/api/auth.mjs +30 -0
  9. package/dist/api/auth.mjs.map +1 -0
  10. package/dist/core/client.cjs +2 -0
  11. package/dist/core/client.cjs.map +1 -0
  12. package/dist/core/client.d.ts +38 -0
  13. package/dist/core/client.mjs +117 -0
  14. package/dist/core/client.mjs.map +1 -0
  15. package/dist/core/createClient.cjs +2 -0
  16. package/dist/core/createClient.cjs.map +1 -0
  17. package/dist/core/createClient.d.ts +6 -0
  18. package/dist/core/createClient.mjs +9 -0
  19. package/dist/core/createClient.mjs.map +1 -0
  20. package/dist/core/events.d.ts +36 -0
  21. package/dist/core/index.d.ts +4 -0
  22. package/dist/core/types.d.ts +127 -0
  23. package/dist/http/createHttp.cjs +2 -0
  24. package/dist/http/createHttp.cjs.map +1 -0
  25. package/dist/http/createHttp.d.ts +5 -0
  26. package/dist/http/createHttp.mjs +29 -0
  27. package/dist/http/createHttp.mjs.map +1 -0
  28. package/dist/http/types.cjs +2 -0
  29. package/dist/http/types.cjs.map +1 -0
  30. package/dist/http/types.d.ts +14 -0
  31. package/dist/http/types.mjs +9 -0
  32. package/dist/http/types.mjs.map +1 -0
  33. package/dist/index.cjs +2 -0
  34. package/dist/index.cjs.map +1 -0
  35. package/dist/index.d.ts +6 -0
  36. package/dist/index.mjs +38 -0
  37. package/dist/index.mjs.map +1 -0
  38. package/dist/mock.cjs +2 -0
  39. package/dist/mock.cjs.map +1 -0
  40. package/dist/mock.d.ts +2 -0
  41. package/dist/mock.mjs +7 -0
  42. package/dist/mock.mjs.map +1 -0
  43. package/dist/node_modules/.pnpm/mitt@3.0.1/node_modules/mitt/dist/mitt.cjs +2 -0
  44. package/dist/node_modules/.pnpm/mitt@3.0.1/node_modules/mitt/dist/mitt.cjs.map +1 -0
  45. package/dist/node_modules/.pnpm/mitt@3.0.1/node_modules/mitt/dist/mitt.mjs +20 -0
  46. package/dist/node_modules/.pnpm/mitt@3.0.1/node_modules/mitt/dist/mitt.mjs.map +1 -0
  47. package/dist/protocol/envelope.cjs +2 -0
  48. package/dist/protocol/envelope.cjs.map +1 -0
  49. package/dist/protocol/envelope.d.ts +3 -0
  50. package/dist/protocol/envelope.mjs +19 -0
  51. package/dist/protocol/envelope.mjs.map +1 -0
  52. package/dist/protocol/guards.cjs +2 -0
  53. package/dist/protocol/guards.cjs.map +1 -0
  54. package/dist/protocol/guards.d.ts +2 -0
  55. package/dist/protocol/guards.mjs +7 -0
  56. package/dist/protocol/guards.mjs.map +1 -0
  57. package/dist/protocol/index.d.ts +2 -0
  58. package/dist/shared/index.d.ts +1 -0
  59. package/dist/shared/visibility.cjs +2 -0
  60. package/dist/shared/visibility.cjs.map +1 -0
  61. package/dist/shared/visibility.d.ts +2 -0
  62. package/dist/shared/visibility.mjs +10 -0
  63. package/dist/shared/visibility.mjs.map +1 -0
  64. package/dist/style.cjs +2 -0
  65. package/dist/style.cjs.map +1 -0
  66. package/dist/style.css +12 -0
  67. package/dist/style.d.ts +1 -0
  68. package/dist/style.mjs +2 -0
  69. package/dist/style.mjs.map +1 -0
  70. package/dist/tui/mapper.cjs +2 -0
  71. package/dist/tui/mapper.cjs.map +1 -0
  72. package/dist/tui/mapper.d.ts +3 -0
  73. package/dist/tui/mapper.mjs +25 -0
  74. package/dist/tui/mapper.mjs.map +1 -0
  75. package/dist/tui/store.cjs +2 -0
  76. package/dist/tui/store.cjs.map +1 -0
  77. package/dist/tui/store.d.ts +2 -0
  78. package/dist/tui/store.mjs +19 -0
  79. package/dist/tui/store.mjs.map +1 -0
  80. package/dist/tui/tim.cjs +2 -0
  81. package/dist/tui/tim.cjs.map +1 -0
  82. package/dist/tui/tim.d.ts +2 -0
  83. package/dist/tui/tim.mjs +116 -0
  84. package/dist/tui/tim.mjs.map +1 -0
  85. package/dist/ui/components/FontSizeControl.vue.cjs +2 -0
  86. package/dist/ui/components/FontSizeControl.vue.cjs.map +1 -0
  87. package/dist/ui/components/FontSizeControl.vue.d.ts +13 -0
  88. package/dist/ui/components/FontSizeControl.vue.mjs +8 -0
  89. package/dist/ui/components/FontSizeControl.vue.mjs.map +1 -0
  90. package/dist/ui/components/FontSizeControl.vue2.cjs +2 -0
  91. package/dist/ui/components/FontSizeControl.vue2.cjs.map +1 -0
  92. package/dist/ui/components/FontSizeControl.vue2.mjs +45 -0
  93. package/dist/ui/components/FontSizeControl.vue2.mjs.map +1 -0
  94. package/dist/ui/components/ImChatRoom.vue.cjs +2 -0
  95. package/dist/ui/components/ImChatRoom.vue.cjs.map +1 -0
  96. package/dist/ui/components/ImChatRoom.vue.d.ts +38 -0
  97. package/dist/ui/components/ImChatRoom.vue.mjs +55 -0
  98. package/dist/ui/components/ImChatRoom.vue.mjs.map +1 -0
  99. package/dist/ui/components/ImChatRoom.vue2.cjs +2 -0
  100. package/dist/ui/components/ImChatRoom.vue2.cjs.map +1 -0
  101. package/dist/ui/components/ImChatRoom.vue2.mjs +5 -0
  102. package/dist/ui/components/ImChatRoom.vue2.mjs.map +1 -0
  103. package/dist/ui/components/ImKit.vue.cjs +2 -0
  104. package/dist/ui/components/ImKit.vue.cjs.map +1 -0
  105. package/dist/ui/components/ImKit.vue.d.ts +17 -0
  106. package/dist/ui/components/ImKit.vue.mjs +17 -0
  107. package/dist/ui/components/ImKit.vue.mjs.map +1 -0
  108. package/dist/ui/components/ImKit.vue2.cjs +2 -0
  109. package/dist/ui/components/ImKit.vue2.cjs.map +1 -0
  110. package/dist/ui/components/ImKit.vue2.mjs +5 -0
  111. package/dist/ui/components/ImKit.vue2.mjs.map +1 -0
  112. package/dist/ui/components/ImMessageInput.vue.cjs +2 -0
  113. package/dist/ui/components/ImMessageInput.vue.cjs.map +1 -0
  114. package/dist/ui/components/ImMessageInput.vue.d.ts +22 -0
  115. package/dist/ui/components/ImMessageInput.vue.mjs +5 -0
  116. package/dist/ui/components/ImMessageInput.vue.mjs.map +1 -0
  117. package/dist/ui/components/ImMessageInput.vue2.cjs +2 -0
  118. package/dist/ui/components/ImMessageInput.vue2.cjs.map +1 -0
  119. package/dist/ui/components/ImMessageInput.vue2.mjs +33 -0
  120. package/dist/ui/components/ImMessageInput.vue2.mjs.map +1 -0
  121. package/dist/ui/components/PcConversationListSplit.vue.cjs +2 -0
  122. package/dist/ui/components/PcConversationListSplit.vue.cjs.map +1 -0
  123. package/dist/ui/components/PcConversationListSplit.vue.d.ts +8 -0
  124. package/dist/ui/components/PcConversationListSplit.vue.mjs +8 -0
  125. package/dist/ui/components/PcConversationListSplit.vue.mjs.map +1 -0
  126. package/dist/ui/components/PcConversationListSplit.vue2.cjs +2 -0
  127. package/dist/ui/components/PcConversationListSplit.vue2.cjs.map +1 -0
  128. package/dist/ui/components/PcConversationListSplit.vue2.mjs +90 -0
  129. package/dist/ui/components/PcConversationListSplit.vue2.mjs.map +1 -0
  130. package/dist/ui/components/SysMessage.vue.cjs +2 -0
  131. package/dist/ui/components/SysMessage.vue.cjs.map +1 -0
  132. package/dist/ui/components/SysMessage.vue.d.ts +19 -0
  133. package/dist/ui/components/SysMessage.vue.mjs +8 -0
  134. package/dist/ui/components/SysMessage.vue.mjs.map +1 -0
  135. package/dist/ui/components/SysMessage.vue2.cjs +2 -0
  136. package/dist/ui/components/SysMessage.vue2.cjs.map +1 -0
  137. package/dist/ui/components/SysMessage.vue2.mjs +42 -0
  138. package/dist/ui/components/SysMessage.vue2.mjs.map +1 -0
  139. package/dist/ui/index.d.ts +8 -0
  140. package/dist/ui/layouts/ChatLayoutH5.vue.cjs +2 -0
  141. package/dist/ui/layouts/ChatLayoutH5.vue.cjs.map +1 -0
  142. package/dist/ui/layouts/ChatLayoutH5.vue.d.ts +22 -0
  143. package/dist/ui/layouts/ChatLayoutH5.vue.mjs +8 -0
  144. package/dist/ui/layouts/ChatLayoutH5.vue.mjs.map +1 -0
  145. package/dist/ui/layouts/ChatLayoutH5.vue2.cjs +2 -0
  146. package/dist/ui/layouts/ChatLayoutH5.vue2.cjs.map +1 -0
  147. package/dist/ui/layouts/ChatLayoutH5.vue2.mjs +49 -0
  148. package/dist/ui/layouts/ChatLayoutH5.vue2.mjs.map +1 -0
  149. package/dist/ui/layouts/ChatLayoutPc.vue.cjs +2 -0
  150. package/dist/ui/layouts/ChatLayoutPc.vue.cjs.map +1 -0
  151. package/dist/ui/layouts/ChatLayoutPc.vue.d.ts +39 -0
  152. package/dist/ui/layouts/ChatLayoutPc.vue.mjs +8 -0
  153. package/dist/ui/layouts/ChatLayoutPc.vue.mjs.map +1 -0
  154. package/dist/ui/layouts/ChatLayoutPc.vue2.cjs +2 -0
  155. package/dist/ui/layouts/ChatLayoutPc.vue2.cjs.map +1 -0
  156. package/dist/ui/layouts/ChatLayoutPc.vue2.mjs +66 -0
  157. package/dist/ui/layouts/ChatLayoutPc.vue2.mjs.map +1 -0
  158. package/dist/ui/mock/consultMeta.cjs +2 -0
  159. package/dist/ui/mock/consultMeta.cjs.map +1 -0
  160. package/dist/ui/mock/consultMeta.d.ts +9 -0
  161. package/dist/ui/mock/consultMeta.mjs +29 -0
  162. package/dist/ui/mock/consultMeta.mjs.map +1 -0
  163. package/dist/ui/mock/mock-driver.cjs +2 -0
  164. package/dist/ui/mock/mock-driver.cjs.map +1 -0
  165. package/dist/ui/mock/mock-driver.d.ts +2 -0
  166. package/dist/ui/mock/mock-driver.mjs +51 -0
  167. package/dist/ui/mock/mock-driver.mjs.map +1 -0
  168. package/dist/ui/mock/mock.d.ts +2 -0
  169. package/dist/ui/renderers/MessageProxy.cjs +2 -0
  170. package/dist/ui/renderers/MessageProxy.cjs.map +1 -0
  171. package/dist/ui/renderers/MessageProxy.d.ts +24 -0
  172. package/dist/ui/renderers/MessageProxy.mjs +36 -0
  173. package/dist/ui/renderers/MessageProxy.mjs.map +1 -0
  174. package/dist/ui/renderers/createMessageComponent.cjs +2 -0
  175. package/dist/ui/renderers/createMessageComponent.cjs.map +1 -0
  176. package/dist/ui/renderers/createMessageComponent.d.ts +4 -0
  177. package/dist/ui/renderers/createMessageComponent.mjs +15 -0
  178. package/dist/ui/renderers/createMessageComponent.mjs.map +1 -0
  179. package/dist/ui/renderers/historyFilter.cjs +2 -0
  180. package/dist/ui/renderers/historyFilter.cjs.map +1 -0
  181. package/dist/ui/renderers/historyFilter.d.ts +10 -0
  182. package/dist/ui/renderers/historyFilter.mjs +41 -0
  183. package/dist/ui/renderers/historyFilter.mjs.map +1 -0
  184. package/dist/ui/renderers/registry.cjs +2 -0
  185. package/dist/ui/renderers/registry.cjs.map +1 -0
  186. package/dist/ui/renderers/registry.d.ts +3 -0
  187. package/dist/ui/renderers/registry.mjs +17 -0
  188. package/dist/ui/renderers/registry.mjs.map +1 -0
  189. package/dist/ui/renderers/resolve.cjs +2 -0
  190. package/dist/ui/renderers/resolve.cjs.map +1 -0
  191. package/dist/ui/renderers/resolve.d.ts +2 -0
  192. package/dist/ui/renderers/resolve.mjs +8 -0
  193. package/dist/ui/renderers/resolve.mjs.map +1 -0
  194. package/dist/ui/styles/style.d.ts +0 -0
  195. package/dist/utils/log.cjs +2 -0
  196. package/dist/utils/log.cjs.map +1 -0
  197. package/dist/utils/log.d.ts +1 -0
  198. package/dist/utils/log.mjs +7 -0
  199. package/dist/utils/log.mjs.map +1 -0
  200. package/package.json +65 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.mjs","sources":["../../src/http/types.ts"],"sourcesContent":["export interface ApiResp<T = any> {\n code: number\n data: T\n message: string\n}\n\nexport class ApiError extends Error {\n code: number\n detail?: any\n constructor(code: number, message: string, detail?: any) {\n super(message)\n this.code = code\n this.detail = detail\n }\n}\n\nexport interface HttpClient {\n get<T = any>(url: string, config?: any): Promise<T>\n post<T = any>(url: string, data?: any, config?: any): Promise<T>\n}\n"],"names":["ApiError","code","message","detail"],"mappings":"AAMO,MAAMA,UAAiB,MAAM;AAAA,EAGlC,YAAYC,GAAcC,GAAiBC,GAAc;AACvD,UAAMD,CAAO,GACb,KAAK,OAAOD,GACZ,KAAK,SAASE;AAAA,EAChB;AACF;"}
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("./tui/tim.cjs"),o=require("./http/createHttp.cjs"),s=require("./ui/components/ImKit.vue.cjs"),n=require("./ui/components/ImChatRoom.vue.cjs"),c=require("./core/createClient.cjs"),a=require("./core/client.cjs"),l=require("./protocol/guards.cjs"),t=require("./protocol/envelope.cjs"),u=require("./shared/visibility.cjs"),v=require("./ui/components/PcConversationListSplit.vue.cjs"),r=require("./ui/renderers/registry.cjs"),p=require("./ui/renderers/resolve.cjs"),g=require("./ui/renderers/createMessageComponent.cjs"),q=require("./ui/mock/mock-driver.cjs"),e=require("./ui/mock/consultMeta.cjs");exports.createTuiDriver=i.createTuiDriver;exports.createFetchHttp=o.createFetchHttp;exports.ImKit=s;exports.ImChatRoom=n;exports.createClient=c.createClient;exports.IMClient=a.IMClient;exports.isEnvelope=l.isEnvelope;exports.decodeEnvelope=t.decodeEnvelope;exports.encodeEnvelope=t.encodeEnvelope;exports.watchPageVisibility=u.watchPageVisibility;exports.PcConversationListSplit=v;exports.registerRenderer=r.registerRenderer;exports.resolveRenderer=r.resolveRenderer;exports.resolveEnvelopeFromMessage=p.resolveEnvelopeFromMessage;exports.createMessageComponent=g.createMessageComponent;exports.createMockDriver=q.createMockDriver;exports.DEPTS=e.DEPTS;exports.TYPES=e.TYPES;exports.fetchConsultMetaBatch=e.fetchConsultMetaBatch;exports.sleep=e.sleep;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export * from './core';
2
+ export * from './protocol';
3
+ export * from './shared';
4
+ export * from './ui';
5
+ export * from './tui/tim';
6
+ export * from './http/createHttp';
package/dist/index.mjs ADDED
@@ -0,0 +1,38 @@
1
+ import { createTuiDriver as o } from "./tui/tim.mjs";
2
+ import { createFetchHttp as p } from "./http/createHttp.mjs";
3
+ import { default as a } from "./ui/components/ImKit.vue.mjs";
4
+ import { default as s } from "./ui/components/ImChatRoom.vue.mjs";
5
+ import { createClient as l } from "./core/createClient.mjs";
6
+ import { IMClient as n } from "./core/client.mjs";
7
+ import { isEnvelope as v } from "./protocol/guards.mjs";
8
+ import { decodeEnvelope as C, encodeEnvelope as E } from "./protocol/envelope.mjs";
9
+ import { watchPageVisibility as u } from "./shared/visibility.mjs";
10
+ import { default as g } from "./ui/components/PcConversationListSplit.vue.mjs";
11
+ import { registerRenderer as D, resolveRenderer as I } from "./ui/renderers/registry.mjs";
12
+ import { resolveEnvelopeFromMessage as S } from "./ui/renderers/resolve.mjs";
13
+ import { createMessageComponent as F } from "./ui/renderers/createMessageComponent.mjs";
14
+ import { createMockDriver as k } from "./ui/mock/mock-driver.mjs";
15
+ import { DEPTS as y, TYPES as B, fetchConsultMetaBatch as H, sleep as K } from "./ui/mock/consultMeta.mjs";
16
+ export {
17
+ y as DEPTS,
18
+ n as IMClient,
19
+ s as ImChatRoom,
20
+ a as ImKit,
21
+ g as PcConversationListSplit,
22
+ B as TYPES,
23
+ l as createClient,
24
+ p as createFetchHttp,
25
+ F as createMessageComponent,
26
+ k as createMockDriver,
27
+ o as createTuiDriver,
28
+ C as decodeEnvelope,
29
+ E as encodeEnvelope,
30
+ H as fetchConsultMetaBatch,
31
+ v as isEnvelope,
32
+ D as registerRenderer,
33
+ S as resolveEnvelopeFromMessage,
34
+ I as resolveRenderer,
35
+ K as sleep,
36
+ u as watchPageVisibility
37
+ };
38
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
package/dist/mock.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./ui/mock/mock-driver.cjs"),t=require("./ui/mock/consultMeta.cjs");exports.createMockDriver=e.createMockDriver;exports.fetchConsultMetaBatch=t.fetchConsultMetaBatch;
2
+ //# sourceMappingURL=mock.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
package/dist/mock.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './ui/mock/mock'
2
+ export {}
package/dist/mock.mjs ADDED
@@ -0,0 +1,7 @@
1
+ import { createMockDriver as t } from "./ui/mock/mock-driver.mjs";
2
+ import { fetchConsultMetaBatch as c } from "./ui/mock/consultMeta.mjs";
3
+ export {
4
+ t as createMockDriver,
5
+ c as fetchConsultMetaBatch
6
+ };
7
+ //# sourceMappingURL=mock.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -0,0 +1,2 @@
1
+ "use strict";function n(t){return{all:t=t||new Map,on:function(e,c){var i=t.get(e);i?i.push(c):t.set(e,[c])},off:function(e,c){var i=t.get(e);i&&(c?i.splice(i.indexOf(c)>>>0,1):t.set(e,[]))},emit:function(e,c){var i=t.get(e);i&&i.slice().map(function(f){f(c)}),(i=t.get("*"))&&i.slice().map(function(f){f(e,c)})}}}module.exports=n;
2
+ //# sourceMappingURL=mitt.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mitt.cjs","sources":["../../../../../../../../../node_modules/.pnpm/mitt@3.0.1/node_modules/mitt/dist/mitt.mjs"],"sourcesContent":["export default function(n){return{all:n=n||new Map,on:function(t,e){var i=n.get(t);i?i.push(e):n.set(t,[e])},off:function(t,e){var i=n.get(t);i&&(e?i.splice(i.indexOf(e)>>>0,1):n.set(t,[]))},emit:function(t,e){var i=n.get(t);i&&i.slice().map(function(n){n(e)}),(i=n.get(\"*\"))&&i.slice().map(function(n){n(t,e)})}}}\n//# sourceMappingURL=mitt.mjs.map\n"],"names":["mitt","n","t","e"],"mappings":"aAAe,SAAAA,EAASC,EAAE,CAAC,MAAM,CAAC,IAAIA,EAAEA,GAAG,IAAI,IAAI,GAAG,SAASC,EAAEC,EAAE,CAAC,IAAI,EAAEF,EAAE,IAAIC,CAAC,EAAE,EAAE,EAAE,KAAKC,CAAC,EAAEF,EAAE,IAAIC,EAAE,CAACC,CAAC,CAAC,CAAC,EAAE,IAAI,SAASD,EAAEC,EAAE,CAAC,IAAI,EAAEF,EAAE,IAAIC,CAAC,EAAE,IAAIC,EAAE,EAAE,OAAO,EAAE,QAAQA,CAAC,IAAI,EAAE,CAAC,EAAEF,EAAE,IAAIC,EAAE,EAAE,EAAE,EAAE,KAAK,SAASA,EAAEC,EAAE,CAAC,IAAI,EAAEF,EAAE,IAAIC,CAAC,EAAE,GAAG,EAAE,QAAQ,IAAI,SAASD,EAAE,CAACA,EAAEE,CAAC,CAAC,CAAC,GAAG,EAAEF,EAAE,IAAI,GAAG,IAAI,EAAE,MAAK,EAAG,IAAI,SAASA,EAAE,CAACA,EAAEC,EAAEC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC","x_google_ignoreList":[0]}
@@ -0,0 +1,20 @@
1
+ function c(t) {
2
+ return { all: t = t || /* @__PURE__ */ new Map(), on: function(e, f) {
3
+ var i = t.get(e);
4
+ i ? i.push(f) : t.set(e, [f]);
5
+ }, off: function(e, f) {
6
+ var i = t.get(e);
7
+ i && (f ? i.splice(i.indexOf(f) >>> 0, 1) : t.set(e, []));
8
+ }, emit: function(e, f) {
9
+ var i = t.get(e);
10
+ i && i.slice().map(function(a) {
11
+ a(f);
12
+ }), (i = t.get("*")) && i.slice().map(function(a) {
13
+ a(e, f);
14
+ });
15
+ } };
16
+ }
17
+ export {
18
+ c as default
19
+ };
20
+ //# sourceMappingURL=mitt.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mitt.mjs","sources":["../../../../../../../../../node_modules/.pnpm/mitt@3.0.1/node_modules/mitt/dist/mitt.mjs"],"sourcesContent":["export default function(n){return{all:n=n||new Map,on:function(t,e){var i=n.get(t);i?i.push(e):n.set(t,[e])},off:function(t,e){var i=n.get(t);i&&(e?i.splice(i.indexOf(e)>>>0,1):n.set(t,[]))},emit:function(t,e){var i=n.get(t);i&&i.slice().map(function(n){n(e)}),(i=n.get(\"*\"))&&i.slice().map(function(n){n(t,e)})}}}\n//# sourceMappingURL=mitt.mjs.map\n"],"names":["mitt","n","t","e"],"mappings":"AAAe,SAAAA,EAASC,GAAE;AAAC,SAAM,EAAC,KAAIA,IAAEA,KAAG,oBAAI,OAAI,IAAG,SAASC,GAAEC,GAAE;AAAC,QAAI,IAAEF,EAAE,IAAIC,CAAC;AAAE,QAAE,EAAE,KAAKC,CAAC,IAAEF,EAAE,IAAIC,GAAE,CAACC,CAAC,CAAC;AAAA,EAAC,GAAE,KAAI,SAASD,GAAEC,GAAE;AAAC,QAAI,IAAEF,EAAE,IAAIC,CAAC;AAAE,UAAIC,IAAE,EAAE,OAAO,EAAE,QAAQA,CAAC,MAAI,GAAE,CAAC,IAAEF,EAAE,IAAIC,GAAE,EAAE;AAAA,EAAE,GAAE,MAAK,SAASA,GAAEC,GAAE;AAAC,QAAI,IAAEF,EAAE,IAAIC,CAAC;AAAE,SAAG,EAAE,QAAQ,IAAI,SAASD,GAAE;AAAC,MAAAA,EAAEE,CAAC;AAAA,IAAC,CAAC,IAAG,IAAEF,EAAE,IAAI,GAAG,MAAI,EAAE,MAAK,EAAG,IAAI,SAASA,GAAE;AAAC,MAAAA,EAAEC,GAAEC,CAAC;AAAA,IAAC,CAAC;AAAA,EAAC,EAAC;AAAC;","x_google_ignoreList":[0]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function n(e){return JSON.stringify(e)}function o(e){if(!e)return null;if(typeof e=="object"&&e.type&&e.version)return e;if(typeof e!="string")return null;try{const r=JSON.parse(e);return r&&r.type?r:null}catch{return null}}exports.decodeEnvelope=o;exports.encodeEnvelope=n;
2
+ //# sourceMappingURL=envelope.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.cjs","sources":["../../src/protocol/envelope.ts"],"sourcesContent":["// 自定义消息 envelope:统一序列化/反序列化\nimport type { Envelope } from '../core/types'\nimport { logTag } from '../utils/log'\nexport function encodeEnvelope(env: Envelope): string {\n return JSON.stringify(env)\n}\n\nexport function decodeEnvelope(input: any): Envelope | null {\n // logTag('input', input)\n if (!input) return null\n if (typeof input === 'object' && input.type && input.version) return input as Envelope\n if (typeof input !== 'string') return null\n\n try {\n const obj = JSON.parse(input)\n if (obj && obj.type) return obj as Envelope\n return null\n } catch {\n return null\n }\n}\n"],"names":["encodeEnvelope","env","decodeEnvelope","input","obj"],"mappings":"gFAGO,SAASA,EAAeC,EAAuB,CACpD,OAAO,KAAK,UAAUA,CAAG,CAC3B,CAEO,SAASC,EAAeC,EAA6B,CAE1D,GAAI,CAACA,EAAO,OAAO,KACnB,GAAI,OAAOA,GAAU,UAAYA,EAAM,MAAQA,EAAM,QAAS,OAAOA,EACrE,GAAI,OAAOA,GAAU,SAAU,OAAO,KAEtC,GAAI,CACF,MAAMC,EAAM,KAAK,MAAMD,CAAK,EAC5B,OAAIC,GAAOA,EAAI,KAAaA,EACrB,IACT,MAAQ,CACN,OAAO,IACT,CACF"}
@@ -0,0 +1,3 @@
1
+ import { Envelope } from '../core/types';
2
+ export declare function encodeEnvelope(env: Envelope): string;
3
+ export declare function decodeEnvelope(input: any): Envelope | null;
@@ -0,0 +1,19 @@
1
+ function n(e) {
2
+ return JSON.stringify(e);
3
+ }
4
+ function t(e) {
5
+ if (!e) return null;
6
+ if (typeof e == "object" && e.type && e.version) return e;
7
+ if (typeof e != "string") return null;
8
+ try {
9
+ const r = JSON.parse(e);
10
+ return r && r.type ? r : null;
11
+ } catch {
12
+ return null;
13
+ }
14
+ }
15
+ export {
16
+ t as decodeEnvelope,
17
+ n as encodeEnvelope
18
+ };
19
+ //# sourceMappingURL=envelope.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.mjs","sources":["../../src/protocol/envelope.ts"],"sourcesContent":["// 自定义消息 envelope:统一序列化/反序列化\nimport type { Envelope } from '../core/types'\nimport { logTag } from '../utils/log'\nexport function encodeEnvelope(env: Envelope): string {\n return JSON.stringify(env)\n}\n\nexport function decodeEnvelope(input: any): Envelope | null {\n // logTag('input', input)\n if (!input) return null\n if (typeof input === 'object' && input.type && input.version) return input as Envelope\n if (typeof input !== 'string') return null\n\n try {\n const obj = JSON.parse(input)\n if (obj && obj.type) return obj as Envelope\n return null\n } catch {\n return null\n }\n}\n"],"names":["encodeEnvelope","env","decodeEnvelope","input","obj"],"mappings":"AAGO,SAASA,EAAeC,GAAuB;AACpD,SAAO,KAAK,UAAUA,CAAG;AAC3B;AAEO,SAASC,EAAeC,GAA6B;AAE1D,MAAI,CAACA,EAAO,QAAO;AACnB,MAAI,OAAOA,KAAU,YAAYA,EAAM,QAAQA,EAAM,QAAS,QAAOA;AACrE,MAAI,OAAOA,KAAU,SAAU,QAAO;AAEtC,MAAI;AACF,UAAMC,IAAM,KAAK,MAAMD,CAAK;AAC5B,WAAIC,KAAOA,EAAI,OAAaA,IACrB;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function t(e){return!!e&&typeof e=="object"&&typeof e.type=="string"&&typeof e.version=="number"&&"payload"in e}exports.isEnvelope=t;
2
+ //# sourceMappingURL=guards.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.cjs","sources":["../../src/protocol/guards.ts"],"sourcesContent":["// packages/im/src/protocol/guards.ts\nimport type { Envelope } from '../core/types'\n\nexport function isEnvelope(v: any): v is Envelope {\n return !!v && typeof v === 'object' && typeof v.type === 'string' && typeof v.version === 'number' && 'payload' in v\n}\n"],"names":["isEnvelope","v"],"mappings":"gFAGO,SAASA,EAAWC,EAAuB,CAChD,MAAO,CAAC,CAACA,GAAK,OAAOA,GAAM,UAAY,OAAOA,EAAE,MAAS,UAAY,OAAOA,EAAE,SAAY,UAAY,YAAaA,CACrH"}
@@ -0,0 +1,2 @@
1
+ import { Envelope } from '../core/types';
2
+ export declare function isEnvelope(v: any): v is Envelope;
@@ -0,0 +1,7 @@
1
+ function o(e) {
2
+ return !!e && typeof e == "object" && typeof e.type == "string" && typeof e.version == "number" && "payload" in e;
3
+ }
4
+ export {
5
+ o as isEnvelope
6
+ };
7
+ //# sourceMappingURL=guards.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.mjs","sources":["../../src/protocol/guards.ts"],"sourcesContent":["// packages/im/src/protocol/guards.ts\nimport type { Envelope } from '../core/types'\n\nexport function isEnvelope(v: any): v is Envelope {\n return !!v && typeof v === 'object' && typeof v.type === 'string' && typeof v.version === 'number' && 'payload' in v\n}\n"],"names":["isEnvelope","v"],"mappings":"AAGO,SAASA,EAAWC,GAAuB;AAChD,SAAO,CAAC,CAACA,KAAK,OAAOA,KAAM,YAAY,OAAOA,EAAE,QAAS,YAAY,OAAOA,EAAE,WAAY,YAAY,aAAaA;AACrH;"}
@@ -0,0 +1,2 @@
1
+ export * from './guards';
2
+ export * from './envelope';
@@ -0,0 +1 @@
1
+ export * from './visibility';
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function t(e){const i=()=>{e(document.visibilityState==="hidden"?"hidden":"visible")};return document.addEventListener("visibilitychange",i),i(),()=>document.removeEventListener("visibilitychange",i)}exports.watchPageVisibility=t;
2
+ //# sourceMappingURL=visibility.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visibility.cjs","sources":["../../src/shared/visibility.ts"],"sourcesContent":["// packages/im/src/shared/visibility.ts\nexport type PageState = 'visible' | 'hidden'\n\nexport function watchPageVisibility(cb: (s: PageState) => void) {\n const handler = () => {\n cb(document.visibilityState === 'hidden' ? 'hidden' : 'visible')\n }\n document.addEventListener('visibilitychange', handler)\n handler()\n return () => document.removeEventListener('visibilitychange', handler)\n}\n"],"names":["watchPageVisibility","cb","handler"],"mappings":"gFAGO,SAASA,EAAoBC,EAA4B,CAC9D,MAAMC,EAAU,IAAM,CACpBD,EAAG,SAAS,kBAAoB,SAAW,SAAW,SAAS,CACjE,EACA,gBAAS,iBAAiB,mBAAoBC,CAAO,EACrDA,EAAA,EACO,IAAM,SAAS,oBAAoB,mBAAoBA,CAAO,CACvE"}
@@ -0,0 +1,2 @@
1
+ export type PageState = 'visible' | 'hidden';
2
+ export declare function watchPageVisibility(cb: (s: PageState) => void): () => void;
@@ -0,0 +1,10 @@
1
+ function t(e) {
2
+ const i = () => {
3
+ e(document.visibilityState === "hidden" ? "hidden" : "visible");
4
+ };
5
+ return document.addEventListener("visibilitychange", i), i(), () => document.removeEventListener("visibilitychange", i);
6
+ }
7
+ export {
8
+ t as watchPageVisibility
9
+ };
10
+ //# sourceMappingURL=visibility.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visibility.mjs","sources":["../../src/shared/visibility.ts"],"sourcesContent":["// packages/im/src/shared/visibility.ts\nexport type PageState = 'visible' | 'hidden'\n\nexport function watchPageVisibility(cb: (s: PageState) => void) {\n const handler = () => {\n cb(document.visibilityState === 'hidden' ? 'hidden' : 'visible')\n }\n document.addEventListener('visibilitychange', handler)\n handler()\n return () => document.removeEventListener('visibilitychange', handler)\n}\n"],"names":["watchPageVisibility","cb","handler"],"mappings":"AAGO,SAASA,EAAoBC,GAA4B;AAC9D,QAAMC,IAAU,MAAM;AACpB,IAAAD,EAAG,SAAS,oBAAoB,WAAW,WAAW,SAAS;AAAA,EACjE;AACA,kBAAS,iBAAiB,oBAAoBC,CAAO,GACrDA,EAAA,GACO,MAAM,SAAS,oBAAoB,oBAAoBA,CAAO;AACvE;"}
package/dist/style.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";;/* empty css */
2
+ //# sourceMappingURL=style.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
package/dist/style.css ADDED
@@ -0,0 +1,12 @@
1
+ .im-chat-room{width:100%;height:100%;display:flex;flex-direction:column}
2
+
3
+ .hl-im-pc[data-v-8cc13c39]{display:flex;grid-template-columns:320px 1fr;height:100%}.hl-im-pc__left[data-v-8cc13c39]{border-right:1px solid rgba(0,0,0,.08);overflow:auto}.hl-im-pc__right[data-v-8cc13c39],.hl-im-pc__chat[data-v-8cc13c39]{flex:1;display:flex;min-width:0}.hl-im-pc[data-v-8cc13c39] .message-layout__meta span,.hl-im-pc[data-v-8cc13c39] .message-input,.hl-im-pc[data-v-8cc13c39] .message-time-divider,.hl-im-pc[data-v-8cc13c39] .message-layout__nick,.hl-im-pc[data-v-8cc13c39] .text-message{font-size:var(--hl-msg-font)}
4
+ /*$vite$:1*/
5
+ .hl-font-ctrl[data-v-c45b912e]{display:inline-flex;align-items:center;gap:4px;padding:4px;border-radius:8px;background:#0000000a;margin-left:8px}.hl-font-ctrl__label[data-v-c45b912e]{font-size:12px;color:#666}.hl-font-ctrl__value[data-v-c45b912e]{font-size:12px;color:#333;min-width:44px;text-align:center}.hl-font-ctrl__btn[data-v-c45b912e]{width:20px;height:24px;border:0;border-radius:6px;background:#fff;cursor:pointer;font-size:14px;line-height:24px;padding:0}.hl-font-ctrl__btn[data-v-c45b912e]:disabled{opacity:.5;cursor:not-allowed}
6
+ /*$vite$:1*/
7
+ .hl-sys-msg[data-v-8ec80450]{margin:8px auto;max-width:520px;padding:10px 12px;border-radius:10px;font-size:13px;line-height:1.45;background:#f6f6f6;color:#333}.hl-sys-msg.is-alert[data-v-8ec80450]{background:#fff5f5;color:#8a1f1f}.hl-sys-msg.is-progress[data-v-8ec80450]{background:#f0fff4;color:#1f6f3a}.hl-sys-msg.is-notice[data-v-8ec80450]{background:#f6f6f6;color:#333}.hl-sys-msg__title[data-v-8ec80450]{font-weight:600;margin-bottom:4px}.hl-sys-msg__text[data-v-8ec80450]{white-space:pre-wrap;word-break:break-word}.hl-sys-msg__actions[data-v-8ec80450]{display:flex;gap:8px;margin-top:8px;flex-wrap:wrap}.hl-sys-msg__btn[data-v-8ec80450]{border:0;border-radius:8px;padding:6px 10px;cursor:pointer;font-size:12px}.hl-sys-msg__btn.is-default[data-v-8ec80450]{background:#fff;color:#333}.hl-sys-msg__btn.is-primary[data-v-8ec80450]{background:#2f80ed;color:#fff}.hl-sys-msg__btn.is-danger[data-v-8ec80450]{background:#eb5757;color:#fff}
8
+ /*$vite$:1*/
9
+ .hl-im-h5[data-v-3e2db453],.hl-im-h5 .hl-im-h5_chat[data-v-3e2db453]{height:100%}
10
+ /*$vite$:1*/
11
+ @charset "UTF-8";.hl-conv[data-v-f4cd5529]{height:100%;display:flex;flex-direction:column;background:#fff}.hl-conv__tabs[data-v-f4cd5529]{display:flex;gap:8px;padding:10px 12px;align-items:center;position:sticky;top:0;background:#fff;z-index:1;border-bottom:1px solid rgba(0,0,0,.06)}.hl-conv__tabs button[data-v-f4cd5529]{padding:6px 10px;border-radius:999px;border:1px solid rgba(0,0,0,.1);background:#00000005;font-size:13px;line-height:18px}.hl-conv__tabs button.active[data-v-f4cd5529]{font-weight:600;background:#0000000f;border-color:#00000024}.hl-conv__search[data-v-f4cd5529]{margin-left:auto;flex:1;min-width:140px;padding:8px 10px;border-radius:999px;border:1px solid rgba(0,0,0,.1);background:#00000005;font-size:13px;outline:none}.hl-conv__search[data-v-f4cd5529]:focus{background:#fff;border-color:#00000038}.hl-conv__list[data-v-f4cd5529]{padding:6px 8px 10px;overflow:auto;flex:1}.hl-conv__item[data-v-f4cd5529]{padding:10px;border-radius:12px;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .15s ease}.hl-conv__item[data-v-f4cd5529]:hover{background:#00000008}.hl-conv__item.active[data-v-f4cd5529]{background:#0000000f}.hl-conv__item+.hl-conv__item[data-v-f4cd5529]{margin-top:6px}.hl-conv__left[data-v-f4cd5529]{display:flex;gap:10px;align-items:center;min-width:0}.hl-conv__avatar[data-v-f4cd5529]{width:38px;height:38px;border-radius:12px;display:grid;place-items:center;font-weight:700;font-size:14px;background:#0000000f;color:#000000b8;flex:0 0 auto}.hl-conv__main[data-v-f4cd5529]{min-width:0;flex:1}.hl-conv__row1[data-v-f4cd5529]{display:flex;align-items:baseline;gap:8px}.hl-conv__title[data-v-f4cd5529]{font-size:14px;font-weight:600;line-height:18px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:1}.hl-conv__time[data-v-f4cd5529]{flex:0 0 auto;font-size:12px;line-height:16px;opacity:.55}.hl-conv__row2[data-v-f4cd5529]{margin-top:4px;display:flex;gap:8px;align-items:center;min-width:0}.hl-conv__sub[data-v-f4cd5529]{font-size:12px;line-height:16px;opacity:.65;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:1}.hl-conv__tag[data-v-f4cd5529]{flex:0 0 auto;font-size:12px;line-height:16px;padding:2px 8px;border-radius:999px;border:1px solid rgba(0,0,0,.1);background:#00000005;opacity:.85}.hl-conv__empty[data-v-f4cd5529]{padding:20px;opacity:.6;text-align:center}.hl-conv__right[data-v-f4cd5529]{flex:0 0 auto;display:flex;flex-direction:column;align-items:flex-end;gap:6px}.badge[data-v-f4cd5529]{display:inline-flex;min-width:18px;height:18px;padding:0 6px;border-radius:999px;align-items:center;justify-content:center;font-size:12px;line-height:18px;border:1px solid rgba(0,0,0,.12);background:#0000000f;font-weight:600}
12
+ /*$vite$:1*/
@@ -0,0 +1 @@
1
+ export {}
package/dist/style.mjs ADDED
@@ -0,0 +1,2 @@
1
+ /* empty css */
2
+ //# sourceMappingURL=style.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("../protocol/envelope.cjs");function p(e){return{id:e?.conversationID??e?.id??"",type:e?.type===1||e?.type==="C2C"?"c2c":e?.type?"group":void 0,title:e?.userProfile?.nick??e?.groupProfile?.name??e?.title??"",avatar:e?.userProfile?.avatar??e?.groupProfile?.avatar??e?.avatar??"",unreadCount:e?.unreadCount??0,lastTime:e?.lastMessage?.lastTime?+e.lastMessage.lastTime:void 0,lastMessage:e?.lastMessage?s(e.lastMessage):void 0,raw:e}}function s(e){const t=e?.type||e?.payload?.type;if(t==="TIMTextElem"||t==="text")return{type:"text",payload:{text:e?.payload?.text??e?.text??""},raw:e};const n=e?.payload?.data??e?.payload?.text??e?.payload?.description,o=a.decodeEnvelope(n);return o?{type:"custom",payload:o,raw:e}:{type:"unknown",payload:e?.payload??e,raw:e}}exports.mapConversation=p;exports.mapMessage=s;
2
+ //# sourceMappingURL=mapper.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.cjs","sources":["../../src/tui/mapper.ts"],"sourcesContent":["// TIM/TUIKit 原始结构 -> 内部模型映射\n// packages/im/src/tui/mapper.ts\nimport type { IMConversation, IMMessage } from '../core/types'\nimport { decodeEnvelope } from '../protocol'\n\nexport function mapConversation(raw: any): IMConversation {\n return {\n id: raw?.conversationID ?? raw?.id ?? '',\n type: raw?.type === 1 || raw?.type === 'C2C' ? 'c2c' : raw?.type ? 'group' : undefined,\n title: raw?.userProfile?.nick ?? raw?.groupProfile?.name ?? raw?.title ?? '',\n avatar: raw?.userProfile?.avatar ?? raw?.groupProfile?.avatar ?? raw?.avatar ?? '',\n unreadCount: raw?.unreadCount ?? 0,\n lastTime: raw?.lastMessage?.lastTime ? +raw.lastMessage.lastTime : undefined,\n lastMessage: raw?.lastMessage ? mapMessage(raw.lastMessage) : undefined,\n raw,\n }\n}\n\nexport function mapMessage(raw: any): IMMessage {\n // 这里做一个尽量“宽松”的识别:不同 SDK/engine 结构可能略有差异\n const type = raw?.type || raw?.payload?.type\n if (type === 'TIMTextElem' || type === 'text') {\n return { type: 'text', payload: { text: raw?.payload?.text ?? raw?.text ?? '' }, raw }\n }\n\n // 自定义:优先尝试 data/text/json\n const customStr = raw?.payload?.data ?? raw?.payload?.text ?? raw?.payload?.description\n const env = decodeEnvelope(customStr)\n if (env) return { type: 'custom', payload: env, raw }\n\n return { type: 'unknown', payload: raw?.payload ?? raw, raw }\n}\n"],"names":["mapConversation","raw","mapMessage","type","customStr","env","decodeEnvelope"],"mappings":"4HAKO,SAASA,EAAgBC,EAA0B,CACxD,MAAO,CACL,GAAIA,GAAK,gBAAkBA,GAAK,IAAM,GACtC,KAAMA,GAAK,OAAS,GAAKA,GAAK,OAAS,MAAQ,MAAQA,GAAK,KAAO,QAAU,OAC7E,MAAOA,GAAK,aAAa,MAAQA,GAAK,cAAc,MAAQA,GAAK,OAAS,GAC1E,OAAQA,GAAK,aAAa,QAAUA,GAAK,cAAc,QAAUA,GAAK,QAAU,GAChF,YAAaA,GAAK,aAAe,EACjC,SAAUA,GAAK,aAAa,SAAW,CAACA,EAAI,YAAY,SAAW,OACnE,YAAaA,GAAK,YAAcC,EAAWD,EAAI,WAAW,EAAI,OAC9D,IAAAA,CAAA,CAEJ,CAEO,SAASC,EAAWD,EAAqB,CAE9C,MAAME,EAAOF,GAAK,MAAQA,GAAK,SAAS,KACxC,GAAIE,IAAS,eAAiBA,IAAS,OACrC,MAAO,CAAE,KAAM,OAAQ,QAAS,CAAE,KAAMF,GAAK,SAAS,MAAQA,GAAK,MAAQ,EAAA,EAAM,IAAAA,CAAA,EAInF,MAAMG,EAAYH,GAAK,SAAS,MAAQA,GAAK,SAAS,MAAQA,GAAK,SAAS,YACtEI,EAAMC,EAAAA,eAAeF,CAAS,EACpC,OAAIC,EAAY,CAAE,KAAM,SAAU,QAASA,EAAK,IAAAJ,CAAA,EAEzC,CAAE,KAAM,UAAW,QAASA,GAAK,SAAWA,EAAK,IAAAA,CAAA,CAC1D"}
@@ -0,0 +1,3 @@
1
+ import { IMConversation, IMMessage } from '../core/types';
2
+ export declare function mapConversation(raw: any): IMConversation;
3
+ export declare function mapMessage(raw: any): IMMessage;
@@ -0,0 +1,25 @@
1
+ import { decodeEnvelope as p } from "../protocol/envelope.mjs";
2
+ function l(t) {
3
+ return {
4
+ id: t?.conversationID ?? t?.id ?? "",
5
+ type: t?.type === 1 || t?.type === "C2C" ? "c2c" : t?.type ? "group" : void 0,
6
+ title: t?.userProfile?.nick ?? t?.groupProfile?.name ?? t?.title ?? "",
7
+ avatar: t?.userProfile?.avatar ?? t?.groupProfile?.avatar ?? t?.avatar ?? "",
8
+ unreadCount: t?.unreadCount ?? 0,
9
+ lastTime: t?.lastMessage?.lastTime ? +t.lastMessage.lastTime : void 0,
10
+ lastMessage: t?.lastMessage ? n(t.lastMessage) : void 0,
11
+ raw: t
12
+ };
13
+ }
14
+ function n(t) {
15
+ const e = t?.type || t?.payload?.type;
16
+ if (e === "TIMTextElem" || e === "text")
17
+ return { type: "text", payload: { text: t?.payload?.text ?? t?.text ?? "" }, raw: t };
18
+ const s = t?.payload?.data ?? t?.payload?.text ?? t?.payload?.description, o = p(s);
19
+ return o ? { type: "custom", payload: o, raw: t } : { type: "unknown", payload: t?.payload ?? t, raw: t };
20
+ }
21
+ export {
22
+ l as mapConversation,
23
+ n as mapMessage
24
+ };
25
+ //# sourceMappingURL=mapper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.mjs","sources":["../../src/tui/mapper.ts"],"sourcesContent":["// TIM/TUIKit 原始结构 -> 内部模型映射\n// packages/im/src/tui/mapper.ts\nimport type { IMConversation, IMMessage } from '../core/types'\nimport { decodeEnvelope } from '../protocol'\n\nexport function mapConversation(raw: any): IMConversation {\n return {\n id: raw?.conversationID ?? raw?.id ?? '',\n type: raw?.type === 1 || raw?.type === 'C2C' ? 'c2c' : raw?.type ? 'group' : undefined,\n title: raw?.userProfile?.nick ?? raw?.groupProfile?.name ?? raw?.title ?? '',\n avatar: raw?.userProfile?.avatar ?? raw?.groupProfile?.avatar ?? raw?.avatar ?? '',\n unreadCount: raw?.unreadCount ?? 0,\n lastTime: raw?.lastMessage?.lastTime ? +raw.lastMessage.lastTime : undefined,\n lastMessage: raw?.lastMessage ? mapMessage(raw.lastMessage) : undefined,\n raw,\n }\n}\n\nexport function mapMessage(raw: any): IMMessage {\n // 这里做一个尽量“宽松”的识别:不同 SDK/engine 结构可能略有差异\n const type = raw?.type || raw?.payload?.type\n if (type === 'TIMTextElem' || type === 'text') {\n return { type: 'text', payload: { text: raw?.payload?.text ?? raw?.text ?? '' }, raw }\n }\n\n // 自定义:优先尝试 data/text/json\n const customStr = raw?.payload?.data ?? raw?.payload?.text ?? raw?.payload?.description\n const env = decodeEnvelope(customStr)\n if (env) return { type: 'custom', payload: env, raw }\n\n return { type: 'unknown', payload: raw?.payload ?? raw, raw }\n}\n"],"names":["mapConversation","raw","mapMessage","type","customStr","env","decodeEnvelope"],"mappings":";AAKO,SAASA,EAAgBC,GAA0B;AACxD,SAAO;AAAA,IACL,IAAIA,GAAK,kBAAkBA,GAAK,MAAM;AAAA,IACtC,MAAMA,GAAK,SAAS,KAAKA,GAAK,SAAS,QAAQ,QAAQA,GAAK,OAAO,UAAU;AAAA,IAC7E,OAAOA,GAAK,aAAa,QAAQA,GAAK,cAAc,QAAQA,GAAK,SAAS;AAAA,IAC1E,QAAQA,GAAK,aAAa,UAAUA,GAAK,cAAc,UAAUA,GAAK,UAAU;AAAA,IAChF,aAAaA,GAAK,eAAe;AAAA,IACjC,UAAUA,GAAK,aAAa,WAAW,CAACA,EAAI,YAAY,WAAW;AAAA,IACnE,aAAaA,GAAK,cAAcC,EAAWD,EAAI,WAAW,IAAI;AAAA,IAC9D,KAAAA;AAAA,EAAA;AAEJ;AAEO,SAASC,EAAWD,GAAqB;AAE9C,QAAME,IAAOF,GAAK,QAAQA,GAAK,SAAS;AACxC,MAAIE,MAAS,iBAAiBA,MAAS;AACrC,WAAO,EAAE,MAAM,QAAQ,SAAS,EAAE,MAAMF,GAAK,SAAS,QAAQA,GAAK,QAAQ,GAAA,GAAM,KAAAA,EAAA;AAInF,QAAMG,IAAYH,GAAK,SAAS,QAAQA,GAAK,SAAS,QAAQA,GAAK,SAAS,aACtEI,IAAMC,EAAeF,CAAS;AACpC,SAAIC,IAAY,EAAE,MAAM,UAAU,SAASA,GAAK,KAAAJ,EAAA,IAEzC,EAAE,MAAM,WAAW,SAASA,GAAK,WAAWA,GAAK,KAAAA,EAAA;AAC1D;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("./mapper.cjs"),n=require("@tencentcloud/chat-uikit-engine");function c(o,r){const e=n.TUIStore.watch(n.StoreName.CONV,{conversationList:t=>r((t??[]).map(a.mapConversation)),currentConversationID:t=>(console.log("id",t),o(t))});return()=>{try{typeof e=="function"&&e()}catch{}}}exports.watchConversations=c;
2
+ //# sourceMappingURL=store.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.cjs","sources":["../../src/tui/store.ts"],"sourcesContent":["// TUIStore watch、会话/消息订阅桥接 只负责“订阅变化 -> 回调”\nimport { mapConversation, mapMessage } from './mapper'\nimport type { IMConversation, IMMessage } from '../core/types'\n\n// 这些 API 在 engine/quickstart/功能文档里反复出现:TUIStore.watch / StoreName.xxx 的模式:contentReference[oaicite:4]{index=4}\nimport { TUIStore, StoreName } from '@tencentcloud/chat-uikit-engine'\n\nexport function watchConversations(cb: (id: string) => void, convListCb: (conversations: IMConversation[]) => void) {\n const unwatch = TUIStore.watch(StoreName.CONV, {\n conversationList: (list: any[]) => convListCb((list ?? []).map(mapConversation)),\n // conversationListData: (list: any[]) => cb((list ?? []).map(mapConversation)),\n currentConversationID: (id) => {\n console.log('id', id)\n return cb(id)\n },\n })\n return () => {\n // 有的实现 watch 会返回 unwatch,有的没有;这里兜底\n try {\n typeof unwatch === 'function' && unwatch()\n } catch {}\n }\n}\n"],"names":["watchConversations","cb","convListCb","unwatch","TUIStore","StoreName","list","mapConversation","id"],"mappings":"6JAOO,SAASA,EAAmBC,EAA0BC,EAAuD,CAClH,MAAMC,EAAUC,EAAAA,SAAS,MAAMC,EAAAA,UAAU,KAAM,CAC7C,iBAAmBC,GAAgBJ,GAAYI,GAAQ,IAAI,IAAIC,EAAAA,eAAe,CAAC,EAE/E,sBAAwBC,IACtB,QAAQ,IAAI,KAAMA,CAAE,EACbP,EAAGO,CAAE,EACd,CACD,EACD,MAAO,IAAM,CAEX,GAAI,CACF,OAAOL,GAAY,YAAcA,EAAA,CACnC,MAAQ,CAAC,CACX,CACF"}
@@ -0,0 +1,2 @@
1
+ import { IMConversation } from '../core/types';
2
+ export declare function watchConversations(cb: (id: string) => void, convListCb: (conversations: IMConversation[]) => void): () => void;
@@ -0,0 +1,19 @@
1
+ import { mapConversation as e } from "./mapper.mjs";
2
+ import { TUIStore as a, StoreName as c } from "@tencentcloud/chat-uikit-engine";
3
+ function m(n, r) {
4
+ const t = a.watch(c.CONV, {
5
+ conversationList: (o) => r((o ?? []).map(e)),
6
+ // conversationListData: (list: any[]) => cb((list ?? []).map(mapConversation)),
7
+ currentConversationID: (o) => (console.log("id", o), n(o))
8
+ });
9
+ return () => {
10
+ try {
11
+ typeof t == "function" && t();
12
+ } catch {
13
+ }
14
+ };
15
+ }
16
+ export {
17
+ m as watchConversations
18
+ };
19
+ //# sourceMappingURL=store.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.mjs","sources":["../../src/tui/store.ts"],"sourcesContent":["// TUIStore watch、会话/消息订阅桥接 只负责“订阅变化 -> 回调”\nimport { mapConversation, mapMessage } from './mapper'\nimport type { IMConversation, IMMessage } from '../core/types'\n\n// 这些 API 在 engine/quickstart/功能文档里反复出现:TUIStore.watch / StoreName.xxx 的模式:contentReference[oaicite:4]{index=4}\nimport { TUIStore, StoreName } from '@tencentcloud/chat-uikit-engine'\n\nexport function watchConversations(cb: (id: string) => void, convListCb: (conversations: IMConversation[]) => void) {\n const unwatch = TUIStore.watch(StoreName.CONV, {\n conversationList: (list: any[]) => convListCb((list ?? []).map(mapConversation)),\n // conversationListData: (list: any[]) => cb((list ?? []).map(mapConversation)),\n currentConversationID: (id) => {\n console.log('id', id)\n return cb(id)\n },\n })\n return () => {\n // 有的实现 watch 会返回 unwatch,有的没有;这里兜底\n try {\n typeof unwatch === 'function' && unwatch()\n } catch {}\n }\n}\n"],"names":["watchConversations","cb","convListCb","unwatch","TUIStore","StoreName","list","mapConversation","id"],"mappings":";;AAOO,SAASA,EAAmBC,GAA0BC,GAAuD;AAClH,QAAMC,IAAUC,EAAS,MAAMC,EAAU,MAAM;AAAA,IAC7C,kBAAkB,CAACC,MAAgBJ,GAAYI,KAAQ,IAAI,IAAIC,CAAe,CAAC;AAAA;AAAA,IAE/E,uBAAuB,CAACC,OACtB,QAAQ,IAAI,MAAMA,CAAE,GACbP,EAAGO,CAAE;AAAA,EACd,CACD;AACD,SAAO,MAAM;AAEX,QAAI;AACF,aAAOL,KAAY,cAAcA,EAAA;AAAA,IACnC,QAAQ;AAAA,IAAC;AAAA,EACX;AACF;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const T=require("./store.cjs"),I=require("@tencentcloud/chat"),h=require("@tencentcloud/tui-core"),o=require("@tencentcloud/chat-uikit-engine"),S=require("../utils/log.cjs");function p(){let a=null,c=null,l=null,u=null,d=null,i=null,g=null,v=[],s=null,C=null;function E(){if(s=o.TUIChatEngine.chat,!s)return;C?.(),C=null;const e=t=>{const n=t?.data??[];if(!n.length)return;const r=n[0]?.conversationID||n[0]?.conversationId||"";S.logTag("MESSAGE_RECEIVED",{conversationId:r,size:n.length,event:t}),l?.({conversationId:r,messages:n})};s.on(I.EVENT.MESSAGE_RECEIVED,e),C=()=>{s?.off?.(I.EVENT.MESSAGE_RECEIVED,e)}}return{async init(){a?.({state:"connecting"}),i?.(),i=T.watchConversations(e=>{g=e,u?.({conversationId:g})},e=>{v=e,d?.({conversations:e})})},async login({userID:e,userSig:t,SDKAppID:n}){try{await h.TUILogin.login({SDKAppID:Number(n)??0,userID:e,userSig:t}),E(),a?.({state:"connected"})}catch(r){throw a?.({state:"disconnected",reason:"login_failed"}),c?.({code:"LOGIN_FAILED",message:r?.message??"login failed",detail:r}),r}},async logout(){i?.(),i=null,await h.TUILogin.logout(),a?.({state:"disconnected",reason:"logout"})},async switchConversation(e){await o.TUIConversationService.switchConversation(e)},getActiveConversationId(){return g??""},getConversations(){return v},async sendText({conversationId:e,text:t}){await o.TUIChatService.sendTextMessage({payload:{text:t}})},async sendCustom({envelope:e}){await o.TUIChatService.sendCustomMessage(e)},async updateNick(e){return o.TUIUserService.updateMyProfile({nick:e}).then(n=>(console.log("res",n),n))},async createGroup(e,t){return o.TUIGroupService.createGroup({type:o.TUIChatEngine.TYPES.GRP_WORK,name:e,joinOption:"free",memberList:t})},async updateMyNameCard(e,t){const n=o.TUIChatService.chat;if(!n)throw new Error("chat 实例不存在,请完成初始化");const r=n.getUserID?.();if(!r)throw new Error("userID 不存在,请完成登录");return o.TUIGroupService.setGroupMemberNameCard({groupID:e,userID:r,nameCard:t})},onMessageReceived(e){return l=e,E(),()=>{l=null}},onActiveConversationChanged(e){return u=e,()=>{u=null}},onConversationListChanged(e){return d=e,()=>{d=null}},onConnectionState(e){return a=e,()=>{a=null}},onError(e){return c=e,()=>{c=null}}}}exports.createTuiDriver=p;
2
+ //# sourceMappingURL=tim.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tim.cjs","sources":["../../src/tui/tim.ts"],"sourcesContent":["// TIM 实例创建/初始化封装\nimport type { ConnectionState, IMDriver, IMMessage, IMConversation } from '../core/types'\nimport { watchConversations } from './store'\nimport TencentCloudChat from '@tencentcloud/chat'\n\n// 登录/服务:官方推荐用 TUILogin\nimport { TUILogin } from '@tencentcloud/tui-core'\n\n// engine 的服务层在示例实现里会调用 TUIChatService / TUIConversationService 来发消息/切会话:contentReference[oaicite:6]{index=6}\nimport {\n TUIChatService,\n TUIGroupService,\n TUIChatEngine,\n TUIUserService,\n TUIConversationService,\n} from '@tencentcloud/chat-uikit-engine'\nimport { logTag } from '../utils/log'\n\nexport function createTuiDriver(): IMDriver {\n let connCb: ((p: { state: ConnectionState; reason?: string }) => void) | null = null\n let errCb: ((p: { code: string; message: string; detail?: any }) => void) | null = null\n let msgCb: ((p: { conversationId: string; messages: IMMessage[] }) => void) | null = null\n let convCb: ((p: { conversationId: string }) => void) | null = null\n let convListCb: ((p: { conversations: IMConversation[] }) => void) | null = null\n\n let stopWatchConv: null | (() => void) = null\n\n let activeConversationId: string | null = null\n // let conversations: IMConversation[] = []\n let cachedConvs: IMConversation[] = []\n\n let tim: any = null\n let offMessageReceived: null | (() => void) = null\n\n function bindTimEvents() {\n tim = TUIChatEngine.chat\n if (!tim) return\n\n // 避免重复绑定\n offMessageReceived?.()\n offMessageReceived = null\n\n const handler = (event: any) => {\n const list = (event?.data ?? []) as any[]\n if (!list.length) return\n\n const conversationId = list[0]?.conversationID || list[0]?.conversationId || ''\n logTag('MESSAGE_RECEIVED', { conversationId, size: list.length, event })\n // 直接抛原始 TIM messageList\n msgCb?.({ conversationId, messages: list })\n }\n\n // 正式监听 TIM 的 MESSAGE_RECEIVED\n tim.on(TencentCloudChat.EVENT.MESSAGE_RECEIVED, handler)\n\n // 返回解绑\n offMessageReceived = () => {\n tim?.off?.(TencentCloudChat.EVENT.MESSAGE_RECEIVED, handler)\n }\n }\n\n return {\n async init() {\n connCb?.({ state: 'connecting' })\n\n // 订阅会话变化(用于你们自定义会话列表)\n stopWatchConv?.()\n stopWatchConv = watchConversations(\n (id) => {\n activeConversationId = id\n convCb?.({ conversationId: activeConversationId })\n },\n (conversations) => {\n cachedConvs = conversations\n convListCb?.({ conversations })\n }\n )\n },\n\n async login({ userID, userSig, SDKAppID }) {\n try {\n await TUILogin.login({\n SDKAppID: Number(SDKAppID) ?? 0,\n userID,\n userSig,\n // 其他可选:useUploadPlugin / framework / language 等\n } as any)\n bindTimEvents()\n connCb?.({ state: 'connected' })\n } catch (e: any) {\n connCb?.({ state: 'disconnected', reason: 'login_failed' })\n errCb?.({ code: 'LOGIN_FAILED', message: e?.message ?? 'login failed', detail: e })\n throw e\n }\n },\n\n async logout() {\n stopWatchConv?.()\n stopWatchConv = null\n // cachedConvs = []\n await TUILogin.logout()\n connCb?.({ state: 'disconnected', reason: 'logout' })\n },\n\n async switchConversation(conversationId) {\n await TUIConversationService.switchConversation(conversationId)\n },\n\n getActiveConversationId() {\n return activeConversationId ?? ''\n },\n\n getConversations() {\n return cachedConvs\n },\n\n async sendText({ conversationId, text }) {\n await TUIChatService.sendTextMessage({ payload: { text } }) // engine 示例做法:contentReference[oaicite:8]{index=8}\n },\n\n async sendCustom({ envelope }) {\n await TUIChatService.sendCustomMessage(envelope)\n },\n\n async updateNick(nick: string) {\n const promise = TUIUserService.updateMyProfile({ nick })\n return promise.then((res) => {\n console.log('res', res)\n return res\n })\n },\n\n async createGroup(groupName: string, memberList: any[]) {\n return TUIGroupService.createGroup({\n type: TUIChatEngine.TYPES.GRP_WORK,\n name: groupName,\n joinOption: 'free',\n memberList,\n })\n },\n\n async updateMyNameCard(groupID: string, nameCard: string) {\n const chat = TUIChatService.chat\n if (!chat) {\n throw new Error('chat 实例不存在,请完成初始化')\n }\n const userID = chat.getUserID?.()\n if (!userID) {\n throw new Error('userID 不存在,请完成登录')\n }\n return TUIGroupService.setGroupMemberNameCard({\n groupID,\n userID,\n nameCard,\n })\n },\n\n onMessageReceived(cb) {\n msgCb = cb\n bindTimEvents()\n return () => {\n msgCb = null\n }\n },\n\n onActiveConversationChanged(cb) {\n convCb = cb\n return () => {\n convCb = null\n }\n },\n\n onConversationListChanged(cb) {\n convListCb = cb\n return () => {\n convListCb = null\n }\n },\n\n onConnectionState(cb) {\n connCb = cb\n return () => {\n connCb = null\n }\n },\n\n onError(cb) {\n errCb = cb\n return () => {\n errCb = null\n }\n },\n }\n}\n"],"names":["createTuiDriver","connCb","errCb","msgCb","convCb","convListCb","stopWatchConv","activeConversationId","cachedConvs","tim","offMessageReceived","bindTimEvents","TUIChatEngine","handler","event","list","conversationId","logTag","TencentCloudChat","watchConversations","id","conversations","userID","userSig","SDKAppID","TUILogin","e","TUIConversationService","text","TUIChatService","envelope","nick","TUIUserService","res","groupName","memberList","TUIGroupService","groupID","nameCard","chat","cb"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { IMDriver } from '../core/types';
2
+ export declare function createTuiDriver(): IMDriver;
@@ -0,0 +1,116 @@
1
+ import { watchConversations as f } from "./store.mjs";
2
+ import m from "@tencentcloud/chat";
3
+ import { TUILogin as h } from "@tencentcloud/tui-core";
4
+ import { TUIChatService as g, TUIGroupService as I, TUIChatEngine as p, TUIUserService as T, TUIConversationService as y } from "@tencentcloud/chat-uikit-engine";
5
+ import { logTag as w } from "../utils/log.mjs";
6
+ function U() {
7
+ let r = null, i = null, l = null, c = null, u = null, a = null, d = null, v = [], s = null, C = null;
8
+ function E() {
9
+ if (s = p.chat, !s) return;
10
+ C?.(), C = null;
11
+ const e = (t) => {
12
+ const n = t?.data ?? [];
13
+ if (!n.length) return;
14
+ const o = n[0]?.conversationID || n[0]?.conversationId || "";
15
+ w("MESSAGE_RECEIVED", { conversationId: o, size: n.length, event: t }), l?.({ conversationId: o, messages: n });
16
+ };
17
+ s.on(m.EVENT.MESSAGE_RECEIVED, e), C = () => {
18
+ s?.off?.(m.EVENT.MESSAGE_RECEIVED, e);
19
+ };
20
+ }
21
+ return {
22
+ async init() {
23
+ r?.({ state: "connecting" }), a?.(), a = f(
24
+ (e) => {
25
+ d = e, c?.({ conversationId: d });
26
+ },
27
+ (e) => {
28
+ v = e, u?.({ conversations: e });
29
+ }
30
+ );
31
+ },
32
+ async login({ userID: e, userSig: t, SDKAppID: n }) {
33
+ try {
34
+ await h.login({
35
+ SDKAppID: Number(n) ?? 0,
36
+ userID: e,
37
+ userSig: t
38
+ // 其他可选:useUploadPlugin / framework / language 等
39
+ }), E(), r?.({ state: "connected" });
40
+ } catch (o) {
41
+ throw r?.({ state: "disconnected", reason: "login_failed" }), i?.({ code: "LOGIN_FAILED", message: o?.message ?? "login failed", detail: o }), o;
42
+ }
43
+ },
44
+ async logout() {
45
+ a?.(), a = null, await h.logout(), r?.({ state: "disconnected", reason: "logout" });
46
+ },
47
+ async switchConversation(e) {
48
+ await y.switchConversation(e);
49
+ },
50
+ getActiveConversationId() {
51
+ return d ?? "";
52
+ },
53
+ getConversations() {
54
+ return v;
55
+ },
56
+ async sendText({ conversationId: e, text: t }) {
57
+ await g.sendTextMessage({ payload: { text: t } });
58
+ },
59
+ async sendCustom({ envelope: e }) {
60
+ await g.sendCustomMessage(e);
61
+ },
62
+ async updateNick(e) {
63
+ return T.updateMyProfile({ nick: e }).then((n) => (console.log("res", n), n));
64
+ },
65
+ async createGroup(e, t) {
66
+ return I.createGroup({
67
+ type: p.TYPES.GRP_WORK,
68
+ name: e,
69
+ joinOption: "free",
70
+ memberList: t
71
+ });
72
+ },
73
+ async updateMyNameCard(e, t) {
74
+ const n = g.chat;
75
+ if (!n)
76
+ throw new Error("chat 实例不存在,请完成初始化");
77
+ const o = n.getUserID?.();
78
+ if (!o)
79
+ throw new Error("userID 不存在,请完成登录");
80
+ return I.setGroupMemberNameCard({
81
+ groupID: e,
82
+ userID: o,
83
+ nameCard: t
84
+ });
85
+ },
86
+ onMessageReceived(e) {
87
+ return l = e, E(), () => {
88
+ l = null;
89
+ };
90
+ },
91
+ onActiveConversationChanged(e) {
92
+ return c = e, () => {
93
+ c = null;
94
+ };
95
+ },
96
+ onConversationListChanged(e) {
97
+ return u = e, () => {
98
+ u = null;
99
+ };
100
+ },
101
+ onConnectionState(e) {
102
+ return r = e, () => {
103
+ r = null;
104
+ };
105
+ },
106
+ onError(e) {
107
+ return i = e, () => {
108
+ i = null;
109
+ };
110
+ }
111
+ };
112
+ }
113
+ export {
114
+ U as createTuiDriver
115
+ };
116
+ //# sourceMappingURL=tim.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tim.mjs","sources":["../../src/tui/tim.ts"],"sourcesContent":["// TIM 实例创建/初始化封装\nimport type { ConnectionState, IMDriver, IMMessage, IMConversation } from '../core/types'\nimport { watchConversations } from './store'\nimport TencentCloudChat from '@tencentcloud/chat'\n\n// 登录/服务:官方推荐用 TUILogin\nimport { TUILogin } from '@tencentcloud/tui-core'\n\n// engine 的服务层在示例实现里会调用 TUIChatService / TUIConversationService 来发消息/切会话:contentReference[oaicite:6]{index=6}\nimport {\n TUIChatService,\n TUIGroupService,\n TUIChatEngine,\n TUIUserService,\n TUIConversationService,\n} from '@tencentcloud/chat-uikit-engine'\nimport { logTag } from '../utils/log'\n\nexport function createTuiDriver(): IMDriver {\n let connCb: ((p: { state: ConnectionState; reason?: string }) => void) | null = null\n let errCb: ((p: { code: string; message: string; detail?: any }) => void) | null = null\n let msgCb: ((p: { conversationId: string; messages: IMMessage[] }) => void) | null = null\n let convCb: ((p: { conversationId: string }) => void) | null = null\n let convListCb: ((p: { conversations: IMConversation[] }) => void) | null = null\n\n let stopWatchConv: null | (() => void) = null\n\n let activeConversationId: string | null = null\n // let conversations: IMConversation[] = []\n let cachedConvs: IMConversation[] = []\n\n let tim: any = null\n let offMessageReceived: null | (() => void) = null\n\n function bindTimEvents() {\n tim = TUIChatEngine.chat\n if (!tim) return\n\n // 避免重复绑定\n offMessageReceived?.()\n offMessageReceived = null\n\n const handler = (event: any) => {\n const list = (event?.data ?? []) as any[]\n if (!list.length) return\n\n const conversationId = list[0]?.conversationID || list[0]?.conversationId || ''\n logTag('MESSAGE_RECEIVED', { conversationId, size: list.length, event })\n // 直接抛原始 TIM messageList\n msgCb?.({ conversationId, messages: list })\n }\n\n // 正式监听 TIM 的 MESSAGE_RECEIVED\n tim.on(TencentCloudChat.EVENT.MESSAGE_RECEIVED, handler)\n\n // 返回解绑\n offMessageReceived = () => {\n tim?.off?.(TencentCloudChat.EVENT.MESSAGE_RECEIVED, handler)\n }\n }\n\n return {\n async init() {\n connCb?.({ state: 'connecting' })\n\n // 订阅会话变化(用于你们自定义会话列表)\n stopWatchConv?.()\n stopWatchConv = watchConversations(\n (id) => {\n activeConversationId = id\n convCb?.({ conversationId: activeConversationId })\n },\n (conversations) => {\n cachedConvs = conversations\n convListCb?.({ conversations })\n }\n )\n },\n\n async login({ userID, userSig, SDKAppID }) {\n try {\n await TUILogin.login({\n SDKAppID: Number(SDKAppID) ?? 0,\n userID,\n userSig,\n // 其他可选:useUploadPlugin / framework / language 等\n } as any)\n bindTimEvents()\n connCb?.({ state: 'connected' })\n } catch (e: any) {\n connCb?.({ state: 'disconnected', reason: 'login_failed' })\n errCb?.({ code: 'LOGIN_FAILED', message: e?.message ?? 'login failed', detail: e })\n throw e\n }\n },\n\n async logout() {\n stopWatchConv?.()\n stopWatchConv = null\n // cachedConvs = []\n await TUILogin.logout()\n connCb?.({ state: 'disconnected', reason: 'logout' })\n },\n\n async switchConversation(conversationId) {\n await TUIConversationService.switchConversation(conversationId)\n },\n\n getActiveConversationId() {\n return activeConversationId ?? ''\n },\n\n getConversations() {\n return cachedConvs\n },\n\n async sendText({ conversationId, text }) {\n await TUIChatService.sendTextMessage({ payload: { text } }) // engine 示例做法:contentReference[oaicite:8]{index=8}\n },\n\n async sendCustom({ envelope }) {\n await TUIChatService.sendCustomMessage(envelope)\n },\n\n async updateNick(nick: string) {\n const promise = TUIUserService.updateMyProfile({ nick })\n return promise.then((res) => {\n console.log('res', res)\n return res\n })\n },\n\n async createGroup(groupName: string, memberList: any[]) {\n return TUIGroupService.createGroup({\n type: TUIChatEngine.TYPES.GRP_WORK,\n name: groupName,\n joinOption: 'free',\n memberList,\n })\n },\n\n async updateMyNameCard(groupID: string, nameCard: string) {\n const chat = TUIChatService.chat\n if (!chat) {\n throw new Error('chat 实例不存在,请完成初始化')\n }\n const userID = chat.getUserID?.()\n if (!userID) {\n throw new Error('userID 不存在,请完成登录')\n }\n return TUIGroupService.setGroupMemberNameCard({\n groupID,\n userID,\n nameCard,\n })\n },\n\n onMessageReceived(cb) {\n msgCb = cb\n bindTimEvents()\n return () => {\n msgCb = null\n }\n },\n\n onActiveConversationChanged(cb) {\n convCb = cb\n return () => {\n convCb = null\n }\n },\n\n onConversationListChanged(cb) {\n convListCb = cb\n return () => {\n convListCb = null\n }\n },\n\n onConnectionState(cb) {\n connCb = cb\n return () => {\n connCb = null\n }\n },\n\n onError(cb) {\n errCb = cb\n return () => {\n errCb = null\n }\n },\n }\n}\n"],"names":["createTuiDriver","connCb","errCb","msgCb","convCb","convListCb","stopWatchConv","activeConversationId","cachedConvs","tim","offMessageReceived","bindTimEvents","TUIChatEngine","handler","event","list","conversationId","logTag","TencentCloudChat","watchConversations","id","conversations","userID","userSig","SDKAppID","TUILogin","e","TUIConversationService","text","TUIChatService","envelope","nick","TUIUserService","res","groupName","memberList","TUIGroupService","groupID","nameCard","chat","cb"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const e=require("./FontSizeControl.vue2.cjs");;/* empty css */const t=require("../../_virtual/_plugin-vue_export-helper.cjs"),r=t(e,[["__scopeId","data-v-c45b912e"]]);module.exports=r;
2
+ //# sourceMappingURL=FontSizeControl.vue.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FontSizeControl.vue.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ type __VLS_Props = {
2
+ label?: string;
3
+ value: number;
4
+ min?: number;
5
+ max?: number;
6
+ step?: number;
7
+ };
8
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
9
+ change: (v: number) => any;
10
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
11
+ onChange?: ((v: number) => any) | undefined;
12
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
13
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import o from "./FontSizeControl.vue2.mjs";
2
+ /* empty css */
3
+ import t from "../../_virtual/_plugin-vue_export-helper.mjs";
4
+ const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-c45b912e"]]);
5
+ export {
6
+ p as default
7
+ };
8
+ //# sourceMappingURL=FontSizeControl.vue.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FontSizeControl.vue.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,2 @@
1
+ "use strict";const e=require("vue"),s=require("../../utils/log.cjs"),m={class:"hl-font-ctrl"},h={class:"hl-font-ctrl__label"},_=["disabled"],b={class:"hl-font-ctrl__value"},g=["disabled"],f=e.defineComponent({__name:"FontSizeControl",props:{label:{},value:{},min:{},max:{},step:{}},emits:["change"],setup(o,{emit:r}){const t=o,a=r,c=t.min??12,i=t.max??20,l=t.step??1;function u(){s.logTag("dec",t.value,c,l);const n=Math.max(c,t.value-l);s.logTag("dec",n),a("change",n)}function d(){const n=Math.min(i,t.value+l);s.logTag("inc",n),a("change",n)}return(n,p)=>(e.openBlock(),e.createElementBlock("div",m,[e.createElementVNode("span",h,e.toDisplayString(o.label),1),e.createElementVNode("button",{class:"hl-font-ctrl__btn",type:"button",disabled:o.value<=e.unref(c),onClick:u},"-",8,_),e.createElementVNode("span",b,e.toDisplayString(o.value)+"px",1),e.createElementVNode("button",{class:"hl-font-ctrl__btn",type:"button",disabled:o.value>=e.unref(i),onClick:d},"+",8,g)]))}});module.exports=f;
2
+ //# sourceMappingURL=FontSizeControl.vue2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FontSizeControl.vue2.cjs","sources":["../../../src/ui/components/FontSizeControl.vue"],"sourcesContent":["<template>\n <div class=\"hl-font-ctrl\">\n <span class=\"hl-font-ctrl__label\">{{ label }}</span>\n\n <button class=\"hl-font-ctrl__btn\" type=\"button\" :disabled=\"value <= min\" @click=\"dec\">-</button>\n <span class=\"hl-font-ctrl__value\">{{ value }}px</span>\n <button class=\"hl-font-ctrl__btn\" type=\"button\" :disabled=\"value >= max\" @click=\"inc\">+</button>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { logTag } from '../../utils/log'\nconst props = defineProps<{\n label?: string\n value: number\n min?: number\n max?: number\n step?: number\n}>()\n\nconst emit = defineEmits<{\n (e: 'change', v: number): void\n}>()\n\nconst min = props.min ?? 12\nconst max = props.max ?? 20\nconst step = props.step ?? 1\n\nfunction dec() {\n logTag('dec', props.value, min, step)\n const next = Math.max(min, props.value - step)\n logTag('dec', next)\n emit('change', next)\n}\nfunction inc() {\n const next = Math.min(max, props.value + step)\n logTag('inc', next)\n emit('change', next)\n}\n</script>\n\n<style scoped lang=\"scss\">\n.hl-font-ctrl {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px;\n border-radius: 8px;\n background: rgba(0, 0, 0, 0.04);\n margin-left: 8px;\n}\n\n.hl-font-ctrl__label {\n font-size: 12px;\n color: #666;\n}\n\n.hl-font-ctrl__value {\n font-size: 12px;\n color: #333;\n min-width: 44px;\n text-align: center;\n}\n\n.hl-font-ctrl__btn {\n width: 20px;\n height: 24px;\n border: 0;\n border-radius: 6px;\n background: #fff;\n cursor: pointer;\n font-size: 14px;\n line-height: 24px;\n padding: 0;\n}\n\n.hl-font-ctrl__btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n</style>\n"],"names":["props","__props","emit","__emit","min","max","step","dec","logTag","next","inc","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_toDisplayString","_unref","_hoisted_3","_hoisted_4","_hoisted_5"],"mappings":"6TAYA,MAAMA,EAAQC,EAQRC,EAAOC,EAIPC,EAAMJ,EAAM,KAAO,GACnBK,EAAML,EAAM,KAAO,GACnBM,EAAON,EAAM,MAAQ,EAE3B,SAASO,GAAM,CACbC,EAAAA,OAAO,MAAOR,EAAM,MAAOI,EAAKE,CAAI,EACpC,MAAMG,EAAO,KAAK,IAAIL,EAAKJ,EAAM,MAAQM,CAAI,EAC7CE,EAAAA,OAAO,MAAOC,CAAI,EAClBP,EAAK,SAAUO,CAAI,CACrB,CACA,SAASC,GAAM,CACb,MAAMD,EAAO,KAAK,IAAIJ,EAAKL,EAAM,MAAQM,CAAI,EAC7CE,EAAAA,OAAO,MAAOC,CAAI,EAClBP,EAAK,SAAUO,CAAI,CACrB,eArCEE,YAAA,EAAAC,qBAMM,MANNC,EAMM,CALJC,EAAAA,mBAAoD,OAApDC,EAAoDC,EAAAA,gBAAff,EAAA,KAAK,EAAA,CAAA,EAE1Ca,EAAAA,mBAAgG,SAAA,CAAxF,MAAM,oBAAoB,KAAK,SAAU,SAAUb,EAAA,OAASgB,EAAAA,MAAAb,CAAA,EAAM,QAAOG,CAAA,EAAK,IAAC,EAAAW,CAAA,EACvFJ,qBAAsD,OAAtDK,EAAsDH,EAAAA,gBAAjBf,EAAA,KAAK,EAAG,KAAE,CAAA,EAC/Ca,EAAAA,mBAAgG,SAAA,CAAxF,MAAM,oBAAoB,KAAK,SAAU,SAAUb,EAAA,OAASgB,EAAAA,MAAAZ,CAAA,EAAM,QAAOK,CAAA,EAAK,IAAC,EAAAU,CAAA,CAAA"}