feat: setup Danger #1289

Merged
IGassmann merged 6 commits from setup-danger into master 2018-04-25 21:31:59 +02:00
34 changed files with 306 additions and 154 deletions
Showing only changes of commit bd6e1e7bbe - Show all commits

1
.gitignore vendored
View file

@ -3,3 +3,4 @@
/static/daemon/lbrynet*
/static/locales
yarn-error.log
/build/daemon*

View file

@ -27,6 +27,13 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/).
* Fix Description box on Publish (dark theme) ([#1356](https://github.com/lbryio/lbry-app/issues/#1356))
## [0.21.3] - 2018-04-23
### Added
* Block blacklisted content ([#1361](https://github.com/lbryio/lbry-app/pull/1361))
## [0.21.2] - 2018-03-22

View file

@ -1,6 +1,6 @@
{
"name": "LBRY",
"version": "0.21.2",
"version": "0.21.3",
"description": "A browser for the LBRY network, a digital marketplace controlled by its users.",
"keywords": [
"lbry"
@ -32,7 +32,8 @@
"postrewrite": "yarnhook",
"postinstall": "electron-builder install-app-deps && node build/downloadDaemon.js",
"lint": "eslint 'src/**/*.{js,jsx}' --fix",
"format": "prettier 'src/**/*.{js,jsx,scss,json}' --write"
"format": "prettier 'src/**/*.{js,jsx,scss,json}' --write",
"clean": "rm -r node_modules && yarn cache clean lbry-redux && yarn"
},
"dependencies": {
"bluebird": "^3.5.1",

View file

@ -12,17 +12,18 @@ type Props = {
label: ?string,
errorMessage: ?string,
reward: Reward,
button: ?boolean,
clearError: Reward => void,
claimReward: Reward => void,
};
const RewardLink = (props: Props) => {
const { reward, claimReward, clearError, errorMessage, label, isPending } = props;
const { reward, claimReward, clearError, errorMessage, label, isPending, button } = props;
return !reward ? null : (
<div className="reward-link">
<Button
button="link"
button={button ? 'primary' : 'link'}
disabled={isPending}
label={isPending ? __('Claiming...') : label || `${__('Get')} ${reward.reward_amount} LBC`}
onClick={() => {

View file

@ -36,7 +36,7 @@ const RewardTile = (props: Props) => {
<Icon icon={icons.CHECK} /> {__('Reward claimed.')}
</span>
) : (
<RewardLink reward_type={reward.reward_type} />
<RewardLink button reward_type={reward.reward_type} />
))}
</div>
</section>

View file

@ -2,7 +2,6 @@
import * as React from 'react';
import Button from 'component/button';
import classnames from 'classnames';
import { CSSTransitionGroup } from 'react-transition-group';
import * as icons from 'constants/icons';
import * as NOTIFICATION_TYPES from 'constants/notification_types';
@ -20,11 +19,13 @@ type Props = {
forward: any => void,
isBackDisabled: boolean,
isForwardDisabled: boolean,
isHome: boolean,
navLinks: {
primary: Array<SideBarLink>,
secondary: Array<SideBarLink>,
},
notifications: {
type: string,
},
};
const SideBar = (props: Props) => {
@ -100,33 +101,30 @@ const SideBar = (props: Props) => {
>
<Button navigate={path} label={label} icon={icon} />
{
// The sublinks should be animated on open close
// Removing it because the current implementation with CSSTransitionGroup
// was really slow and looked pretty bad. Possible fix is upgrading to v2
// Not sure if that has better performance
}
{!!subLinks.length &&
active && (
<CSSTransitionGroup
transitionAppear
transitionLeave
transitionAppearTimeout={300}
transitionEnterTimeout={300}
transitionLeaveTimeout={300}
transitionName="nav__sub"
>
<ul key="0" className="nav__sub-links">
{subLinks.map(({ label: subLabel, path: subPath, active: subLinkActive }) => (
<li
key={subPath}
className={classnames('nav__link nav__link--sub', {
'nav__link--active': subLinkActive,
})}
>
{subPath ? (
<Button navigate={subPath} label={subLabel} />
) : (
<span>{subLabel}</span>
)}
</li>
))}
</ul>
</CSSTransitionGroup>
<ul key="0" className="nav__sub-links">
{subLinks.map(({ label: subLabel, path: subPath, active: subLinkActive }) => (
<li
key={subPath}
className={classnames('nav__link nav__link--sub', {
'nav__link--active': subLinkActive,
})}
>
{subPath ? (
<Button navigate={subPath} label={subLabel} />
) : (
<span>{subLabel}</span>
)}
</li>
))}
</ul>
)}
</li>
))}

View file

@ -1,10 +1,11 @@
import { connect } from 'react-redux';
import { selectCurrentModal, selectDaemonVersionMatched } from 'redux/selectors/app';
import { selectDaemonVersionMatched } from 'redux/selectors/app';
import { selectNotification } from 'lbry-redux';
import { doCheckDaemonVersion } from 'redux/actions/app';
import SplashScreen from './view';
const select = state => ({
modal: selectCurrentModal(state),
notification: selectNotification(state),
daemonVersionMatched: selectDaemonVersionMatched(state),
});

View file

@ -8,7 +8,9 @@ import * as modals from 'constants/modal_types';
type Props = {
checkDaemonVersion: () => Promise<any>,
modal: string,
notification: ?{
id: string,
},
};
type State = {
@ -100,9 +102,11 @@ export class SplashScreen extends React.PureComponent<Props, State> {
}
render() {
const { modal } = this.props;
const { notification } = this.props;
const { message, details, isLagging, isRunning } = this.state;
const notificationId = notification && notification.id;
return (
<React.Fragment>
<LoadScreen message={message} details={details} isWarning={isLagging} />
@ -111,9 +115,9 @@ export class SplashScreen extends React.PureComponent<Props, State> {
in the modals won't work. */}
{isRunning && (
<React.Fragment>
{modal === modals.INCOMPATIBLE_DAEMON && <ModalIncompatibleDaemon />}
{modal === modals.UPGRADE && <ModalUpgrade />}
{modal === modals.DOWNLOADING && <ModalDownloading />}
{notificationId === modals.INCOMPATIBLE_DAEMON && <ModalIncompatibleDaemon />}
{notificationId === modals.UPGRADE && <ModalUpgrade />}
{notificationId === modals.DOWNLOADING && <ModalDownloading />}
</React.Fragment>
)}
</React.Fragment>

View file

@ -7,6 +7,7 @@ import Button from 'component/button';
import { buildURI } from 'lbry-redux';
import * as txnTypes from 'constants/transaction_types';
import type { Transaction } from '../view';
import * as ICONS from 'constants/icons';
type Props = {
transaction: Transaction,
@ -32,9 +33,9 @@ class TransactionListItem extends React.PureComponent<Props> {
getLink(type: string) {
if (type === txnTypes.TIP) {
return <Button button="link" onClick={this.abandonClaim} label={__('Unlock Tip')} />;
return <Button icon={ICONS.UNLOCK} onClick={this.abandonClaim} title={__('Unlock Tip')} />;
}
return <Button button="link" onClick={this.abandonClaim} label={__('Abandon Claim')} />;
return <Button icon={ICONS.TRASH} onClick={this.abandonClaim} title={__('Abandon Claim')} />;
}
capitalize(string: string) {

View file

@ -100,8 +100,9 @@ class TransactionList extends React.PureComponent<Props, State> {
postfix={
<Button
button="link"
icon={icons.HELP}
href="https://lbry.io/faq/transaction-types"
label={__('Help')}
title={__('Help')}
/>
}
>

View file

@ -8,7 +8,6 @@ import {
selectIdentityVerifyErrorMessage,
} from 'redux/selectors/user';
import UserVerify from './view';
import { selectCurrentModal } from 'redux/selectors/app';
import { doNotify } from 'lbry-redux';
import { PHONE_COLLECTION } from 'constants/modal_types';
@ -19,7 +18,6 @@ const select = (state, props) => {
isPending: selectIdentityVerifyIsPending(state),
errorMessage: selectIdentityVerifyErrorMessage(state),
reward: selectReward(state, { reward_type: rewards.TYPE_NEW_USER }),
modal: selectCurrentModal(state),
};
};

View file

@ -23,3 +23,4 @@ export const HOME = 'Home';
export const PHONE = 'Phone';
export const CHECK = 'CheckCircle';
export const HEART = 'Heart';
export const UNLOCK = 'Unlock';

View file

@ -8,7 +8,7 @@ import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { doConditionalAuthNavigate, doDaemonReady, doAutoUpdate } from 'redux/actions/app';
import { doNotify } from 'lbry-redux';
import { doNotify, doBlackListedOutpointsSubscribe } from 'lbry-redux';
import { doNavigate } from 'redux/actions/navigation';
import { doDownloadLanguages, doUpdateIsNightAsync } from 'redux/actions/settings';
import { doUserEmailVerify } from 'redux/actions/user';
@ -117,8 +117,10 @@ const init = () => {
app.store.dispatch(doAutoUpdate());
});
}
app.store.dispatch(doUpdateIsNightAsync());
app.store.dispatch(doDownloadLanguages());
app.store.dispatch(doBlackListedOutpointsSubscribe());
function onDaemonReady() {
window.sessionStorage.setItem('loaded', 'y'); // once we've made it here once per session, we don't need to show splash again

View file

@ -129,7 +129,7 @@ export class ExpandableModal extends React.PureComponent<ModalProps, State> {
onClick={this.props.onConfirmed}
/>
<Button
button="alt"
button="link"
label={!this.state.expanded ? this.props.expandButtonLabel : this.props.hideButtonLabel}
className="modal__button"
onClick={() => {

View file

@ -1,6 +1,5 @@
import { connect } from 'react-redux';
import * as settings from 'constants/settings';
import { selectCurrentModal, selectModalProps, selectModalsAllowed } from 'redux/selectors/app';
import {
doNotify,
selectCostForCurrentPageUri,
@ -17,8 +16,6 @@ import ModalRouter from './view';
const select = state => ({
balance: selectBalance(state),
showPageCost: selectCostForCurrentPageUri(state),
modal: selectCurrentModal(state),
modalProps: selectModalProps(state),
page: selectCurrentPage(state),
isVerificationCandidate: selectUserIsVerificationCandidate(state),
isCreditIntroAcknowledged: makeSelectClientSetting(settings.CREDIT_REQUIRED_ACKNOWLEDGED)(state),
@ -27,7 +24,6 @@ const select = state => ({
),
isWelcomeAcknowledged: makeSelectClientSetting(settings.NEW_USER_ACKNOWLEDGED)(state),
user: selectUser(state),
modalsAllowed: selectModalsAllowed(state),
notification: selectNotification(state),
notificationProps: selectNotificationProps(state),
});

View file

@ -107,6 +107,11 @@ class ModalRouter extends React.PureComponent {
if (!notification) {
return null;
}
if (notification.error) {
return <ModalError {...notification} {...notificationProps} />;
}
switch (notification.id) {
case modals.UPGRADE:
return <ModalUpgrade {...notificationProps} />;

View file

@ -67,7 +67,7 @@ class ChannelPage extends React.PureComponent<Props> {
} else {
contentList =
claimsInChannel && claimsInChannel.length ? (
<FileList hideFilter fileInfos={claimsInChannel} />
<FileList sortByHeight hideFilter fileInfos={claimsInChannel} />
) : (
<span className="empty">{__('No content found.')}</span>
);

View file

@ -1,13 +1,13 @@
import { connect } from 'react-redux';
import { selectMyClaimsWithoutChannels } from 'lbry-redux';
import { selectPendingPublishesLessEdits } from 'redux/selectors/publish';
import { selectPendingPublishes } from 'redux/selectors/publish';
import { doNavigate } from 'redux/actions/navigation';
import { doCheckPendingPublishes } from 'redux/actions/publish';
import FileListPublished from './view';
const select = state => ({
claims: selectMyClaimsWithoutChannels(state),
pendingPublishes: selectPendingPublishesLessEdits(state),
pendingPublishes: selectPendingPublishes(state),
});
const perform = dispatch => ({

View file

@ -1,10 +1,16 @@
import { connect } from 'react-redux';
import { doResolveUri, makeSelectClaimForUri, makeSelectIsUriResolving } from 'lbry-redux';
import {
doResolveUri,
makeSelectClaimForUri,
makeSelectIsUriResolving,
selectBlackListedOutpoints,
} from 'lbry-redux';
import ShowPage from './view';
const select = (state, props) => ({
claim: makeSelectClaimForUri(props.uri)(state),
isResolvingUri: makeSelectIsUriResolving(props.uri)(state),
blackListedOutpoints: selectBlackListedOutpoints(state),
});
const perform = dispatch => ({

View file

@ -4,12 +4,21 @@ import BusyIndicator from 'component/common/busy-indicator';
import ChannelPage from 'page/channel';
import FilePage from 'page/file';
import Page from 'component/page';
import Button from 'component/button';
type Props = {
isResolvingUri: boolean,
resolveUri: string => void,
uri: string,
claim: { name: string },
claim: {
name: string,
txid: string,
nout: number,
},
blackListedOutpoints: Array<{
txid: string,
nout: number,
}>,
};
class ShowPage extends React.PureComponent<Props> {
@ -28,7 +37,7 @@ class ShowPage extends React.PureComponent<Props> {
}
render() {
const { claim, isResolvingUri, uri } = this.props;
const { claim, isResolvingUri, uri, blackListedOutpoints } = this.props;
let innerContent = '';
@ -50,7 +59,37 @@ class ShowPage extends React.PureComponent<Props> {
} else if (claim && claim.name.length && claim.name[0] === '@') {
innerContent = <ChannelPage uri={uri} />;
} else if (claim) {
innerContent = <FilePage uri={uri} />;
let isClaimBlackListed = false;
for (let i = 0; i < blackListedOutpoints.length; i += 1) {
const outpoint = blackListedOutpoints[i];
if (outpoint.txid === claim.txid && outpoint.nout === claim.nout) {
isClaimBlackListed = true;
break;
}
}
if (isClaimBlackListed) {
innerContent = (
<Page>
<section className="card card--section">
<div className="card__title">{uri}</div>
<div className="card__content">
<p>
{__(
'In response to a complaint we received under the US Digital Millennium Copyright Act, we have blocked access to this content from our applications.'
)}
</p>
</div>
<div className="card__actions">
<Button button="link" href="https://lbry.io/faq/dmca" label={__('Read More')} />
</div>
</section>
</Page>
);
} else {
innerContent = <FilePage uri={uri} />;
}
}
return innerContent;

View file

@ -3,7 +3,14 @@ import isDev from 'electron-is-dev';
import path from 'path';
import * as MODALS from 'constants/modal_types';
import { ipcRenderer, remote } from 'electron';
import { ACTIONS, Lbry, doBalanceSubscribe, doFetchFileInfosAndPublishedClaims } from 'lbry-redux';
import {
ACTIONS,
Lbry,
doBalanceSubscribe,
doFetchFileInfosAndPublishedClaims,
doNotify,
selectNotification,
} from 'lbry-redux';
import Native from 'native';
import { doFetchRewardedContent } from 'redux/actions/content';
import { doFetchDaemonSettings } from 'redux/actions/settings';
@ -12,7 +19,6 @@ import { doAuthenticate } from 'redux/actions/user';
import { doPause } from 'redux/actions/media';
import { doCheckSubscriptions } from 'redux/actions/subscriptions';
import {
selectCurrentModal,
selectIsUpgradeSkipped,
selectUpdateUrl,
selectUpgradeDownloadItem,
@ -83,12 +89,11 @@ export function doDownloadUpgrade() {
dispatch({
type: ACTIONS.UPGRADE_DOWNLOAD_STARTED,
});
dispatch({
type: ACTIONS.CREATE_NOTIFICATION,
data: {
modal: MODALS.DOWNLOADING,
},
});
dispatch(
doNotify({
id: MODALS.DOWNLOADING,
})
);
};
}
@ -110,17 +115,19 @@ export function doDownloadUpgradeRequested() {
// electron-updater behavior
if (autoUpdateDeclined) {
// The user declined an update before, so show the "confirm" dialog
dispatch({
type: ACTIONS.CREATE_NOTIFICATION,
data: { modal: MODALS.AUTO_UPDATE_CONFIRM },
});
dispatch(
doNotify({
id: MODALS.AUTO_UPDATE_CONFIRM,
})
);
} else {
// The user was never shown the original update dialog (e.g. because they were
// watching a video). So show the inital "update downloaded" dialog.
dispatch({
type: ACTIONS.CREATE_NOTIFICATION,
data: { modal: MODALS.AUTO_UPDATE_DOWNLOADED },
});
dispatch(
doNotify({
id: MODALS.AUTO_UPDATE_DOWNLOADED,
})
);
}
} else {
// Old behavior for Linux
@ -135,10 +142,11 @@ export function doAutoUpdate() {
type: ACTIONS.AUTO_UPDATE_DOWNLOADED,
});
dispatch({
type: ACTIONS.CREATE_NOTIFICATION,
data: { modal: MODALS.AUTO_UPDATE_DOWNLOADED },
});
dispatch(
doNotify({
id: MODALS.AUTO_UPDATE_DOWNLOADED,
})
);
};
}
@ -203,15 +211,14 @@ export function doCheckUpgradeAvailable() {
if (
upgradeAvailable &&
!selectCurrentModal(state) &&
!selectNotification(state) &&
(!selectIsUpgradeSkipped(state) || remoteVersion !== selectRemoteVersion(state))
) {
dispatch({
type: ACTIONS.CREATE_NOTIFICATION,
data: {
modal: MODALS.UPGRADE,
},
});
dispatch(
doNotify({
id: MODALS.UPGRADE,
})
);
}
};
@ -256,13 +263,12 @@ export function doCheckDaemonVersion() {
export function doAlertError(errorList) {
return dispatch => {
dispatch({
type: ACTIONS.CREATE_NOTIFICATION,
data: {
modal: MODALS.ERROR,
modalProps: { error: errorList },
},
});
dispatch(
doNotify({
id: MODALS.ERROR,
error: errorList,
})
);
};
}
@ -328,7 +334,9 @@ export function doChangeVolume(volume) {
export function doConditionalAuthNavigate(newSession) {
return (dispatch, getState) => {
const state = getState();
if (newSession || selectCurrentModal(state) !== 'email_collection') {
const notification = selectNotification(state);
if (newSession || (notification && notification.id !== 'email_collection')) {
dispatch(doAuthNavigate());
}
};

View file

@ -150,7 +150,7 @@ export const doPublish = (params: PublishParams) => (dispatch: Dispatch, getStat
const failure = error => {
dispatch({ type: ACTIONS.PUBLISH_FAIL });
dispatch(doNotify({ id: MODALS.ERROR }, { error: error.message }));
dispatch(doNotify({ id: MODALS.ERROR, error: error.message }));
};
return Lbry.publish(publishPayload).then(success, failure);

View file

@ -136,8 +136,12 @@ export default handleActions(
[ACTIONS.PUBLISH_SUCCESS]: (state: PublishState, action): PublishState => {
const { pendingPublish } = action.data;
// If it's an edit, don't create a pending publish
// It will take some more work to know when an edit is confirmed
const newPendingPublishes = state.pendingPublishes.slice();
newPendingPublishes.push(pendingPublish);
if (!pendingPublish.isEdit) {
newPendingPublishes.push(pendingPublish);
}
return {
...state,

View file

@ -41,8 +41,6 @@ export const selectUpgradeFilename = createSelector(
}
);
export const selectCurrentModal = createSelector(selectState, state => state.modal);
export const selectDownloadProgress = createSelector(selectState, state => state.downloadProgress);
export const selectDownloadComplete = createSelector(
@ -66,10 +64,6 @@ export const selectAutoUpdateDeclined = createSelector(
state => state.autoUpdateDeclined
);
export const selectModalsAllowed = createSelector(selectState, state => state.modalsAllowed);
export const selectModalProps = createSelector(selectState, state => state.modalProps);
export const selectDaemonVersionMatched = createSelector(
selectState,
state => state.daemonVersionMatched

View file

@ -8,11 +8,6 @@ export const selectPendingPublishes = createSelector(
state => state.pendingPublishes.map(pendingClaim => ({ ...pendingClaim, pending: true })) || []
);
export const selectPendingPublishesLessEdits = createSelector(
selectPendingPublishes,
pendingPublishes => pendingPublishes.filter(pendingPublish => !pendingPublish.isEdit)
);
export const selectPublishFormValues = createSelector(selectState, state => {
const { pendingPublish, ...formValues } = state;
return formValues;
@ -27,6 +22,6 @@ export const selectPendingPublish = uri =>
}
return pendingPublishes.filter(
publish => publish.name === claimName || publish.name === contentName
publish => (publish.name === claimName || publish.name === contentName) && !publish.isEdit
)[0];
});

View file

@ -160,6 +160,7 @@ p {
'nav header'
'nav content';
background-color: var(--color-bg);
height: 100vh;
@media only screen and (min-width: $medium-breakpoint) {
grid-template-columns: var(--side-nav-width-m) auto;
@ -246,7 +247,7 @@ p {
/* Custom text selection */
*::selection {
background: var(--text-selection-bg);
background: var(--color-primary-light);
color: var(--text-selection-color);
}

View file

@ -34,6 +34,7 @@ $large-breakpoint: 1760px;
--color-green: #399483;
--color-green-light: #effbe4;
--color-green-blue: #2ec1a8;
--color-purple: #8165b0;
/* Colors */
--color-divider: #e3e3e3;
@ -57,7 +58,7 @@ $large-breakpoint: 1760px;
--text-help-color: var(--color-help);
--text-max-width: 660px;
--text-link-padding: 4px;
--text-selection-bg: rgba(saturate(lighten(#155b4a, 20%), 20%), 1); // temp color
--text-selection-bg: var(--color-purple);
--text-selection-color: #fff;
/* Form */
@ -111,7 +112,7 @@ $large-breakpoint: 1760px;
--header-bg: var(--color-white);
--header-color: var(--color-text);
--header-active-color: rgba(0, 0, 0, 0.85);
--header-height: $spacing-width * 3;
--header-height: 75px;
--header-button-bg: transparent;
--header-button-hover-bg: rgba(100, 100, 100, 0.15);
--header-primary-color: var(--color-primary);
@ -139,7 +140,6 @@ $large-breakpoint: 1760px;
--card-bg: var(--color-white);
--card-text-color: var(--color-grey-dark);
--card-radius: 2px;
--card-margin: $spacing-vertical * 2/3;
--card-wallet-color: var(--text-color-inverse);
--success-msg-color: var(--color-green);
--success-msg-border: var(--color-green-blue);

View file

@ -169,15 +169,11 @@ button:disabled {
.btn.btn--header-balance {
font-family: 'metropolis-medium';
font-size: 13px;
font-size: 14px;
color: var(--header-primary-color);
@media only screen and (min-width: $medium-breakpoint) {
font-size: 18px;
}
@media only screen and (min-width: $large-breakpoint) {
font-size: 21px;
font-size: 18px;
}
.btn__label--balance {

View file

@ -177,7 +177,7 @@
}
.card__content {
margin-top: var(--card-margin);
margin-top: $spacing-vertical * 2/3;
}
.card__subtext-title {
@ -198,7 +198,7 @@
}
.card__actions {
margin-top: var(--card-margin);
margin-top: $spacing-vertical * 2/3;
display: flex;
&:not(.card__actions--vertical) .btn:nth-child(n + 2) {

View file

@ -86,7 +86,12 @@
}
.modal__button {
margin: 0px 6px;
margin: 0px $spacing-vertical * 1/3;
&.btn--link {
// So the text isn't bigger than the text inside the button
font-size: 0.8em;
}
}
.error-modal-overlay {
@ -119,7 +124,7 @@
list-style: none;
max-height: 400px;
max-width: var(--modal-width);
overflow-y: hidden;
overflow-y: scroll;
}
.error-modal__content p {

View file

@ -82,10 +82,10 @@ table.table--help {
table.table--transactions {
td:nth-of-type(1) {
width: 17.5%;
width: 25%;
}
td:nth-of-type(2) {
width: 27.5%;
width: 20%;
}
td:nth-of-type(3) {
width: 22.5%;

View file

@ -9,6 +9,7 @@ import {
searchReducer,
walletReducer,
notificationsReducer,
blacklistReducer,
} from 'lbry-redux';
import navigationReducer from 'redux/reducers/navigation';
import rewardsReducer from 'redux/reducers/rewards';
@ -71,6 +72,7 @@ const reducers = combineReducers({
media: mediaReducer,
publish: publishReducer,
notifications: notificationsReducer,
blacklist: blacklistReducer,
});
const bulkThunk = createBulkThunkMiddleware();

View file

@ -48,7 +48,7 @@
--header-active-color: rgba(0, 0, 0, 0.85);
--header-button-bg: transparent;
--header-button-hover-bg: rgba(100, 100, 100, 0.15);
--header-primary-color: #8165B0;
--header-primary-color: var(--color-purple);
/* Header */
--header-color: #CCC;

147
yarn.lock
View file

@ -144,14 +144,28 @@
node-fetch "^2.1.1"
url-template "^2.0.8"
"@segment/top-domain@^3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@segment/top-domain/-/top-domain-3.0.0.tgz#02e5a5a4fd42a9f6cf886b05e82f104012a3c3a7"
dependencies:
component-cookie "^1.1.2"
component-url "^0.2.1"
"@types/node@^8.0.24":
version "8.10.9"
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.9.tgz#b507a74a7d3eddc74a17dc35fd40d8f45dde0d6c"
version "8.10.10"
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.10.tgz#fec07bc2ad549d9e6d2f7aa0fb0be3491b83163a"
"@types/webpack-env@^1.13.5":
version "1.13.6"
resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.13.6.tgz#128d1685a7c34d31ed17010fc87d6a12c1de6976"
JSONStream@^1.3.1:
version "1.3.2"
resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea"
dependencies:
jsonparse "^1.2.0"
through ">=2.2.7 <3"
abab@^1.0.0, abab@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
@ -259,6 +273,16 @@ amdefine@>=0.0.4:
version "1.0.1"
resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
amplitude-js@^4.0.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/amplitude-js/-/amplitude-js-4.2.1.tgz#539f5aaf312c1a56fec3946370e8dfa7ed185de1"
dependencies:
"@segment/top-domain" "^3.0.0"
blueimp-md5 "^2.10.0"
json3 "^3.3.2"
lodash "^4.17.4"
ua-parser-js "github:amplitude/ua-parser-js#ed538f1"
ansi-align@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
@ -513,8 +537,8 @@ autoprefixer@^6.3.1:
postcss-value-parser "^3.2.3"
aws-sdk@^2.224.1:
version "2.227.1"
resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.227.1.tgz#e0051fa680f29cd83d66f4b751aafbc6beebe9ab"
version "2.228.1"
resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.228.1.tgz#57b3cc29671cbc80a36d45bbeada8ad269079f2d"
dependencies:
buffer "4.9.1"
events "1.1.1"
@ -1351,6 +1375,10 @@ bluebird@~3.4.1:
version "3.4.7"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3"
blueimp-md5@^2.10.0:
version "2.10.0"
resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.10.0.tgz#02f0843921f90dca14f5b8920a38593201d6964d"
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
version "4.11.8"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
@ -2047,7 +2075,7 @@ combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5:
dependencies:
delayed-stream "~1.0.0"
commander@2.15.x, commander@^2.11.0, commander@^2.13.0, commander@^2.14.1, commander@^2.5.0, commander@^2.9.0, commander@~2.15.0:
commander@2.15.x, commander@^2.11.0, commander@^2.12.2, commander@^2.13.0, commander@^2.14.1, commander@^2.5.0, commander@^2.9.0, commander@~2.15.0:
version "2.15.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
@ -2100,10 +2128,20 @@ compare-version@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080"
component-cookie@^1.1.2:
version "1.1.3"
resolved "https://registry.yarnpkg.com/component-cookie/-/component-cookie-1.1.3.tgz#053e14a3bd7748154f55724fd39a60c01994ebed"
dependencies:
debug "*"
component-emitter@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
component-url@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/component-url/-/component-url-0.2.1.tgz#4e4f4799c43ead9fd3ce91b5a305d220208fee47"
compressible@~2.0.13:
version "2.0.13"
resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.13.tgz#0d1020ab924b2fdb4d6279875c7d6daba6baa7a9"
@ -2530,15 +2568,15 @@ date-now@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
debug@2.6.9, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
debug@*, debug@3.1.0, debug@^3.0.0, debug@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
dependencies:
ms "2.0.0"
debug@3.1.0, debug@^3.0.0, debug@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
debug@2.6.9, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
dependencies:
ms "2.0.0"
@ -3010,7 +3048,7 @@ electron-devtools-installer@^2.2.3:
rimraf "^2.5.2"
semver "^5.3.0"
electron-dl@^1.11.0:
electron-dl@^1.11.0, electron-dl@^1.6.0:
version "1.11.0"
resolved "https://registry.yarnpkg.com/electron-dl/-/electron-dl-1.11.0.tgz#112851f3857bb1a556b5c736af06040bd40df850"
dependencies:
@ -3821,6 +3859,10 @@ extsprintf@^1.2.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
eyes@^0.1.8:
version "0.1.8"
resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0"
fast-deep-equal@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
@ -4133,7 +4175,7 @@ fresh@0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
from2@^2.1.0:
from2@^2.1.0, from2@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
dependencies:
@ -4760,8 +4802,8 @@ http-errors@~1.6.2:
statuses ">= 1.4.0 < 2"
http-parser-js@>=0.4.0:
version "0.4.11"
resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.11.tgz#5b720849c650903c27e521633d94696ee95f3529"
version "0.4.12"
resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.12.tgz#b9cfbf4a2cf26f0fc34b10ca1489a27771e3474f"
http-proxy-agent@^2.1.0:
version "2.1.0"
@ -4967,6 +5009,10 @@ inquirer@^3.0.6:
strip-ansi "^4.0.0"
through "^2.3.6"
install@^0.10.2:
version "0.10.4"
resolved "https://registry.yarnpkg.com/install/-/install-0.10.4.tgz#9cb09115768b93a582d1450a6ba3f275975b49aa"
internal-ip@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c"
@ -5377,6 +5423,17 @@ isurl@^1.0.0-alpha5:
has-to-string-tag-x "^1.2.0"
is-object "^1.0.1"
jayson@^2.0.2:
version "2.0.5"
resolved "https://registry.yarnpkg.com/jayson/-/jayson-2.0.5.tgz#46df3f0bceb0b5b708bf7c8806c34c81938d3f21"
dependencies:
JSONStream "^1.3.1"
commander "^2.12.2"
es6-promisify "^5.0.0"
eyes "^0.1.8"
json-stringify-safe "^5.0.1"
lodash "^4.17.4"
jest-config@^22.4.3:
version "22.4.3"
resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.3.tgz#0e9d57db267839ea31309119b41dc2fa31b76403"
@ -5600,6 +5657,10 @@ jsesc@~0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
jshashes@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/jshashes/-/jshashes-1.0.7.tgz#bed8c97a0e9632fd0513916f55f76dd5486be59f"
jsome@^2.3.25:
version "2.5.0"
resolved "https://registry.yarnpkg.com/jsome/-/jsome-2.5.0.tgz#5e417eef4341ffeb83ee8bfa9265b36d56fe49ed"
@ -5658,6 +5719,10 @@ jsonfile@^4.0.0:
optionalDependencies:
graceful-fs "^4.1.6"
jsonparse@^1.2.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
jsonpointer@^4.0.0, jsonpointer@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
@ -5740,7 +5805,7 @@ lazy-val@^1.0.3:
lbry-redux@lbryio/lbry-redux:
version "0.0.1"
resolved "https://codeload.github.com/lbryio/lbry-redux/tar.gz/06cfc1c88cc4cc6dafd97647cd7529e0571256da"
resolved "https://codeload.github.com/lbryio/lbry-redux/tar.gz/5a6a7701969aef177934ce76aeb3233c746c8b49"
dependencies:
amplitude-js "^4.0.0"
bluebird "^3.5.1"
@ -5925,8 +5990,8 @@ locate-path@^2.0.0:
path-exists "^3.0.0"
lodash-es@^4.17.4, lodash-es@^4.17.5, lodash-es@^4.2.1:
version "4.17.8"
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.8.tgz#6fa8c8c5d337481df0bdf1c0d899d42473121e45"
version "4.17.10"
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.10.tgz#62cd7104cdf5dd87f235a837f0ede0e8e5117e05"
lodash.assign@^4.0.3, lodash.assign@^4.0.6, lodash.assign@^4.2.0:
version "4.2.0"
@ -6057,8 +6122,8 @@ lodash.unset@^4.5.2:
resolved "https://registry.yarnpkg.com/lodash.unset/-/lodash.unset-4.5.2.tgz#370d1d3e85b72a7e1b0cdf2d272121306f23e4ed"
lodash@^4.0.0, lodash@^4.1.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.4:
version "4.17.5"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
version "4.17.10"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
log-symbols@^1.0.2:
version "1.0.2"
@ -6377,8 +6442,8 @@ mixin-object@^2.0.1:
is-extendable "^0.1.1"
mixpanel-browser@^2.17.1:
version "2.20.0"
resolved "https://registry.yarnpkg.com/mixpanel-browser/-/mixpanel-browser-2.20.0.tgz#07cc666b3c7c95ac35b302a0fbc787b71921e595"
version "2.21.0"
resolved "https://registry.yarnpkg.com/mixpanel-browser/-/mixpanel-browser-2.21.0.tgz#930b540ad7eab400b97a1ff19e533c4f104f1b19"
mkdirp@0.5.0:
version "0.5.0"
@ -6515,8 +6580,8 @@ no-case@^2.2.0:
lower-case "^1.1.1"
node-abi@^2.2.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.3.0.tgz#f3d554d6ac72a9ee16f0f4dc9548db7c08de4986"
version "2.4.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.4.0.tgz#3c27515cb842f5bbc132a31254f9f1e1c55c7b83"
dependencies:
semver "^5.4.1"
@ -7792,7 +7857,7 @@ react@^0.14.2:
envify "^3.0.0"
fbjs "^0.6.1"
react@^16.3.0:
react@^16.2.0, react@^16.3.0:
version "16.3.2"
resolved "https://registry.yarnpkg.com/react/-/react-16.3.2.tgz#fdc8420398533a1e58872f59091b272ce2f91ea9"
dependencies:
@ -7939,6 +8004,10 @@ reduce-function-call@^1.0.1:
dependencies:
balanced-match "^0.4.2"
redux-action-buffer@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/redux-action-buffer/-/redux-action-buffer-1.2.0.tgz#2ec0a1d899cc9f6f44ccdeb431ee52ad41dd9755"
redux-logger@^3.0.1:
version "3.0.6"
resolved "https://registry.yarnpkg.com/redux-logger/-/redux-logger-3.0.6.tgz#f7555966f3098f3c88604c449cf0baf5778274bf"
@ -7952,6 +8021,17 @@ redux-persist-transform-compress@^4.2.0:
json-stringify-safe "^5.0.1"
lz-string "^1.4.4"
redux-persist-transform-filter@0.0.10:
version "0.0.10"
resolved "https://registry.yarnpkg.com/redux-persist-transform-filter/-/redux-persist-transform-filter-0.0.10.tgz#9a3b106ce8939d2cbbf5212c747ed177fff14280"
dependencies:
lodash.forin "^4.4.0"
lodash.get "^4.4.2"
lodash.isempty "^4.4.0"
lodash.pickby "^4.6.0"
lodash.set "^4.3.2"
lodash.unset "^4.5.2"
redux-persist-transform-filter@0.0.16:
version "0.0.16"
resolved "https://registry.yarnpkg.com/redux-persist-transform-filter/-/redux-persist-transform-filter-0.0.16.tgz#0c21dc166774c12fb3f090f7a2f5ea90f7ba0cea"
@ -8521,8 +8601,8 @@ simple-concat@^1.0.0:
resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6"
simple-get@^2.7.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.7.0.tgz#ad37f926d08129237ff08c4f2edfd6f10e0380b5"
version "2.8.1"
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d"
dependencies:
decompress-response "^3.3.0"
once "^1.3.1"
@ -8646,9 +8726,10 @@ source-map-support@^0.4.15:
source-map "^0.5.6"
source-map-support@^0.5.0, source-map-support@^0.5.3, source-map-support@^0.5.4:
version "0.5.4"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.4.tgz#54456efa89caa9270af7cd624cc2f123e51fbae8"
version "0.5.5"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.5.tgz#0d4af9e00493e855402e8ec36ebed2d266fceb90"
dependencies:
buffer-from "^1.0.0"
source-map "^0.6.0"
source-map-url@^0.4.0:
@ -9112,7 +9193,7 @@ through2@~0.2.3:
readable-stream "~1.1.9"
xtend "~2.1.1"
through@^2.3.6, through@^2.3.8, through@~2.3.4, through@~2.3.6:
"through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8, through@~2.3.4, through@~2.3.6:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
@ -9269,6 +9350,10 @@ ua-parser-js@^0.7.9:
version "0.7.17"
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac"
"ua-parser-js@github:amplitude/ua-parser-js#ed538f1":
version "0.7.10"
resolved "https://codeload.github.com/amplitude/ua-parser-js/tar.gz/ed538f16f5c6ecd8357da989b617d4f156dcf35d"
uglify-es@^3.3.4:
version "3.3.9"
resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
@ -9586,7 +9671,7 @@ vm-browserify@0.0.4:
dependencies:
indexof "0.0.1"
"vm2@github:patriksimek/vm2#custom_files":
vm2@patriksimek/vm2#custom_files:
version "3.5.0"
resolved "https://codeload.github.com/patriksimek/vm2/tar.gz/7e82f90ac705fc44fad044147cb0df09b4c79a57"