share.tsx 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. import { defineComponent, DefineComponent, ref, Ref } from 'vue'
  2. import { ElButton, ElFormItem, ElForm, ElRadio, ElMessage } from 'element-plus'
  3. import runtime, * as RuntimeUtils from './runtime'
  4. import styles from './share.module.less'
  5. import request from "/src/helpers/request";
  6. import { vaildStudentUrl } from "/src/helpers/validate";
  7. import { toPng } from "html-to-image";
  8. // @ts-ignore
  9. import Clipboard from "clipboard";
  10. import GroupChat from './groupChat'
  11. import Preview from './preview'
  12. import { state } from '/src/state'
  13. const GroupChatRef: Ref<DefineComponent<{}, {}, any> | null> = ref(null)
  14. const shareText: Ref<HTMLDivElement | null> = ref(null)
  15. export default defineComponent({
  16. name: 'LiveBroadcastShare',
  17. props: {
  18. onClose: {
  19. type: Function,
  20. default: () => { }
  21. }
  22. },
  23. data() {
  24. return {
  25. form: { shareType: '1' },
  26. detail: {
  27. roomTitle: '',
  28. liveStartTime: '',
  29. liveRemark: '',
  30. roomUid: '',
  31. speakerName: ''
  32. },
  33. url: ''
  34. }
  35. },
  36. async mounted() {
  37. this.detail = { ...state.user }
  38. this.url = vaildStudentUrl() + `/#/liveClassTransfer?roomUid=${this.detail.roomUid}`;
  39. },
  40. methods: {
  41. copyText() {
  42. let text = `乐团老师邀请您参与直播课!\n${this.detail.roomTitle || ""
  43. }\主讲人:${this.detail.speakerName}\n直播时间:${this.detail.liveStartTime || ""}\n直播内容:${this.detail.liveRemark || ""
  44. }\n直播地址:${this.url}\n`;
  45. if (text) {
  46. const el = document.createElement('button')
  47. var clipboard = new Clipboard(el, {
  48. text: function () {
  49. return text;
  50. },
  51. });
  52. clipboard.on("success", () => {
  53. ElMessage.success("复制成功");
  54. this.onClose()
  55. // 释放内存
  56. clipboard.destroy();
  57. });
  58. clipboard.on("error", () => {
  59. // 不支持复制
  60. console.log("该浏览器不支持自动复制");
  61. // 释放内存
  62. clipboard.destroy();
  63. });
  64. el.click()
  65. }
  66. },
  67. shareImage() {
  68. var node = document.getElementById("preview");
  69. if (node) {
  70. toPng(node)
  71. .then((dataUrl) => {
  72. var img = new Image();
  73. img.src = dataUrl;
  74. // 在这里下载
  75. let link = document.createElement("a");
  76. let fname = this.detail.roomTitle || "分享图片文件.png"; //下载文件的名字
  77. link.href = dataUrl;
  78. link.setAttribute("download", fname);
  79. document.body.appendChild(link);
  80. link.click();
  81. this.onClose()
  82. })
  83. .catch(function (error) {
  84. console.error("oops, something went wrong!", error);
  85. });
  86. }
  87. },
  88. async shareChat() {
  89. let checkList = GroupChatRef.value?.checkList || [];
  90. if (!(checkList.length > 0)) {
  91. ElMessage.error("请至少选择一个群聊");
  92. return;
  93. }
  94. try {
  95. let obj = {
  96. groupIds: checkList.join(","),
  97. roomUid: this.detail.roomUid,
  98. }
  99. const res = await request.get('/api-web/imLiveBroadcastRoom/shareGroup', {
  100. params: {
  101. ...obj
  102. }
  103. });
  104. ElMessage.success('分享成功')
  105. this.onClose()
  106. } catch (e) {
  107. console.log(e);
  108. }
  109. },
  110. changeRafdio(value: string) {
  111. this.form.shareType = value;
  112. }
  113. },
  114. render() {
  115. return (
  116. <div >
  117. <ElForm model={this.form} ref="form" class={styles.form}>
  118. <ElFormItem label="分享方式" >
  119. <ElRadio modelValue={this.form.shareType} onChange={() => { this.changeRafdio("1") }} label="1">链接分享</ElRadio>
  120. <ElRadio modelValue={this.form.shareType} onChange={() => { this.changeRafdio("2") }} label="2" >二维码分享</ElRadio>
  121. <ElRadio modelValue={this.form.shareType} onChange={() => { this.changeRafdio("3") }} label="3">群聊分享</ElRadio>
  122. </ElFormItem>
  123. </ElForm>
  124. <div>
  125. {this.form.shareType === '1' ? <div class="linkWrap">
  126. <div class={styles.shareWrap}>
  127. <h2>乐团老师邀请您参与直播课!</h2>
  128. <h4>{this.detail.roomTitle}</h4>
  129. <p>主讲人:{this.detail.speakerName}</p>
  130. <p>开播时间:{this.detail.liveStartTime}</p>
  131. <p>直播内容:{this.detail.liveRemark}</p>
  132. <p>直播地址:{this.url}</p>
  133. </div>
  134. <div class={[styles.shareBtn, 'shareText']} onClick={this.copyText} ref='shareText' data-clipboard-action="copy">复制分享内容</div>
  135. </div> : null}
  136. </div >
  137. {this.form.shareType === '2' ? <div class={styles.codeWrap} >
  138. <div class={styles.shareWrap}>
  139. <Preview form={this.detail} url={this.url} />
  140. </div>
  141. <div class={styles.shareBtn} onClick={this.shareImage}>复制分享内容</div>
  142. </div> : null
  143. }
  144. {this.form.shareType == '3' ? <div class={styles.shareWrap}>
  145. <div class={styles.groupWrap} >
  146. <GroupChat ref={GroupChatRef} />
  147. </div>
  148. <div class={styles.shareBtn} onClick={this.shareChat}>发送分享信息</div>
  149. </div> : null
  150. }
  151. </div>
  152. )
  153. }
  154. })