-
Notifications
You must be signed in to change notification settings - Fork 49
Expand file tree
/
Copy pathMessageContents.vue
More file actions
119 lines (106 loc) · 3.44 KB
/
Copy pathMessageContents.vue
File metadata and controls
119 lines (106 loc) · 3.44 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
<template>
<div :class="$style.container">
<UserIcon :class="$style.userIcon" :user-id="message.userId" :size="40" />
<MessageHeader
:class="$style.messageHeader"
:user-id="message.userId"
:created-at="message.createdAt"
:updated-at="message.updatedAt"
/>
<div :class="$style.messageContents">
<MarkdownContent
v-show="!isEditing"
:content="renderedContent"
:defer-on-mounted="!isInitialLoad"
/>
<MessageEditor
v-if="isEditing"
:raw-content="message.content"
:message-id="messageId"
:channel-id="message.channelId"
@finish-editing="finishEditing"
/>
<DeferredRender :disabled="isInitialLoad">
<MessageQuoteList
v-if="embeddingsState.quoteMessageIds.length > 0"
:class="$style.messageEmbeddingsList"
:parent-message-channel-id="message.channelId"
:message-ids="embeddingsState.quoteMessageIds"
/>
<MessageFileList
v-if="embeddingsState.fileIds.length > 0"
:class="$style.messageEmbeddingsList"
:channel-id="message.channelId"
:file-ids="embeddingsState.fileIds"
/>
<MessageOgpList
v-if="embeddingsState.externalUrls.length > 0"
:external-urls="embeddingsState.externalUrls"
/>
</DeferredRender>
</div>
</div>
</template>
<script lang="ts" setup>
import { computed } from 'vue'
import DeferredRender from '/@/components/UI/DeferredRender.vue'
import MarkdownContent from '/@/components/UI/MarkdownContent.vue'
import UserIcon from '/@/components/UI/UserIcon.vue'
import useEmbeddings from '/@/composables/message/useEmbeddings'
import { useMessagesView } from '/@/store/domain/messagesView'
import { useMessagesStore } from '/@/store/entities/messages'
import { useMessageEditingStateStore } from '/@/store/ui/messageEditingStateStore'
import type { MessageId } from '/@/types/entity-ids'
import MessageFileList from './Embeddings/MessageFileList.vue'
import MessageOgpList from './Embeddings/MessageOgpList.vue'
import MessageQuoteList from './Embeddings/MessageQuoteList.vue'
import MessageEditor from './MessageEditor.vue'
import MessageHeader from './MessageHeader.vue'
const props = defineProps<{
messageId: MessageId
isInitialLoad?: boolean
}>()
const { messagesMap } = useMessagesStore()
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const message = computed(() => messagesMap.value.get(props.messageId)!)
const { editingMessageId } = useMessageEditingStateStore()
const isEditing = computed(() => props.messageId === editingMessageId.value)
const finishEditing = () => {
editingMessageId.value = undefined
}
const { renderedContentMap } = useMessagesView()
const renderedContent = computed(
() => renderedContentMap.value.get(props.messageId) ?? ''
)
const { embeddingsState } = useEmbeddings(props)
</script>
<style lang="scss" module>
.container {
display: grid;
grid-template:
'user-icon message-header'
'user-icon message-contents'
'......... message-contents';
grid-template-rows: 20px auto 1fr;
grid-template-columns: 42px 1fr;
width: 100%;
min-width: 0;
}
.userIcon {
grid-area: user-icon;
margin-top: 2px;
}
.messageHeader {
grid-area: message-header;
padding-left: 8px;
}
.messageContents {
grid-area: message-contents;
padding-top: 4px;
padding-left: 8px;
min-width: 0;
}
.messageEmbeddingsList {
margin-top: 16px;
}
</style>