From 8340783e043fc4b10c73beaa23a03879639ea1f3 Mon Sep 17 00:00:00 2001 From: infinite-persistence Date: Mon, 20 Sep 2021 10:30:23 +0800 Subject: [PATCH] doFetchActiveLivestreams: add interval check - Added a default minimum of 5 minutes between fetches. Clients can bypass this through `forceFetch` if needed. --- flow-typed/livestream.js | 1 + ui/constants/action_types.js | 1 + ui/redux/actions/livestream.js | 36 +++++++++++++++++++-------------- ui/redux/reducers/livestream.js | 10 +++++++-- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/flow-typed/livestream.js b/flow-typed/livestream.js index 63f1dd6a7..29743f06b 100644 --- a/flow-typed/livestream.js +++ b/flow-typed/livestream.js @@ -26,6 +26,7 @@ declare type LivestreamState = { viewersById: {}, fetchingActiveLivestreams: boolean, activeLivestreams: ?LivestreamInfo, + lastFetchedActiveLivestreams: number, } declare type LivestreamInfo = { diff --git a/ui/constants/action_types.js b/ui/constants/action_types.js index 6baee5377..17748007e 100644 --- a/ui/constants/action_types.js +++ b/ui/constants/action_types.js @@ -354,4 +354,5 @@ export const FETCH_NO_SOURCE_CLAIMS_FAILED = 'FETCH_NO_SOURCE_CLAIMS_FAILED'; export const VIEWERS_RECEIVED = 'VIEWERS_RECEIVED'; export const FETCH_ACTIVE_LIVESTREAMS_STARTED = 'FETCH_ACTIVE_LIVESTREAMS_STARTED'; export const FETCH_ACTIVE_LIVESTREAMS_FAILED = 'FETCH_ACTIVE_LIVESTREAMS_FAILED'; +export const FETCH_ACTIVE_LIVESTREAMS_SKIPPED = 'FETCH_ACTIVE_LIVESTREAMS_SKIPPED'; export const FETCH_ACTIVE_LIVESTREAMS_COMPLETED = 'FETCH_ACTIVE_LIVESTREAMS_COMPLETED'; diff --git a/ui/redux/actions/livestream.js b/ui/redux/actions/livestream.js index 9ab7051a4..1674a0f2d 100644 --- a/ui/redux/actions/livestream.js +++ b/ui/redux/actions/livestream.js @@ -33,19 +33,26 @@ export const doFetchNoSourceClaims = (channelId: string) => async (dispatch: Dis } }; -export const doFetchActiveLivestreams = () => { - return async (dispatch: Dispatch) => { - dispatch({ - type: ACTIONS.FETCH_ACTIVE_LIVESTREAMS_STARTED, - }); +const FETCH_ACTIVE_LIVESTREAMS_MIN_INTERVAL_MS = 5 * 60 * 1000; + +export const doFetchActiveLivestreams = (forceFetch: boolean) => { + return async (dispatch: Dispatch, getState: GetState) => { + const state = getState(); + const now = Date.now(); + const timeDelta = now - state.livestream.lastFetchedActiveLivestreams; + + if (!forceFetch && timeDelta < FETCH_ACTIVE_LIVESTREAMS_MIN_INTERVAL_MS) { + dispatch({ type: ACTIONS.FETCH_ACTIVE_LIVESTREAMS_SKIPPED }); + return; + } + + dispatch({ type: ACTIONS.FETCH_ACTIVE_LIVESTREAMS_STARTED }); fetch(LIVESTREAM_LIVE_API) .then((res) => res.json()) .then((res) => { if (!res.data) { - dispatch({ - type: ACTIONS.FETCH_ACTIVE_LIVESTREAMS_FAILED, - }); + dispatch({ type: ACTIONS.FETCH_ACTIVE_LIVESTREAMS_FAILED }); return; } @@ -88,19 +95,18 @@ export const doFetchActiveLivestreams = () => { dispatch({ type: ACTIONS.FETCH_ACTIVE_LIVESTREAMS_COMPLETED, - data: activeLivestreams, + data: { + activeLivestreams, + lastFetchedActiveLivestreams: now, + }, }); }) .catch(() => { - dispatch({ - type: ACTIONS.FETCH_ACTIVE_LIVESTREAMS_FAILED, - }); + dispatch({ type: ACTIONS.FETCH_ACTIVE_LIVESTREAMS_FAILED }); }); }) .catch((err) => { - dispatch({ - type: ACTIONS.FETCH_ACTIVE_LIVESTREAMS_FAILED, - }); + dispatch({ type: ACTIONS.FETCH_ACTIVE_LIVESTREAMS_FAILED }); }); }; }; diff --git a/ui/redux/reducers/livestream.js b/ui/redux/reducers/livestream.js index 932be2cb9..fe89b618b 100644 --- a/ui/redux/reducers/livestream.js +++ b/ui/redux/reducers/livestream.js @@ -7,6 +7,7 @@ const defaultState: LivestreamState = { viewersById: {}, fetchingActiveLivestreams: false, activeLivestreams: null, + lastFetchedActiveLivestreams: 0, }; export default handleActions( @@ -45,8 +46,13 @@ export default handleActions( return { ...state, fetchingActiveLivestreams: false }; }, [ACTIONS.FETCH_ACTIVE_LIVESTREAMS_COMPLETED]: (state: LivestreamState, action: any) => { - const activeLivestreams: LivestreamInfo = action.data; - return { ...state, fetchingActiveLivestreams: false, activeLivestreams }; + const { activeLivestreams, lastFetchedActiveLivestreams } = action.data; + return { + ...state, + fetchingActiveLivestreams: false, + activeLivestreams, + lastFetchedActiveLivestreams, + }; }, }, defaultState