gaoluyang
2 天以前 b64a0deae5b5d33f9e20671a68936b27f0b9b00b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<!--
  消息文本片段渲染:tip 文案 + TEXT 气泡共用
  - mention 段挂点击 → openMentionUserInfoCardAtEvent
  - link 段渲染 <a target="_blank">,浏览器默认行为打开新标签
  - text 段原样输出
-->
<script lang="ts" setup>
import type { TipSegment } from '#/views/im/utils/message'
 
import { IM_AT_ALL_USER_ID } from '#/views/im/utils/constants'
import { openMentionUserInfoCardAtEvent } from '#/views/im/utils/user'
 
defineOptions({ name: 'ImTipSegments' })
 
defineProps<{
  segments: TipSegment[]
}>()
 
/** @全体成员是广播 mention,仅高亮配色,不挂可点击交互 */
function isClickableMention(segment: { userId: number }): boolean {
  return segment.userId !== IM_AT_ALL_USER_ID
}
 
/** mention 段点击:fallbackName 取 segment 文本,避免 friend / member 都查不到时弹空 */
function handleMentionClick(
  segment: { text: string; type: 'mention'; userId: number; },
  event: MouseEvent
) {
  if (!isClickableMention(segment)) {
    return
  }
  openMentionUserInfoCardAtEvent(segment.userId, event, segment.text)
}
</script>
 
<template>
  <template v-for="(segment, _index) in segments" :key="_index">
    <span
      v-if="segment.type === 'mention'"
      class="text-[#576b95]"
      :class="{ 'cursor-pointer hover:underline': isClickableMention(segment) }"
      @click.stop="handleMentionClick(segment, $event)"
      >{{ segment.text }}</span>
    <a
      v-else-if="segment.type === 'link'"
      :href="segment.href"
      target="_blank"
      rel="noopener noreferrer"
      class="text-[#576b95] hover:underline break-all"
      @click.stop
      >{{ segment.text }}</a>
    <span v-else>{{ segment.text }}</span>
  </template>
</template>