|
1 | 1 | import React from 'react';
|
2 |
| -import { semverGreaterThan } from './helper'; |
3 | 2 | import packageJson from '../package.json';
|
4 | 3 | global.appVersion = packageJson.version;
|
5 | 4 |
|
| 5 | +// version from response - first param, local version second param |
| 6 | +const semverGreaterThan = (versionA, versionB) => { |
| 7 | + const versionsA = versionA.split(/\./g); |
| 8 | + |
| 9 | + const versionsB = versionB.split(/\./g); |
| 10 | + while (versionsA.length || versionsB.length) { |
| 11 | + const a = Number(versionsA.shift()); |
| 12 | + |
| 13 | + const b = Number(versionsB.shift()); |
| 14 | + // eslint-disable-next-line no-continue |
| 15 | + if (a === b) continue; |
| 16 | + // eslint-disable-next-line no-restricted-globals |
| 17 | + return a > b || isNaN(b); |
| 18 | + } |
| 19 | + return false; |
| 20 | +}; |
| 21 | + |
6 | 22 | class CacheBuster extends React.Component {
|
7 | 23 | constructor(props) {
|
8 | 24 | super(props);
|
9 | 25 | this.state = {
|
10 |
| - isAppReady: false |
| 26 | + loading: true, |
| 27 | + isLatestVersion: false, |
| 28 | + refreshCacheAndReload: () => window.location.reload(true) |
11 | 29 | };
|
12 | 30 | }
|
13 | 31 |
|
14 | 32 | componentDidMount() {
|
15 | 33 | fetch('/meta.json')
|
16 | 34 | .then((response) => response.json())
|
17 | 35 | .then((meta) => {
|
18 |
| - console.log({ meta }); |
19 | 36 | const latestVersion = meta.version;
|
20 | 37 | const currentVersion = global.appVersion;
|
21 | 38 |
|
22 | 39 | const shouldForceRefresh = semverGreaterThan(latestVersion, currentVersion);
|
23 | 40 | if (shouldForceRefresh) {
|
24 |
| - console.log(`We have a new version - ${latestVersion}. Going to force refresh`); |
25 |
| - window.location.reload(true); |
| 41 | + console.log(`We have a new version - ${latestVersion}. Should force refresh`); |
| 42 | + this.setState({ loading: false, isLatestVersion: false }); |
26 | 43 | } else {
|
27 | 44 | console.log(`You already have the latest version - ${latestVersion}. No cache refresh needed.`);
|
| 45 | + this.setState({ loading: false, isLatestVersion: true }); |
28 | 46 | }
|
29 |
| - |
30 |
| - this.setState({ isAppReady: true }); |
31 | 47 | });
|
32 | 48 | }
|
33 | 49 | render() {
|
34 |
| - const { isAppReady } = this.state; |
35 |
| - if (!isAppReady) return null; |
36 |
| - return this.props.children; |
| 50 | + const { loading, isLatestVersion, refreshCacheAndReload } = this.state; |
| 51 | + return this.props.children({ loading, isLatestVersion, refreshCacheAndReload }); |
37 | 52 | }
|
38 | 53 | }
|
39 | 54 |
|
|
0 commit comments