replace setInterval for timelne, notifications and follow requests

This commit is contained in:
Shpuld Shpuldson 2020-09-02 20:40:47 +03:00
parent acc45b49a5
commit 2d914c331e
5 changed files with 34 additions and 9 deletions

View File

@ -20,7 +20,7 @@ const api = {
state.fetchers[fetcherName] = fetcher state.fetchers[fetcherName] = fetcher
}, },
removeFetcher (state, { fetcherName, fetcher }) { removeFetcher (state, { fetcherName, fetcher }) {
window.clearInterval(fetcher) state.fetchers[fetcherName]()
delete state.fetchers[fetcherName] delete state.fetchers[fetcherName]
}, },
setWsToken (state, token) { setWsToken (state, token) {

View File

@ -0,0 +1,23 @@
export const makeFetcher = (call, interval) => {
let stopped = false
let timeout = null
let func = () => {}
func = () => {
call().finally(() => {
console.log('callbacks')
if (stopped) return
timeout = window.setTimeout(func, interval)
})
}
const stopFetcher = () => {
stopped = true
window.cancelTimeout(timeout)
}
func()
return stopFetcher
}

View File

@ -1,4 +1,5 @@
import apiService from '../api/api.service.js' import apiService from '../api/api.service.js'
import { makeFetcher } from '../fetcher/fetcher.js'
const fetchAndUpdate = ({ store, credentials }) => { const fetchAndUpdate = ({ store, credentials }) => {
return apiService.fetchFollowRequests({ credentials }) return apiService.fetchFollowRequests({ credentials })
@ -10,9 +11,8 @@ const fetchAndUpdate = ({ store, credentials }) => {
} }
const startFetching = ({ credentials, store }) => { const startFetching = ({ credentials, store }) => {
fetchAndUpdate({ credentials, store })
const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store }) const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store })
return setInterval(boundFetchAndUpdate, 10000) return makeFetcher(boundFetchAndUpdate, 10000)
} }
const followRequestFetcher = { const followRequestFetcher = {

View File

@ -1,4 +1,5 @@
import apiService from '../api/api.service.js' import apiService from '../api/api.service.js'
import makeFetcher from '../fetcher/fetcher.js'
const update = ({ store, notifications, older }) => { const update = ({ store, notifications, older }) => {
store.dispatch('setNotificationsError', { value: false }) store.dispatch('setNotificationsError', { value: false })
@ -39,6 +40,7 @@ const fetchAndUpdate = ({ store, credentials, older = false }) => {
args['since'] = Math.max(...readNotifsIds) args['since'] = Math.max(...readNotifsIds)
fetchNotifications({ store, args, older }) fetchNotifications({ store, args, older })
} }
return result return result
} }
} }
@ -53,13 +55,12 @@ const fetchNotifications = ({ store, args, older }) => {
} }
const startFetching = ({ credentials, store }) => { const startFetching = ({ credentials, store }) => {
fetchAndUpdate({ credentials, store })
const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store })
// Initially there's set flag to silence all desktop notifications so // Initially there's set flag to silence all desktop notifications so
// that there won't spam of them when user just opened up the FE we // that there won't spam of them when user just opened up the FE we
// reset that flag after a while to show new notifications once again. // reset that flag after a while to show new notifications once again.
setTimeout(() => store.dispatch('setNotificationsSilence', false), 10000) setTimeout(() => store.dispatch('setNotificationsSilence', false), 10000)
return setInterval(boundFetchAndUpdate, 10000) const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store, refetch: true })
return makeFetcher(boundFetchAndUpdate, 10000)
} }
const notificationsFetcher = { const notificationsFetcher = {

View File

@ -1,6 +1,7 @@
import { camelCase } from 'lodash' import { camelCase } from 'lodash'
import apiService from '../api/api.service.js' import apiService from '../api/api.service.js'
import { makeFetcher } from '../fetcher/fetcher.js'
const update = ({ store, statuses, timeline, showImmediately, userId, pagination }) => { const update = ({ store, statuses, timeline, showImmediately, userId, pagination }) => {
const ccTimeline = camelCase(timeline) const ccTimeline = camelCase(timeline)
@ -70,9 +71,9 @@ const startFetching = ({ timeline = 'friends', credentials, store, userId = fals
const timelineData = rootState.statuses.timelines[camelCase(timeline)] const timelineData = rootState.statuses.timelines[camelCase(timeline)]
const showImmediately = timelineData.visibleStatuses.length === 0 const showImmediately = timelineData.visibleStatuses.length === 0
timelineData.userId = userId timelineData.userId = userId
fetchAndUpdate({ timeline, credentials, store, showImmediately, userId, tag }) const boundFetchAndUpdate = () =>
const boundFetchAndUpdate = () => fetchAndUpdate({ timeline, credentials, store, userId, tag }) fetchAndUpdate({ timeline, credentials, store, showImmediately, userId, tag })
return setInterval(boundFetchAndUpdate, 10000) return makeFetcher(boundFetchAndUpdate, 10000)
} }
const timelineFetcher = { const timelineFetcher = {
fetchAndUpdate, fetchAndUpdate,