pr feedback

This commit is contained in:
Sean Yesmunt 2019-10-01 00:53:33 -04:00
parent 044076ca1d
commit bbcff99fb3
17 changed files with 92 additions and 80 deletions

2
flow-typed/18nj.js vendored Normal file
View file

@ -0,0 +1,2 @@
// @flow
declare function __(a: string, b?: {}): string;

View file

@ -128,8 +128,8 @@
"husky": "^0.14.3", "husky": "^0.14.3",
"json-loader": "^0.5.4", "json-loader": "^0.5.4",
"lbry-format": "https://github.com/lbryio/lbry-format.git", "lbry-format": "https://github.com/lbryio/lbry-format.git",
"lbry-redux": "lbryio/lbry-redux#42bf926138872d14523be7191694309be4f37605", "lbry-redux": "lbryio/lbry-redux#04ae0913a444abac200731c7ed53796d763a0bbb",
"lbryinc": "lbryio/lbryinc#368040d64658cf2a4b8a7a6725ec1787329ce65d", "lbryinc": "lbryio/lbryinc#a44576194e1f5f60e37d328ddfdca40bd6165c2d",
"lint-staged": "^7.0.2", "lint-staged": "^7.0.2",
"localforage": "^1.7.1", "localforage": "^1.7.1",
"lodash-es": "^4.17.14", "lodash-es": "^4.17.14",

View file

