diff --git a/package.json b/package.json index a677410..6c4f879 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "base-64": "^0.1.0", "@expo/vector-icons": "^8.1.0", "gfycat-style-urls": "^1.0.3", - "lbry-redux": "lbryio/lbry-redux#9c48cce570ee8e057068c86cb6507e1b441841ee", + "lbry-redux": "lbryio/lbry-redux#f36b91496b3852e3d032b6d360b14d5fafbc07a9", "lbryinc": "lbryio/lbryinc#1fc104c2d29d1d3975234c3606e848eaa28e1b6e", "lodash": ">=4.17.11", "merge": ">=1.2.1", diff --git a/src/constants.js b/src/constants.js index 37aa7fb..bf019b5 100644 --- a/src/constants.js +++ b/src/constants.js @@ -93,6 +93,7 @@ const Constants = { DRAWER_ROUTE_CHANNEL_CREATOR: 'ChannelCreator', DRAWER_ROUTE_CHANNEL_CREATOR_FORM: 'ChannnelCreatorForm', DRAWER_ROUTE_INVITES: 'Invites', + DRAWER_ROUTE_LITE_FILE: 'LiteFile', FULL_ROUTE_NAME_DISCOVER: 'DiscoverStack', FULL_ROUTE_NAME_WALLET: 'WalletStack', diff --git a/src/page/liteFile/view.js b/src/page/liteFile/view.js index 8c60814..bf20c5c 100644 --- a/src/page/liteFile/view.js +++ b/src/page/liteFile/view.js @@ -1,5 +1,5 @@ import React from 'react'; -import { Lbry, formatCredits, normalizeURI, parseURI } from 'lbry-redux'; +import { Lbry, formatCredits, normalizeURI, parseURI, parseQueryParams } from 'lbry-redux'; import { Lbryio } from 'lbryinc'; import { ActivityIndicator, @@ -24,11 +24,10 @@ import Link from 'component/link'; import MediaPlayer from 'component/mediaPlayer'; import RelatedContent from 'component/relatedContent'; import filePageStyle from 'styles/filePage'; -import { formatLbryUrlForWeb, navigateToUri } from 'utils/helper'; -import uriBarStyle from 'styles/uriBar'; +import { decode, formatLbryUrlForWeb, navigateToUri } from 'utils/helper'; import Icon from 'react-native-vector-icons/FontAwesome5'; -import ProgressCircle from 'react-native-progress-circle'; -import Constants from "constants"; +import Constants from 'constants'; // eslint-disable-line node/no-deprecated-api +import uriBarStyle from 'styles/uriBar'; // This page will only be used for playing audio / video content from a remote stream URL class LiteFilePage extends React.PureComponent { @@ -39,6 +38,9 @@ class LiteFilePage extends React.PureComponent { player = null; state = { + channelName: null, + channelUrl: null, + contentTitle: null, fullscreenMode: false, playerHeight: null, isLandscape: false, @@ -102,15 +104,33 @@ class LiteFilePage extends React.PureComponent { NativeModules.UtilityModule.shareUrl(shareUrl); }; - render() { - const { navigation, rewardedContentClaimIds, title } = this.props; - const { viewCount } = this.state; + componentDidUpdate() { + const { navigation } = this.props; const { uri } = navigation.state.params; + if (!this.state.contentTitle) { + const params = parseQueryParams(uri); + const { channelUrl, contentTitle } = params; + const channelName = channelUrl ? parseURI(decode(channelUrl)).claimName : null; + + this.setState({ + title: decode(contentTitle), + channelUrl, + channelName, + showRecommended: true, + }); + } + } + + render() { + const { navigation, rewardedContentClaimIds } = this.props; + const { channelName, channelUrl, title, viewCount } = this.state; + const { uri } = navigation.state.params; const { claimName, claimId } = parseURI(uri); const isRewardContent = rewardedContentClaimIds.includes(claimId); - const channelName = null; - const channelUri = null; + + const playerBgStyle = [filePageStyle.playerBackground, filePageStyle.containedPlayerBackground]; + const fsPlayerBgStyle = [filePageStyle.playerBackground, filePageStyle.fullscreenPlayerBackground]; const playerStyle = [ filePageStyle.player, @@ -123,12 +143,27 @@ class LiteFilePage extends React.PureComponent { return ( <View style={filePageStyle.pageContainer}> - {!this.state.fullscreenMode && <UriBar value={uri} navigation={navigation} />} + {!this.state.fullscreenMode && <UriBar value={uri.split('?')[0]} navigation={navigation} />} <View style={this.state.fullscreenMode ? filePageStyle.innerPageContainerFsMode : filePageStyle.innerPageContainer} onLayout={this.checkOrientation} > + <TouchableOpacity activeOpacity={0.5} style={filePageStyle.mediaContainer} /> + + <View + style={playerBgStyle} + ref={ref => { + this.playerBackground = ref; + }} + onLayout={evt => { + if (!this.state.playerBgHeight) { + this.setState({ playerBgHeight: evt.nativeEvent.layout.height }); + } + }} + /> + + {this.state.fullscreenMode && <View style={fsPlayerBgStyle} />} <MediaPlayer assignPlayer={ref => { this.player = ref; @@ -144,89 +179,74 @@ class LiteFilePage extends React.PureComponent { } }} /> - </View> - <ScrollView - contentContainerstyle={filePageStyle.scrollContent} - keyboardShouldPersistTaps={'handled'} - ref={ref => { - this.scrollView = ref; - }} - > - <TouchableWithoutFeedback - style={filePageStyle.titleTouch} - onPress={() => this.setState({ showDescription: !this.state.showDescription })} + <ScrollView + style={filePageStyle.scrollContainer} + contentContainerStyle={filePageStyle.scrollContent} + keyboardShouldPersistTaps={'handled'} + ref={ref => { + this.scrollView = ref; + }} > - <View style={filePageStyle.titleArea}> - <View style={filePageStyle.titleRow}> - <Text style={filePageStyle.title} selectable> - {title} - </Text> - {isRewardContent && <Icon name="award" style={filePageStyle.rewardIcon} size={16} />} - </View> - <Text style={filePageStyle.viewCount}> - {viewCount === 1 && __('%view% view', { view: viewCount })} - {viewCount > 1 && __('%view% views', { view: viewCount })} - </Text> - </View> - </TouchableWithoutFeedback> - - <View style={filePageStyle.largeButtonsRow}> - <TouchableOpacity style={filePageStyle.largeButton} onPress={() => this.handleSharePress(uri)}> - <Icon name={'share-alt'} size={16} style={filePageStyle.largeButtonIcon} /> - <Text style={filePageStyle.largeButtonText}>{__('Share')}</Text> - </TouchableOpacity> - - <TouchableOpacity - style={filePageStyle.largeButton} - onPress={() => this.setState({ showTipView: true })} + <TouchableWithoutFeedback + style={filePageStyle.titleTouch} + onPress={() => this.setState({ showDescription: !this.state.showDescription })} > - <Icon name={'gift'} size={16} style={filePageStyle.largeButtonIcon} /> - <Text style={filePageStyle.largeButtonText}>{__('Tip')}</Text> - </TouchableOpacity> - </View> - - <View style={filePageStyle.channelRow}> - <View style={filePageStyle.publishInfo}> - {channelName && ( - <Link - style={filePageStyle.channelName} - selectable - text={channelName} - numberOfLines={1} - ellipsizeMode={'tail'} - onPress={() => { - navigateToUri( - navigation, - normalizeURI(channelUri), - null, - false, - null, - false, - ); - }} - /> - )} - {!channelName && ( - <Text style={filePageStyle.anonChannelName} selectable ellipsizeMode={'tail'}> - {__('Anonymous')} + <View style={filePageStyle.titleArea}> + <View style={filePageStyle.titleRow}> + <Text style={filePageStyle.title} selectable> + {title} + </Text> + {isRewardContent && <Icon name="award" style={filePageStyle.rewardIcon} size={16} />} + </View> + <Text style={filePageStyle.viewCount}> + {viewCount === 1 && __('%view% view', { view: viewCount })} + {viewCount > 1 && __('%view% views', { view: viewCount })} </Text> - )} + </View> + </TouchableWithoutFeedback> + + <View style={filePageStyle.largeButtonsRow}> + <TouchableOpacity style={filePageStyle.largeButton} onPress={() => this.handleSharePress(uri)}> + <Icon name={'share-alt'} size={16} style={filePageStyle.largeButtonIcon} /> + <Text style={filePageStyle.largeButtonText}>{__('Share')}</Text> + </TouchableOpacity> + + <TouchableOpacity style={filePageStyle.largeButton} onPress={() => this.setState({ showTipView: true })}> + <Icon name={'gift'} size={16} style={filePageStyle.largeButtonIcon} /> + <Text style={filePageStyle.largeButtonText}>{__('Tip')}</Text> + </TouchableOpacity> </View> - </View> - <View onLayout={this.setRelatedContentPosition} /> + <View style={filePageStyle.channelRow}> + <View style={filePageStyle.publishInfo}> + {channelName && ( + <Link + style={filePageStyle.channelName} + selectable + text={channelName} + numberOfLines={1} + ellipsizeMode={'tail'} + onPress={() => { + navigateToUri(navigation, normalizeURI(channelUrl), null, false, null, false); + }} + /> + )} + {!channelName && ( + <Text style={filePageStyle.anonChannelName} selectable ellipsizeMode={'tail'}> + {__('Anonymous')} + </Text> + )} + </View> + </View> - {this.state.showRecommended && ( - <RelatedContent - navigation={navigation} - claimId={claimId} - title={title} - uri={uri} - fullUri={uri} - /> - )} - </ScrollView> + <View onLayout={this.setRelatedContentPosition} /> + + {this.state.showRecommended && ( + <RelatedContent navigation={navigation} claimId={claimId} title={title} uri={uri} fullUri={uri} /> + )} + </ScrollView> + </View> </View> ); } diff --git a/src/page/splash/view.js b/src/page/splash/view.js index ded3599..e5f9d28 100644 --- a/src/page/splash/view.js +++ b/src/page/splash/view.js @@ -160,12 +160,13 @@ class SplashScreen extends React.PureComponent { navigateToLiteMode = () => { const { navigation } = this.props; + const { launchUrl } = this.state; const resetAction = StackActions.reset({ index: 0, actions: [ NavigationActions.navigate({ - routeName: 'LiteFile', - params: { uri: this.state.launchUrl.replace(/liteMode=1/gi, '') }, + routeName: Constants.DRAWER_ROUTE_LITE_FILE, + params: { uri: launchUrl }, }), ], }); diff --git a/src/redux/reducers/drawer.js b/src/redux/reducers/drawer.js index 2525ece..6b5a8c5 100644 --- a/src/redux/reducers/drawer.js +++ b/src/redux/reducers/drawer.js @@ -45,15 +45,14 @@ reducers[Constants.ACTION_PUSH_DRAWER_STACK] = (state, action) => { if (routeName === Constants.DRAWER_ROUTE_SUBSCRIPTIONS && newStack.length === 1) { canPushStack = false; } + if (routeName === Constants.DRAWER_ROUTE_LITE_FILE) { + canPushStack = false; + } let lastRouteInStack; if (canPushStack) { newStack.push({ route: routeName, params }); - - // save the route (if it's not lite mode) - if (routeName.toLowerCase() !== 'litefile') { - lastRouteInStack = { route: routeName, params }; - } + lastRouteInStack = { route: routeName, params }; } return { diff --git a/src/utils/helper.js b/src/utils/helper.js index 38daa46..756826c 100644 --- a/src/utils/helper.js +++ b/src/utils/helper.js @@ -432,3 +432,7 @@ export function fetchReferralCode(successCallback, errorCallback) { } }); } + +export function decode(value) { + return decodeURIComponent(value).replace(/\+/g, ' '); +} diff --git a/yarn.lock b/yarn.lock index 6651987..c61e10c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4591,9 +4591,9 @@ latest-version@^3.0.0: dependencies: package-json "^4.0.0" -lbry-redux@lbryio/lbry-redux#9c48cce570ee8e057068c86cb6507e1b441841ee: +lbry-redux@lbryio/lbry-redux#f36b91496b3852e3d032b6d360b14d5fafbc07a9: version "0.0.1" - resolved "https://codeload.github.com/lbryio/lbry-redux/tar.gz/9c48cce570ee8e057068c86cb6507e1b441841ee" + resolved "https://codeload.github.com/lbryio/lbry-redux/tar.gz/f36b91496b3852e3d032b6d360b14d5fafbc07a9" dependencies: proxy-polyfill "0.1.6" reselect "^3.0.0"