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 >
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}
0 commit comments