Skip to content

Commit d567d13

Browse files
committed
(refacto) rooms infinite-loading by intersection
1 parent 219fe6b commit d567d13

File tree

1 file changed

+34
-33
lines changed

1 file changed

+34
-33
lines changed

src/lib/RoomsList/RoomsList.vue

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
</slot>
3131
</div>
3232

33-
<div v-if="!loadingRooms" class="vac-room-list">
33+
<div v-if="!loadingRooms" id="rooms-list" class="vac-room-list">
3434
<div
3535
v-for="fRoom in filteredRooms"
3636
:id="fRoom.roomId"
@@ -54,31 +54,15 @@
5454
</room-content>
5555
</div>
5656
<transition name="vac-fade-message">
57-
<infinite-loading
58-
v-if="rooms.length && !loadingRooms"
59-
force-use-infinite-wrapper=".vac-room-list"
60-
web-component-name="vue-advanced-chat"
61-
spinner="spiral"
62-
@infinite="loadMoreRooms"
63-
>
64-
<template #spinner>
65-
<loader :show="true" :infinite="true" />
66-
</template>
67-
<template #no-results>
68-
<div />
69-
</template>
70-
<template #no-more>
71-
<div />
72-
</template>
73-
</infinite-loading>
57+
<div v-if="rooms.length && !loadingRooms" id="infinite-loader">
58+
<loader :show="showLoader" :infinite="true" />
59+
</div>
7460
</transition>
7561
</div>
7662
</div>
7763
</template>
7864

7965
<script>
80-
import InfiniteLoading from 'vue-infinite-loading'
81-
8266
import Loader from '../../components/Loader/Loader'
8367
8468
import RoomsSearch from './RoomsSearch/RoomsSearch'
@@ -89,7 +73,6 @@ import filteredUsers from '../../utils/filter-items'
8973
export default {
9074
name: 'RoomsList',
9175
components: {
92-
InfiniteLoading,
9376
Loader,
9477
RoomsSearch,
9578
RoomContent
@@ -122,7 +105,8 @@ export default {
122105
data() {
123106
return {
124107
filteredRooms: this.rooms || [],
125-
infiniteState: null,
108+
infiniteLoader: null,
109+
showLoader: true,
126110
loadingMoreRooms: false,
127111
selectedRoomId: ''
128112
}
@@ -133,25 +117,22 @@ export default {
133117
deep: true,
134118
handler(newVal, oldVal) {
135119
this.filteredRooms = newVal
136-
if (
137-
this.infiniteState &&
138-
(newVal.length !== oldVal.length || this.roomsLoaded)
139-
) {
140-
this.infiniteState.loaded()
120+
if (newVal.length !== oldVal.length || this.roomsLoaded) {
141121
this.loadingMoreRooms = false
142122
}
143123
}
144124
},
145125
loadingRooms(val) {
146-
if (val) this.infiniteState = null
126+
if (!val) {
127+
setTimeout(() => this.initIntersectionObserver())
128+
}
147129
},
148130
loadingMoreRooms(val) {
149131
this.$emit('loading-more-rooms', val)
150132
},
151133
roomsLoaded(val) {
152-
if (val && this.infiniteState) {
134+
if (val) {
153135
this.loadingMoreRooms = false
154-
this.infiniteState.complete()
155136
}
156137
},
157138
room: {
@@ -163,6 +144,27 @@ export default {
163144
},
164145
165146
methods: {
147+
initIntersectionObserver() {
148+
const loader = document.getElementById('infinite-loader')
149+
150+
if (loader && !this.infiniteLoader) {
151+
this.infiniteLoader = loader
152+
153+
const options = {
154+
root: document.getElementById('rooms-list'),
155+
rootMargin: '100px',
156+
threshold: 0
157+
}
158+
159+
const observer = new IntersectionObserver(entries => {
160+
if (entries[0].isIntersecting) {
161+
this.loadMoreRooms()
162+
}
163+
}, options)
164+
165+
observer.observe(loader)
166+
}
167+
},
166168
searchRoom(ev) {
167169
this.filteredRooms = filteredUsers(
168170
this.rooms,
@@ -175,15 +177,14 @@ export default {
175177
if (!this.isMobile) this.selectedRoomId = room.roomId
176178
this.$emit('fetch-room', { room })
177179
},
178-
loadMoreRooms(infiniteState) {
180+
loadMoreRooms() {
179181
if (this.loadingMoreRooms) return
180182
181183
if (this.roomsLoaded) {
182184
this.loadingMoreRooms = false
183-
return infiniteState.complete()
185+
return (this.showLoader = false)
184186
}
185187
186-
this.infiniteState = infiniteState
187188
this.$emit('fetch-more-rooms')
188189
this.loadingMoreRooms = true
189190
}

0 commit comments

Comments
 (0)