30
30
</slot >
31
31
</div >
32
32
33
- <div v-if =" !loadingRooms" class =" vac-room-list" >
33
+ <div v-if =" !loadingRooms" id = " rooms-list " class =" vac-room-list" >
34
34
<div
35
35
v-for =" fRoom in filteredRooms"
36
36
:id =" fRoom.roomId"
54
54
</room-content >
55
55
</div >
56
56
<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 >
74
60
</transition >
75
61
</div >
76
62
</div >
77
63
</template >
78
64
79
65
<script >
80
- import InfiniteLoading from ' vue-infinite-loading'
81
-
82
66
import Loader from ' ../../components/Loader/Loader'
83
67
84
68
import RoomsSearch from ' ./RoomsSearch/RoomsSearch'
@@ -89,7 +73,6 @@ import filteredUsers from '../../utils/filter-items'
89
73
export default {
90
74
name: ' RoomsList' ,
91
75
components: {
92
- InfiniteLoading,
93
76
Loader,
94
77
RoomsSearch,
95
78
RoomContent
@@ -122,7 +105,8 @@ export default {
122
105
data () {
123
106
return {
124
107
filteredRooms: this .rooms || [],
125
- infiniteState: null ,
108
+ infiniteLoader: null ,
109
+ showLoader: true ,
126
110
loadingMoreRooms: false ,
127
111
selectedRoomId: ' '
128
112
}
@@ -133,25 +117,22 @@ export default {
133
117
deep: true ,
134
118
handler (newVal , oldVal ) {
135
119
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 ) {
141
121
this .loadingMoreRooms = false
142
122
}
143
123
}
144
124
},
145
125
loadingRooms (val ) {
146
- if (val) this .infiniteState = null
126
+ if (! val) {
127
+ setTimeout (() => this .initIntersectionObserver ())
128
+ }
147
129
},
148
130
loadingMoreRooms (val ) {
149
131
this .$emit (' loading-more-rooms' , val)
150
132
},
151
133
roomsLoaded (val ) {
152
- if (val && this . infiniteState ) {
134
+ if (val) {
153
135
this .loadingMoreRooms = false
154
- this .infiniteState .complete ()
155
136
}
156
137
},
157
138
room: {
@@ -163,6 +144,27 @@ export default {
163
144
},
164
145
165
146
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
+ },
166
168
searchRoom (ev ) {
167
169
this .filteredRooms = filteredUsers (
168
170
this .rooms ,
@@ -175,15 +177,14 @@ export default {
175
177
if (! this .isMobile ) this .selectedRoomId = room .roomId
176
178
this .$emit (' fetch-room' , { room })
177
179
},
178
- loadMoreRooms (infiniteState ) {
180
+ loadMoreRooms () {
179
181
if (this .loadingMoreRooms ) return
180
182
181
183
if (this .roomsLoaded ) {
182
184
this .loadingMoreRooms = false
183
- return infiniteState . complete ( )
185
+ return ( this . showLoader = false )
184
186
}
185
187
186
- this .infiniteState = infiniteState
187
188
this .$emit (' fetch-more-rooms' )
188
189
this .loadingMoreRooms = true
189
190
}
0 commit comments