Polling hook useRef
do not useState for internal values. which are not relevnat to rendering This will only trigger unnecessary rerenders
This commit is contained in:
parent
453a45d980
commit
cd62d90de8
@ -1,4 +1,4 @@
|
|||||||
import usePolling from '../util/Polling';
|
import usePolling from '../hook/Polling';
|
||||||
|
|
||||||
export default function useGamesApi(dispatchGames) {
|
export default function useGamesApi(dispatchGames) {
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import usePolling from "../util/Polling";
|
import usePolling from "../hook/Polling";
|
||||||
|
|
||||||
export default function useLeaderboardApi() {
|
export default function useLeaderboardApi() {
|
||||||
const [leaderboard, setLeaderboard] = useState(null);
|
const [leaderboard, setLeaderboard] = useState(null);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import usePolling from "../util/Polling";
|
import usePolling from "../hook/Polling";
|
||||||
import useUserReducer from "../reducer/user";
|
import useUserReducer from "../reducer/user";
|
||||||
|
|
||||||
export default function useUserApi() {
|
export default function useUserApi() {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { useState, useCallback, useEffect, } from "react"
|
import { useState, useRef, useCallback, useEffect, } from "react"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
- uri: string
|
- uri: string
|
||||||
@ -9,13 +9,18 @@ import { useState, useCallback, useEffect, } from "react"
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
export default function usePolling(uri, onResponce, mode = null) {
|
export default function usePolling(uri, onResponce, mode = null) {
|
||||||
const [initialPoll, setInitialPoll] = useState(true);
|
|
||||||
const [isPolling, setPolling] = useState(false);
|
const [isPolling, setPolling] = useState(false);
|
||||||
const [intervalTimer, setIntervalTimer] = useState(null);
|
|
||||||
|
const initialPollRef = useRef(true);
|
||||||
|
const initialPoll = initialPollRef.current;
|
||||||
|
|
||||||
|
const intervalTimerIdRef = useRef(null);
|
||||||
|
const intervalTimerId = intervalTimerIdRef.current;
|
||||||
|
|
||||||
|
|
||||||
const pollData = useCallback(() => {
|
const pollData = useCallback(() => {
|
||||||
setPolling(true);
|
setPolling(true);
|
||||||
setInitialPoll(false);
|
initialPollRef.current = false;
|
||||||
|
|
||||||
fetch(uri)
|
fetch(uri)
|
||||||
.then((responce) => {
|
.then((responce) => {
|
||||||
@ -23,8 +28,7 @@ export default function usePolling(uri, onResponce, mode = null) {
|
|||||||
|
|
||||||
if (typeof mode?.interval_sec === 'number') {
|
if (typeof mode?.interval_sec === 'number') {
|
||||||
console.log("Schedule", uri, "fetch in", mode.interval_sec, "sec");
|
console.log("Schedule", uri, "fetch in", mode.interval_sec, "sec");
|
||||||
const intervalTimer = setTimeout(pollData, mode.interval_sec * 1000);
|
intervalTimerIdRef.current = setTimeout(pollData, mode.interval_sec * 1000);
|
||||||
setIntervalTimer(intervalTimer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return responce.json();
|
return responce.json();
|
||||||
@ -35,21 +39,23 @@ export default function usePolling(uri, onResponce, mode = null) {
|
|||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.warn(err.message);
|
console.warn(err.message);
|
||||||
})
|
})
|
||||||
}, [uri, mode, onResponce]);
|
}, [uri, mode, onResponce, initialPollRef, intervalTimerIdRef]);
|
||||||
|
|
||||||
|
const stopPollInterval = useCallback(() => {
|
||||||
|
console.log("Cancel scheduled fetch for", uri);
|
||||||
|
clearTimeout(intervalTimerId);
|
||||||
|
intervalTimerIdRef.current = null;
|
||||||
|
initialPollRef.current = true;
|
||||||
|
}, [uri, intervalTimerId, intervalTimerIdRef, initialPollRef]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if ((initialPoll || (typeof mode?.interval_sec === 'number' && intervalTimer === null)) && !isPolling) {
|
if ((initialPoll || (typeof mode?.interval_sec === 'number' && intervalTimerId === null)) && !isPolling) {
|
||||||
pollData();
|
pollData();
|
||||||
|
} else
|
||||||
|
if (mode?.interval_stop && intervalTimerId) {
|
||||||
|
stopPollInterval();
|
||||||
}
|
}
|
||||||
}, [initialPoll, mode, intervalTimer, isPolling, pollData]);
|
}, [initialPoll, mode, intervalTimerId, isPolling, pollData, stopPollInterval]);
|
||||||
|
|
||||||
if (mode?.interval_stop && intervalTimer) {
|
|
||||||
console.log("Cancel scheduled fetch for", uri);
|
|
||||||
clearTimeout(intervalTimer);
|
|
||||||
setIntervalTimer(null);
|
|
||||||
setInitialPoll(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return isPolling;
|
return isPolling;
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user