@ -22,10 +22,8 @@ const perform = dispatch => ({
fetchTransactions: () => dispatch(doFetchTransactions()), fetchTransactions: () => dispatch(doFetchTransactions()),
fetchAccessToken: () => dispatch(doFetchAccessToken()), fetchAccessToken: () => dispatch(doFetchAccessToken()),
fetchChannelListMine: () => dispatch(doFetchChannelListMine()), fetchChannelListMine: () => dispatch(doFetchChannelListMine()),
onSignedIn: () => dispatch(doSignIn()), signIn: () => dispatch(doSignIn()),
requestDownloadUpgrade: () => dispatch(doDownloadUpgradeRequested()), requestDownloadUpgrade: () => dispatch(doDownloadUpgradeRequested()),
fetchChannelListMine: () => dispatch(doFetchChannelListMine()),
onSignedIn: () => dispatch(doSignIn()),
}); });
export default hot( export default hot(

View file

@ -28,7 +28,7 @@ type Props = {
fetchTransactions: () => void, fetchTransactions: () => void,
fetchAccessToken: () => void, fetchAccessToken: () => void,
fetchChannelListMine: () => void, fetchChannelListMine: () => void,
onSignedIn: () => void, signIn: () => void,
requestDownloadUpgrade: () => void, requestDownloadUpgrade: () => void,
fetchChannelListMine: () => void, fetchChannelListMine: () => void,
onSignedIn: () => void, onSignedIn: () => void,
@ -45,7 +45,7 @@ function App(props: Props) {
user, user,
fetchAccessToken, fetchAccessToken,
fetchChannelListMine, fetchChannelListMine,
onSignedIn, signIn,
autoUpdateDownloaded, autoUpdateDownloaded,
isUpgradeAvailable, isUpgradeAvailable,
requestDownloadUpgrade, requestDownloadUpgrade,
@ -96,7 +96,7 @@ function App(props: Props) {
if (previousHasVerifiedEmail === false && hasVerifiedEmail) { if (previousHasVerifiedEmail === false && hasVerifiedEmail) {
analytics.emailVerifiedEvent(); analytics.emailVerifiedEvent();
} }
}, [previousHasVerifiedEmail, hasVerifiedEmail, onSignedIn]); }, [previousHasVerifiedEmail, hasVerifiedEmail, signIn]);
useEffect(() => { useEffect(() => {
if (previousRewardApproved === false && isRewardApproved) { if (previousRewardApproved === false && isRewardApproved) {
@ -107,9 +107,9 @@ function App(props: Props) {
// Keep this at the end to ensure initial setup effects are run first // Keep this at the end to ensure initial setup effects are run first
useEffect(() => { useEffect(() => {
if (!previousHasVerifiedEmail && hasVerifiedEmail) { if (!previousHasVerifiedEmail && hasVerifiedEmail) {
onSignedIn(); signIn();
} }
}, [previousHasVerifiedEmail, hasVerifiedEmail, onSignedIn]); }, [previousHasVerifiedEmail, hasVerifiedEmail, signIn]);
if (!user) { if (!user) {
return null; return null;

View file

@ -75,16 +75,14 @@ class ErrorBoundary extends React.Component<Props, State> {
title={__('Aw shucks!')} title={__('Aw shucks!')}
subtitle={ subtitle={
<Fragment> <Fragment>
<p> {__("There was an error. It's been reported and will be fixed")}. {__('Try')}{' '}
{__("There was an error. It's been reported and will be fixed")}. {__('Try')}{' '} <Button
<Button button="link"
button="link" className="load-screen__button"
className="load-screen__button" label={__('refreshing the app')}
label={__('refreshing the app')} onClick={this.refresh}
onClick={this.refresh} />{' '}
/>{' '} {__("to fix it. If that doesn't work, press CMD/CTRL-R to reset to the homepage.")}.
{__("to fix it. If that doesn't work, press CMD/CTRL-R to reset to the homepage.")}.
</p>
</Fragment> </Fragment>
} }
/> />

View file

@ -31,9 +31,8 @@ function PublishFile(props: Props) {
return ( return (
<Card <Card
className={disabled ? 'card--disabled' : undefined}
icon={ICONS.PUBLISH} icon={ICONS.PUBLISH}
disabled={balance === 0} disabled={disabled || balance === 0}
title={isStillEditing ? __('Edit') : __('Publish')} title={isStillEditing ? __('Edit') : __('Publish')}
subtitle={__('You are currently editing a claim.')} subtitle={__('You are currently editing a claim.')}
actions={ actions={

View file

@ -125,7 +125,7 @@ function PublishForm(props: Props) {
<Fragment> <Fragment>
<UnsupportedOnWeb /> <UnsupportedOnWeb />
<PublishFile /> <PublishFile disabled={formDisabled} />
<div className={classnames({ 'card--disabled': formDisabled })}> <div className={classnames({ 'card--disabled': formDisabled })}>
<PublishText disabled={formDisabled} /> <PublishText disabled={formDisabled} />
<Card actions={<SelectThumbnail />} /> <Card actions={<SelectThumbnail />} />

View file

@ -37,7 +37,7 @@ function PublishPrice(props: Props) {
{!contentIsFree && ( {!contentIsFree && (
<FormFieldPrice <FormFieldPrice
name="content_cost_amount" name="content_cost_amount"
min="0" min={0}
price={fee} price={fee}
onChange={newFee => updatePublishForm({ fee: newFee })} onChange={newFee => updatePublishForm({ fee: newFee })}
/> />

View file

@ -5,7 +5,7 @@ import UserEmailNew from 'component/userEmailNew';
import UserEmailVerify from 'component/userEmailVerify'; import UserEmailVerify from 'component/userEmailVerify';
import UserFirstChannel from 'component/userFirstChannel'; import UserFirstChannel from 'component/userFirstChannel';
import { DEFAULT_BID_FOR_FIRST_CHANNEL } from 'component/userFirstChannel/view'; import { DEFAULT_BID_FOR_FIRST_CHANNEL } from 'component/userFirstChannel/view';
import { rewards as REWARDS } from 'lbryinc'; import { rewards as REWARDS, YOUTUBE_STATUSES } from 'lbryinc';
import UserVerify from 'component/userVerify'; import UserVerify from 'component/userVerify';
import Spinner from 'component/spinner'; import Spinner from 'component/spinner';
import YoutubeTransferWelcome from 'component/youtubeTransferWelcome'; import YoutubeTransferWelcome from 'component/youtubeTransferWelcome';
@ -61,14 +61,14 @@ function UserSignIn(props: Props) {
const hasYoutubeChannels = youtubeChannels && Boolean(youtubeChannels.length); const hasYoutubeChannels = youtubeChannels && Boolean(youtubeChannels.length);
const hasTransferrableYoutubeChannels = hasYoutubeChannels && youtubeChannels.some(channel => channel.transferable); const hasTransferrableYoutubeChannels = hasYoutubeChannels && youtubeChannels.some(channel => channel.transferable);
const hasPendingYoutubeTransfer = const hasPendingYoutubeTransfer =
hasYoutubeChannels && youtubeChannels.some(channel => channel.transfer_state === 'pending_transfer'); hasYoutubeChannels && youtubeChannels.some(channel => channel.transfer_state === YOUTUBE_STATUSES.PENDING_TRANSFER);
// Complexity warning // Complexity warning
// We can't just check if we are currently fetching something // We can't just check if we are currently fetching something
// We may want to keep a component rendered while something is being fetched, instead of replacing it with the large spinner // We may want to keep a component rendered while something is being fetched, instead of replacing it with the large spinner
// The verbose variable names are an attempt to alleviate _some_ of the confusion from handling all edge cases that come from // The verbose variable names are an attempt to alleviate _some_ of the confusion from handling all edge cases that come from
// reward claiming (plus the balance updating after), channel creation, account syncing, and youtube transfer // reward claiming (plus the balance updating after), channel creation, account syncing, and youtube transfer
const canHijackSignInFlowWithSpinner = hasVerifiedEmail && !hasClaimedEmailAward && balance === 0 && !getSyncError; const canHijackSignInFlowWithSpinner = hasVerifiedEmail && !getSyncError && balance === 0;
const isCurrentlyFetchingSomething = fetchingChannels || claimingReward || syncingWallet; const isCurrentlyFetchingSomething = fetchingChannels || claimingReward || syncingWallet;
const isWaitingForSomethingToFinish = const isWaitingForSomethingToFinish =
// If the user has claimed the email award, we need to wait until the balance updates sometime in the future // If the user has claimed the email award, we need to wait until the balance updates sometime in the future
@ -116,15 +116,17 @@ function UserSignIn(props: Props) {
), ),
]; ];
let componentToRender; function getSignInStep() {
for (var i = SIGN_IN_FLOW.length - 1; i > -1; i--) { for (var i = SIGN_IN_FLOW.length - 1; i > -1; i--) {
const Component = SIGN_IN_FLOW[i]; const Component = SIGN_IN_FLOW[i];
if (Component) { if (Component) {
componentToRender = Component; return Component;
break; }
} }
} }
const componentToRender = getSignInStep();
if (!componentToRender) { if (!componentToRender) {
history.replace(redirect || '/'); history.replace(redirect || '/');
} }

View file

@ -6,6 +6,7 @@ import CopyableText from 'component/copyableText';
import AdmZip from 'adm-zip'; import AdmZip from 'adm-zip';
import path from 'path'; import path from 'path';
import Card from 'component/common/card'; import Card from 'component/common/card';
import I18nMessage from 'component/i18nMessage';
type Props = { type Props = {
daemonSettings: { daemonSettings: {
@ -96,7 +97,7 @@ class WalletBackup extends React.PureComponent<Props, State> {
<ul> <ul>
<li> <li>
{__( {__(
'Your LBRY credits are controllable by you and only you, via wallet file(s) stored locally on your computer.' 'Your LBRY credits are controllable by you and only you, via a wallet file stored locally on your computer.'
)} )}
</li> </li>
<li> <li>
@ -106,7 +107,7 @@ class WalletBackup extends React.PureComponent<Props, State> {
</li> </li>
<li> <li>
{__( {__(
'However, it is fairly easy to back up manually. To backup your wallet, make a copy of the folder listed below:' 'However, it is easy to back up manually. To backup your wallet, make a copy of the folder listed below:'
)} )}
</li> </li>
</ul> </ul>
@ -115,12 +116,20 @@ class WalletBackup extends React.PureComponent<Props, State> {
<React.Fragment> <React.Fragment>
<CopyableText copyable={lbryumWalletDir} snackMessage={__('Path copied.')} /> <CopyableText copyable={lbryumWalletDir} snackMessage={__('Path copied.')} />
<p className="help"> <p className="help">
{__( <I18nMessage
'Access to these files are equivalent to having access to your credits. Keep any copies you make of your wallet in a secure place.' tokens={{
)}{' '} helpLink: (
{/* @i18fixme */} <Button
{__('For more details on backing up and best practices')},{' '} button="link"
<Button button="link" href="https://lbry.com/faq/how-to-backup-wallet" label={__('see this article')} />. href="https://lbry.com/faq/how-to-backup-wallet"
label={__('see this article')}
/>
),
}}
>
Access to these files are equivalent to having access to your credits. Keep any copies you make of your
wallet in a secure place. For more details on backing up and best practices %helpLink%.
</I18nMessage>
</p> </p>
<p className={'card__message card__message--error' + (this.state.errorMessage ? '' : ' hidden')}> <p className={'card__message card__message--error' + (this.state.errorMessage ? '' : ' hidden')}>
{this.state.errorMessage} {this.state.errorMessage}

View file

@ -1,20 +1,20 @@
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { import {
selectYoutubeChannels, selectYoutubeChannels,
selectYTImportPending, selectYouTubeImportPending,
selectUserIsPending, selectUserIsPending,
doClaimYoutubeChannels, doClaimYoutubeChannels,
doUserFetch, doUserFetch,
selectYTImportVideosComplete, selectYouTubeImportVideosComplete,
doCheckYoutubeTransfer, doCheckYoutubeTransfer,
} from 'lbryinc'; } from 'lbryinc';
import YoutubeChannelList from './view'; import YoutubeChannelList from './view';
const select = state => ({ const select = state => ({
youtubeChannels: selectYoutubeChannels(state), youtubeChannels: selectYoutubeChannels(state),
ytImportPending: selectYTImportPending(state), youtubeImportPending: selectYouTubeImportPending(state),
userFetchPending: selectUserIsPending(state), userFetchPending: selectUserIsPending(state),
videosImported: selectYTImportVideosComplete(state), videosImported: selectYouTubeImportVideosComplete(state),
}); });
const perform = dispatch => ({ const perform = dispatch => ({

View file

@ -3,28 +3,33 @@ import * as React from 'react';
import Button from 'component/button'; import Button from 'component/button';
import ClaimPreview from 'component/claimPreview'; import ClaimPreview from 'component/claimPreview';
import Card from 'component/common/card'; import Card from 'component/common/card';
import { YOUTUBE_STATUSES } from 'lbryinc';
import { buildURI } from 'lbry-redux';
type Props = { type Props = {
youtubeChannels: Array<any>, youtubeChannels: Array<any>,
ytImportPending: boolean, youtubeImportPending: boolean,
claimChannels: () => void, claimChannels: () => void,
updateUser: () => void, updateUser: () => void,
checkYoutubeTransfer: () => void, checkYoutubeTransfer: () => void,
videosImported: ?Array<number>, // [currentAmountImported, totalAmountToImport] videosImported: ?Array<number>, // [currentAmountImported, totalAmountToImport]
}; };
const NOT_TRANSFERRED = 'not_transferred';
const PENDING_TRANSFER = 'pending_transfer';
const COMPLETED_TRANSFER = 'completed_transfer';
export default function YoutubeTransferStatus(props: Props) { export default function YoutubeTransferStatus(props: Props) {
const { youtubeChannels, ytImportPending, claimChannels, videosImported, checkYoutubeTransfer, updateUser } = props; const {
youtubeChannels,
youtubeImportPending,
claimChannels,
videosImported,
checkYoutubeTransfer,
updateUser,
} = props;
const hasChannels = youtubeChannels && youtubeChannels.length; const hasChannels = youtubeChannels && youtubeChannels.length;
const transferEnabled = youtubeChannels.some(status => status.transferable); const transferEnabled = youtubeChannels.some(status => status.transferable);
const hasPendingTransfers = youtubeChannels.some(status => status.transfer_state === PENDING_TRANSFER); const hasPendingTransfers = youtubeChannels.some(
const hasCompleteTransfers = youtubeChannels.some(status => status.transfer_state === COMPLETED_TRANSFER); status => status.transfer_state === YOUTUBE_STATUSES.PENDING_TRANSFER
console.log('?', hasChannels && (hasPendingTransfers || (!hasPendingTransfers && !hasCompleteTransfers))); );
let total; let total;
let complete; let complete;
@ -37,11 +42,11 @@ export default function YoutubeTransferStatus(props: Props) {
const { transferable, transfer_state: transferState, sync_status: syncStatus } = channel; const { transferable, transfer_state: transferState, sync_status: syncStatus } = channel;
if (!transferable) { if (!transferable) {
switch (transferState) { switch (transferState) {
case NOT_TRANSFERRED: case YOUTUBE_STATUSES.NOT_TRANSFERRED:
return syncStatus[0].toUpperCase() + syncStatus.slice(1); return syncStatus[0].toUpperCase() + syncStatus.slice(1);
case PENDING_TRANSFER: case YOUTUBE_STATUSES.PENDING_TRANSFER:
return __('Transfer in progress'); return __('Transfer in progress');
case COMPLETED_TRANSFER: case YOUTUBE_STATUSES.COMPLETED_TRANSFER:
return __('Completed transfer'); return __('Completed transfer');
} }
} else { } else {
@ -82,7 +87,7 @@ export default function YoutubeTransferStatus(props: Props) {
<section> <section>
{youtubeChannels.map((channel, index) => { {youtubeChannels.map((channel, index) => {
const { lbry_channel_name: channelName, channel_claim_id: claimId } = channel; const { lbry_channel_name: channelName, channel_claim_id: claimId } = channel;
const url = `lbry://${channelName}#${claimId}`; const url = buildURI({ channelName, channelClaimId: claimId });
const transferState = getMessage(channel); const transferState = getMessage(channel);
return ( return (
<div key={url} className="card--inline"> <div key={url} className="card--inline">
@ -91,9 +96,7 @@ export default function YoutubeTransferStatus(props: Props) {
); );
})} })}
{videosImported && ( {videosImported && (
<div className="section help"> <div className="section help">{__('%complete% / %total% videos transferred', { complete, total })}</div>
{complete} / {total} {__('videos transferred')}
</div>
)} )}
</section> </section>
} }
@ -102,7 +105,7 @@ export default function YoutubeTransferStatus(props: Props) {
<div className="card__actions"> <div className="card__actions">
<Button <Button
button="primary" button="primary"
disabled={ytImportPending} disabled={youtubeImportPending}
onClick={claimChannels} onClick={claimChannels}
label={youtubeChannels.length > 1 ? __('Claim Channels') : __('Claim Channel')} label={youtubeChannels.length > 1 ? __('Claim Channels') : __('Claim Channel')}
/> />

View file

@ -1,7 +1,7 @@
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { import {
selectYoutubeChannels, selectYoutubeChannels,
selectYTImportPending, selectYouTubeImportPending,
selectUserIsPending, selectUserIsPending,
doClaimYoutubeChannels, doClaimYoutubeChannels,
doUserFetch, doUserFetch,
@ -10,7 +10,7 @@ import YoutubeChannelList from './view';
const select = state => ({ const select = state => ({
youtubeChannels: selectYoutubeChannels(state), youtubeChannels: selectYoutubeChannels(state),
youtubeImportPending: selectYTImportPending(state), youtubeImportPending: selectYouTubeImportPending(state),
userFetchPending: selectUserIsPending(state), userFetchPending: selectUserIsPending(state),
}); });

View file

@ -5,6 +5,7 @@ import classnames from 'classnames';
import ClaimPreview from 'component/claimPreview'; import ClaimPreview from 'component/claimPreview';
import Button from 'component/button'; import Button from 'component/button';
import Confetti from 'react-confetti'; import Confetti from 'react-confetti';
import { YOUTUBE_STATUSES } from 'lbryinc';
type Props = { type Props = {
youtubeChannels: Array<{ lbry_channel_name: string, channel_claim_id: string, transfer_state: string }>, youtubeChannels: Array<{ lbry_channel_name: string, channel_claim_id: string, transfer_state: string }>,
@ -15,7 +16,7 @@ export default function UserYoutubeTransfer(props: Props) {
const { youtubeChannels, claimChannels } = props; const { youtubeChannels, claimChannels } = props;
const hasYoutubeChannels = youtubeChannels && youtubeChannels.length; const hasYoutubeChannels = youtubeChannels && youtubeChannels.length;
const hasPendingYoutubeTransfer = const hasPendingYoutubeTransfer =
hasYoutubeChannels && youtubeChannels.some(channel => channel.transfer_state === 'pending_transfer'); hasYoutubeChannels && youtubeChannels.some(channel => channel.transfer_state === YOUTUBE_STATUSES.PENDING_TRANSFER);
return ( return (
<div> <div>
@ -27,7 +28,7 @@ export default function UserYoutubeTransfer(props: Props) {
</React.Fragment> </React.Fragment>
) : ( ) : (
<React.Fragment> <React.Fragment>
<h1 className="section__title--large">{__('Good to Go!')}</h1> <h1 className="section__title--large">{__('Good To Go!')}</h1>
<p className="section__subtitle"> <p className="section__subtitle">
{__('You now control your channel and your videos are being transferred to your account.')} {__('You now control your channel and your videos are being transferred to your account.')}
</p> </p>
@ -59,7 +60,6 @@ export default function UserYoutubeTransfer(props: Props) {
) : ( ) : (
<section className="section"> <section className="section">
<h1 className="section__title">{__('Begin Transfer')}</h1> <h1 className="section__title">{__('Begin Transfer')}</h1>
<p className="section__subtitle">{__('Do it to it.')}</p>
<div className="section__actions"> <div className="section__actions">
<Button button="primary" label={__('Transfer')} onClick={claimChannels} /> <Button button="primary" label={__('Transfer')} onClick={claimChannels} />
</div> </div>

View file

@ -11,6 +11,7 @@ import Native from 'native';
import Button from 'component/button'; import Button from 'component/button';
import Page from 'component/page'; import Page from 'component/page';
import Card from 'component/common/card'; import Card from 'component/common/card';
import I18nMessage from 'component/i18nMessage';
type DeamonSettings = { type DeamonSettings = {
data_dir: string | any, data_dir: string | any,
@ -142,10 +143,10 @@ class HelpPage extends React.PureComponent<Props, State> {
<Card <Card
title={__('Find Assistance')} title={__('Find Assistance')}
subtitle={ subtitle={
<p> <I18nMessage tokens={{ channel: <strong>#help</strong> }}>
{__('Live help is available most hours in the')} <strong>#help</strong>{' '} Live help is available most hours in the %channel% channel of our Discord chat room. Or you can always
{__('channel of our Discord chat room. Or you can always email us at help@lbry.com.')} email us at help@lbry.com.
</p> </I18nMessage>
} }
actions={ actions={
<div className="section__actions"> <div className="section__actions">

View file

@ -16,7 +16,6 @@ import {
makeSelectClaimIsMine, makeSelectClaimIsMine,
doPopulateSharedUserState, doPopulateSharedUserState,
doFetchChannelListMine, doFetchChannelListMine,
getSync,
} from 'lbry-redux'; } from 'lbry-redux';
import Native from 'native'; import Native from 'native';
import { doFetchDaemonSettings } from 'redux/actions/settings'; import { doFetchDaemonSettings } from 'redux/actions/settings';
@ -32,7 +31,7 @@ import {
selectUpgradeTimer, selectUpgradeTimer,
selectModal, selectModal,
} from 'redux/selectors/app'; } from 'redux/selectors/app';
import { Lbryio, doAuthenticate } from 'lbryinc'; import { Lbryio, doAuthenticate, doGetSync } from 'lbryinc';
import { lbrySettings as config, version as appVersion } from 'package.json'; import { lbrySettings as config, version as appVersion } from 'package.json';
import { push } from 'connected-react-router'; import { push } from 'connected-react-router';
import analytics from 'analytics'; import analytics from 'analytics';
@ -451,12 +450,13 @@ export function doSignIn() {
// @if TARGET='web' // @if TARGET='web'
const { auth_token: authToken } = cookie.parse(document.cookie); const { auth_token: authToken } = cookie.parse(document.cookie);
Lbry.setApiHeader('X-Lbry-Auth-Token', authToken); Lbry.setApiHeader('X-Lbry-Auth-Token', authToken);
dispatch(doBalanceSubscribe()); dispatch(doBalanceSubscribe());
dispatch(doCheckSubscriptionsInit());
dispatch(doFetchChannelListMine()); dispatch(doFetchChannelListMine());
dispatch(getSync()); dispatch(doCheckSubscriptionsInit());
// @endif
// @if TARGET='app'
dispatch(doGetSync());
// @endif // @endif
Lbryio.call('user_settings', 'get').then(settings => { Lbryio.call('user_settings', 'get').then(settings => {

View file

@ -6850,17 +6850,17 @@ lazy-val@^1.0.3, lazy-val@^1.0.4:
yargs "^13.2.2" yargs "^13.2.2"
zstd-codec "^0.1.1" zstd-codec "^0.1.1"
lbry-redux@lbryio/lbry-redux#42bf926138872d14523be7191694309be4f37605: lbry-redux@lbryio/lbry-redux#04ae0913a444abac200731c7ed53796d763a0bbb:
version "0.0.1" version "0.0.1"
resolved "https://codeload.github.com/lbryio/lbry-redux/tar.gz/42bf926138872d14523be7191694309be4f37605" resolved "https://codeload.github.com/lbryio/lbry-redux/tar.gz/04ae0913a444abac200731c7ed53796d763a0bbb"
dependencies: dependencies:
proxy-polyfill "0.1.6" proxy-polyfill "0.1.6"
reselect "^3.0.0" reselect "^3.0.0"
uuid "^3.3.2" uuid "^3.3.2"
lbryinc@lbryio/lbryinc#368040d64658cf2a4b8a7a6725ec1787329ce65d: lbryinc@lbryio/lbryinc#a44576194e1f5f60e37d328ddfdca40bd6165c2d:
version "0.0.1" version "0.0.1"
resolved "https://codeload.github.com/lbryio/lbryinc/tar.gz/368040d64658cf2a4b8a7a6725ec1787329ce65d" resolved "https://codeload.github.com/lbryio/lbryinc/tar.gz/a44576194e1f5f60e37d328ddfdca40bd6165c2d"
dependencies: dependencies:
reselect "^3.0.0" reselect "^3.0.0"