Skip to content

Commit 1ec0d04

Browse files
committed
first commit
0 parents  commit 1ec0d04

File tree

9 files changed

+240
-0
lines changed

9 files changed

+240
-0
lines changed

.babelrc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"presets": ["es2015"],
3+
"plugins": ["babel-plugin-add-module-exports"]
4+
}

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Dependency directory
2+
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
3+
node_modules

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# handle-failed-requests-js

example.html

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
4+
<head>
5+
<meta charset="utf-8">
6+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
7+
<meta name="viewport" content="width=device-width, initial-scale=1">
8+
<title>Offline Requests</title>
9+
<!-- Bootstrap -->
10+
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
11+
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
12+
<!-- Offline-js -->
13+
<link rel="stylesheet" href="http://github.hubspot.com/offline/themes/offline-theme-chrome.css">
14+
<link rel="stylesheet" href="http://github.hubspot.com/offline/themes/offline-language-english.css">
15+
</head>
16+
17+
<body>
18+
<div class="container">
19+
<div class="jumbotron">
20+
<h3>Handling Failed Requests</h3>
21+
<form id="form1" class="form-horizontal">
22+
<div class="form-group">
23+
<div class="col-md-6">
24+
Name: <input type="text" name="name" value="" class="form-control">
25+
</div>
26+
</div>
27+
<div class="form-group">
28+
<button type="submit" name="button" class="btn">Send</button>
29+
</div>
30+
</form>
31+
</div>
32+
</div>
33+
<script src="handle-requests.min.js"></script>
34+
<script type="text/javascript">
35+
var req = new Request();
36+
document.getElementById('form1').addEventListener('submit', function(e) {
37+
38+
e.preventDefault();
39+
40+
var inputs = [].slice.call(e.target.getElementsByTagName('input'));
41+
var data = {};
42+
43+
inputs.forEach(function(input) {
44+
data[input.name] = input.value
45+
})
46+
47+
req.send('/', data)
48+
.then(function(res) {
49+
console.log(res)
50+
})
51+
52+
})
53+
</script>
54+
</body>
55+
56+
</html>

lib/handle-requests.min.js

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/handle-requests.min.js.map

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

package.json

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
{
2+
"name": "webpack-library-starter",
3+
"version": "0.2.1",
4+
"description": "Produce universal library with webpack and es6",
5+
"main": "lib/library.js",
6+
"scripts": {
7+
"build": "webpack --mode=build",
8+
"dev": "webpack --progress --colors --watch --mode=dev",
9+
"test": "mocha --compilers js:babel-core/register --colors ./test/*.spec.js",
10+
"test:watch": "mocha --compilers js:babel-core/register --colors -w ./test/*.spec.js"
11+
},
12+
"devDependencies": {
13+
"babel": "6.3.13",
14+
"babel-core": "6.1.18",
15+
"babel-eslint": "5.0.0",
16+
"babel-loader": "6.1.0",
17+
"babel-plugin-add-module-exports": "0.1.2",
18+
"babel-preset-es2015": "6.3.13",
19+
"chai": "3.4.1",
20+
"eslint": "1.7.2",
21+
"eslint-loader": "1.1.0",
22+
"mocha": "2.3.4",
23+
"webpack": "1.12.9",
24+
"yargs": "3.32.0"
25+
},
26+
"repository": {
27+
"type": "git",
28+
"url": "https://github.com/krasimir/webpack-library-starter.git"
29+
},
30+
"keywords": [
31+
"webpack",
32+
"es6",
33+
"starter",
34+
"library",
35+
"universal",
36+
"umd",
37+
"commonjs"
38+
],
39+
"author": "Krasimir Tsonev",
40+
"license": "MIT",
41+
"bugs": {
42+
"url": "https://github.com/krasimir/webpack-library-starter/issues"
43+
},
44+
"homepage": "https://github.com/krasimir/webpack-library-starter",
45+
"dependencies": {
46+
"axios": "^0.15.3",
47+
"offline-js": "^0.7.18"
48+
}
49+
}

src/index.js

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import 'offline-js/offline.min'
2+
import axios from 'axios'
3+
4+
class Request {
5+
constructor() {
6+
Offline.options = {
7+
interceptRequests: false,
8+
requests: false
9+
}
10+
11+
Offline.on('up', () => {
12+
this.checkPendingRequests()
13+
})
14+
15+
this.checkPendingRequests()
16+
17+
this.eRequests = []
18+
}
19+
20+
checkPendingRequests() {
21+
let eRequests = localStorage.getItem("eRequests")
22+
23+
if ((eRequests !== null)&&(eRequests !== 'undefined')) {
24+
25+
this.eRequests = JSON.parse(eRequests)
26+
27+
return this.sendPendingRequests()
28+
}
29+
30+
return false
31+
}
32+
33+
sendPendingRequests() {
34+
let requests = this.eRequests
35+
let sendRequest = (item) => axios(item)
36+
37+
if (requests.length === 0) {
38+
return false
39+
}
40+
41+
axios.all(requests.map((item) => {
42+
requests.splice(requests.indexOf(item), 1)
43+
return sendRequest(item)
44+
}))
45+
.then(() => {
46+
this.eRequests = requests
47+
this.updateFailedRequests()
48+
})
49+
.catch(() => false)
50+
51+
return true
52+
}
53+
54+
queueFailedRequests(requestData) {
55+
this.eRequests.push(requestData)
56+
57+
this.updateFailedRequests()
58+
}
59+
60+
updateFailedRequests() {
61+
localStorage.setItem("eRequests", JSON.stringify(this.eRequests))
62+
}
63+
64+
send(request, data) {
65+
66+
if (typeof request !== 'object') {
67+
request = {
68+
method : 'post',
69+
url : request,
70+
data : data
71+
}
72+
}
73+
74+
return axios(request)
75+
.catch(() => this.queueFailedRequests(request))
76+
}
77+
}
78+
79+
export default Request

webpack.config.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
var webpack = require('webpack');
2+
var UglifyJsPlugin = webpack.optimize.UglifyJsPlugin;
3+
var path = require('path');
4+
var env = require('yargs').argv.mode;
5+
6+
var libraryName = 'Request';
7+
var fileName = 'handle-requests';
8+
9+
var plugins = [], outputFile;
10+
11+
if (env === 'build') {
12+
plugins.push(new UglifyJsPlugin({ minimize: true }));
13+
outputFile = fileName + '.min.js';
14+
} else {
15+
outputFile = fileName + '.js';
16+
}
17+
18+
var config = {
19+
entry: __dirname + '/src/index.js',
20+
devtool: 'source-map',
21+
output: {
22+
path: __dirname + '/lib',
23+
filename: outputFile,
24+
library: libraryName,
25+
libraryTarget: 'umd',
26+
umdNamedDefine: true
27+
},
28+
module: {
29+
loaders: [
30+
{
31+
test: /(\.jsx|\.js)$/,
32+
loader: 'babel',
33+
exclude: /(node_modules|bower_components)/
34+
}
35+
]
36+
},
37+
resolve: {
38+
root: path.resolve('./src'),
39+
extensions: ['', '.js']
40+
},
41+
plugins: plugins
42+
};
43+
44+
module.exports = config;

0 commit comments

Comments
 (0)