Skip to content

Commit 7134164

Browse files
Merge pull request #1369 from trilitech/fix-tzkt-polling-issue
Update useDataPolling hook to show only one notification
2 parents 8036c20 + 6a16a4c commit 7134164

File tree

2 files changed

+58
-106
lines changed

2 files changed

+58
-106
lines changed

apps/desktop/src/utils/dataPolling/useDataPolling.test.ts

Lines changed: 43 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { usePollBlock } from "./usePollBlock";
55
import { usePollConversionRate } from "./usePollConversionRate";
66
import { usePollMultisigs } from "./usePollMultisigs";
77
import { usePollPendingOperations } from "./usePollPendingOperations";
8+
import { usePollProtocolSettings } from "./usePollProtocolSettings";
89
import { usePollTokenBalances } from "./usePollTokenBalances";
910
import { usePollUnstakeRequests } from "./usePollUnstakeRequests";
1011
import { renderHook } from "../../mocks/testUtils";
@@ -34,107 +35,73 @@ const usePollTokenBalancesMock = jest.mocked(usePollTokenBalances);
3435
jest.mock("./usePollUnstakeRequests");
3536
const usePollUnstakeRequestsMock = jest.mocked(usePollUnstakeRequests);
3637

38+
jest.mock("./usePollProtocolSettings");
39+
const usePollProtocolSettingsMock = jest.mocked(usePollProtocolSettings);
40+
3741
describe("useDataPolling", () => {
3842
describe("isLoading", () => {
3943
it.each([
44+
{ hookName: "usePollAccountStates", mock: usePollAccountStatesMock },
45+
{ hookName: "usePollBakers", mock: usePollBakersMock },
46+
{ hookName: "usePollBlock", mock: usePollBlockMock },
47+
{ hookName: "usePollConversionRate", mock: usePollConversionRateMock },
4048
{ hookName: "usePollMultisigs", mock: usePollMultisigsMock },
4149
{ hookName: "usePollPendingOperations", mock: usePollPendingOperationsMock },
42-
{ hookName: "usePollAccountStates", mock: usePollAccountStatesMock },
50+
{ hookName: "usePollProtocolSettings", mock: usePollProtocolSettingsMock },
4351
{ hookName: "usePollTokenBalances", mock: usePollTokenBalancesMock },
4452
{ hookName: "usePollUnstakeRequests", mock: usePollUnstakeRequestsMock },
4553
])("is true when the data is being fetched by $hookName", ({ mock }) => {
4654
[
55+
usePollAccountStatesMock,
4756
usePollBakersMock,
4857
usePollBlockMock,
4958
usePollConversionRateMock,
5059
usePollMultisigsMock,
5160
usePollPendingOperationsMock,
52-
usePollAccountStatesMock,
61+
usePollProtocolSettingsMock,
5362
usePollTokenBalancesMock,
5463
usePollUnstakeRequestsMock,
5564
].forEach(hookMock => {
56-
if (hookMock === mock) {
57-
// @ts-expect-error 2590
58-
hookMock.mockReturnValue({
59-
isFetching: true,
60-
dataUpdatedAt: 1,
61-
});
62-
} else {
63-
hookMock.mockReturnValue({
64-
isFetching: false,
65-
dataUpdatedAt: 1,
66-
});
67-
}
65+
// @ts-expect-error TS2590
66+
hookMock.mockReturnValue({
67+
isFetching: hookMock === mock,
68+
dataUpdatedAt: 1,
69+
});
6870
});
6971

7072
renderHook(() => useDataPolling());
7173

7274
expect(store.getState().assets.isLoading).toBe(true);
7375
});
76+
});
7477

78+
describe("lastTimeUpdated", () => {
7579
it.each([
80+
{ hookName: "usePollAccountStates", mock: usePollAccountStatesMock },
7681
{ hookName: "usePollBakers", mock: usePollBakersMock },
7782
{ hookName: "usePollBlock", mock: usePollBlockMock },
7883
{ hookName: "usePollConversionRate", mock: usePollConversionRateMock },
79-
])("is not affected by $hookName", ({ mock }) => {
80-
[
81-
usePollBakersMock,
82-
usePollBlockMock,
83-
usePollConversionRateMock,
84-
usePollMultisigsMock,
85-
usePollPendingOperationsMock,
86-
usePollAccountStatesMock,
87-
usePollTokenBalancesMock,
88-
usePollUnstakeRequestsMock,
89-
].forEach(hookMock => {
90-
if (hookMock === mock) {
91-
hookMock.mockReturnValue({
92-
isFetching: true,
93-
dataUpdatedAt: 1,
94-
});
95-
} else {
96-
hookMock.mockReturnValue({
97-
isFetching: false,
98-
dataUpdatedAt: 1,
99-
});
100-
}
101-
});
102-
103-
renderHook(() => useDataPolling());
104-
105-
expect(store.getState().assets.isLoading).toBe(false);
106-
});
107-
});
108-
109-
describe("lastUpdatedAt", () => {
110-
it.each([
11184
{ hookName: "usePollMultisigs", mock: usePollMultisigsMock },
11285
{ hookName: "usePollPendingOperations", mock: usePollPendingOperationsMock },
113-
{ hookName: "usePollAccountStates", mock: usePollAccountStatesMock },
86+
{ hookName: "usePollProtocolSettings", mock: usePollProtocolSettingsMock },
11487
{ hookName: "usePollTokenBalances", mock: usePollTokenBalancesMock },
11588
{ hookName: "usePollUnstakeRequests", mock: usePollUnstakeRequestsMock },
116-
])("is true when the data is being fetched by $hookName", ({ mock }) => {
89+
])("is set to the lastUpdatedAt of the $hookName hook if it is the latest one", ({ mock }) => {
11790
[
91+
usePollAccountStatesMock,
11892
usePollBakersMock,
11993
usePollBlockMock,
12094
usePollConversionRateMock,
12195
usePollMultisigsMock,
12296
usePollPendingOperationsMock,
123-
usePollAccountStatesMock,
97+
usePollProtocolSettingsMock,
12498
usePollTokenBalancesMock,
12599
usePollUnstakeRequestsMock,
126100
].forEach(hookMock => {
127-
if (hookMock === mock) {
128-
hookMock.mockReturnValue({
129-
isFetching: false,
130-
dataUpdatedAt: 1000,
131-
});
132-
} else {
133-
hookMock.mockReturnValue({
134-
isFetching: false,
135-
dataUpdatedAt: 1,
136-
});
137-
}
101+
hookMock.mockReturnValue({
102+
isFetching: false,
103+
dataUpdatedAt: hookMock === mock ? 1000 : 1,
104+
});
138105
});
139106

140107
renderHook(() => useDataPolling());
@@ -143,36 +110,36 @@ describe("useDataPolling", () => {
143110
});
144111

145112
it.each([
113+
{ hookName: "usePollAccountStates", mock: usePollAccountStatesMock },
146114
{ hookName: "usePollBakers", mock: usePollBakersMock },
147115
{ hookName: "usePollBlock", mock: usePollBlockMock },
148116
{ hookName: "usePollConversionRate", mock: usePollConversionRateMock },
149-
])("is not affected by $hookName", ({ mock }) => {
117+
{ hookName: "usePollMultisigs", mock: usePollMultisigsMock },
118+
{ hookName: "usePollPendingOperations", mock: usePollPendingOperationsMock },
119+
{ hookName: "usePollProtocolSettings", mock: usePollProtocolSettingsMock },
120+
{ hookName: "usePollTokenBalances", mock: usePollTokenBalancesMock },
121+
{ hookName: "usePollUnstakeRequests", mock: usePollUnstakeRequestsMock },
122+
])("does not change lastTimeUpdated if $hookName is loading", ({ mock }) => {
150123
[
151-
usePollMultisigsMock,
152-
usePollPendingOperationsMock,
153124
usePollAccountStatesMock,
154-
usePollTokenBalancesMock,
155125
usePollBakersMock,
156126
usePollBlockMock,
157127
usePollConversionRateMock,
128+
usePollMultisigsMock,
129+
usePollPendingOperationsMock,
130+
usePollProtocolSettingsMock,
131+
usePollTokenBalancesMock,
158132
usePollUnstakeRequestsMock,
159133
].forEach(hookMock => {
160-
if (hookMock === mock) {
161-
hookMock.mockReturnValue({
162-
isFetching: false,
163-
dataUpdatedAt: 5,
164-
});
165-
} else {
166-
hookMock.mockReturnValue({
167-
isFetching: false,
168-
dataUpdatedAt: 1,
169-
});
170-
}
134+
hookMock.mockReturnValue({
135+
isFetching: hookMock === mock,
136+
dataUpdatedAt: 1000,
137+
});
171138
});
172139

173140
renderHook(() => useDataPolling());
174141

175-
expect(store.getState().assets.lastTimeUpdated).toBe("Thu, 01 Jan 1970 00:00:00 GMT");
142+
expect(store.getState().assets.lastTimeUpdated).toBeNull();
176143
});
177144
});
178145
});

apps/desktop/src/utils/dataPolling/useDataPolling.ts

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { fromUnixTime } from "date-fns";
2+
import { max } from "lodash";
23
import { useEffect } from "react";
34

45
import { usePollAccountStates } from "./usePollAccountStates";
@@ -16,36 +17,20 @@ import { assetsActions } from "../redux/slices/assetsSlice";
1617
export const useDataPolling = () => {
1718
const dispatch = useAppDispatch();
1819

19-
const { dataUpdatedAt: isMultisigsUpdatedAt, isFetching: isMultisigsFetching } =
20-
usePollMultisigs();
21-
const { dataUpdatedAt: isPendingOperationsUpdatedAt, isFetching: isPendingOperationsFetching } =
22-
usePollPendingOperations();
23-
const { dataUpdatedAt: isAccountStatesUpdatedAt, isFetching: isAccountStatesFetching } =
24-
usePollAccountStates();
25-
const { dataUpdatedAt: isUnstakeRequestUpdatedAt, isFetching: isUnstakeRequestFetching } =
26-
usePollUnstakeRequests();
27-
const { dataUpdatedAt: isTokenBalancesUpdatedAt, isFetching: isTokenBalancesFetching } =
28-
usePollTokenBalances();
29-
30-
usePollConversionRate();
31-
usePollBlock();
32-
usePollBakers();
33-
usePollProtocolSettings();
34-
35-
const isFetching =
36-
isMultisigsFetching ||
37-
isPendingOperationsFetching ||
38-
isAccountStatesFetching ||
39-
isTokenBalancesFetching ||
40-
isUnstakeRequestFetching;
41-
42-
const lastUpdatedAt = Math.max(
43-
isMultisigsUpdatedAt,
44-
isPendingOperationsUpdatedAt,
45-
isAccountStatesUpdatedAt,
46-
isTokenBalancesUpdatedAt,
47-
isUnstakeRequestUpdatedAt
48-
);
20+
const pollers = [
21+
usePollAccountStates(),
22+
usePollBakers(),
23+
usePollBlock(),
24+
usePollConversionRate(),
25+
usePollMultisigs(),
26+
usePollPendingOperations(),
27+
usePollProtocolSettings(),
28+
usePollTokenBalances(),
29+
usePollUnstakeRequests(),
30+
];
31+
32+
const isFetching = pollers.some(poller => poller.isFetching);
33+
const lastUpdatedAt = max(pollers.map(poller => poller.dataUpdatedAt));
4934

5035
useEffect(() => {
5136
dispatch(assetsActions.setIsLoading(isFetching));

0 commit comments

Comments
 (0)