99
99
100
100
<transition name =" slide-left" >
101
101
<div
102
+ ref =" actionIcon"
102
103
class =" svg-button message-options"
103
104
v-if =" messageActions.length && messageReply && !message.deleted"
104
- @click =" optionsOpened = !optionsOpened "
105
+ @click =" openOptions "
105
106
>
106
107
<svg-icon name =" dropdown" />
107
108
</div >
112
113
v-if =" messageActions.length"
113
114
>
114
115
<div
116
+ ref =" menuOptions"
115
117
v-if =" optionsOpened"
116
118
v-click-outside =" closeOptions"
117
119
class =" menu-options"
118
120
:class =" { 'menu-left': message.sender_id !== 'me' }"
121
+ :style =" { top: `${menuOptionsHeight}px` }"
119
122
>
120
123
<div class =" menu-list" >
121
124
<div v-for =" action in messageActions" :key =" action.name" >
@@ -153,7 +156,8 @@ export default {
153
156
editedMessage: { type: Object , required: true },
154
157
roomUsers: { type: Array , default : () => [] },
155
158
textMessages: { type: Object , required: true },
156
- messageActions: { type: Array , required: true }
159
+ messageActions: { type: Array , required: true },
160
+ roomFooterRef: { type: HTMLDivElement }
157
161
},
158
162
159
163
data () {
@@ -162,7 +166,8 @@ export default {
162
166
imageLoading: false ,
163
167
imageHover: false ,
164
168
messageReply: false ,
165
- optionsOpened: false
169
+ optionsOpened: false ,
170
+ menuOptionsHeight: 0
166
171
}
167
172
},
168
173
@@ -243,6 +248,25 @@ export default {
243
248
const image = new Image ()
244
249
image .src = this .message .file .url
245
250
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 )
246
270
}
247
271
}
248
272
}
0 commit comments