16
loading...
This website collects cookies to deliver better user experience
yarn build
command is run. This file essentially tells the application where/what files exist. The file names are hashed for each build. This means we can tell if something has changed, as long as we poll this manifest file somehow...import {Button} from '@material-ui/core';
import {CloseOutlined} from '@material-ui/icons';
import {useSnackbar} from 'notistack';
import React, {useState} from 'react';
const MANIFEST = '/asset-manifest.json';
const POLL_INTERVAL = 60000;
export const VersionCheck: React.FC = ({children}) => {
const {enqueueSnackbar, closeSnackbar} = useSnackbar();
const [dismissedVersion, setDismissedVersion] = useState('');
React.useEffect(() => {
const getLatestVersion = async () => {
const response = await fetch(MANIFEST);
return await response.text();
};
const init = async () => {
try {
const latestVersion = await getLatestVersion();
localStorage.setItem('tend-version', latestVersion);
} catch (ex) {
// log to sentry / or something
} finally {
setTimeout(poll, POLL_INTERVAL);
}
};
const poll = async () => {
try {
const currentVersion = localStorage.getItem('tend-version');
const latestVersion = await getLatestVersion();
if (currentVersion && currentVersion !== latestVersion && latestVersion !== dismissedVersion) {
enqueueSnackbar('A new version is available', {
variant: 'info',
persist: true,
preventDuplicate: true,
action: (key) => (
<>
<Button color="inherit" onClick={() => window.location.reload()}>
Refresh
</Button>
<Button
color="inherit"
variant="text"
onClick={() => {
setDismissedVersion(latestVersion);
closeSnackbar(key);
}}>
<CloseOutlined />
</Button>
</>
),
});
}
} catch (ex) {
// log somewhere
} finally {
setTimeout(poll, POLL_INTERVAL);
}
};
if (process.env.NODE_ENV === 'production') {
init();
}
}, [closeSnackbar, dismissedVersion, enqueueSnackbar]);
return <>{children}</>;
};