Skip to content

Commit 68b505e

Browse files
committed
(feature) add room options dropdown
1 parent 534d058 commit 68b505e

File tree

5 files changed

+88
-5
lines changed

5 files changed

+88
-5
lines changed

demo/src/ChatContainer.vue

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
:messages="messages"
4747
:messages-loaded="messagesLoaded"
4848
:rooms-loaded="roomsLoaded"
49+
:room-actions="roomActions"
4950
:menu-actions="menuActions"
5051
:room-message="roomMessage"
5152
@fetch-more-rooms="fetchMoreRooms"
@@ -56,6 +57,7 @@
5657
@open-file="openFile"
5758
@open-user-tag="openUserTag"
5859
@add-room="addRoom"
60+
@room-action-handler="menuActionHandler"
5961
@menu-action-handler="menuActionHandler"
6062
@send-message-reaction="sendMessageReaction"
6163
@typing-message="typingMessage"
@@ -116,6 +118,11 @@ export default {
116118
removeRoomId: null,
117119
removeUserId: '',
118120
removeUsers: [],
121+
roomActions: [
122+
{ name: 'inviteUser', title: 'Invite User' },
123+
{ name: 'removeUser', title: 'Remove User' },
124+
{ name: 'deleteRoom', title: 'Delete Room' }
125+
],
119126
menuActions: [
120127
{ name: 'inviteUser', title: 'Invite User' },
121128
{ name: 'removeUser', title: 'Remove User' },

src/ChatWindow/ChatWindow.vue

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
:loading-rooms="loadingRooms"
99
:rooms-loaded="roomsLoaded"
1010
:room="room"
11+
:room-actions="roomActions"
1112
:text-messages="t"
1213
:show-add-room="showAddRoom"
1314
:show-rooms-list="showRoomsList"
@@ -17,6 +18,7 @@
1718
@fetch-more-rooms="fetchMoreRooms"
1819
@loading-more-rooms="loadingMoreRooms = $event"
1920
@add-room="addRoom"
21+
@room-action-handler="roomActionHandler"
2022
>
2123
<template v-for="(index, name) in $scopedSlots" v-slot:[name]="data">
2224
<slot :name="name" v-bind="data"></slot>
@@ -101,6 +103,7 @@ export default {
101103
loadFirstRoom: { type: Boolean, default: true },
102104
messages: { type: Array, default: () => [] },
103105
messagesLoaded: { type: Boolean, default: false },
106+
roomActions: { type: Array, default: () => [] },
104107
menuActions: { type: Array, default: () => [] },
105108
messageActions: {
106109
type: Array,
@@ -281,6 +284,12 @@ export default {
281284
roomId: this.room.roomId
282285
})
283286
},
287+
roomActionHandler({ action, roomId }) {
288+
this.$emit('room-action-handler', {
289+
action,
290+
roomId
291+
})
292+
},
284293
messageActionHandler(ev) {
285294
this.$emit('message-action-handler', {
286295
...ev,

src/ChatWindow/RoomsList.vue

Lines changed: 65 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,41 @@
121121
>
122122
{{ typingUsers(room) }}
123123
</div>
124-
<div v-if="room.unreadCount" class="vac-room-badge">
125-
{{ room.unreadCount }}
124+
<div class="vac-room-options-container">
125+
<div v-if="room.unreadCount" class="vac-room-badge-container">
126+
<div class="vac-room-badge">
127+
{{ room.unreadCount }}
128+
</div>
129+
</div>
130+
<slot name="room-list-options" v-bind="{ room }">
131+
<div
132+
class="vac-svg-button vac-list-room-options"
133+
v-if="roomActions.length"
134+
@click.stop="roomMenuOpened = room.roomId"
135+
>
136+
<slot name="room-list-options-icon">
137+
<svg-icon name="dropdown" param="room" />
138+
</slot>
139+
</div>
140+
<transition name="vac-slide-left" v-if="roomActions.length">
141+
<div
142+
v-if="roomMenuOpened === room.roomId"
143+
v-click-outside="closeRoomMenu"
144+
class="vac-menu-options"
145+
>
146+
<div class="vac-menu-list">
147+
<div v-for="action in roomActions" :key="action.name">
148+
<div
149+
class="vac-menu-item"
150+
@click.stop="roomActionHandler(action, room)"
151+
>
152+
{{ action.title }}
153+
</div>
154+
</div>
155+
</div>
156+
</div>
157+
</transition>
158+
</slot>
126159
</div>
127160
</div>
128161
</div>
@@ -147,6 +180,7 @@
147180

148181
<script>
149182
import InfiniteLoading from 'vue-infinite-loading'
183+
import vClickOutside from 'v-click-outside'
150184
import Loader from './Loader'
151185
import SvgIcon from './SvgIcon'
152186
import FormatMessage from './FormatMessage'
@@ -158,6 +192,10 @@ export default {
158192
name: 'rooms-list',
159193
components: { InfiniteLoading, Loader, SvgIcon, FormatMessage },
160194
195+
directives: {
196+
clickOutside: vClickOutside.directive
197+
},
198+
161199
props: {
162200
currentUserId: { type: [String, Number], required: true },
163201
textMessages: { type: Object, required: true },
@@ -168,15 +206,17 @@ export default {
168206
rooms: { type: Array, required: true },
169207
loadingRooms: { type: Boolean, required: true },
170208
roomsLoaded: { type: Boolean, required: true },
171-
room: { type: Object, required: true }
209+
room: { type: Object, required: true },
210+
roomActions: { type: Array, required: true }
172211
},
173212
174213
data() {
175214
return {
176215
filteredRooms: this.rooms || [],
177216
infiniteState: null,
178217
loadingMoreRooms: false,
179-
selectedRoomId: ''
218+
selectedRoomId: '',
219+
roomMenuOpened: null
180220
}
181221
},
182222
@@ -285,6 +325,13 @@ export default {
285325
room.lastMessage.distributed ||
286326
room.lastMessage.seen)
287327
)
328+
},
329+
roomActionHandler(action, room) {
330+
this.closeRoomMenu()
331+
this.$emit('room-action-handler', { action, roomId: room.roomId })
332+
},
333+
closeRoomMenu() {
334+
this.roomMenuOpened = null
288335
}
289336
}
290337
}
@@ -376,7 +423,7 @@ export default {
376423
display: flex;
377424
flex: 1 1 100%;
378425
margin-bottom: 5px;
379-
padding: 0 16px;
426+
padding: 0 14px;
380427
position: relative;
381428
min-height: 71px;
382429
@@ -470,6 +517,11 @@ export default {
470517
fill: var(--chat-room-color-message);
471518
}
472519
520+
.vac-room-options-container {
521+
display: flex;
522+
margin-left: auto;
523+
}
524+
473525
.vac-room-badge {
474526
background-color: var(--chat-room-bg-color-badge);
475527
color: var(--chat-room-color-badge);
@@ -478,13 +530,21 @@ export default {
478530
height: 13px;
479531
width: auto;
480532
min-width: 13px;
533+
margin-left: 5px;
481534
border-radius: 50%;
482535
display: flex;
483536
align-items: center;
484537
justify-content: center;
485538
padding: 3px;
486539
}
487540
541+
.vac-list-room-options {
542+
height: 19px;
543+
width: 19px;
544+
align-items: center;
545+
margin-left: 5px;
546+
}
547+
488548
@media only screen and (max-width: 768px) {
489549
.vac-box-search {
490550
height: 58px;

src/ChatWindow/SvgIcon.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,10 @@ export default {
210210
fill: var(--chat-icon-color-dropdown-message);
211211
}
212212
213+
#vac-icon-dropdown-room {
214+
fill: var(--chat-icon-color-dropdown-room);
215+
}
216+
213217
#vac-icon-dropdown-scroll {
214218
fill: var(--chat-icon-color-dropdown-scroll);
215219
}

src/themes/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ export const defaultThemeStyles = {
121121
eye: '#fff',
122122
dropdownMessage: '#fff',
123123
dropdownMessageBackground: 'rgba(0, 0, 0, 0.25)',
124+
dropdownRoom: '#67717a',
124125
dropdownScroll: '#0a0a0a',
125126
microphone: '#1976d2',
126127
microphoneOff: '#eb4034'
@@ -248,6 +249,7 @@ export const defaultThemeStyles = {
248249
eye: '#fff',
249250
dropdownMessage: '#fff',
250251
dropdownMessageBackground: 'rgba(0, 0, 0, 0.25)',
252+
dropdownRoom: '#fff',
251253
dropdownScroll: '#0a0a0a',
252254
microphone: '#fff',
253255
microphoneOff: '#eb4034'
@@ -382,6 +384,7 @@ export const cssThemeVars = ({
382384
'--chat-icon-color-eye': icons.eye,
383385
'--chat-icon-color-dropdown-message': icons.dropdownMessage,
384386
'--chat-icon-bg-dropdown-message': icons.dropdownMessageBackground,
387+
'--chat-icon-color-dropdown-room': icons.dropdownRoom,
385388
'--chat-icon-color-dropdown-scroll': icons.dropdownScroll,
386389
'--chat-icon-color-microphone': icons.microphone,
387390
'--chat-icon-color-microphone-off': icons.microphoneOff

0 commit comments

Comments
 (0)