index.vue 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <template>
  2. <div
  3. v-if="convertVisible"
  4. ref="convertWrapperRef"
  5. :class="{
  6. 'message-convert': true,
  7. 'reverse': props.message.flow === 'out',
  8. 'error': hasConvertError,
  9. }"
  10. >
  11. <ConvertContent
  12. :message="props.message"
  13. :contentVisible="convertVisible"
  14. :isSingleConvert="isSingleConvert"
  15. :convertWrapperRef="convertWrapperRef"
  16. @toggleErrorStatus="toggleErrorStatus"
  17. />
  18. </div>
  19. </template>
  20. <script lang="ts" setup>
  21. import { ref, onMounted, onUnmounted } from '../../../../../adapter-vue';
  22. import {
  23. TUIStore,
  24. StoreName,
  25. IMessageModel,
  26. } from '@tencentcloud/chat-uikit-engine';
  27. import ConvertContent from './convert-content.vue';
  28. import { IConvertInfo } from '../../../../../interface';
  29. interface IProps {
  30. message: IMessageModel;
  31. }
  32. const props = withDefaults(defineProps<IProps>(), {
  33. message: () => ({} as IMessageModel),
  34. });
  35. const convertVisible = ref<boolean>(false);
  36. const hasConvertError = ref<boolean>(false);
  37. const convertWrapperRef = ref<HTMLDivElement>();
  38. let isSingleConvert = true;
  39. onMounted(() => {
  40. TUIStore.watch(StoreName.CHAT, {
  41. voiceToTextInfo: onMessageConvertUpdated,
  42. });
  43. });
  44. onUnmounted(() => {
  45. TUIStore.unwatch(StoreName.CHAT, {
  46. voiceToTextInfo: onMessageConvertUpdated,
  47. });
  48. });
  49. function toggleErrorStatus(hasError: boolean) {
  50. hasConvertError.value = hasError;
  51. }
  52. function onMessageConvertUpdated(info: Map<string, IConvertInfo[]>) {
  53. if (info === undefined) return;
  54. isSingleConvert = false;
  55. const convertInfoList = info.get(props.message.conversationID) || [];
  56. for (let i = 0; i < convertInfoList.length; ++i) {
  57. const { messageID, visible } = convertInfoList[i];
  58. if (messageID === props.message.ID && visible !== undefined) {
  59. if (convertInfoList.length === 1 && visible) {
  60. isSingleConvert = true;
  61. }
  62. hasConvertError.value = false;
  63. convertVisible.value = visible;
  64. break;
  65. }
  66. }
  67. }
  68. </script>
  69. <style lang="scss" scoped>
  70. .message-convert {
  71. margin-top: 4px;
  72. margin-left: 44px;
  73. padding: 10px;
  74. background-color: #f2f7ff;
  75. border-radius: 10px;
  76. display: flex;
  77. flex-direction: column !important;
  78. transition: background-color 0.15s ease-out;
  79. &.error {
  80. background-color: #ffdfdf;
  81. }
  82. }
  83. .message-convert.reverse {
  84. margin-right: 44px;
  85. margin-left: auto;
  86. }
  87. </style>