1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-30 16:18:07 +01:00
metamask-extension/ui/hooks/useSafeGasEstimatePolling.js

48 lines
1.4 KiB
JavaScript
Raw Normal View History

import { useEffect } from 'react';
import {
disconnectGasFeeEstimatePoller,
getGasFeeEstimatesAndStartPolling,
addPollingTokenToAppState,
removePollingTokenFromAppState,
} from '../store/actions';
/**
* Provides a reusable hook that can be used for safely updating the polling
* data in the gas fee controller. It makes a request to get estimates and
* begin polling, keeping track of the poll token for the lifetime of the hook.
* It then disconnects polling upon unmount. If the hook is unmounted while waiting
* for `getGasFeeEstimatesAndStartPolling` to resolve, the `active` flag ensures
* that a call to disconnect happens after promise resolution.
*/
export function useSafeGasEstimatePolling() {
useEffect(() => {
let active = true;
let pollToken;
const cleanup = () => {
active = false;
if (pollToken) {
disconnectGasFeeEstimatePoller(pollToken);
removePollingTokenFromAppState(pollToken);
}
};
getGasFeeEstimatesAndStartPolling().then((newPollToken) => {
if (active) {
pollToken = newPollToken;
addPollingTokenToAppState(pollToken);
} else {
disconnectGasFeeEstimatePoller(newPollToken);
removePollingTokenFromAppState(pollToken);
}
});
window.addEventListener('beforeunload', cleanup);
return () => {
cleanup();
window.removeEventListener('beforeunload', cleanup);
};
}, []);
}