Skip to content

Commit 832586b

Browse files
committed
(fix) dynamic message option icon position
1 parent e18d0e7 commit 832586b

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

src/ChatWindow/ChatMessage.vue

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,10 @@
9999

100100
<transition name="slide-left">
101101
<div
102+
ref="actionIcon"
102103
class="svg-button message-options"
103104
v-if="messageActions.length && messageReply && !message.deleted"
104-
@click="optionsOpened = !optionsOpened"
105+
@click="openOptions"
105106
>
106107
<svg-icon name="dropdown" />
107108
</div>
@@ -112,10 +113,12 @@
112113
v-if="messageActions.length"
113114
>
114115
<div
116+
ref="menuOptions"
115117
v-if="optionsOpened"
116118
v-click-outside="closeOptions"
117119
class="menu-options"
118120
:class="{ 'menu-left': message.sender_id !== 'me' }"
121+
:style="{ top: `${menuOptionsHeight}px` }"
119122
>
120123
<div class="menu-list">
121124
<div v-for="action in messageActions" :key="action.name">
@@ -153,7 +156,8 @@ export default {
153156
editedMessage: { type: Object, required: true },
154157
roomUsers: { type: Array, default: () => [] },
155158
textMessages: { type: Object, required: true },
156-
messageActions: { type: Array, required: true }
159+
messageActions: { type: Array, required: true },
160+
roomFooterRef: { type: HTMLDivElement }
157161
},
158162
159163
data() {
@@ -162,7 +166,8 @@ export default {
162166
imageLoading: false,
163167
imageHover: false,
164168
messageReply: false,
165-
optionsOpened: false
169+
optionsOpened: false,
170+
menuOptionsHeight: 0
166171
}
167172
},
168173
@@ -243,6 +248,25 @@ export default {
243248
const image = new Image()
244249
image.src = this.message.file.url
245250
image.addEventListener('load', () => (this.imageLoading = false))
251+
},
252+
openOptions() {
253+
this.optionsOpened = !this.optionsOpened
254+
255+
if (!this.optionsOpened) return
256+
257+
setTimeout(() => {
258+
const menuOptionsHeight = this.$refs.menuOptions.getBoundingClientRect()
259+
.height
260+
261+
const actionIconTop = this.$refs.actionIcon.getBoundingClientRect().top
262+
const roomFooterTop = this.roomFooterRef.getBoundingClientRect().top
263+
264+
const optionsTopPosition =
265+
roomFooterTop - actionIconTop > menuOptionsHeight
266+
267+
if (optionsTopPosition) this.menuOptionsHeight = 28
268+
else this.menuOptionsHeight = -menuOptionsHeight
269+
}, 0)
246270
}
247271
}
248272
}

src/ChatWindow/MessagesList.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
:messageActions="messageActions"
6060
:roomUsers="room.users"
6161
:textMessages="textMessages"
62+
:roomFooterRef="$refs.roomFooter"
6263
@messageActionHandler="messageActionHandler"
6364
@openFile="openFile"
6465
></chat-message>
@@ -67,6 +68,7 @@
6768
</div>
6869
</div>
6970
<div
71+
ref="roomFooter"
7072
class="room-footer"
7173
:class="{
7274
'textarea-outline': editedMessage._id

0 commit comments

Comments
 (0)