Merge pull request #880 from daovist/master
Pushing for help with Redux selectors
This commit is contained in:
commit
4c93119f73
10 changed files with 74 additions and 2 deletions
|
@ -9,6 +9,7 @@ import { makeSelectCostInfoForUri } from "redux/selectors/cost_info";
|
||||||
import { doFetchAvailability } from "redux/actions/availability";
|
import { doFetchAvailability } from "redux/actions/availability";
|
||||||
import { doOpenFileInShell } from "redux/actions/file_info";
|
import { doOpenFileInShell } from "redux/actions/file_info";
|
||||||
import { doPurchaseUri, doStartDownload } from "redux/actions/content";
|
import { doPurchaseUri, doStartDownload } from "redux/actions/content";
|
||||||
|
import { setVideoPause } from "redux/actions/video";
|
||||||
import FileDownloadLink from "./view";
|
import FileDownloadLink from "./view";
|
||||||
|
|
||||||
const select = (state, props) => ({
|
const select = (state, props) => ({
|
||||||
|
@ -24,6 +25,7 @@ const perform = dispatch => ({
|
||||||
openInShell: path => dispatch(doOpenFileInShell(path)),
|
openInShell: path => dispatch(doOpenFileInShell(path)),
|
||||||
purchaseUri: uri => dispatch(doPurchaseUri(uri)),
|
purchaseUri: uri => dispatch(doPurchaseUri(uri)),
|
||||||
restartDownload: (uri, outpoint) => dispatch(doStartDownload(uri, outpoint)),
|
restartDownload: (uri, outpoint) => dispatch(doStartDownload(uri, outpoint)),
|
||||||
|
setVideoPause: val => dispatch(setVideoPause(val)),
|
||||||
});
|
});
|
||||||
|
|
||||||
export default connect(select, perform)(FileDownloadLink);
|
export default connect(select, perform)(FileDownloadLink);
|
||||||
|
|
|
@ -42,8 +42,14 @@ class FileDownloadLink extends React.PureComponent {
|
||||||
purchaseUri,
|
purchaseUri,
|
||||||
costInfo,
|
costInfo,
|
||||||
loading,
|
loading,
|
||||||
|
setVideoPause,
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
|
const openFile = () => {
|
||||||
|
openInShell(fileInfo.download_path);
|
||||||
|
setVideoPause(true);
|
||||||
|
};
|
||||||
|
|
||||||
if (loading || downloading) {
|
if (loading || downloading) {
|
||||||
const progress =
|
const progress =
|
||||||
fileInfo && fileInfo.written_bytes
|
fileInfo && fileInfo.written_bytes
|
||||||
|
@ -93,7 +99,7 @@ class FileDownloadLink extends React.PureComponent {
|
||||||
button="text"
|
button="text"
|
||||||
icon="icon-external-link-square"
|
icon="icon-external-link-square"
|
||||||
className="no-underline"
|
className="no-underline"
|
||||||
onClick={() => openInShell(fileInfo.download_path)}
|
onClick={() => openFile()}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { connect } from "react-redux";
|
||||||
import { doChangeVolume } from "redux/actions/app";
|
import { doChangeVolume } from "redux/actions/app";
|
||||||
import { selectVolume } from "redux/selectors/app";
|
import { selectVolume } from "redux/selectors/app";
|
||||||
import { doPlayUri, doSetPlayingUri } from "redux/actions/content";
|
import { doPlayUri, doSetPlayingUri } from "redux/actions/content";
|
||||||
|
import { setVideoPause } from "redux/actions/video";
|
||||||
import {
|
import {
|
||||||
makeSelectMetadataForUri,
|
makeSelectMetadataForUri,
|
||||||
makeSelectContentTypeForUri,
|
makeSelectContentTypeForUri,
|
||||||
|
@ -14,6 +15,7 @@ import {
|
||||||
} from "redux/selectors/file_info";
|
} from "redux/selectors/file_info";
|
||||||
import { makeSelectCostInfoForUri } from "redux/selectors/cost_info";
|
import { makeSelectCostInfoForUri } from "redux/selectors/cost_info";
|
||||||
import { selectShowNsfw } from "redux/selectors/settings";
|
import { selectShowNsfw } from "redux/selectors/settings";
|
||||||
|
import { selectVideoPause } from "redux/selectors/video";
|
||||||
import Video from "./view";
|
import Video from "./view";
|
||||||
import { selectPlayingUri } from "redux/selectors/content";
|
import { selectPlayingUri } from "redux/selectors/content";
|
||||||
|
|
||||||
|
@ -27,12 +29,14 @@ const select = (state, props) => ({
|
||||||
playingUri: selectPlayingUri(state),
|
playingUri: selectPlayingUri(state),
|
||||||
contentType: makeSelectContentTypeForUri(props.uri)(state),
|
contentType: makeSelectContentTypeForUri(props.uri)(state),
|
||||||
volume: selectVolume(state),
|
volume: selectVolume(state),
|
||||||
|
videoPause: selectVideoPause(state),
|
||||||
});
|
});
|
||||||
|
|
||||||
const perform = dispatch => ({
|
const perform = dispatch => ({
|
||||||
play: uri => dispatch(doPlayUri(uri)),
|
play: uri => dispatch(doPlayUri(uri)),
|
||||||
cancelPlay: () => dispatch(doSetPlayingUri(null)),
|
cancelPlay: () => dispatch(doSetPlayingUri(null)),
|
||||||
changeVolume: volume => dispatch(doChangeVolume(volume)),
|
changeVolume: volume => dispatch(doChangeVolume(volume)),
|
||||||
|
setVideoPause: val => dispatch(setVideoPause(val)),
|
||||||
});
|
});
|
||||||
|
|
||||||
export default connect(select, perform)(Video);
|
export default connect(select, perform)(Video);
|
||||||
|
|
|
@ -20,6 +20,13 @@ class VideoPlayer extends React.PureComponent {
|
||||||
this.togglePlayListener = this.togglePlay.bind(this);
|
this.togglePlayListener = this.togglePlay.bind(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
componentWillReceiveProps(nextProps) {
|
||||||
|
if (nextProps.videoPause) {
|
||||||
|
this.refs.media.children[0].pause();
|
||||||
|
this.props.setVideoPause(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
const container = this.refs.media;
|
const container = this.refs.media;
|
||||||
const {
|
const {
|
||||||
|
|
|
@ -56,6 +56,8 @@ class Video extends React.PureComponent {
|
||||||
changeVolume,
|
changeVolume,
|
||||||
volume,
|
volume,
|
||||||
uri,
|
uri,
|
||||||
|
videoPause,
|
||||||
|
setVideoPause,
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
const isPlaying = playingUri === uri;
|
const isPlaying = playingUri === uri;
|
||||||
|
@ -110,6 +112,8 @@ class Video extends React.PureComponent {
|
||||||
downloadCompleted={fileInfo.completed}
|
downloadCompleted={fileInfo.completed}
|
||||||
changeVolume={changeVolume}
|
changeVolume={changeVolume}
|
||||||
volume={volume}
|
volume={volume}
|
||||||
|
videoPause={videoPause}
|
||||||
|
setVideoPause={setVideoPause}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
{!isPlaying && (
|
{!isPlaying && (
|
||||||
|
|
|
@ -164,3 +164,6 @@ export const CLEAR_SHAPE_SHIFT = "CLEAR_SHAPE_SHIFT";
|
||||||
export const CHANNEL_SUBSCRIBE = "CHANNEL_SUBSCRIBE";
|
export const CHANNEL_SUBSCRIBE = "CHANNEL_SUBSCRIBE";
|
||||||
export const CHANNEL_UNSUBSCRIBE = "CHANNEL_UNSUBSCRIBE";
|
export const CHANNEL_UNSUBSCRIBE = "CHANNEL_UNSUBSCRIBE";
|
||||||
export const HAS_FETCHED_SUBSCRIPTIONS = "HAS_FETCHED_SUBSCRIPTIONS";
|
export const HAS_FETCHED_SUBSCRIPTIONS = "HAS_FETCHED_SUBSCRIPTIONS";
|
||||||
|
|
||||||
|
// Video controls
|
||||||
|
export const SET_VIDEO_PAUSE = "SET_VIDEO_PAUSE";
|
||||||
|
|
10
src/renderer/redux/actions/video.js
Normal file
10
src/renderer/redux/actions/video.js
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
// @flow
|
||||||
|
import * as actions from "constants/action_types";
|
||||||
|
import type { Action, Dispatch } from "redux/reducers/video";
|
||||||
|
import lbry from "lbry";
|
||||||
|
|
||||||
|
export const setVideoPause = (data: boolean) => (dispatch: Dispatch) =>
|
||||||
|
dispatch({
|
||||||
|
type: actions.SET_VIDEO_PAUSE,
|
||||||
|
data,
|
||||||
|
});
|
25
src/renderer/redux/reducers/video.js
Normal file
25
src/renderer/redux/reducers/video.js
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
// @flow
|
||||||
|
import * as actions from "constants/action_types";
|
||||||
|
import { handleActions } from "util/redux-utils";
|
||||||
|
|
||||||
|
export type VideoState = { videoPause: boolean };
|
||||||
|
|
||||||
|
type setVideoPause = {
|
||||||
|
type: actions.SET_VIDEO_PAUSE,
|
||||||
|
data: boolean,
|
||||||
|
};
|
||||||
|
|
||||||
|
export type Action = setVideoPause;
|
||||||
|
export type Dispatch = (action: Action) => any;
|
||||||
|
|
||||||
|
const defaultState = { videoPause: false };
|
||||||
|
|
||||||
|
export default handleActions(
|
||||||
|
{
|
||||||
|
[actions.SET_VIDEO_PAUSE]: (
|
||||||
|
state: VideoState,
|
||||||
|
action: setVideoPause
|
||||||
|
): VideoState => ({ ...state, videoPause: action.data }),
|
||||||
|
},
|
||||||
|
defaultState
|
||||||
|
);
|
9
src/renderer/redux/selectors/video.js
Normal file
9
src/renderer/redux/selectors/video.js
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
import * as settings from "constants/settings";
|
||||||
|
import { createSelector } from "reselect";
|
||||||
|
|
||||||
|
const _selectState = state => state.video || {};
|
||||||
|
|
||||||
|
export const selectVideoPause = createSelector(
|
||||||
|
_selectState,
|
||||||
|
state => state.videoPause
|
||||||
|
);
|
|
@ -13,6 +13,7 @@ import userReducer from "redux/reducers/user";
|
||||||
import walletReducer from "redux/reducers/wallet";
|
import walletReducer from "redux/reducers/wallet";
|
||||||
import shapeShiftReducer from "redux/reducers/shape_shift";
|
import shapeShiftReducer from "redux/reducers/shape_shift";
|
||||||
import subscriptionsReducer from "redux/reducers/subscriptions";
|
import subscriptionsReducer from "redux/reducers/subscriptions";
|
||||||
|
import videoReducer from "redux/reducers/video";
|
||||||
import { persistStore, autoRehydrate } from "redux-persist";
|
import { persistStore, autoRehydrate } from "redux-persist";
|
||||||
import createCompressor from "redux-persist-transform-compress";
|
import createCompressor from "redux-persist-transform-compress";
|
||||||
import createFilter from "redux-persist-transform-filter";
|
import createFilter from "redux-persist-transform-filter";
|
||||||
|
@ -20,7 +21,7 @@ import localForage from "localforage";
|
||||||
import { createStore, applyMiddleware, compose, combineReducers } from "redux";
|
import { createStore, applyMiddleware, compose, combineReducers } from "redux";
|
||||||
import thunk from "redux-thunk";
|
import thunk from "redux-thunk";
|
||||||
|
|
||||||
const env = process.env.NODE_ENV || "production"
|
const env = process.env.NODE_ENV || "production";
|
||||||
|
|
||||||
function isFunction(object) {
|
function isFunction(object) {
|
||||||
return typeof object === "function";
|
return typeof object === "function";
|
||||||
|
@ -69,6 +70,7 @@ const reducers = combineReducers({
|
||||||
user: userReducer,
|
user: userReducer,
|
||||||
shapeShift: shapeShiftReducer,
|
shapeShift: shapeShiftReducer,
|
||||||
subscriptions: subscriptionsReducer,
|
subscriptions: subscriptionsReducer,
|
||||||
|
video: videoReducer,
|
||||||
});
|
});
|
||||||
|
|
||||||
const bulkThunk = createBulkThunkMiddleware();
|
const bulkThunk = createBulkThunkMiddleware();
|
||||||
|
|
Loading…
Reference in a new issue