Skip to content

Commit 7a35ab2

Browse files
authored
Merge pull request #1 from FriendsOfECMAScript/refactor/es6
Refactor/es6
2 parents 296c03b + 9217656 commit 7a35ab2

22 files changed

+1004
-683
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
# For the full copyright and license information, please view the LICENSE
66
# file that was distributed with this source code.
77

8-
/bower_components
98
/coverage
109
/dist
1110
/node_modules
1211
/npm-debug.log
12+
/demo

package.json

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "foes-scrollproxy",
3-
"version": "0.4.5",
3+
"version": "0.5.0",
44
"license": "MIT",
55
"description": "",
66
"keywords": [
@@ -28,6 +28,7 @@
2828
"prebuild": "rimraf dist",
2929
"build": "npm-run-all --parallel build:*",
3030
"build:main": "webpack --output-filename foes-scrollproxy.js",
31+
"build:main.min": "webpack --output-filename foes-scrollproxy.min.js -p",
3132
"build:umd": "webpack --output-filename foes-scrollproxy.umd.js --env.libraryTarget umd",
3233
"build:umd.min": "webpack --output-filename foes-scrollproxy.umd.min.js --env.libraryTarget umd -p"
3334
},
@@ -51,15 +52,15 @@
5152
"babel-plugin-transform-array-from": "^1.0.0",
5253
"babel-preset-es2015": "^6.14.0",
5354
"babel-preset-stage-2": "^6.13.0",
55+
"gsap": "^1.19.0",
5456
"jest": "^15.1.1",
5557
"jsdom": "^9.3.0",
58+
"lodash.debounce": "^4.0.8",
5659
"npm-run-all": "^3.1.0",
5760
"rimraf": "^2.5.4",
58-
"webpack": "^2.1.0-beta.21"
61+
"webpack": "^2.1.0-beta.26"
5962
},
6063
"peerDependencies": {
61-
"gsap": "^1.19.0",
62-
"lodash.throttle": "^4.1.0",
63-
"jquery": "^2.2.0"
64+
"gsap": "^1.19.0"
6465
}
6566
}

src/Core/ScrollProxy.js

Lines changed: 58 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,88 +1,70 @@
11
/*
2-
* @author Mikel Tuesta <[email protected]>
2+
* This file is part of the FoesScrollProxy library.
3+
*
4+
* (c) Mikel Tuesta <[email protected]>
5+
*
6+
* For the full copyright and license information, please view the LICENSE
7+
* file that was distributed with this source code.
38
*/
4-
'use strict';
59

