diff --git a/CHANGELOG.md b/CHANGELOG.md index 10c3f05b7..695df1aa6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,20 +8,12 @@ Web UI version numbers should always match the corresponding version of LBRY App ## [Unreleased] ### Added - * Identity verification for new reward participants - * Support rich markup in publishing descriptions and show pages. - * Release past publishing claims (and recover LBC) via the UI - * Added transition to card hovers to smooth animation - * Use randomly colored tiles when image is missing from metadata - * Added a loading message to file actions - * URL is auto suggested in Publish Page - * Added infinite scroll to channel pages + * + * ### Changed - * Publishing revamped. Editing claims is much easier. - * Publish page now use `claim_list` rather than `file_list` - * Daemon updated to [v0.14.2](https://github.com/lbryio/lbry/releases/tag/v0.14.2) - * Made channel claim storage more efficient + * + * ### Fixed * diff --git a/ui/js/actions/app.js b/ui/js/actions/app.js index c8586de86..b668b6301 100644 --- a/ui/js/actions/app.js +++ b/ui/js/actions/app.js @@ -22,7 +22,7 @@ const { download } = remote.require("electron-dl"); const fs = remote.require("fs"); const { lbrySettings: config } = require("../../../app/package.json"); -export function doNavigate(path, params = {}, options = {}) { +export function doNavigate(path, params = {}) { return function(dispatch, getState) { let url = path; if (params) url = `${url}?${toQueryString(params)}`; @@ -297,7 +297,13 @@ export function doClearCache() { }; } -export function doQuitAndLaunchDaemonHelp() { +export function doQuit() { + return function(dispatch, getState) { + remote.app.quit(); + }; +} + +export function doLaunchDaemonHelp() { return function(dispatch, getState) { shell.openExternal("https://lbry.io/faq/incompatible-protocol-version"); remote.app.quit(); diff --git a/ui/js/actions/content.js b/ui/js/actions/content.js index 695cbd6ee..249bb6838 100644 --- a/ui/js/actions/content.js +++ b/ui/js/actions/content.js @@ -262,7 +262,6 @@ export function doLoadVideo(uri) { type: types.LOADING_VIDEO_FAILED, data: { uri }, }); - dispatch(doOpenModal("timedOut")); } else { dispatch(doDownloadFile(uri, streamInfo)); @@ -314,28 +313,22 @@ export function doPurchaseUri(uri, purchaseModalName) { }; } -export function doFetchClaimsByChannel(uri, page) { +export function doFetchClaimsByChannel(uri, page = 1) { return function(dispatch, getState) { dispatch({ type: types.FETCH_CHANNEL_CLAIMS_STARTED, - data: { uri, page }, + data: { uri }, }); lbry.claim_list_by_channel({ uri, page }).then(result => { const claimResult = result[uri], - claims = claimResult ? claimResult.claims_in_channel : [], - totalPages = claimResult - ? claimResult.claims_in_channel_pages - : undefined, - currentPage = claimResult ? claimResult.returned_page : undefined; + claims = claimResult ? claimResult.claims_in_channel : []; dispatch({ type: types.FETCH_CHANNEL_CLAIMS_COMPLETED, data: { uri, - claims, - totalPages, - page: currentPage, + claims: claims, }, }); }); diff --git a/ui/js/component/modalIncompatibleDaemon/index.jsx b/ui/js/component/modalIncompatibleDaemon/index.jsx index 27ddecd8d..29670469d 100644 --- a/ui/js/component/modalIncompatibleDaemon/index.jsx +++ b/ui/js/component/modalIncompatibleDaemon/index.jsx @@ -1,13 +1,14 @@ import React from "react"; import { connect } from "react-redux"; import { doQuit, doSkipWrongDaemonNotice } from "actions/app"; -import { doQuitAndLaunchDaemonHelp } from "actions/app"; +import { doLaunchDaemonHelp } from "actions/app"; import ModalIncompatibleDaemon from "./view"; const select = state => ({}); const perform = dispatch => ({ - quitAndLaunchDaemonHelp: () => dispatch(doQuitAndLaunchDaemonHelp()), + quit: () => dispatch(doQuit()), + launchDaemonHelp: () => dispatch(doLaunchDaemonHelp()), }); export default connect(select, perform)(ModalIncompatibleDaemon); diff --git a/ui/js/component/modalIncompatibleDaemon/view.jsx b/ui/js/component/modalIncompatibleDaemon/view.jsx index 851a2ec88..135299850 100644 --- a/ui/js/component/modalIncompatibleDaemon/view.jsx +++ b/ui/js/component/modalIncompatibleDaemon/view.jsx @@ -3,15 +3,17 @@ import { Modal } from "component/modal"; class ModalIncompatibleDaemon extends React.PureComponent { render() { - const { quitAndLaunchDaemonHelp } = this.props; + const { quit, launchDaemonHelp } = this.props; return ( {__( "This browser is running with an incompatible version of the LBRY protocol and your install must be repaired." diff --git a/ui/js/component/router/view.jsx b/ui/js/component/router/view.jsx index 74ffc836b..ac3f29921 100644 --- a/ui/js/component/router/view.jsx +++ b/ui/js/component/router/view.jsx @@ -25,23 +25,23 @@ const Router = props => { const { currentPage, params } = props; return route(currentPage, { - auth: , - channel: , - developer: , - discover: , - downloaded: , - help: , - publish: , - published: , - receive: , - report: , - rewards: , - search: , - send: , - settings: , - show: , - start: , - wallet: , + auth: , + channel: , + developer: , + discover: , + downloaded: , + help: , + publish: , + published: , + receive: , + report: , + rewards: , + search: , + send: , + settings: , + show: , + start: , + wallet: , }); }; diff --git a/ui/js/component/wunderbar/index.js b/ui/js/component/wunderbar/index.js index 9d23f4d26..a6b8860c1 100644 --- a/ui/js/component/wunderbar/index.js +++ b/ui/js/component/wunderbar/index.js @@ -12,10 +12,8 @@ const select = state => ({ const perform = dispatch => ({ onSearch: query => dispatch(doNavigate("/search", { query })), - onSubmit: (query, extraParams) => - dispatch( - doNavigate("/show", { uri: lbryuri.normalize(query), ...extraParams }) - ), + onSubmit: query => + dispatch(doNavigate("/show", { uri: lbryuri.normalize(query) })), }); export default connect(select, perform)(Wunderbar); diff --git a/ui/js/component/wunderbar/view.jsx b/ui/js/component/wunderbar/view.jsx index 04ba1a030..673b015a5 100644 --- a/ui/js/component/wunderbar/view.jsx +++ b/ui/js/component/wunderbar/view.jsx @@ -1,7 +1,6 @@ import React from "react"; import lbryuri from "lbryuri.js"; import { Icon } from "component/common.js"; -import { parseQueryParams } from "util/query_params"; class WunderBar extends React.PureComponent { static TYPING_TIMEOUT = 800; @@ -121,15 +120,12 @@ class WunderBar extends React.PureComponent { onKeyPress(event) { if (event.charCode == 13 && this._input.value) { let uri = null, - method = "onSubmit", - extraParams = {}; + method = "onSubmit"; this._resetOnNextBlur = false; clearTimeout(this._userTypingTimer); - const parts = this._input.value.trim().split("?"); - const value = parts.shift(); - if (parts.length > 0) extraParams = parseQueryParams(parts.join("")); + const value = this._input.value.trim(); try { uri = lbryuri.normalize(value); @@ -140,7 +136,7 @@ class WunderBar extends React.PureComponent { method = "onSearch"; } - this.props[method](uri, extraParams); + this.props[method](uri); this._input.blur(); } } diff --git a/ui/js/page/channel/index.js b/ui/js/page/channel/index.js index bce739e1e..5e2be42ea 100644 --- a/ui/js/page/channel/index.js +++ b/ui/js/page/channel/index.js @@ -3,34 +3,24 @@ import { connect } from "react-redux"; import { doFetchClaimsByChannel } from "actions/content"; import { makeSelectClaimForUri, - makeSelectClaimsInChannelForCurrentPage, - makeSelectFetchingChannelClaims, + makeSelectClaimsInChannelForUri, } from "selectors/claims"; -import { selectCurrentParams } from "selectors/app"; -import { doNavigate } from "actions/app"; -import { makeSelectTotalPagesForChannel } from "selectors/content"; import ChannelPage from "./view"; const makeSelect = () => { const selectClaim = makeSelectClaimForUri(), - selectClaimsInChannel = makeSelectClaimsInChannelForCurrentPage(), - selectFetchingChannelClaims = makeSelectFetchingChannelClaims(), - selectTotalPagesForChannel = makeSelectTotalPagesForChannel(); + selectClaimsInChannel = makeSelectClaimsInChannelForUri(); const select = (state, props) => ({ claim: selectClaim(state, props), claimsInChannel: selectClaimsInChannel(state, props), - fetching: selectFetchingChannelClaims(state, props), - totalPages: selectTotalPagesForChannel(state, props), - params: selectCurrentParams(state), }); return select; }; const perform = dispatch => ({ - fetchClaims: (uri, page) => dispatch(doFetchClaimsByChannel(uri, page)), - navigate: (path, params) => dispatch(doNavigate(path, params)), + fetchClaims: uri => dispatch(doFetchClaimsByChannel(uri)), }); export default connect(makeSelect, perform)(ChannelPage); diff --git a/ui/js/page/channel/view.jsx b/ui/js/page/channel/view.jsx index d694c3ba8..377069330 100644 --- a/ui/js/page/channel/view.jsx +++ b/ui/js/page/channel/view.jsx @@ -2,41 +2,24 @@ import React from "react"; import lbryuri from "lbryuri"; import { BusyMessage } from "component/common"; import FileTile from "component/fileTile"; -import Link from "component/link"; -import ReactPaginate from "react-paginate"; class ChannelPage extends React.PureComponent { componentDidMount() { - const { uri, params, fetchClaims } = this.props; - - fetchClaims(uri, params.page || 1); + this.fetchClaims(this.props); } componentWillReceiveProps(nextProps) { - const { params, fetching, fetchClaims } = this.props; - const nextParams = nextProps.params; - - if (fetching !== nextParams.page && params.page !== nextParams.page) - fetchClaims(nextProps.uri, nextParams.page); + this.fetchClaims(nextProps); } - changePage(pageNumber) { - const { params, currentPage } = this.props; - const newParams = Object.assign({}, params, { page: pageNumber }); - - this.props.navigate("/show", newParams); + fetchClaims(props) { + if (props.claimsInChannel === undefined) { + props.fetchClaims(props.uri); + } } render() { - const { - fetching, - claimsInChannel, - claim, - uri, - params, - totalPages, - } = this.props; - const { page } = params; + const { claimsInChannel, claim, uri } = this.props; let contentList; if (claimsInChannel === undefined) { @@ -46,17 +29,14 @@ class ChannelPage extends React.PureComponent { ? claimsInChannel.map(claim => ) : {__("No content found.")}; } return ( -
+

