server.ts 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import TUICore, { TUIConstants } from "@tencentcloud/tui-core";
  2. import {
  3. TUITranslateService,
  4. TUIConversationService,
  5. TUIStore,
  6. StoreName,
  7. } from "@tencentcloud/chat-uikit-engine";
  8. import { TUIGlobal } from "@tencentcloud/universal-api";
  9. import { CONV_CREATE_TYPE } from "../../constant";
  10. import { isUniFrameWork } from "../../utils/env";
  11. import createGroupIcon from "../../assets/icon/start-group.svg";
  12. import createC2CIcon from "../../assets/icon/icon-c2c.svg";
  13. import { enableSampleTaskStatus } from "../../utils/enableSampleTaskStatus";
  14. export default class TUIConversationServer {
  15. static instance: TUIConversationServer;
  16. private onCallParamsMap: Map<String, any>;
  17. private onCallCallbackMap: Map<String, Function>;
  18. public constants: typeof TUIConstants;
  19. constructor() {
  20. TUICore.registerService(TUIConstants.TUIConversation.SERVICE.NAME, this);
  21. TUICore.registerExtension(TUIConstants.TUISearch.EXTENSION.SEARCH_MORE.EXT_ID, this);
  22. this.onCallParamsMap = new Map();
  23. this.onCallCallbackMap = new Map();
  24. this.constants = TUIConstants;
  25. }
  26. static getInstance(): TUIConversationServer {
  27. if (!TUIConversationServer.instance) {
  28. TUIConversationServer.instance = new TUIConversationServer();
  29. }
  30. return TUIConversationServer.instance;
  31. }
  32. public getOnCallParams(method: String): any {
  33. return this.onCallParamsMap.get(method);
  34. }
  35. public getOnCallCallback(method: String): Function | undefined {
  36. return this.onCallCallbackMap.get(method);
  37. }
  38. public onCall(method: string, params: Object, callback: Function): void {
  39. this.onCallParamsMap.set(method, params);
  40. this.onCallCallbackMap.set(method, callback);
  41. switch (method) {
  42. case TUIConstants.TUIConversation.SERVICE.METHOD.CREATE_CONVERSATION:
  43. this.createConversation(params);
  44. break;
  45. case TUIConstants.TUIConversation.SERVICE.METHOD.HIDE_CONVERSATION_HEADER:
  46. this.hideConversationHeader();
  47. break;
  48. }
  49. }
  50. public onGetExtension(extensionID: string, params: Object) {
  51. if (extensionID === TUIConstants.TUISearch.EXTENSION.SEARCH_MORE.EXT_ID) {
  52. const list = [
  53. {
  54. weight: 100,
  55. icon: createC2CIcon,
  56. text: TUITranslateService.t("TUIConversation.发起单聊"),
  57. data: {
  58. name: CONV_CREATE_TYPE.TYPEC2C,
  59. },
  60. listener: {
  61. onClicked: this.createConversation.bind(this),
  62. },
  63. },
  64. {
  65. weight: 100,
  66. icon: createGroupIcon,
  67. text: TUITranslateService.t("TUIConversation.发起群聊"),
  68. data: {
  69. name: CONV_CREATE_TYPE.TYPEGROUP,
  70. },
  71. listener: {
  72. onClicked: this.createConversation.bind(this),
  73. },
  74. },
  75. ];
  76. return list;
  77. }
  78. }
  79. private createConversation(item: any) {
  80. // 通知 TUIContact 调用 SelectFriend 组件,进行选人
  81. TUICore.callService({
  82. serviceName: TUIConstants.TUIContact.SERVICE.NAME,
  83. method: TUIConstants.TUIContact.SERVICE.METHOD.SELECT_FRIEND,
  84. params: {
  85. title: item.text,
  86. isRadio: item.data.name !== CONV_CREATE_TYPE.TYPEGROUP,
  87. isNeedSearch: !TUIStore.getData(StoreName.APP, "isOfficial"),
  88. },
  89. callback: async (memberList: Array<any>) => {
  90. if (!memberList || memberList.length === 0) {
  91. // 返回上个页面
  92. return this.routerForward(null);
  93. }
  94. if (item.data.name === CONV_CREATE_TYPE.TYPEGROUP) {
  95. // 选人成员完后,如果是创建群聊,需要创建群组
  96. this.createGroup(memberList);
  97. } else {
  98. const { userID } = memberList[0];
  99. // 生成会话
  100. await this.generateConversation(`C2C${userID}`);
  101. this.routerForward(`C2C${userID}`);
  102. }
  103. },
  104. });
  105. }
  106. private createGroup(memberList: Array<any>) {
  107. // 通知 TUIGroup 调用 CreateGroup 组件,进行建群操作
  108. TUICore.callService({
  109. serviceName: TUIConstants.TUIGroup.SERVICE.NAME,
  110. method: TUIConstants.TUIGroup.SERVICE.METHOD.CREATE_GROUP,
  111. params: {
  112. title: TUITranslateService.t("TUIConversation.发起群聊"),
  113. memberList,
  114. },
  115. callback: async (group: any) => {
  116. let conversationID = null;
  117. if (group) {
  118. const { groupID } = group;
  119. await this.generateConversation(`GROUP${groupID}`);
  120. conversationID = `GROUP${groupID}`;
  121. }
  122. this.routerForward(conversationID);
  123. },
  124. });
  125. }
  126. private async routerForward(conversationID: string | null): Promise<void> {
  127. if (isUniFrameWork) {
  128. await TUIGlobal?.reLaunch({
  129. url: "/TUIKit/components/TUIConversation/index",
  130. });
  131. if (conversationID) {
  132. TUIGlobal?.navigateTo({
  133. url: "/TUIKit/components/TUIChat/index",
  134. });
  135. }
  136. }
  137. }
  138. private generateConversation(conversationID: string) {
  139. TUIConversationService.switchConversation(conversationID)
  140. .then(() => {
  141. if (conversationID.startsWith("GROUP")) {
  142. enableSampleTaskStatus("groupChat");
  143. }
  144. console.warn("打开会话成功");
  145. })
  146. .catch((err: any) => {
  147. console.warn("打开会话失败", err.code, err.msg);
  148. });
  149. }
  150. private hideConversationHeader = () => {
  151. TUIStore.update(StoreName.CUSTOM, "isShowConversationHeader", false);
  152. };
  153. }