Skip to content
This repository was archived by the owner on Dec 15, 2022. It is now read-only.

Commit 63cb0ea

Browse files
committed
Model to unify the refresh operation in the GitHub tab
1 parent c427e2a commit 63cb0ea

File tree

2 files changed

+93
-0
lines changed

2 files changed

+93
-0
lines changed

lib/models/refresher.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Uniformly trigger a refetch of all GraphQL query containers within a scoped hierarchy.
3+
*/
4+
export default class Refresher {
5+
constructor() {
6+
this.dispose();
7+
}
8+
9+
setRetryCallback(key, retryCallback) {
10+
this.retryByKey.set(key, retryCallback);
11+
}
12+
13+
trigger() {
14+
for (const [, retryCallback] of this.retryByKey) {
15+
retryCallback();
16+
}
17+
}
18+
19+
deregister(key) {
20+
this.retryByKey.delete(key);
21+
}
22+
23+
dispose() {
24+
this.retryByKey = new Map();
25+
}
26+
}

test/models/refresher.test.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import Refresher from '../../lib/models/refresher';
2+
3+
describe('Refresher', function() {
4+
let refresher;
5+
6+
beforeEach(function() {
7+
refresher = new Refresher();
8+
});
9+
10+
afterEach(function() {
11+
refresher.dispose();
12+
});
13+
14+
it('calls the latest retry method registered per key instance when triggered', function() {
15+
const keyOne = Symbol('one');
16+
const keyTwo = Symbol('two');
17+
18+
const one0 = sinon.spy();
19+
const one1 = sinon.spy();
20+
const two0 = sinon.spy();
21+
22+
refresher.setRetryCallback(keyOne, one0);
23+
refresher.setRetryCallback(keyOne, one1);
24+
refresher.setRetryCallback(keyTwo, two0);
25+
26+
refresher.trigger();
27+
28+
assert.isFalse(one0.called);
29+
assert.isTrue(one1.called);
30+
assert.isTrue(two0.called);
31+
});
32+
33+
it('deregisters a retry callback for a key', function() {
34+
const keyOne = Symbol('one');
35+
const keyTwo = Symbol('two');
36+
37+
const one = sinon.spy();
38+
const two = sinon.spy();
39+
40+
refresher.setRetryCallback(keyOne, one);
41+
refresher.setRetryCallback(keyTwo, two);
42+
43+
refresher.deregister(keyOne);
44+
45+
refresher.trigger();
46+
47+
assert.isFalse(one.called);
48+
assert.isTrue(two.called);
49+
});
50+
51+
it('deregisters all retry callbacks on dispose', function() {
52+
const keyOne = Symbol('one');
53+
const keyTwo = Symbol('two');
54+
55+
const one = sinon.spy();
56+
const two = sinon.spy();
57+
58+
refresher.setRetryCallback(keyOne, one);
59+
refresher.setRetryCallback(keyTwo, two);
60+
61+
refresher.dispose();
62+
refresher.trigger();
63+
64+
assert.isFalse(one.called);
65+
assert.isFalse(two.called);
66+
});
67+
});

0 commit comments

Comments
 (0)