gaoluyang
7 小时以前 cb9cd49627b65a4c0e137e08063271a8cefe1826
src/views/im/home/pages/conversation/components/message/tip-segments.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,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>