6-
(function (window, GeometricHelpers, DomHelpers, ScrollProxyListener, _) {
10+
import DOMHelpers from '../Helpers/DOMHelpers';
11+
import ScrollProxyObserver from './ScrollProxyObserver';
12+
import debounce from 'lodash.debounce';
713

8-
/**
9-
* ParallaxController - Singleton
10-
*
11-
* @constructor
12-
*/
13-
var ScrollProxy = (function () {
14-
var instance;
14+
class ScrollProxy {
1515

16-
function ScrollProxy() {
17-
var latestKnownScrollPosition = DomHelpers.getScrollPosition(),
18-
viewportSize = DomHelpers.getViewportSize(),
19-
listeners = [],
20-
rendering = false;
16+
constructor() {
17+
this.observers = new Map();
18+
this.isUpdatingDOM = false;
2119

22-
var notifyListeners = function () {
23-
var args = Array.prototype.slice.call(arguments),
24-
methodName = args.splice(0, 1);
25-
for (var i = 0; i < listeners.length; i++) {
26-
listeners[i][methodName].apply(listeners[i], args);
27-
}
28-
};
29-
var requestFrame = function () {
30-
if (!rendering) {
31-
window.requestAnimationFrame(render);
32-
}
33-
rendering = true;
34-
};
35-
var render = function () {
36-
notifyListeners('render');
37-
rendering = false;
38-
};
39-
var onScroll = function () {
40-
latestKnownScrollPosition = DomHelpers.getScrollPosition();
41-
notifyListeners('onScroll', latestKnownScrollPosition);
42-
requestFrame();
43-
};
44-
var onResize = function () {
45-
viewportSize = DomHelpers.getViewportSize();
46-
notifyListeners('onResize', viewportSize);
47-
};
48-
var bindListeners = function () {
49-
window.addEventListener('scroll', onScroll);
50-
window.addEventListener('resize', _.debounce(onResize, 200));
51-
};
52-
var addListener = function (listener) {
53-
if (!(listener instanceof ScrollProxyListener)) {
54-
throw 'Provided listener must be an instance of ScrollProxyListener.';
55-
}
56-
listeners.push(listener);
57-
};
58-
var removeListener = function (listener) {
59-
var listenerIndex = listeners.indexOf(listener);
60-
if (listenerIndex !== -1) {
61-
listeners.splice(listenerIndex, 1);
62-
}
63-
};
64-
var init = function () {
65-
bindListeners();
66-
};
67-
init();
20+
this.onScroll = () => {
21+
const scrollPosition = DOMHelpers.getScrollPosition();
22+
this.notifyObservers('onScroll', scrollPosition);
23+
this.requestDOMUpdate();
24+
};
6825

69-
return {
70-
addListener: addListener,
71-
removeListener: removeListener
72-
}
73-
}
26+
this.onResize = () => {
27+
const viewportSize = DOMHelpers.getViewportSize();
28+
this.notifyObservers('onResize', viewportSize);
29+
};
7430

75-
return {
76-
getInstance: function () {
77-
if (!instance) {
78-
instance = new ScrollProxy();
79-
}
80-
return instance;
31+
this.requestDOMUpdate = () => {
32+
if (!this.isUpdatingDOM) {
33+
window.requestAnimationFrame(this.updateDOM);
8134
}
35+
this.isUpdatingDOM = true;
8236
};
83-
})();
8437

85-
// Expose ScrollProxy
86-
window.ScrollProxy = ScrollProxy;
38+
this.updateDOM = () => {
39+
this.notifyObservers('updateDOM');
40+
this.isUpdatingDOM = false;
41+
};
42+
43+
this.notifyObservers = (methodName, ...methodParams) => {
44+
this.observers.forEach((observer, uuid) => {
45+
observer[methodName](...methodParams);
46+
});
47+
};
48+
49+
window.addEventListener('scroll', this.onScroll);
50+
window.addEventListener('resize', debounce(this.onResize, 200));
51+
}
52+
53+
addObserver(observer) {
54+
if (!(observer instanceof ScrollProxyObserver)) {
55+
throw new TypeError('Provided object must inherit from ScrollProxyObserver abstract class.');
56+
}
57+
58+
const uuid = Symbol();
59+
this.observers.set(uuid, observer);
60+
return uuid;
61+
};
62+
63+
removeObserver(uuid) {
64+
return this.observers.delete(uuid);
65+
};
66+
}
67+
68+
const instance = new ScrollProxy();
8769

88-
})(window, window.GeometricHelpers, window.DomHelpers, window.ScrollProxyListener, _);
70+
export default instance;

src/Core/ScrollProxyListener.js

Lines changed: 0 additions & 65 deletions
This file was deleted.

src/Core/ScrollProxyObserver.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
* This file is part of the FoesScrollProxy library.
3+
*
4+
* (c) Mikel Tuesta <[email protected]>
5+
*
6+
* For the full copyright and license information, please view the LICENSE
7+
* file that was distributed with this source code.
8+
*/
9+
10+
import DOMHelpers from '../Helpers/DOMHelpers';
11+
import ScrollProxy from './ScrollProxy';
12+
13+
class ScrollProxyObserver {
14+
15+
static STATE = {
16+
IDLE: 'IDLE',
17+
RUNNING: 'RUNNING'
18+
};
19+
20+
constructor() {
21+
// Abstract class
22+
if (this.constructor === ScrollProxyObserver) {
23+
throw new TypeError("Abstract class ScrollProxyObserver cannot be instantiated directly.");
24+
}
25+
26+
this.state = ScrollProxyObserver.STATE.RUNNING;
27+
this.scrollPosition = DOMHelpers.getScrollPosition();
28+
this.viewportSize = DOMHelpers.getViewportSize();
29+
// Add self as observer
30+
this.uuid = ScrollProxy.addObserver(this);
31+
32+
this.setScrollPosition = (scrollPosition) => {
33+
this.scrollPosition = scrollPosition;
34+
};
35+
}
36+
37+
setState(state) {
38+
this.state = state;
39+
this.onStateChanged(this.state);
40+
}
41+
42+
onStateChanged(state) {
43+
}
44+
45+
isRunning() {
46+
return this.state !== ScrollProxyObserver.STATE.IDLE;
47+
}
48+
49+
onScroll(scrollPosition) {
50+
if (!this.isRunning()) {
51+
return;
52+
}
53+
54+
this.setScrollPosition(scrollPosition);
55+
}
56+
57+
updateDOM() {
58+
throw new TypeError("In order to extend ScrollProxyObserver class you must implement updateDOM method.");
59+
}
60+
61+
onResize(viewportSize) {
62+
this.viewportSize = viewportSize;
63+
}
64+
65+
destroy() {
66+
// Remove self from observers
67+
ScrollProxy.removeObserver(this.uuid);
68+
}
69+
70+
}
71+
72+
export default ScrollProxyObserver;

0 commit comments

Comments
 (0)