{uri}

@@ -71,24 +51,7 @@ class ChannelPage extends React.PureComponent {

{__("Published Content")}

{contentList} -
- {(!fetching || (claimsInChannel && claimsInChannel.length)) && - totalPages > 1 && - this.changePage(e.selected + 1)} - initialPage={parseInt(page - 1)} - containerClassName="pagination" - />} -
+
); } } diff --git a/ui/js/page/showPage/index.js b/ui/js/page/showPage/index.js index 6306e5e33..cd9677169 100644 --- a/ui/js/page/showPage/index.js +++ b/ui/js/page/showPage/index.js @@ -10,8 +10,8 @@ const makeSelect = () => { selectIsResolving = makeSelectIsResolvingForUri(); const select = (state, props) => ({ - claim: selectClaim(state, props.params), - isResolvingUri: selectIsResolving(state, props.params), + claim: selectClaim(state, props), + isResolvingUri: selectIsResolving(state, props), }); return select; diff --git a/ui/js/page/showPage/view.jsx b/ui/js/page/showPage/view.jsx index 67bbf6178..687cb5498 100644 --- a/ui/js/page/showPage/view.jsx +++ b/ui/js/page/showPage/view.jsx @@ -6,15 +6,13 @@ import FilePage from "page/filePage"; class ShowPage extends React.PureComponent { componentWillMount() { - const { isResolvingUri, resolveUri, params } = this.props; - const { uri } = params; + const { isResolvingUri, resolveUri, uri } = this.props; if (!isResolvingUri) resolveUri(uri); } componentWillReceiveProps(nextProps) { - const { isResolvingUri, resolveUri, claim, params } = nextProps; - const { uri } = params; + const { isResolvingUri, resolveUri, claim, uri } = nextProps; if (!isResolvingUri && claim === undefined && uri) { resolveUri(uri); @@ -22,8 +20,7 @@ class ShowPage extends React.PureComponent { } render() { - const { claim, params, isResolvingUri } = this.props; - const { uri } = params; + const { claim, uri, isResolvingUri } = this.props; let innerContent = ""; diff --git a/ui/js/reducers/claims.js b/ui/js/reducers/claims.js index c70fd45e0..9e072f1ce 100644 --- a/ui/js/reducers/claims.js +++ b/ui/js/reducers/claims.js @@ -101,44 +101,17 @@ reducers[types.FETCH_CHANNEL_LIST_MINE_COMPLETED] = function(state, action) { }); }; -reducers[types.FETCH_CHANNEL_CLAIMS_STARTED] = function(state, action) { - const { uri, page } = action.data; - const fetchingChannelClaims = Object.assign({}, state.fetchingChannelClaims); - - fetchingChannelClaims[uri] = page; - - return Object.assign({}, state, { - fetchingChannelClaims, - }); -}; - reducers[types.FETCH_CHANNEL_CLAIMS_COMPLETED] = function(state, action) { - const { uri, claims, page } = action.data; + const { uri, claims } = action.data; - const claimsByChannel = Object.assign({}, state.claimsByChannel); - const byChannel = Object.assign({}, claimsByChannel[uri]); - const allClaimIds = new Set(byChannel["all"]); - const currentPageClaimIds = []; - const byId = Object.assign({}, state.byId); - const fetchingChannelClaims = Object.assign({}, state.fetchingChannelClaims); + const newClaims = Object.assign({}, state.claimsByChannel); if (claims !== undefined) { - claims.forEach(claim => { - allClaimIds.add(claim.claim_id); - currentPageClaimIds.push(claim.claim_id); - byId[claim.claim_id] = claim; - }); + newClaims[uri] = claims; } - byChannel["all"] = allClaimIds; - byChannel[page] = currentPageClaimIds; - claimsByChannel[uri] = byChannel; - delete fetchingChannelClaims[uri]; - return Object.assign({}, state, { - claimsByChannel, - byId, - fetchingChannelClaims, + claimsByChannel: newClaims, }); }; diff --git a/ui/js/reducers/content.js b/ui/js/reducers/content.js index 0e1d71fed..f346e2d27 100644 --- a/ui/js/reducers/content.js +++ b/ui/js/reducers/content.js @@ -47,17 +47,6 @@ reducers[types.RESOLVE_URI_CANCELED] = reducers[ }); }; -reducers[types.FETCH_CHANNEL_CLAIMS_COMPLETED] = function(state, action) { - const channelPages = Object.assign({}, state.channelPages); - const { uri, totalPages } = action.data; - - channelPages[uri] = totalPages; - - return Object.assign({}, state, { - channelPages, - }); -}; - export default function reducer(state = defaultState, action) { const handler = reducers[action.type]; if (handler) return handler(state, action); diff --git a/ui/js/selectors/app.js b/ui/js/selectors/app.js index a67dc9f37..3951a8216 100644 --- a/ui/js/selectors/app.js +++ b/ui/js/selectors/app.js @@ -1,5 +1,5 @@ import { createSelector } from "reselect"; -import { parseQueryParams, toQueryString } from "util/query_params"; +import { parseQueryParams } from "util/query_params"; import lbry from "lbry"; import lbryuri from "lbryuri"; @@ -55,14 +55,8 @@ export const selectPageTitle = createSelector( return params.query ? __("Search results for %s", params.query) : __("Search"); - case "show": { - const parts = [lbryuri.normalize(params.uri)]; - // If the params has any keys other than "uri" - if (Object.keys(params).length > 1) { - parts.push(toQueryString(Object.assign({}, params, { uri: null }))); - } - return parts.join("?"); - } + case "show": + return lbryuri.normalize(params.uri); case "downloaded": return __("Downloads & Purchases"); case "published": diff --git a/ui/js/selectors/claims.js b/ui/js/selectors/claims.js index 2c4b4b511..3c10ec931 100644 --- a/ui/js/selectors/claims.js +++ b/ui/js/selectors/claims.js @@ -1,5 +1,4 @@ import { createSelector } from "reselect"; -import { selectCurrentParams } from "selectors/app"; import lbryuri from "lbryuri"; const _selectState = state => state.claims || {}; @@ -61,59 +60,14 @@ export const makeSelectClaimForUriIsMine = () => { return createSelector(selectClaimForUriIsMine, isMine => isMine); }; -export const selectAllFetchingChannelClaims = createSelector( - _selectState, - state => state.fetchingChannelClaims || {} -); - -const selectFetchingChannelClaims = (state, props) => { - const allFetchingChannelClaims = selectAllFetchingChannelClaims(state); - - return allFetchingChannelClaims[props.uri]; -}; - -export const makeSelectFetchingChannelClaims = (state, props) => { - return createSelector(selectFetchingChannelClaims, fetching => fetching); -}; - export const selectClaimsInChannelForUri = (state, props) => { - const byId = selectClaimsById(state); - const byChannel = selectAllClaimsByChannel(state)[props.uri] || {}; - const claimIds = byChannel["all"]; - - if (!claimIds) return claimIds; - - const claims = []; - - claimIds.forEach(claimId => claims.push(byId[claimId])); - - return claims; + return selectAllClaimsByChannel(state)[props.uri]; }; export const makeSelectClaimsInChannelForUri = () => { return createSelector(selectClaimsInChannelForUri, claims => claims); }; -export const selectClaimsInChannelForCurrentPage = (state, props) => { - const byId = selectClaimsById(state); - const byChannel = selectAllClaimsByChannel(state)[props.uri] || {}; - const params = selectCurrentParams(state); - const page = params && params.page ? params.page : 1; - const claimIds = byChannel[page]; - - if (!claimIds) return claimIds; - - const claims = []; - - claimIds.forEach(claimId => claims.push(byId[claimId])); - - return claims; -}; - -export const makeSelectClaimsInChannelForCurrentPage = () => { - return createSelector(selectClaimsInChannelForCurrentPage, claims => claims); -}; - const selectMetadataForUri = (state, props) => { const claim = selectClaimForUri(state, props); const metadata = diff --git a/ui/js/selectors/content.js b/ui/js/selectors/content.js index 663aab145..75162a454 100644 --- a/ui/js/selectors/content.js +++ b/ui/js/selectors/content.js @@ -24,16 +24,3 @@ const selectResolvingUri = (state, props) => { export const makeSelectIsResolvingForUri = () => { return createSelector(selectResolvingUri, resolving => resolving); }; - -export const selectChannelPages = createSelector( - _selectState, - state => state.channelPages || {} -); - -const selectTotalPagesForChannel = (state, props) => { - return selectChannelPages(state)[props.uri]; -}; - -export const makeSelectTotalPagesForChannel = () => { - return createSelector(selectTotalPagesForChannel, totalPages => totalPages); -}; diff --git a/ui/package.json b/ui/package.json index 5d447d6a4..fd9137ba5 100644 --- a/ui/package.json +++ b/ui/package.json @@ -31,7 +31,6 @@ "react-dom": "^15.4.0", "react-markdown": "^2.5.0", "react-modal": "^1.5.2", - "react-paginate": "^4.4.3", "react-redux": "^5.0.3", "react-simplemde-editor": "^3.6.11", "redux": "^3.6.0", @@ -55,8 +54,8 @@ "babel-preset-es2015": "^6.24.1", "babel-preset-react": "^6.24.1", "babel-preset-stage-2": "^6.18.0", - "css-loader": "^0.28.4", "electron-rebuild": "^1.5.11", + "css-loader": "^0.28.4", "eslint": "^3.10.2", "eslint-config-airbnb": "^13.0.0", "eslint-loader": "^1.6.1", diff --git a/ui/scss/all.scss b/ui/scss/all.scss index d899566ab..61612d7df 100644 --- a/ui/scss/all.scss +++ b/ui/scss/all.scss @@ -17,7 +17,6 @@ @import "component/_modal.scss"; @import "component/_snack-bar.scss"; @import "component/_video.scss"; -@import "component/_pagination.scss"; @import "page/_developer.scss"; @import "page/_reward.scss"; @import "page/_show.scss"; diff --git a/ui/scss/component/_pagination.scss b/ui/scss/component/_pagination.scss deleted file mode 100644 index 940dd11bd..000000000 --- a/ui/scss/component/_pagination.scss +++ /dev/null @@ -1,32 +0,0 @@ -@import "../global"; - -.pagination { - display: block; - padding: 0; - margin: 0 auto; - text-align: center; -} - -.pagination__item { - display: inline-block; - line-height: $spacing-vertical * 1.5; - height: $spacing-vertical * 1.5; - border-radius: 2px; - &:not(.pagination__item--selected):hover { - background: rgba(0, 0, 0, 0.2); - > a { cursor: hand } - } - > a { - display: inline-block; - padding: 0 $spacing-vertical * 2 / 3; - } -} - -.pagination__item--previous, .pagination__item--next { - font-size: 1.2em; -} - -.pagination__item--selected { - color: white; - background: $color-primary; -} diff --git a/ui/yarn.lock b/ui/yarn.lock index 5d5848976..cb2ca85fb 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -1204,10 +1204,6 @@ clap@^1.0.9: dependencies: chalk "^1.1.3" -classnames@^2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" - cli-cursor@^1.0.1, cli-cursor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" @@ -2333,14 +2329,6 @@ faye-websocket@~0.11.0: dependencies: websocket-driver ">=0.5.1" -fbjs@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.2.1.tgz#622061630a43e11f845017b9044aaa648ed3f731" - dependencies: - core-js "^1.0.0" - promise "^7.0.3" - whatwg-fetch "^0.9.0" - fbjs@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.6.1.tgz#9636b7705f5ba9684d44b72f78321254afc860f7" @@ -2351,7 +2339,7 @@ fbjs@^0.6.1: ua-parser-js "^0.7.9" whatwg-fetch "^0.9.0" -fbjs@^0.8.4, fbjs@^0.8.9: +fbjs@^0.8.9: version "0.8.12" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04" dependencies: @@ -4783,26 +4771,10 @@ rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-addons-create-fragment@^0.14.7: - version "0.14.8" - resolved "https://registry.yarnpkg.com/react-addons-create-fragment/-/react-addons-create-fragment-0.14.8.tgz#e83240d1cba49249690fcc6f148710baa11d2b7a" - -react-addons-create-fragment@^15.0.0: - version "15.6.0" - resolved "https://registry.yarnpkg.com/react-addons-create-fragment/-/react-addons-create-fragment-15.6.0.tgz#af91a22b1fb095dd01f1afba43bfd0ef589d8b20" - dependencies: - fbjs "^0.8.4" - loose-envify "^1.3.1" - object-assign "^4.1.0" - react-dom-factories@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/react-dom-factories/-/react-dom-factories-1.0.0.tgz#f43c05e5051b304f33251618d5bc859b29e46b6d" -react-dom@^0.14.7: - version "0.14.9" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-0.14.9.tgz#05064a3dcf0fb1880a3b2bfc9d58c55d8d9f6293" - react-dom@^15.4.0: version "15.6.1" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.1.tgz#2cb0ed4191038e53c209eb3a79a23e2a4cf99470" @@ -4832,15 +4804,6 @@ react-modal@^1.5.2: prop-types "^15.5.7" react-dom-factories "^1.0.0" -react-paginate@^4.4.3: - version "4.4.3" - resolved "https://registry.yarnpkg.com/react-paginate/-/react-paginate-4.4.3.tgz#11817ece628fa59c54a2df7968c854ed64b99077" - dependencies: - classnames "^2.2.5" - prop-types "^15.5.7" - react "^15.0.0" - react-addons-create-fragment "^15.0.0" - react-redux@^5.0.3: version "5.0.5" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.5.tgz#f8e8c7b239422576e52d6b7db06439469be9846a" @@ -4860,20 +4823,14 @@ react-simplemde-editor@^3.6.11: react "^0.14.2" simplemde "^1.11.2" -react-tap-event-plugin@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/react-tap-event-plugin/-/react-tap-event-plugin-0.2.2.tgz#4f6f257851654f6c2b1c213a1d3ff21b353ae4e1" - dependencies: - fbjs "^0.2.1" - -react@^0.14.2, react@^0.14.7: +react@^0.14.2: version "0.14.9" resolved "https://registry.yarnpkg.com/react/-/react-0.14.9.tgz#9110a6497c49d44ba1c0edd317aec29c2e0d91d1" dependencies: envify "^3.0.0" fbjs "^0.6.1" -react@^15.0.0, react@^15.4.0: +react@^15.4.0: version "15.6.1" resolved "https://registry.yarnpkg.com/react/-/react-15.6.1.tgz#baa8434ec6780bde997cdc380b79cd33b96393df" dependencies: