Skip to content

Commit 72959e6

Browse files
committed
v0.1.9; saved .15kb for pettiness 🙂
1 parent 7f9a786 commit 72959e6

File tree

4 files changed

+42
-26
lines changed

4 files changed

+42
-26
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ npm install -D use-viewport-sizes
99
```
1010

1111
## Benefits
12-
- extremely lightweight and dependency-free; **2.8kb pre-gzipped** with all dependencies.
12+
- extremely lightweight and dependency-free; **2.54kb pre-gzipped** with all dependencies.
1313
- only one `window.onresize` handler used to subscribe to any changes in an unlimited number of components.
1414
- optional debounce to delay updates until user stops dragging their window for a moment; this can make expensive components with size-dependent calculations run much faster and your app feel smoother.
1515
- debouncing does not create new handlers or waste re-renders in your component; the results are also pooled from only one resize result.

build/index.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "use-viewport-sizes",
3-
"version": "0.1.8",
3+
"version": "0.1.9",
44
"description": "tiny React hook which allows you to track visible window viewport size in your components w/ an optional debounce for updates for optimal rendering.",
55
"main": "build/index.js",
66
"scripts": {

src/index.js

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,57 @@
11
import { useState, useEffect, useMemo } from "react"
22

3-
const getVpWidth = () =>
4-
Math.max(
5-
window.document.documentElement.clientWidth,
6-
window.innerWidth || 0
7-
);
3+
// Note: not using pure ES6/7 as babel
4+
// transpilation eats into precious
5+
// bytes and we're being petty here 🙂
6+
7+
var { documentElement } = window.document;
8+
9+
function getVpWidth () {
10+
return Math.max(
11+
documentElement.clientWidth,
12+
window.innerWidth || 0
13+
);
14+
}
15+
816

9-
const getVpHeight = () =>
10-
Math.max(
11-
window.document.documentElement.clientHeight,
17+
function getVpHeight () {
18+
return Math.max(
19+
documentElement.clientHeight,
1220
window.innerHeight || 0
1321
);
22+
}
1423

15-
const store = {
16-
listeners: new Set(),
17-
state: { vpWidth: getVpWidth(), vpHeight: getVpHeight() },
18-
onResize(vpWidth, vpHeight) {
19-
this.state = { vpWidth, vpHeight };
20-
21-
for(let listener of this.listeners) {
24+
// =============== //
25+
// Shared State //
26+
// =============== //
27+
28+
var listeners = new Set();
29+
var vpW = getVpWidth();
30+
var vpH = getVpHeight();
31+
32+
function onResize(vpWidth, vpHeight) {
33+
listeners.forEach(function(listener) {
2234
listener({ vpWidth, vpHeight });
23-
}
24-
}
25-
};
35+
});
36+
}
2637

27-
window.addEventListener("resize", () => {
28-
store.onResize(getVpWidth(), getVpHeight());
38+
window.addEventListener('resize',function(){
39+
vpW = getVpWidth();
40+
vpH = getVpHeight();
41+
onResize(vpW, vpH);
2942
});
3043

44+
// =============== //
45+
// the Hook //
46+
// =============== //
47+
3148
function useViewportSizes(debounce) {
3249
const [{ vpWidth, vpHeight }, setState] = useState(() => ({
33-
...store.state
50+
vpWidth : vpW, vpHeight : vpH
3451
}));
3552

3653
const listener = useMemo(()=> {
37-
store.listeners.delete(listener);
54+
listeners.delete(listener);
3855

3956
let interval = undefined;
4057

@@ -52,7 +69,6 @@ function useViewportSizes(debounce) {
5269
}, [debounce, setState]);
5370

5471
useEffect(() => {
55-
const { listeners } = store;
5672
listeners.add(listener);
5773
return () => listeners.delete(listener);
5874
}, []);

0 commit comments

Comments
 (0)