From 425f69ba81b37aede24bf2665f8886b7f65ddeb6 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Fri, 7 Jun 2019 10:23:15 +0100 Subject: [PATCH 01/12] create gallery module for retrieving media from device --- app/package.json | 1 + app/src/component/AppNavigator.js | 4 + app/src/component/gallery/index.js | 4 + app/src/component/gallery/view.js | 9 ++ app/src/constants.js | 1 + app/src/page/publish/index.js | 13 ++ app/src/page/publish/view.js | 52 +++++++ app/src/styles/publish.js | 11 ++ .../browser/reactmodules/GalleryModule.java | 146 ++++++++++++++++++ .../reactpackages/LbryReactPackage.java | 2 + 10 files changed, 243 insertions(+) create mode 100644 app/src/component/gallery/index.js create mode 100644 app/src/component/gallery/view.js create mode 100644 app/src/page/publish/index.js create mode 100644 app/src/page/publish/view.js create mode 100644 app/src/styles/publish.js create mode 100644 src/main/java/io/lbry/browser/reactmodules/GalleryModule.java diff --git a/app/package.json b/app/package.json index 491c967d..555a398e 100644 --- a/app/package.json +++ b/app/package.json @@ -23,6 +23,7 @@ "react-native-image-zoom-viewer": "^2.2.5", "react-native-password-strength-meter": "^0.0.2", "react-native-phone-input": "lbryio/react-native-phone-input", + "react-native-super-grid": "^3.0.4", "react-native-vector-icons": "^6.4.2", "react-native-video": "lbryio/react-native-video#exoplayer-lbry-android", "react-navigation": "^3.11.0", diff --git a/app/src/component/AppNavigator.js b/app/src/component/AppNavigator.js index 9ca1c955..aa644c56 100644 --- a/app/src/component/AppNavigator.js +++ b/app/src/component/AppNavigator.js @@ -5,6 +5,7 @@ import DownloadsPage from 'page/downloads'; import DrawerContent from 'component/drawerContent'; import FilePage from 'page/file'; import FirstRunScreen from 'page/firstRun'; +import PublishPage from 'page/publish'; import RewardsPage from 'page/rewards'; import TrendingPage from 'page/trending'; import SearchPage from 'page/search'; @@ -133,6 +134,9 @@ const drawer = createDrawerNavigator({ WalletStack: { screen: walletStack, navigationOptions: { title: 'Wallet', drawerIcon: ({ tintColor }) => }}, + Publish: { screen: PublishPage, navigationOptions: { + drawerIcon: ({ tintColor }) => + }}, Rewards: { screen: RewardsPage, navigationOptions: { drawerIcon: ({ tintColor }) => }}, diff --git a/app/src/component/gallery/index.js b/app/src/component/gallery/index.js new file mode 100644 index 00000000..c942e248 --- /dev/null +++ b/app/src/component/gallery/index.js @@ -0,0 +1,4 @@ +import { connect } from 'react-redux'; +import Gallery from './view'; + +export default connect()(Gallery); diff --git a/app/src/component/gallery/view.js b/app/src/component/gallery/view.js new file mode 100644 index 00000000..d45e756c --- /dev/null +++ b/app/src/component/gallery/view.js @@ -0,0 +1,9 @@ +import React from 'react'; + +class Gallery extends React.PureComponent { + render() { + + } +} + +export default Gallery; diff --git a/app/src/constants.js b/app/src/constants.js index a48197e7..ccd0584f 100644 --- a/app/src/constants.js +++ b/app/src/constants.js @@ -48,6 +48,7 @@ const Constants = { DRAWER_ROUTE_TRENDING: "Trending", DRAWER_ROUTE_SUBSCRIPTIONS: "Subscriptions", DRAWER_ROUTE_MY_LBRY: "Downloads", + DRAWER_ROUTE_PUBLISH: "Publish", DRAWER_ROUTE_REWARDS: "Rewards", DRAWER_ROUTE_WALLET: "Wallet", DRAWER_ROUTE_SETTINGS: "Settings", diff --git a/app/src/page/publish/index.js b/app/src/page/publish/index.js new file mode 100644 index 00000000..5b5ff94c --- /dev/null +++ b/app/src/page/publish/index.js @@ -0,0 +1,13 @@ +import { connect } from 'react-redux'; +import { doToast } from 'lbry-redux'; +import { doPushDrawerStack, doSetPlayerVisible } from 'redux/actions/drawer'; +import Constants from 'constants'; +import PublishPage from './view'; + +const perform = dispatch => ({ + notify: data => dispatch(doToast(data)), + pushDrawerStack: () => dispatch(doPushDrawerStack(Constants.DRAWER_ROUTE_PUBLISH)), + setPlayerVisible: () => dispatch(doSetPlayerVisible(false)) +}); + +export default connect(null, perform)(PublishPage); \ No newline at end of file diff --git a/app/src/page/publish/view.js b/app/src/page/publish/view.js new file mode 100644 index 00000000..ce6eb0c9 --- /dev/null +++ b/app/src/page/publish/view.js @@ -0,0 +1,52 @@ +import React from 'react'; +import { NativeModules, Text, View } from 'react-native'; +import publishStyle from 'styles/reward'; + +class PublishPage extends React.PureComponent { + didFocusListener; + + componentWillMount() { + const { navigation } = this.props; + this.didFocusListener = navigation.addListener('didFocus', this.onComponentFocused); + } + + componentWillUnmount() { + if (this.didFocusListener) { + this.didFocusListener.remove(); + } + } + + onComponentFocused = () => { + const { pushDrawerStack, setPlayerVisible } = this.props; + + pushDrawerStack(); + setPlayerVisible(); + NativeModules.Gallery.getVideos().then(videos => { + console.log('videos retrieved.'); + }); + } + + componentDidMount() { + this.onComponentFocused(); + } + + componentWillReceiveProps(nextProps) { + const { currentRoute } = nextProps; + const { currentRoute: prevRoute } = this.props; + + if (Constants.DRAWER_ROUTE_REWARDS === currentRoute && currentRoute !== prevRoute) { + this.onComponentFocused(); + } + } + + render() { + return ( + + + + + ); + } +} + +export default PublishPage; diff --git a/app/src/styles/publish.js b/app/src/styles/publish.js new file mode 100644 index 00000000..eeb87737 --- /dev/null +++ b/app/src/styles/publish.js @@ -0,0 +1,11 @@ +import { StyleSheet } from 'react-native'; +import Colors from './colors'; + +const publishStyle = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: Colors.PageBackground + } +}); + +export default publishStyle; diff --git a/src/main/java/io/lbry/browser/reactmodules/GalleryModule.java b/src/main/java/io/lbry/browser/reactmodules/GalleryModule.java new file mode 100644 index 00000000..b3eb24bf --- /dev/null +++ b/src/main/java/io/lbry/browser/reactmodules/GalleryModule.java @@ -0,0 +1,146 @@ +package io.lbry.browser.reactmodules; + +import android.content.Context; +import android.database.Cursor; +import android.provider.MediaStore; +import android.os.Bundle; + +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.WritableArray; +import com.facebook.react.bridge.WritableMap; + +import java.util.List; +import java.util.ArrayList; + +public class GalleryModule extends ReactContextBaseJavaModule { + private Context context; + + public GalleryModule(ReactApplicationContext reactContext) { + super(reactContext); + this.context = reactContext; + } + + @Override + public String getName() { + return "Gallery"; + } + + @ReactMethod + public void getVideos(Promise promise) { + WritableArray items = Arguments.createArray(); + List videos = loadVideos(); + for (int i = 0; i < videos.size(); i++) { + items.pushMap(videos.get(i).toMap()); + } + + promise.resolve(items); + } + + private List loadVideos() { + String[] projection = { + MediaStore.MediaColumns._ID, + MediaStore.MediaColumns.DATA, + MediaStore.MediaColumns.DISPLAY_NAME, + MediaStore.MediaColumns.MIME_TYPE, + MediaStore.Video.Media.DURATION + }; + + List items = new ArrayList(); + Cursor cursor = context.getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, projection, null, null, null); + while (cursor.moveToNext()) { + int idColumn = cursor.getColumnIndex(MediaStore.MediaColumns._ID); + int nameColumn = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME); + int typeColumn = cursor.getColumnIndex(MediaStore.MediaColumns.MIME_TYPE); + int pathColumn = cursor.getColumnIndex(MediaStore.MediaColumns.DATA); + int durationColumn = cursor.getColumnIndex(MediaStore.Video.Media.DURATION); + + GalleryItem item = new GalleryItem(); + item.setId(cursor.getString(idColumn)); + item.setName(cursor.getString(nameColumn)); + item.setType(cursor.getString(typeColumn)); + item.setFilePath(cursor.getString(pathColumn)); + items.add(item); + } + + return items; + } + + + private static class GalleryItem { + private String id; + + private int duration; + + private String filePath; + + private String name; + + private String thumbnailUri; + + private String type; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getDuration() { + return duration; + } + + public void setDuration(int duration) { + this.duration = duration; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getThumbnailUri() { + return thumbnailUri; + } + + public void setThumnbailUri(String thumbnailUri) { + this.thumbnailUri = thumbnailUri; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public WritableMap toMap() { + WritableMap map = Arguments.createMap(); + map.putString("id", id); + map.putString("name", name); + map.putString("filePath", filePath); + map.putString("type", type); + map.putString("thumbnailUri", thumbnailUri); + map.putInt("duration", duration); + + return map; + } + } +} diff --git a/src/main/java/io/lbry/browser/reactpackages/LbryReactPackage.java b/src/main/java/io/lbry/browser/reactpackages/LbryReactPackage.java index e6191344..6b535bae 100644 --- a/src/main/java/io/lbry/browser/reactpackages/LbryReactPackage.java +++ b/src/main/java/io/lbry/browser/reactpackages/LbryReactPackage.java @@ -9,6 +9,7 @@ import io.lbry.browser.reactmodules.BackgroundMediaModule; import io.lbry.browser.reactmodules.DaemonServiceControlModule; import io.lbry.browser.reactmodules.FirstRunModule; import io.lbry.browser.reactmodules.FirebaseModule; +import io.lbry.browser.reactmodules.GalleryModule; import io.lbry.browser.reactmodules.ScreenOrientationModule; import io.lbry.browser.reactmodules.VersionInfoModule; import io.lbry.browser.reactmodules.UtilityModule;; @@ -31,6 +32,7 @@ public class LbryReactPackage implements ReactPackage { modules.add(new DaemonServiceControlModule(reactContext)); modules.add(new FirstRunModule(reactContext)); modules.add(new FirebaseModule(reactContext)); + modules.add(new GalleryModule(reactContext)); modules.add(new ScreenOrientationModule(reactContext)); modules.add(new UtilityModule(reactContext)); modules.add(new VersionInfoModule(reactContext)); -- 2.45.2 From 3077653f4b2ce3b16e0494dc404e8edff4a683ed Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Fri, 7 Jun 2019 10:29:01 +0100 Subject: [PATCH 02/12] fix missing import --- app/src/component/AppNavigator.js | 6 +++--- app/src/page/publish/view.js | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/component/AppNavigator.js b/app/src/component/AppNavigator.js index aa644c56..b1487425 100644 --- a/app/src/component/AppNavigator.js +++ b/app/src/component/AppNavigator.js @@ -134,12 +134,12 @@ const drawer = createDrawerNavigator({ WalletStack: { screen: walletStack, navigationOptions: { title: 'Wallet', drawerIcon: ({ tintColor }) => }}, - Publish: { screen: PublishPage, navigationOptions: { - drawerIcon: ({ tintColor }) => - }}, Rewards: { screen: RewardsPage, navigationOptions: { drawerIcon: ({ tintColor }) => }}, + Publish: { screen: PublishPage, navigationOptions: { + drawerIcon: ({ tintColor }) => + }}, MyLBRYStack: { screen: DownloadsPage, navigationOptions: { title: 'Library', drawerIcon: ({ tintColor }) => }}, diff --git a/app/src/page/publish/view.js b/app/src/page/publish/view.js index ce6eb0c9..0adc85e7 100644 --- a/app/src/page/publish/view.js +++ b/app/src/page/publish/view.js @@ -1,5 +1,6 @@ import React from 'react'; import { NativeModules, Text, View } from 'react-native'; +import UriBar from 'component/uriBar'; import publishStyle from 'styles/reward'; class PublishPage extends React.PureComponent { @@ -22,7 +23,7 @@ class PublishPage extends React.PureComponent { pushDrawerStack(); setPlayerVisible(); NativeModules.Gallery.getVideos().then(videos => { - console.log('videos retrieved.'); + console.log(videos); }); } @@ -40,6 +41,8 @@ class PublishPage extends React.PureComponent { } render() { + const { navigation } = this.props; + return ( -- 2.45.2 From 380e11218c9a32ff508a3ab33eddef46e909e638 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Fri, 14 Jun 2019 16:21:43 +0100 Subject: [PATCH 03/12] gallery and ui flow for publishing --- app/package-lock.json | 54 ++--- app/package.json | 3 +- app/src/component/AppNavigator.js | 6 + app/src/constants.js | 3 + app/src/page/publish/view.js | 186 +++++++++++++++++- app/src/styles/colors.js | 1 + app/src/styles/publish.js | 124 ++++++++++++ .../lbry/build/templates/build.tmpl.gradle | 1 + .../lbry/build/templates/settings.gradle | 2 + .../java/io/lbry/browser/MainActivity.java | 2 + .../browser/reactmodules/GalleryModule.java | 75 +++++-- 11 files changed, 417 insertions(+), 40 deletions(-) diff --git a/app/package-lock.json b/app/package-lock.json index 4a784489..52c7453d 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -4404,13 +4404,11 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, - "optional": true + "bundled": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4423,18 +4421,15 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true, - "optional": true + "bundled": true }, "concat-map": { "version": "0.0.1", - "bundled": true, - "optional": true + "bundled": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, - "optional": true + "bundled": true }, "core-util-is": { "version": "1.0.2", @@ -4537,8 +4532,7 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, - "optional": true + "bundled": true }, "ini": { "version": "1.3.5", @@ -4548,7 +4542,6 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4561,20 +4554,17 @@ "minimatch": { "version": "3.0.4", "bundled": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true, - "optional": true + "bundled": true }, "minipass": { "version": "2.3.5", "bundled": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -4591,7 +4581,6 @@ "mkdirp": { "version": "0.5.1", "bundled": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -4664,8 +4653,7 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "optional": true + "bundled": true }, "object-assign": { "version": "4.1.1", @@ -4675,7 +4663,6 @@ "once": { "version": "1.4.0", "bundled": true, - "optional": true, "requires": { "wrappy": "1" } @@ -4781,7 +4768,6 @@ "string-width": { "version": "1.0.2", "bundled": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5567,8 +5553,8 @@ } }, "lbry-redux": { - "version": "github:lbryio/lbry-redux#a01b919c72139d82fa981df6be4e0fe902ff8f70", - "from": "github:lbryio/lbry-redux", + "version": "github:lbryio/lbry-redux#03998a2acf1a9e6c1b0818821612d137b31ebea3", + "from": "github:lbryio/lbry-redux#03998a2acf1a9e6c1b0818821612d137b31ebea3", "requires": { "proxy-polyfill": "0.1.6", "reselect": "^3.0.0", @@ -7690,6 +7676,15 @@ "resolved": "https://registry.npmjs.org/react-native-fast-image/-/react-native-fast-image-5.4.2.tgz", "integrity": "sha512-S4E96Lwmx6z6QD3MaAuP7cNcXRLfgEUYU2GB694TbGEoOjk/FO1OnfbxfFp0vUs/klr4HJwACcwihPPxrFTt8w==" }, + "react-native-fs": { + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/react-native-fs/-/react-native-fs-2.13.3.tgz", + "integrity": "sha512-B62LSSAEYQGItg7KVTzTVVCxezOYFBYp4DMVFbdoZUd1mZVFdqR2sy1HY1mye1VI/Lf3IbxSyZEQ0GmrrdwLjg==", + "requires": { + "base-64": "^0.1.0", + "utf8": "^2.1.1" + } + }, "react-native-gesture-handler": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-1.2.1.tgz", @@ -7752,6 +7747,14 @@ "prop-types": "^15.6.2" } }, + "react-native-super-grid": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-native-super-grid/-/react-native-super-grid-3.0.4.tgz", + "integrity": "sha512-aoK71FGP5sFcLujuODYkAqyFDAZZRpvTeEwwaoXsc0JENhExEG7rGg65T5ELqyykiDOLBihuCLKasK5gLb0WtQ==", + "requires": { + "prop-types": "^15.6.0" + } + }, "react-native-tab-view": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/react-native-tab-view/-/react-native-tab-view-1.4.1.tgz", @@ -9548,6 +9551,11 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, + "utf8": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", + "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/app/package.json b/app/package.json index 1f30ec01..003c02f3 100644 --- a/app/package.json +++ b/app/package.json @@ -10,7 +10,7 @@ "dependencies": { "base-64": "^0.1.0", "@expo/vector-icons": "^8.1.0", - "lbry-redux": "lbryio/lbry-redux", + "lbry-redux": "lbryio/lbry-redux#03998a2acf1a9e6c1b0818821612d137b31ebea3", "lbryinc": "lbryio/lbryinc", "lodash": ">=4.17.11", "merge": ">=1.2.1", @@ -21,6 +21,7 @@ "react-native-country-picker-modal": "^0.6.2", "react-native-exception-handler": "2.9.0", "react-native-fast-image": "^5.0.3", + "react-native-fs": "^2.13.3", "react-native-gesture-handler": "^1.1.0", "react-native-image-zoom-viewer": "^2.2.5", "react-native-password-strength-meter": "^0.0.2", diff --git a/app/src/component/AppNavigator.js b/app/src/component/AppNavigator.js index ea87767f..74d3ddcb 100644 --- a/app/src/component/AppNavigator.js +++ b/app/src/component/AppNavigator.js @@ -149,6 +149,12 @@ const drawer = createDrawerNavigator( drawerIcon: ({ tintColor }) => , }, }, + Publish: { + screen: PublishPage, + navigationOptions: { + drawerIcon: ({ tintColor }) => , + }, + }, Rewards: { screen: RewardsPage, navigationOptions: { diff --git a/app/src/constants.js b/app/src/constants.js index c0e64505..b3910c66 100644 --- a/app/src/constants.js +++ b/app/src/constants.js @@ -11,6 +11,9 @@ const Constants = { PHASE_COLLECTION: 'collection', PHASE_VERIFICATION: 'verification', + PHASE_SELECTOR: 'selector', + PHASE_DETAILS: 'details', + CONTENT_TAB: 'content', ABOUT_TAB: 'about', diff --git a/app/src/page/publish/view.js b/app/src/page/publish/view.js index 2ceb7329..df3f8e0e 100644 --- a/app/src/page/publish/view.js +++ b/app/src/page/publish/view.js @@ -1,9 +1,40 @@ import React from 'react'; -import { NativeModules, Text, View } from 'react-native'; +import { + ActivityIndicator, + Image, + NativeModules, + Picker, + ScrollView, + Switch, + Text, + TextInput, + TouchableOpacity, + View +} from 'react-native'; +import { FlatGrid } from 'react-native-super-grid'; +import Button from 'component/button'; +import Colors from 'styles/colors'; +import Constants from 'constants'; +import FastImage from 'react-native-fast-image'; +import FloatingWalletBalance from 'component/floatingWalletBalance'; +import Icon from 'react-native-vector-icons/FontAwesome5'; +import Link from 'component/link'; import UriBar from 'component/uriBar'; -import publishStyle from 'styles/reward'; +import publishStyle from 'styles/publish'; class PublishPage extends React.PureComponent { + state = { + thumbnailPath: null, + videos: null, + currentMedia: null, + currentPhase: Constants.PHASE_SELECTOR, + + // publish + anonymous: true, + channelName: null, + priceFree: true, + }; + didFocusListener; componentWillMount() { @@ -22,8 +53,13 @@ class PublishPage extends React.PureComponent { pushDrawerStack(); setPlayerVisible(); + NativeModules.Gallery.getThumbnailPath().then(thumbnailPath => { + if (thumbnailPath != null) { + this.setState({ thumbnailPath }); + } + }); NativeModules.Gallery.getVideos().then(videos => { - console.log(videos); + this.setState({ videos }); }); }; @@ -40,12 +76,156 @@ class PublishPage extends React.PureComponent { } } + setCurrentMedia(media) { + this.setState({ currentMedia: media, currentPhase: Constants.PHASE_DETAILS }); + } + + showSelector() { + this.setState({ + currentMedia: null, + currentPhase: Constants.PHASE_SELECTOR, + // reset publish state + anonymous: true, + channelName: null, + priceFree: true + }); + } + render() { const { navigation } = this.props; + const { thumbnailPath } = this.state; + + let content; + if (Constants.PHASE_SELECTOR === this.state.currentPhase) { + content = ( + + + + + Record + + + + + Take a photo + + + + Upload a file + + + + {(!this.state.videos || !thumbnailPath) && + + + + } + {(this.state.videos && thumbnailPath) && + { + return ( + this.setCurrentMedia(item)}> + + + ); + }} + />} + + ); + } else if (Constants.PHASE_DETAILS === this.state.currentPhase && this.state.currentMedia) { + const { currentMedia } = this.state; + content = ( + + + + + + + + + + + + Price + + + + this.setState({ priceFree: value }) } /> + Free + + + {!this.state.priceFree && + + + LBC + } + + + + + Publish anonymously or as a channel? + + + this.setState({ anonymous: value }) } /> + Anonymous + + + {!this.state.anonymous && + + this.setState({channelName: itemValue}) + }> + + } + + + + + Where can people find this content? + The LBRY URL is the exact address where people can find your content (ex. lbry://myvideo) + + + + + LBC + + This LBC remains yours and the deposit can be undone at any time. + + + + this.setState({ currentPhase: Constants.PHASE_SELECTOR })} /> +