-
Notifications
You must be signed in to change notification settings - Fork 49
Expand file tree
/
Copy pathClipElement.vue
More file actions
123 lines (106 loc) · 3.11 KB
/
Copy pathClipElement.vue
File metadata and controls
123 lines (106 loc) · 3.11 KB
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<template>
<ClickOutside :enabled="isHovered" @click-outside="onClickOutside">
<div
v-if="message"
ref="bodyRef"
:class="$style.body"
:data-is-mobile="$boolAttr(isMobile)"
:data-is-editing="$boolAttr(isEditing)"
:data-is-active="$boolAttr(isActive)"
@pointerenter="onPointerEnter"
@click="onClick"
@mouseleave="onMouseLeave"
>
<MessageTools
v-model:is-active="isActive"
:class="$style.tools"
:show="showMessageTools"
:message-id="messageId"
is-minimum
/>
<MessageContents
:class="$style.messageContents"
:message-id="messageId"
/>
<MessageQuoteListItemFooter :class="$style.footer" :message="message" />
</div>
</ClickOutside>
</template>
<script lang="ts" setup>
import { computed, ref, shallowRef, toRef } from 'vue'
import ClickOutside from '/@/components/UI/ClickOutside'
import useEmbeddings from '/@/composables/message/useEmbeddings'
import useResponsive from '/@/composables/useResponsive'
import { useMessagesStore } from '/@/store/entities/messages'
import { useMessageEditingStateStore } from '/@/store/ui/messageEditingStateStore'
import type { MessageId } from '/@/types/entity-ids'
import MessageQuoteListItemFooter from './Embeddings/MessageQuoteListItemFooter.vue'
import MessageContents from './MessageContents.vue'
import MessageTools, { useMessageToolsHover } from './MessageTools.vue'
import useElementRenderObserver, {
type ChangeHeightData
} from './composables/useElementRenderObserver'
const props = defineProps<{
messageId: MessageId
}>()
const emit = defineEmits<{
(e: 'entryMessageLoaded', _relativePos: number): void
(e: 'changeHeight', _data: ChangeHeightData): void
}>()
const isActive = ref(false)
const { messagesMap } = useMessagesStore()
const { editingMessageId } = useMessageEditingStateStore()
const isEditing = computed(() => props.messageId === editingMessageId.value)
const bodyRef = shallowRef<HTMLDivElement | null>(null)
const { isMobile } = useResponsive()
const message = computed(() => messagesMap.value.get(props.messageId))
const { embeddingsState } = useEmbeddings(props)
useElementRenderObserver(
bodyRef,
false,
toRef(props, 'messageId'),
embeddingsState,
emit
)
const { isHovered, onPointerEnter, onClick, onMouseLeave, onClickOutside } =
useMessageToolsHover()
const showMessageTools = computed(
() => (isHovered.value && !isEditing.value) || isActive.value
)
</script>
<style lang="scss" module>
$messagePadding: 32px;
$messagePaddingMobile: 16px;
.body {
position: relative;
width: 100%;
min-width: 0;
overflow: hidden;
overflow: clip;
padding: 8px $messagePadding;
&[data-is-mobile] {
padding: 8px $messagePaddingMobile;
}
&:not([data-is-editing]) {
&[data-is-active],
&:hover {
background: var(--specific-message-hover-background);
}
}
}
.messageContents {
grid-area: message-contents;
min-width: 0;
}
.tools {
position: absolute;
top: 4px;
right: 16px;
z-index: $z-index-message-element-tools;
}
.footer {
margin-top: 4px;
margin-left: 42px;
padding-left: 8px;
}
</style>