Skip to content

Commit a5e7f42

Browse files
authored
Merge pull request #1286 from input-output-hk/djo/1185/cache_spo_tickers_calls_in_explorer
Cache `/signers/tickers` calls in explorer
2 parents 74c8f25 + 758698d commit a5e7f42

File tree

4 files changed

+36
-24
lines changed

4 files changed

+36
-24
lines changed

mithril-explorer/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mithril-explorer",
3-
"version": "0.3.7",
3+
"version": "0.3.8",
44
"private": true,
55
"scripts": {
66
"dev": "next dev",

mithril-explorer/src/app/page.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ export default function Explorer() {
2727
const [isUpdatingAggregatorInUrl, setIsUpdatingAggregatorInUrl] = useState(false);
2828
const selectedAggregator = useSelector(currentlySelectedAggregator);
2929

30-
3130
// Update the aggregator in the url query
3231
useEffect(() => {
3332
const aggregatorInUrl = searchParams.get(aggregatorSearchParam);

mithril-explorer/src/app/registrations/page.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ import {Alert, ButtonGroup, Col, Row, Spinner, Stack, Table} from "react-bootstr
88
import {ArcElement, BarElement, CategoryScale, Chart, Legend, LinearScale, Title, Tooltip} from 'chart.js';
99
import {Bar, Pie} from "react-chartjs-2";
1010
import {aggregatorSearchParam} from "../../constants";
11+
import {updatePoolsForAggregator} from "../../store/poolsSlice";
1112
import LinkButton from "../../components/LinkButton";
1213
import Stake from "../../components/Stake";
1314
import RawJsonButton from "../../components/RawJsonButton";
1415
import VerifiedBadge from "../../components/VerifiedBadge";
1516
import PoolTicker from "../../components/PoolTicker";
16-
import {updatePoolsForAggregator} from "../../store/poolsSlice";
1717
import PartyId from "../../components/PartyId";
1818

1919
Chart.register(

mithril-explorer/src/store/poolsSlice.js

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
import {createAsyncThunk, createSelector, createSlice} from "@reduxjs/toolkit";
22

3+
// Delete all caches older than 6 hours
4+
const cacheRefreshIntervalInMilliseconds = 6 * 3600 * 1000;
5+
36
export const poolsSlice = createSlice({
47
name: 'pools',
58
initialState: { list: [] },
69
reducers: {},
710
extraReducers: builder => builder.addCase(updatePoolsForAggregator.fulfilled, (state, action) => {
8-
let existing = poolsForAggregator(state, action.payload.aggregator);
11+
if (action.payload.keep_cached_data) {
12+
return;
13+
}
14+
const existing = poolsForAggregator(state, action.payload.aggregator);
915

1016
if (existing) {
11-
existing.date = action.payload.date;
17+
existing.network = action.payload.network;
1218
existing.pools = action.payload.pools;
19+
existing.date = action.payload.date;
1320
} else {
1421
state.list.push({
1522
aggregator: action.payload.aggregator,
@@ -21,30 +28,36 @@ export const poolsSlice = createSlice({
2128
})
2229
});
2330

24-
export const updatePoolsForAggregator = createAsyncThunk('pools/updateForAggregator', aggregator => {
25-
return fetch(`${aggregator}/signers/tickers`)
26-
.then(response => response.status === 200 ? response.json() : {})
27-
.then(data => {
28-
return {
29-
aggregator: aggregator,
30-
date: Date.now(),
31-
network: data.network,
32-
pools: data.signers,
33-
};
34-
});
31+
export const updatePoolsForAggregator = createAsyncThunk('pools/updateForAggregator', (aggregator, thunkAPI) => {
32+
const state = thunkAPI.getState();
33+
const aggregatorPools = poolsForAggregator(state.pools, aggregator);
34+
const now = Date.now();
35+
36+
const millisecondsSinceLastRefresh = now - (aggregatorPools?.date ?? 0);
37+
38+
if (millisecondsSinceLastRefresh > cacheRefreshIntervalInMilliseconds) {
39+
return fetch(`${aggregator}/signers/tickers`)
40+
.then(response => response.status === 200 ? response.json() : {})
41+
.then(data => {
42+
return {
43+
aggregator: aggregator,
44+
date: now,
45+
network: data.network,
46+
pools: data.signers ?? [],
47+
};
48+
});
49+
}
50+
51+
return { keep_cached_data: true };
3552
});
3653

37-
const poolsForAggregator = (state, aggregator) => {
38-
return state.list.find(poolsData => poolsData.aggregator === aggregator);
39-
};
54+
const poolsForAggregator = (poolsSlice, aggregator) => {
55+
return poolsSlice.list.find(poolsData => poolsData.aggregator === aggregator);
56+
}
4057

4158
export const getPool = createSelector([
4259
state => state.pools,
43-
(state, aggregator, poolId) => {
44-
return {
45-
aggregator: aggregator,
46-
poolId: poolId
47-
}},
60+
(state, aggregator, poolId) => ({ aggregator: aggregator, poolId: poolId, }),
4861
],
4962
(pools, args) => {
5063
const aggregator = poolsForAggregator(pools, args.aggregator);

0 commit comments

Comments
 (0)