diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index fa6f49039a4a..b5d199815e2c 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,4 +1,6 @@ - [ ] Check the current issues to ensure you aren't creating a duplicate. - [ ] Consider making small typo fixes and such directly as pull requests. +- [ ] For the voting application, go to https://github.com/webpack-contrib/voting-app. +- [ ] For loader/plugin docs, consider opening an issue in the corresponding repository. - [ ] No existing issue? Go ahead and open a new one. - __Remove these instructions from your PR as they are for your eyes only.__ diff --git a/package.json b/package.json index 471f466b6aae..c8f71e076491 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "antwar-helpers": "^0.19.0", "antwar-interactive": "^0.19.0", "async": "^2.5.0", - "autoprefixer": "^7.1.3", + "autoprefixer": "^7.2.3", "babel-core": "^6.26.0", "babel-eslint": "^7.2.3", "babel-loader": "^7.1.2", @@ -53,12 +53,12 @@ "babel-plugin-transform-object-rest-spread": "^6.26.0", "babel-preset-env": "^1.6.0", "babel-preset-react": "^6.24.1", - "copy-webpack-plugin": "^4.0.1", + "copy-webpack-plugin": "^4.3.0", "css-loader": "^0.28.5", "duplexer": "^0.1.1", "eslint": "4.5.0", "eslint-loader": "^1.9.0", - "eslint-plugin-markdown": "^1.0.0-beta.6", + "eslint-plugin-markdown": "^1.0.0-beta.7", "extract-text-webpack-plugin": "^3.0.0", "file-loader": "^0.11.2", "fontgen-loader": "^0.2.1", @@ -67,22 +67,22 @@ "github": "^10.0.0", "html-webpack-plugin": "^2.30.1", "http-server": "^0.10.0", - "hyperlink": "^3.0.0", + "hyperlink": "^3.0.1", "loader-utils": "^1.1.0", "lodash": "^4.17.4", "markdown-loader": "^2.0.1", "markdownlint": "^0.6.0", "markdownlint-cli": "^0.3.1", - "marked": "^0.3.6", + "marked": "^0.3.7", "mkdirp": "^0.5.1", "modularscale-sass": "^3.0.3", - "moment": "^2.18.1", + "moment": "^2.20.1", "ncp": "^2.0.0", "node-sass": "^4.5.3", "npm-run-all": "^4.1.1", "postcss-loader": "^2.0.6", "prism-languages": "^0.3.3", - "prismjs": "^1.6.0", + "prismjs": "^1.9.0", "raw-loader": "^0.5.1", "request": "^2.81.0", "sass-loader": "^6.0.6", @@ -92,14 +92,14 @@ "tap-parser": "^6.0.1", "through2": "^2.0.3", "url-loader": "^0.5.9", - "webpack": "^3.5.5", - "webpack-dev-server": "^2.7.1", + "webpack": "^3.10.0", + "webpack-dev-server": "^2.9.7", "webpack-merge": "^4.1.0", "yaml-frontmatter-loader": "^0.1.0" }, "dependencies": { - "ajv": "^5.2.2", - "preact": "^8.2.5", + "ajv": "^5.5.2", + "preact": "^8.2.7", "preact-compat": "3.17.0", "prop-types": "^15.5.10", "react": "^15.6.1", @@ -107,6 +107,7 @@ "react-router": "^4.2.0", "react-router-dom": "^4.2.2", "tool-list": "^0.11.0", + "webpack.vote": "^0.1.0", "whatwg-fetch": "^2.0.3" } } diff --git a/src/components/Navigation/Links.json b/src/components/Navigation/Links.json index 4546aa78e1fb..aafac7beec4f 100644 --- a/src/components/Navigation/Links.json +++ b/src/components/Navigation/Links.json @@ -15,8 +15,12 @@ "title": "Contribute", "url": "contribute" }, + { + "title": "Vote", + "url": "vote" + }, { "title": "Blog", "url": "//medium.com/webpack" } -] \ No newline at end of file +] diff --git a/src/components/Vote/App.jsx b/src/components/Vote/App.jsx deleted file mode 100644 index cfba8704f200..000000000000 --- a/src/components/Vote/App.jsx +++ /dev/null @@ -1,411 +0,0 @@ -import React from 'react'; -import 'whatwg-fetch'; -import * as api from "./api"; -import VoteButton from './Button/Button'; -import Influence from './Influence'; -import GithubMark from '../../assets/github-logo.svg'; - -function updateByProperty(array, property, propertyValue, update) { - return array.map(item => { - if(item[property] === propertyValue) { - return update(item); - } else { - return item; - } - }); -} - -export default class VoteApp extends React.Component { - constructor(props) { - super(props); - this.state = { - selfInfo: undefined, - listInfo: undefined, - isFetchingSelf: false, - isVoting: 0 - }; - } - - isBrowserSupported() { - return typeof localStorage === 'object'; - } - - componentDidMount() { - if(!this.isBrowserSupported()) - return; - - let { selfInfo, listInfo } = this.state; - - if(api.isLoginActive()) { - this.setState({ - isLoginActive: true - }); - api.continueLogin().then(token => { - window.localStorage.voteAppToken = token; - }); - } else { - if(!selfInfo) { - this.updateSelf(); - } - if(!listInfo) { - this.updateList(); - } - } - } - - componentWillReceiveProps(props) { - if(!this.isBrowserSupported()) - return; - - this.updateList(props); - } - - updateSelf() { - let { voteAppToken } = localStorage; - if(voteAppToken) { - this.setState({ - isFetchingSelf: true - }); - api.getSelf(voteAppToken).catch(e => { - this.setState({ - selfInfo: null, - isFetchingSelf: false - }); - }).then(result => { - this.setState({ - selfInfo: result, - isFetchingSelf: false - }); - }); - } - } - - updateList(props = this.props) { - let { name } = props; - let { voteAppToken } = localStorage; - this.setState({ - isFetchingList: true - }); - api.getList(voteAppToken, name).catch(e => { - this.setState({ - listInfo: null, - isFetchingList: false - }); - }).then(result => { - this.setState({ - listInfo: result, - isFetchingList: false - }); - }); - } - - localVote(itemId, voteName, diffValue, currencyName, score) { - let { selfInfo, listInfo } = this.state; - this.setState({ - isVoting: this.state.isVoting + 1, - listInfo: listInfo && { - ...listInfo, - items: updateByProperty(listInfo.items, "id", itemId, item => ({ - ...item, - votes: updateByProperty(item.votes, "name", voteName, vote => ({ - ...vote, - votes: vote.votes + diffValue - })), - userVotes: updateByProperty(item.userVotes, "name", voteName, vote => ({ - ...vote, - votes: vote.votes + diffValue - })), - score: item.score + score * diffValue - })) - }, - selfInfo: selfInfo && { - ...selfInfo, - currencies: updateByProperty(selfInfo.currencies, "name", currencyName, currency => ({ - ...currency, - used: currency.used + diffValue, - remaining: currency.remaining - diffValue - })) - } - }); - } - - vote(itemId, voteName, diffValue, currencyName, score) { - if(!diffValue) return; - this.localVote(itemId, voteName, diffValue, currencyName, score); - let { voteAppToken } = localStorage; - api.vote(voteAppToken, itemId, voteName, diffValue).catch(e => { - console.error(e); - // revert local vote - this.localVote(itemId, voteName, -diffValue, currencyName, score); - this.setState({ - isVoting: this.state.isVoting - 1 - }); - }).then(() => { - this.setState({ - isVoting: this.state.isVoting - 1 - }); - }); - } - - render() { - let { name } = this.props; - - if(!this.isBrowserSupported()) - return
Your browser is not supported.
; - - let { selfInfo, listInfo, isVoting, isFetchingList, isFetchingSelf, isCreating, isLoginActive, editItem, editItemTitle, editItemDescription } = this.state; - - let { voteAppToken } = localStorage; - - if(isLoginActive) { - return
Logging in...
; - } - - const inProgress = isFetchingList || isFetchingSelf || isCreating || isVoting; - - let maxVoteInfo = listInfo && listInfo.possibleVotes.map(() => 0); - - if(listInfo) listInfo.items.forEach(item => { - if(item.userVotes) { - maxVoteInfo.forEach((max, idx) => { - let votes = item.userVotes[idx].votes; - if(votes > max) - maxVoteInfo[idx] = votes; - }); - } - }); - return ( -
-
- Vote -
-
-
-
-
- - -
-
- DISCLAIMER: Since this feature is its Alpha stages, the formula for calculating influence may change. -
-
-
- {this.renderSelf(inProgress)} -
-
-
- { listInfo &&
-

{listInfo.displayName}

-
{listInfo.description}
-