Merge branch 'master' into master

This commit is contained in:
Baltazar Gomez 2017-08-17 22:45:08 -06:00 committed by GitHub
commit ba35ac81aa
67 changed files with 223 additions and 22810 deletions

View file

@ -17,6 +17,10 @@ values =
production production
[bumpversion:file:app/package.json] [bumpversion:file:app/package.json]
search = "version": "{current_version}"
replace = "version": "{new_version}"
[bumpversion:file:ui/package.json] [bumpversion:file:ui/package.json]
search = "version": "{current_version}"
replace = "version": "{new_version}"

View file

@ -31,7 +31,7 @@ Tell us what happens instead
You can include a screenshot instead of typing it out --> You can include a screenshot instead of typing it out -->
<!-- For the daemon, run: <!-- For the daemon, run:
curl 'http://localhost:5279/lbryapi' --data '{"method":"version"}' curl 'http://localhost:5279' --data '{"method":"version"}'
and include the full output --> and include the full output -->
- LBRY Daemon version: - LBRY Daemon version:

View file

@ -11,17 +11,25 @@ Web UI version numbers should always match the corresponding version of LBRY App
* Added a new component, `FormFieldPrice` which is now used in Publish and Settings * Added a new component, `FormFieldPrice` which is now used in Publish and Settings
* Added a theme system to select different themes in Settings. * Added a theme system to select different themes in Settings.
* New Dark theme. * New Dark theme.
* Added wallet backup guide reference
* *
### Changed ### Changed
* Updated to daemon [0.15](https://github.com/lbryio/lbry/releases). Most relevant changes for app are improved announcing of content and a fix for the daemon getting stuck running.
* Some form field refactoring as we progress towards form sanity. * Some form field refactoring as we progress towards form sanity.
* When an "Open" button is clicked on a show page, if the file fails to open, the app will try to open the file's folder. * When an "Open" button is clicked on a show page, if the file fails to open, the app will try to open the file's folder.
* * Removed confusing placeholder text from email input
* Updated several packages and fixed warnings in build process (all but the [fsevents warning](https://github.com/yarnpkg/yarn/issues/3738), which is rather dramatic)
### Fixed ### Fixed
* Tiles will no longer be blurry on hover (Windows only bug) * Tiles will no longer be blurry on hover (Windows only bug)
* Removed placeholder values from price selection form fields, which was causing confusion that these were real values (#426) * Removed placeholder values from price selection form fields, which was causing confusion that these were real values (#426)
* * Fixed showing "other currency" help tip in publish form, which was caused due to not "setting" state for price
* Now using setState in formFieldPrice
* Public page now properly checks for all required fields are filled
* Fixed pagination styling for pages > 5 (#416)
* Fixed sizing on squat videos (#419)
* Support claims no longer show up on Published page (#384)
### Deprecated ### Deprecated
* *
@ -29,6 +37,7 @@ Web UI version numbers should always match the corresponding version of LBRY App
### Removed ### Removed
* Removed the label "Max Purchase Price" from settings page. It was redundant. * Removed the label "Max Purchase Price" from settings page. It was redundant.
* Unused old files from previous commit(9c3d633)
* *
## [0.14.3] - 2017-08-03 ## [0.14.3] - 2017-08-03

View file

@ -32,7 +32,7 @@ const DAEMON_PATH = process.env.LBRY_DAEMON || path.join(__dirname, 'dist', 'lbr
let client = jayson.client.http({ let client = jayson.client.http({
host: 'localhost', host: 'localhost',
port: 5279, port: 5279,
path: '/lbryapi', path: '/',
timeout: 1000 timeout: 1000
}); });

View file

@ -20,6 +20,8 @@
"electron-rebuild": "^1.5.11" "electron-rebuild": "^1.5.11"
}, },
"lbrySettings": { "lbrySettings": {
"lbrynetDaemonVersion": "0.14.2" "lbrynetDaemonVersion": "0.15.0",
} "lbrynetDaemonUrlTemplate": "https://github.com/lbryio/lbry/releases/download/vDAEMONVER/lbrynet-daemon-vDAEMONVER-OSNAME.zip"
},
"license": "MIT"
} }

View file

@ -1 +0,0 @@
https://github.com/lbryio/lbry/releases/download/v0.14.2/lbrynet-daemon-v0.14.2-OSNAME.zip

View file

@ -29,7 +29,10 @@ cd ..
# get daemon and cli executable # get daemon and cli executable
$daemon_url = (Get-Content build\DAEMON_URL -Raw).replace("OSNAME", "windows") $package_settings = (Get-Content app\package.json -Raw | ConvertFrom-Json).lbrySettings
$daemon_ver = $package_settings.lbrynetDaemonVersion
$daemon_url_template = $package_settings.lbrynetDaemonUrlTemplate
$daemon_url = $daemon_url_template.Replace('OSNAME', 'windows').Replace('DAEMONVER', $daemon_ver)
Invoke-WebRequest -Uri $daemon_url -OutFile daemon.zip Invoke-WebRequest -Uri $daemon_url -OutFile daemon.zip
Expand-Archive daemon.zip -DestinationPath app\dist\ Expand-Archive daemon.zip -DestinationPath app\dist\
dir app\dist\ # verify that daemon binary is there dir app\dist\ # verify that daemon binary is there

View file

@ -5,6 +5,7 @@ This script should be run locally, not on a build server.
import argparse import argparse
import contextlib import contextlib
import os import os
import json
import re import re
import requests import requests
import subprocess import subprocess
@ -16,7 +17,7 @@ import github
import changelog import changelog
ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
DAEMON_URL_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'DAEMON_URL') APP_PACKAGE_JSON_FILE = os.path.join(ROOT, 'app', 'package.json')
def main(): def main():
@ -38,11 +39,11 @@ def main():
print 'Current version: {}'.format(repo.current_version) print 'Current version: {}'.format(repo.current_version)
print 'New version: {}'.format(repo.new_version) print 'New version: {}'.format(repo.new_version)
with open(DAEMON_URL_FILE, 'r') as f: with open(APP_PACKAGE_JSON_FILE, 'r') as f:
daemon_url_template = f.read().strip() package_settings = json.load(f)['lbrySettings']
daemon_version = re.search('/(?P<version>v[^/]+)', daemon_url_template) daemon_url_template = package_settings['lbrynetDaemonUrlTemplate']
print 'Daemon version: {} ({})'.format( daemon_version = package_settings['lbrynetDaemonVersion']
daemon_version.group('version'), daemon_url_template) print 'Daemon version: {} ({})'.format(daemon_version, daemon_url_template.replace('DAEMONVER', daemon_version))
if not args.confirm and not confirm(): if not args.confirm and not confirm():
print "Aborting" print "Aborting"
@ -190,18 +191,25 @@ def run_sanity_checks(repo, branch):
def check_daemon_urls(): def check_daemon_urls():
success = True with open(APP_PACKAGE_JSON_FILE, 'r') as f:
with open(DAEMON_URL_FILE, 'r') as f: package_settings = json.load(f)['lbrySettings']
daemon_url_template = f.read().strip()
if "OSNAME" not in daemon_url_template:
print "Daemon URL must include the string 'OSNAME'"
return False
for osname in ('linux', 'macos', 'windows'):
if not check_url(daemon_url_template.replace('OSNAME', osname)):
success = False
print "Daemon URL for " + osname + " does not work"
return success
daemon_url_template = package_settings['lbrynetDaemonUrlTemplate']
daemon_version = package_settings['lbrynetDaemonVersion']
if "OSNAME" not in daemon_url_template:
print "Daemon URL must include the string \"OSNAME\""
return False
elif "DAEMONVER" not in daemon_url_template:
print "Daemon URL must include the string \"DAEMONVER\""
return False
for osname in ('linux', 'macos', 'windows'):
if not check_url(daemon_url_template.replace('DAEMONVER', daemon_version).replace('OSNAME', osname)):
print "Daemon URL for", osname, " does not work"
return False
return True
def check_url(url): def check_url(url):
url = url.strip() url = url.strip()

View file

@ -60,5 +60,6 @@
"electron": "^1.7.5", "electron": "^1.7.5",
"electron-builder": "^11.7.0", "electron-builder": "^11.7.0",
"electron-debug": "^1.4.0" "electron-debug": "^1.4.0"
} },
"license": "MIT"
} }

3
ui/dist/index.html vendored
View file

@ -4,7 +4,6 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<title>LBRY</title> <title>LBRY</title>
<link href='https://fonts.googleapis.com/css?family=Raleway:600,300' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400italic,600italic,600' rel='stylesheet' type='text/css'> <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400italic,600italic,600' rel='stylesheet' type='text/css'>
<link href="./css/all.css" rel="stylesheet" type="text/css" media="screen,print" /> <link href="./css/all.css" rel="stylesheet" type="text/css" media="screen,print" />
<link rel="icon" type="image/png" href="./img/fav/favicon-32x32.png" sizes="32x32"> <link rel="icon" type="image/png" href="./img/fav/favicon-32x32.png" sizes="32x32">
@ -19,8 +18,6 @@
</head> </head>
<body> <body>
<div id="canvas"></div> <div id="canvas"></div>
<script src="./js/mediaelement/jquery.js"></script>
<script src="./js/mediaelement/mediaelement-and-player.js"></script>
<script src="./js/bundle.js"></script> <script src="./js/bundle.js"></script>
</body> </body>
</html> </html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -1,14 +0,0 @@
<?xml version="1.0" standalone="no"?>
<svg id="bigplay" viewBox="0 0 100 200" style="background-color:#ffffff00" version="1.1"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve"
x="0px" y="0px" width="100px" height="200px"
>
<g id="dark">
<path id="Polygon" d="M 72.5 49.5 L 38.75 68.9856 L 38.75 30.0144 L 72.5 49.5 Z" fill="#ffffff" opacity="0.75" />
<path id="Ellipse" d="M 13 50.5 C 13 29.7891 29.7891 13 50.5 13 C 71.2109 13 88 29.7891 88 50.5 C 88 71.2109 71.2109 88 50.5 88 C 29.7891 88 13 71.2109 13 50.5 Z" stroke="#ffffff" stroke-width="5" fill="none" opacity="0.75"/>
</g>
<g id="light">
<path id="Polygon2" d="M 72.5 149.5 L 38.75 168.9856 L 38.75 130.0144 L 72.5 149.5 Z" fill="#ffffff" opacity="1.0" />
<path id="Ellipse2" d="M 13 150.5 C 13 129.7891 29.7891 113 50.5 113 C 71.2109 113 88 129.7891 88 150.5 C 88 171.211 71.2109 188 50.5 188 C 29.7891 188 13 171.211 13 150.5 Z" stroke="#ffffff" stroke-width="5" fill="none" opacity="1.0"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,289 +0,0 @@
/* TED player */
.mejs-container.mejs-ted {
}
.mejs-ted .mejs-controls {
background: #eee;
height: 65px;
}
.mejs-ted .mejs-button,
.mejs-ted .mejs-time {
position: absolute;
background: #ddd;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-total {
background-color: none;
background: url(controls-ted.png) repeat-x 0 -52px;
height: 6px;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-buffering {
height: 6px;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-loaded {
background-color: none;
background: url(controls-ted.png) repeat-x 0 -52px;
width: 0;
height: 6px;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-current {
width: 0;
height: 6px;
background-color: none;
background: url(controls-ted.png) repeat-x 0 -59px;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-handle {
display: block;
margin: 0;
width: 14px;
height: 21px;
top: -7px;
border: 0;
background: url(controls-ted.png) no-repeat 0 0;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-float {
display: none;
}
.mejs-ted .mejs-controls .mejs-playpause-button {
top: 29px;
left: 9px;
width: 49px;
height: 28px;
}
.mejs-ted .mejs-controls .mejs-playpause-button button {
width: 49px;
height: 28px;
background: url(controls-ted.png) no-repeat -50px -23px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-pause button {
background-position: 0 -23px;
}
.mejs-ted .mejs-controls .mejs-fullscreen-button {
top: 34px;
right: 9px;
width: 17px;
height: 15px;
background : none;
}
.mejs-ted .mejs-controls .mejs-fullscreen-button button {
width: 19px;
height: 17px;
background: transparent url(controls-ted.png) no-repeat 0 -66px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-unfullscreen button {
background: transparent url(controls-ted.png) no-repeat -21px -66px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-volume-button {
top: 30px;
right: 35px;
width: 24px;
height: 22px;
}
.mejs-ted .mejs-controls .mejs-mute button {
background: url(controls-ted.png) no-repeat -15px 0;
width: 24px;
height: 22px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-unmute button {
background: url(controls-ted.png) no-repeat -40px 0;
width: 24px;
height: 22px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-slider {
background: #fff;
border: solid 1px #aaa;
border-width: 1px 1px 0 1px;
width: 22px;
height: 65px;
top: -65px;
}
.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-total {
background: url(controls-ted.png) repeat-y -41px -66px;
left: 8px;
width: 6px;
height: 50px;
}
.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-current {
left: 8px;
width: 6px;
background: url(controls-ted.png) repeat-y -48px -66px;
height: 50px;
}
.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-handle {
display: none;
}
.mejs-ted .mejs-controls .mejs-time span {
color: #333;
}
.mejs-ted .mejs-controls .mejs-currenttime-container {
position: absolute;
top: 32px;
right: 100px;
border: solid 1px #999;
background: #fff;
color: #333;
padding-top: 2px;
border-radius: 3px;
color: #333;
}
.mejs-ted .mejs-controls .mejs-duration-container {
position: absolute;
top: 32px;
right: 65px;
border: solid 1px #999;
background: #fff;
color: #333;
padding-top: 2px;
border-radius: 3px;
color: #333;
}
.mejs-ted .mejs-controls .mejs-time button{
color: #333;
}
.mejs-ted .mejs-controls .mejs-captions-button {
display: none;
}
/* END: TED player */
/* WMP player */
.mejs-container.mejs-wmp {
}
.mejs-wmp .mejs-controls {
background: transparent url(controls-wmp-bg.png) center 16px no-repeat;
height: 65px;
}
.mejs-wmp .mejs-button,
.mejs-wmp .mejs-time {
position: absolute;
background: transparent;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-total {
background-color: transparent;
border: solid 1px #ccc;
height: 3px;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-buffering {
height: 3px;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-loaded {
background-color: rgba(255,255,255,0.3);
width: 0;
height: 3px;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-current {
width: 0;
height: 1px;
background-color: #014CB6;
border: solid 1px #7FC9FA;
border-width: 1px 0;
border-color: #7FC9FA #fff #619FF2 #fff;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-handle {
display: block;
margin: 0;
width: 16px;
height: 9px;
top: -3px;
border: 0;
background: url(controls-wmp.png) no-repeat 0 -80px;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-float {
display: none;
}
.mejs-wmp .mejs-controls .mejs-playpause-button {
top: 10px;
left: 50%;
margin: 10px 0 0 -20px;
width: 40px;
height: 40px;
}
.mejs-wmp .mejs-controls .mejs-playpause-button button {
width: 40px;
height: 40px;
background: url(controls-wmp.png) no-repeat 0 0;
margin: 0;
padding: 0;
}
.mejs-wmp .mejs-controls .mejs-pause button {
background-position: 0 -40px;
}
.mejs-wmp .mejs-controls .mejs-currenttime-container {
position: absolute;
top: 25px;
left: 50%;
margin-left: -93px;
}
.mejs-wmp .mejs-controls .mejs-duration-container {
position: absolute;
top: 25px;
left: 50%;
margin-left: -58px;
}
.mejs-wmp .mejs-controls .mejs-volume-button {
top: 32px;
right: 50%;
margin-right: -55px;
width: 20px;
height: 15px;
}
.mejs-wmp .mejs-controls .mejs-volume-button button {
margin: 0;
padding: 0;
background: url(controls-wmp.png) no-repeat -42px -17px;
width: 20px;
height: 15px;
}
.mejs-wmp .mejs-controls .mejs-unmute button {
margin: 0;
padding: 0;
background: url(controls-wmp.png) no-repeat -42px 0;
width: 20px;
height: 15px;
}
.mejs-wmp .mejs-controls .mejs-volume-button .mejs-volume-slider {
background: rgba(102,102,102,0.6);
}
.mejs-wmp .mejs-controls .mejs-fullscreen-button {
top: 32px;
right: 50%;
margin-right: -82px;
width: 15px;
height: 14px;
}
.mejs-wmp .mejs-controls .mejs-fullscreen-button button {
margin: 0;
padding: 0;
background: url(controls-wmp.png) no-repeat -63px 0;
width: 15px;
height: 14px;
}
.mejs-wmp .mejs-controls .mejs-captions-button {
display: none;
}
/* END: WMP player */

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

3
ui/dist/quit.html vendored
View file

@ -3,8 +3,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<title>LBRY</title> <title>LBRY</title>
<link href='https://fonts.googleapis.com/css?family=Raleway:600,300' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400italic,600italic,600' rel='stylesheet' type='text/css'> <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400italic,600italic,600' rel='stylesheet' type='text/css'>
<link href="./css/all.css" rel="stylesheet" type="text/css" media="screen,print" /> <link href="./css/all.css" rel="stylesheet" type="text/css" media="screen,print" />
<link href="./js/mediaelement/mediaelementplayer.css" rel="stylesheet" type="text/css" /> <link href="./js/mediaelement/mediaelementplayer.css" rel="stylesheet" type="text/css" />

View file

@ -3,11 +3,9 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<title>LBRY</title> <title>LBRY</title>
<link href='https://fonts.googleapis.com/css?family=Raleway:600,300' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400italic,600italic,600' rel='stylesheet' type='text/css'> <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400italic,600italic,600' rel='stylesheet' type='text/css'>
<link href="./css/all.css" rel="stylesheet" type="text/css" media="screen,print" /> <link href="./css/all.css" rel="stylesheet" type="text/css" media="screen,print" />
<link href="./js/mediaelement/mediaelementplayer.css" rel="stylesheet" type="text/css" />
<link rel="icon" type="image/png" href="./img/fav/favicon-32x32.png" sizes="32x32"> <link rel="icon" type="image/png" href="./img/fav/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="./img/fav/favicon-194x194.png" sizes="194x194"> <link rel="icon" type="image/png" href="./img/fav/favicon-194x194.png" sizes="194x194">
<link rel="icon" type="image/png" href="./img/fav/favicon-96x96.png" sizes="96x96"> <link rel="icon" type="image/png" href="./img/fav/favicon-96x96.png" sizes="96x96">

View file

@ -3,11 +3,9 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<title>LBRY</title> <title>LBRY</title>
<link href='https://fonts.googleapis.com/css?family=Raleway:600,300' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400italic,600italic,600' rel='stylesheet' type='text/css'> <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400italic,600italic,600' rel='stylesheet' type='text/css'>
<link href="./css/all.css" rel="stylesheet" type="text/css" media="screen,print" /> <link href="./css/all.css" rel="stylesheet" type="text/css" media="screen,print" />
<link href="./js/mediaelement/mediaelementplayer.css" rel="stylesheet" type="text/css" />
<link rel="icon" type="image/png" href="./img/fav/favicon-32x32.png" sizes="32x32"> <link rel="icon" type="image/png" href="./img/fav/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="./img/fav/favicon-194x194.png" sizes="194x194"> <link rel="icon" type="image/png" href="./img/fav/favicon-194x194.png" sizes="194x194">
<link rel="icon" type="image/png" href="./img/fav/favicon-96x96.png" sizes="96x96"> <link rel="icon" type="image/png" href="./img/fav/favicon-96x96.png" sizes="96x96">

View file

@ -104,7 +104,7 @@ export function doSendDraftTransaction() {
}; };
lbry lbry
.send_amount_to_address({ .wallet_send({
amount: draftTx.amount, amount: draftTx.amount,
address: draftTx.address, address: draftTx.address,
}) })

View file

@ -72,25 +72,28 @@ export class CreditAmount extends React.PureComponent {
}; };
static defaultProps = { static defaultProps = {
precision: 1, precision: 2,
label: true, label: true,
showFree: false, showFree: false,
look: "indicator", look: "indicator",
}; };
render() { render() {
const formattedAmount = formatCredits( const minimumRenderableAmount = Math.pow(10, -1 * this.props.precision);
this.props.amount, const { amount, precision } = this.props;
this.props.precision
); let formattedAmount = amount > 0 && amount < minimumRenderableAmount
? "<" + minimumRenderableAmount
: formatCredits(amount, precision);
let amountText; let amountText;
if (this.props.showFree && parseFloat(formattedAmount) == 0) { if (this.props.showFree && parseFloat(this.props.amount) === 0) {
amountText = __("free"); amountText = __("free");
} else if (this.props.label) { } else if (this.props.label) {
amountText = amountText =
formattedAmount + formattedAmount +
" " + " " +
(parseFloat(formattedAmount) == 1 ? __("credit") : __("credits")); (parseFloat(amount) == 1 ? __("credit") : __("credits"));
} else { } else {
amountText = formattedAmount; amountText = formattedAmount;
} }

View file

@ -14,21 +14,23 @@ class FormFieldPrice extends React.PureComponent {
}; };
} }
dispatchChange() { handleChange(newValues) {
const newState = Object.assign({}, this.state, newValues);
this.setState(newState);
this.props.onChange({ this.props.onChange({
amount: this.state.amount, amount: newState.amount,
currency: this.state.currency, currency: newState.currency,
}); });
} }
handleFeeAmountChange(event) { handleFeeAmountChange(event) {
this.state.amount = event.target.value ? Number(event.target.value) : null; this.handleChange({
this.dispatchChange(); amount: event.target.value ? Number(event.target.value) : null,
});
} }
handleFeeCurrencyChange(event) { handleFeeCurrencyChange(event) {
this.state.currency = event.target.value; this.handleChange({ currency: event.target.value });
this.dispatchChange();
} }
render() { render() {

View file

@ -17,11 +17,9 @@ const Link = props => {
const className = const className =
(props.className || "") + (props.className || "") +
(!props.className && !props.button ? "button-text" : "") + // Non-button links get the same look as text buttons (!props.className && !button ? "button-text" : "") + // Non-button links get the same look as text buttons
(props.button (button ? " button-block button-" + button + " button-set-item" : "") +
? " button-block button-" + props.button + " button-set-item" (disabled ? " disabled" : "");
: "") +
(props.disabled ? " disabled" : "");
let content; let content;
if (children) { if (children) {

View file

@ -1,5 +0,0 @@
import React from "react";
import { connect } from "react-redux";
import FormFieldPrice from "./view";
export default connect(null, null)(FormFieldPrice);

View file

@ -1,71 +0,0 @@
import React from "react";
import FormField from "component/formField";
class FormFieldPrice extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
price: {
feeAmount: "",
feeCurrency: "LBC",
},
};
}
handleFeeAmountChange(event) {
this.setState({
price: {
...this.state.price,
feeAmount: event.target.value,
},
});
this.props.onChange(event.target.name, this.state.price);
}
handleFeeCurrencyChange(event) {
this.setState({
price: {
...this.state.price,
feeCurrency: event.target.value,
},
});
this.props.onChange(event.target.name, this.state.price);
}
render() {
const {
defaultAmount,
defaultCurrency,
placeholder,
min,
step,
} = this.props;
return (
<span className={"form-field "}>
<FormField
type="number"
name="amount"
min={min}
placeholder={placeholder || null}
step={step}
onChange={event => this.handleFeeAmountChange(event)}
defaultValue={defaultAmount}
className="form-field__input--inline"
/>
<FormField
type="select"
name="currency"
onChange={event => this.handleFeeCurrencyChange(event)}
defaultValue={defaultCurrency}
className="form-field__input--inline"
>
<option value="LBC">{__("LBRY credits")}</option>
<option value="USD">{__("US Dollars")}</option>
</FormField>
</span>
);
}
}
export default FormFieldPrice;

View file

@ -55,7 +55,7 @@ class ChannelSection extends React.PureComponent {
handleCreateChannelClick(event) { handleCreateChannelClick(event) {
if (this.state.newChannelName.length < 5) { if (this.state.newChannelName.length < 5) {
this.refs.newChannelName.showError( this.refs.newChannelName.showError(
__("LBRY channel names must be at least 4 characters in length.") __("LBRY channel names must be at least 5 characters in length.")
); );
return; return;
} }

View file

@ -309,8 +309,10 @@ class PublishForm extends React.PureComponent {
} }
handleFeeChange(newValue) { handleFeeChange(newValue) {
this.state.feeAmount = newValue.amount; this.setState({
this.state.feeCurrency = newValue.currency; feeAmount: newValue.amount,
feeCurrency: newValue.currency,
});
} }
handleFeePrefChange(feeEnabled) { handleFeePrefChange(feeEnabled) {
@ -375,46 +377,6 @@ class PublishForm extends React.PureComponent {
}); });
} }
handleCreateChannelClick(event) {
if (this.state.newChannelName.length < 5) {
this.refs.newChannelName.showError(
__("LBRY channel names must be at least 4 characters in length.")
);
return;
}
this.setState({
creatingChannel: true,
});
const newChannelName = this.state.newChannelName;
lbry
.channel_new({
channel_name: newChannelName,
amount: parseFloat(this.state.newChannelBid),
})
.then(
() => {
setTimeout(() => {
this.setState({
creatingChannel: false,
});
this._updateChannelList(newChannelName);
}, 10000);
},
error => {
// TODO: better error handling
this.refs.newChannelName.showError(
__("Unable to create channel due to an internal error.")
);
this.setState({
creatingChannel: false,
});
}
);
}
getLicense() { getLicense() {
switch (this.state.licenseType) { switch (this.state.licenseType) {
case "copyright": case "copyright":
@ -562,6 +524,7 @@ class PublishForm extends React.PureComponent {
: <div> : <div>
<div className="card__content"> <div className="card__content">
<FormRow <FormRow
ref="meta_title"
label={__("Title")} label={__("Title")}
type="text" type="text"
name="title" name="title"
@ -670,12 +633,7 @@ class PublishForm extends React.PureComponent {
onChange={val => this.handleFeeChange(val)} onChange={val => this.handleFeeChange(val)}
/> />
</span> </span>
{/* {this.state.isFee && this.state.feeCurrency.toUpperCase() != "LBC"
&& this.state.feeCurrency.toUpperCase() != "LBC"
for some reason, react does not trigger a re-render on currency change (despite trigger a state change), so
the above logic cannot be added to the below check
*/}
{this.state.isFee
? <div className="form-field__helper"> ? <div className="form-field__helper">
{__( {__(
"All content fees are charged in LBC. For non-LBC payment methods, the number of credits charged will be adjusted based on the value of LBRY credits at the time of purchase." "All content fees are charged in LBC. For non-LBC payment methods, the number of credits charged will be adjusted based on the value of LBRY credits at the time of purchase."
@ -828,6 +786,7 @@ class PublishForm extends React.PureComponent {
ref="bid" ref="bid"
type="number" type="number"
step="0.01" step="0.01"
min="0"
label={__("Deposit")} label={__("Deposit")}
postfix="LBC" postfix="LBC"
onChange={event => { onChange={event => {
@ -836,6 +795,7 @@ class PublishForm extends React.PureComponent {
value={this.state.bid} value={this.state.bid}
placeholder={this.claim() ? this.topClaimValue() + 10 : 100} placeholder={this.claim() ? this.topClaimValue() + 10 : 100}
helper={lbcInputHelp} helper={lbcInputHelp}
min="0"
/> />
</div> </div>
: ""} : ""}
@ -847,6 +807,7 @@ class PublishForm extends React.PureComponent {
</div> </div>
<div className="card__content"> <div className="card__content">
<FormRow <FormRow
ref="tosAgree"
label={ label={
<span> <span>
{__("I agree to the")} {__("I agree to the")}

View file

@ -14,6 +14,7 @@ import FileListPublished from "page/fileListPublished";
import ChannelPage from "page/channel"; import ChannelPage from "page/channel";
import SearchPage from "page/search"; import SearchPage from "page/search";
import AuthPage from "page/auth"; import AuthPage from "page/auth";
import BackupPage from "page/backup";
const route = (page, routesMap) => { const route = (page, routesMap) => {
const component = routesMap[page]; const component = routesMap[page];
@ -26,6 +27,7 @@ const Router = props => {
return route(currentPage, { return route(currentPage, {
auth: <AuthPage params={params} />, auth: <AuthPage params={params} />,
backup: <BackupPage params={params} />,
channel: <ChannelPage params={params} />, channel: <ChannelPage params={params} />,
developer: <DeveloperPage params={params} />, developer: <DeveloperPage params={params} />,
discover: <DiscoverPage params={params} />, discover: <DiscoverPage params={params} />,

View file

@ -34,7 +34,7 @@ class UserEmailNew extends React.PureComponent {
<FormRow <FormRow
type="text" type="text"
label="Email" label="Email"
placeholder="scrwvwls@lbry.io" placeholder="youremail@example.org"
name="email" name="email"
value={this.state.email} value={this.state.email}
errorMessage={errorMessage} errorMessage={errorMessage}

View file

@ -25,6 +25,7 @@ const WalletSend = props => {
label={__("Amount")} label={__("Amount")}
postfix={__("LBC")} postfix={__("LBC")}
step="0.01" step="0.01"
min="0"
type="number" type="number"
placeholder="1.23" placeholder="1.23"
size="10" size="10"

View file

@ -9,7 +9,7 @@ const menu = remote.require("./menu/main-menu");
let lbry = { let lbry = {
isConnected: false, isConnected: false,
daemonConnectionString: "http://localhost:5279/lbryapi", daemonConnectionString: "http://localhost:5279",
pendingPublishTimeout: 20 * 60 * 1000, pendingPublishTimeout: 20 * 60 * 1000,
defaultClientSettings: { defaultClientSettings: {
showNsfw: false, showNsfw: false,

View file

@ -35,7 +35,7 @@ window.addEventListener("popstate", (event, param) => {
let action; let action;
if (hash !== "") { if (hash !== "") {
const url = hash.split("#")[1]; const url = hash.replace(/^#/, "");
const { params, scrollY } = event.state || {}; const { params, scrollY } = event.state || {};
const queryString = toQueryString(params); const queryString = toQueryString(params);

View file

@ -0,0 +1,10 @@
import React from "react";
import { connect } from "react-redux";
import { selectDaemonSettings } from "selectors/settings";
import BackupPage from "./view";
const select = state => ({
daemonSettings: selectDaemonSettings(state),
});
export default connect(select, null)(BackupPage);

View file

@ -0,0 +1,55 @@
import React from "react";
import SubHeader from "component/subHeader";
import Link from "component/link";
class BackupPage extends React.PureComponent {
render() {
const { daemonSettings } = this.props;
if (!daemonSettings || Object.keys(daemonSettings).length === 0) {
return (
<main className="main--single-column">
<SubHeader />
<span className="empty">{__("Failed to load settings.")}</span>
</main>
);
}
return (
<main className="main--single-column">
<SubHeader />
<section className="card">
<div className="card__title-primary">
<h3>{__("Backup Wallet")}</h3>
</div>
<div className="card__content">
<p>
{__(
"Currently, there is no automatic wallet backup, but it is fairly easy to back up manually."
)}
</p>
<p>
{__(
"To backup your wallet, make a copy of the folder listed below:"
)}
</p>
<p>
<code>
{__(`${daemonSettings.lbryum_wallet_dir}`)}
</code>
</p>
<p>
<strong>
{__(
"Access to these files are equivalent to having access to your credits. Keep any copies you make of your wallet in a secure place."
)}
</strong>
</p>
</div>
</section>
</main>
);
}
}
export default BackupPage;

View file

@ -83,6 +83,7 @@ class ChannelPage extends React.PureComponent {
pageClassName="pagination__item" pageClassName="pagination__item"
previousClassName="pagination__item pagination__item--previous" previousClassName="pagination__item pagination__item--previous"
nextClassName="pagination__item pagination__item--next" nextClassName="pagination__item pagination__item--next"
breakClassName="pagination__item pagination__item--break"
marginPagesDisplayed={2} marginPagesDisplayed={2}
onPageChange={e => this.changePage(e.selected + 1)} onPageChange={e => this.changePage(e.selected + 1)}
initialPage={parseInt(page - 1)} initialPage={parseInt(page - 1)}

View file

@ -1,5 +1,6 @@
import React from "react"; import React from "react";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { doNavigate } from "actions/app";
import { selectCurrentPage } from "selectors/app"; import { selectCurrentPage } from "selectors/app";
import { selectBalance } from "selectors/wallet"; import { selectBalance } from "selectors/wallet";
import WalletPage from "./view"; import WalletPage from "./view";
@ -9,4 +10,8 @@ const select = state => ({
balance: selectBalance(state), balance: selectBalance(state),
}); });
export default connect(select, null)(WalletPage); const perform = dispatch => ({
navigate: path => dispatch(doNavigate(path)),
});
export default connect(select, perform)(WalletPage);

View file

@ -3,11 +3,11 @@ import SubHeader from "component/subHeader";
import TransactionList from "component/transactionList"; import TransactionList from "component/transactionList";
import WalletAddress from "component/walletAddress"; import WalletAddress from "component/walletAddress";
import WalletSend from "component/walletSend"; import WalletSend from "component/walletSend";
import Link from "component/link";
import { CreditAmount } from "component/common"; import { CreditAmount } from "component/common";
const WalletPage = props => { const WalletPage = props => {
const { balance, currentPage } = props; const { balance, currentPage, navigate } = props;
return ( return (
<main className="main--single-column"> <main className="main--single-column">
@ -19,6 +19,14 @@ const WalletPage = props => {
<div className="card__content"> <div className="card__content">
<CreditAmount amount={balance} precision={8} /> <CreditAmount amount={balance} precision={8} />
</div> </div>
<div className="card__content">
<div className="help">
<Link
onClick={() => navigate("/backup")}
label={__("Backup Your Wallet")}
/>
</div>
</div>
</section> </section>
{currentPage === "wallet" ? <TransactionList {...props} /> : ""} {currentPage === "wallet" ? <TransactionList {...props} /> : ""}
{currentPage === "send" ? <WalletSend {...props} /> : ""} {currentPage === "send" ? <WalletSend {...props} /> : ""}

View file

@ -50,7 +50,7 @@ reducers[types.FETCH_CLAIM_LIST_MINE_COMPLETED] = function(state, action) {
.filter(claimId => Object.keys(abandoningById).indexOf(claimId) === -1) .filter(claimId => Object.keys(abandoningById).indexOf(claimId) === -1)
); );
claims.forEach(claim => { claims.filter(claim => claim.category.match(/claim/)).forEach(claim => {
byId[claim.claim_id] = claim; byId[claim.claim_id] = claim;
const pending = Object.values(pendingById).find(pendingClaim => { const pending = Object.values(pendingById).find(pendingClaim => {

View file

@ -41,6 +41,8 @@ export const selectPageTitle = createSelector(
return __("Send"); return __("Send");
case "receive": case "receive":
return __("Receive"); return __("Receive");
case "backup":
return __("Backup");
case "rewards": case "rewards":
return __("Rewards"); return __("Rewards");
case "start": case "start":
@ -130,11 +132,13 @@ export const selectDownloadComplete = createSelector(
); );
export const selectHeaderLinks = createSelector(selectCurrentPage, page => { export const selectHeaderLinks = createSelector(selectCurrentPage, page => {
// This contains intentional fall throughs
switch (page) { switch (page) {
case "wallet": case "wallet":
case "send": case "send":
case "receive": case "receive":
case "rewards": case "rewards":
case "backup":
return { return {
wallet: __("Overview"), wallet: __("Overview"),
send: __("Send"), send: __("Send"),

View file

@ -57,6 +57,7 @@ export const selectWunderBarIcon = createSelector(selectCurrentPage, page => {
case "wallet": case "wallet":
case "send": case "send":
case "receive": case "receive":
case "backup":
return "icon-bank"; return "icon-bank";
case "show": case "show":
return "icon-file"; return "icon-file";

View file

@ -23,7 +23,7 @@
"homepage": "https://github.com/lbryio/lbry-app", "homepage": "https://github.com/lbryio/lbry-app",
"dependencies": { "dependencies": {
"from2": "^2.3.0", "from2": "^2.3.0",
"jshashes": "^1.0.6", "jshashes": "^1.0.7",
"localforage": "^1.5.0", "localforage": "^1.5.0",
"node-sass": "^4.5.3", "node-sass": "^4.5.3",
"rc-progress": "^2.0.6", "rc-progress": "^2.0.6",
@ -49,7 +49,7 @@
"babel": "^6.5.2", "babel": "^6.5.2",
"babel-cli": "^6.24.1", "babel-cli": "^6.24.1",
"babel-core": "^6.18.2", "babel-core": "^6.18.2",
"babel-loader": "^6.4.1", "babel-loader": "^7.1.1",
"babel-plugin-react-require": "^3.0.0", "babel-plugin-react-require": "^3.0.0",
"babel-polyfill": "^6.20.0", "babel-polyfill": "^6.20.0",
"babel-preset-es2015": "^6.24.1", "babel-preset-es2015": "^6.24.1",

View file

@ -26,6 +26,10 @@
font-size: 1.2em; font-size: 1.2em;
} }
.pagination__item--break {
padding: 0 $spacing-vertical * 2 / 3;
}
.pagination__item--selected { .pagination__item--selected {
color: white; color: white;
background: $color-primary; background: $color-primary;

View file

@ -20,9 +20,10 @@ video {
position: relative; position: relative;
video { video {
height: 100%; height: 100%;
width: 100%;
position: absolute; position: absolute;
left: 0;
top: 0; top: 0;
left: 0;
} }
&.video--hidden { &.video--hidden {
height: $height-video-embedded; height: $height-video-embedded;

View file

@ -2,6 +2,8 @@ const path = require("path");
const webpack = require("webpack") const webpack = require("webpack")
const appPath = path.resolve(__dirname, "js"); const appPath = path.resolve(__dirname, "js");
process.traceDeprecation = true;
const PATHS = { const PATHS = {
app: path.join(__dirname, "app"), app: path.join(__dirname, "app"),
dist: path.join(__dirname, "dist") dist: path.join(__dirname, "dist")

View file

@ -455,14 +455,13 @@ babel-helpers@^6.24.1:
babel-runtime "^6.22.0" babel-runtime "^6.22.0"
babel-template "^6.24.1" babel-template "^6.24.1"
babel-loader@^6.4.1: babel-loader@^7.1.1:
version "6.4.1" version "7.1.1"
resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42d50b8ca" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.1.tgz#b87134c8b12e3e4c2a94e0546085bc680a2b8488"
dependencies: dependencies:
find-cache-dir "^0.1.1" find-cache-dir "^1.0.0"
loader-utils "^0.2.16" loader-utils "^1.0.2"
mkdirp "^0.5.1" mkdirp "^0.5.1"
object-assign "^4.0.1"
babel-messages@^6.23.0: babel-messages@^6.23.0:
version "6.23.0" version "6.23.0"
@ -2333,14 +2332,6 @@ faye-websocket@~0.11.0:
dependencies: dependencies:
websocket-driver ">=0.5.1" websocket-driver ">=0.5.1"
fbjs@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.2.1.tgz#622061630a43e11f845017b9044aaa648ed3f731"
dependencies:
core-js "^1.0.0"
promise "^7.0.3"
whatwg-fetch "^0.9.0"
fbjs@^0.6.1: fbjs@^0.6.1:
version "0.6.1" version "0.6.1"
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.6.1.tgz#9636b7705f5ba9684d44b72f78321254afc860f7" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.6.1.tgz#9636b7705f5ba9684d44b72f78321254afc860f7"
@ -2411,6 +2402,14 @@ find-cache-dir@^0.1.1:
mkdirp "^0.5.1" mkdirp "^0.5.1"
pkg-dir "^1.0.0" pkg-dir "^1.0.0"
find-cache-dir@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
dependencies:
commondir "^1.0.1"
make-dir "^1.0.0"
pkg-dir "^2.0.0"
find-parent-dir@^0.3.0: find-parent-dir@^0.3.0:
version "0.3.0" version "0.3.0"
resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54"
@ -2422,7 +2421,7 @@ find-up@^1.0.0:
path-exists "^2.0.0" path-exists "^2.0.0"
pinkie-promise "^2.0.0" pinkie-promise "^2.0.0"
find-up@^2.0.0: find-up@^2.0.0, find-up@^2.1.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
dependencies: dependencies:
@ -3204,9 +3203,9 @@ jsesc@~0.5.0:
version "0.5.0" version "0.5.0"
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
jshashes@^1.0.6: jshashes@^1.0.7:
version "1.0.6" version "1.0.7"
resolved "https://registry.yarnpkg.com/jshashes/-/jshashes-1.0.6.tgz#b04eb4ae8f9987b2d3ce00a6337c120543949bfd" resolved "https://registry.yarnpkg.com/jshashes/-/jshashes-1.0.7.tgz#bed8c97a0e9632fd0513916f55f76dd5486be59f"
json-loader@^0.5.4: json-loader@^0.5.4:
version "0.5.4" version "0.5.4"
@ -3571,10 +3570,6 @@ lodash.unset@^4.5.2:
version "4.5.2" version "4.5.2"
resolved "https://registry.yarnpkg.com/lodash.unset/-/lodash.unset-4.5.2.tgz#370d1d3e85b72a7e1b0cdf2d272121306f23e4ed" resolved "https://registry.yarnpkg.com/lodash.unset/-/lodash.unset-4.5.2.tgz#370d1d3e85b72a7e1b0cdf2d272121306f23e4ed"
lodash@4.12.0:
version "4.12.0"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.12.0.tgz#2bd6dc46a040f59e686c972ed21d93dc59053258"
lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.4: lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.4:
version "4.17.4" version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
@ -3624,6 +3619,12 @@ macaddress@^0.2.8:
version "0.2.8" version "0.2.8"
resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12"
make-dir@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978"
dependencies:
pify "^2.3.0"
map-obj@^1.0.0, map-obj@^1.0.1: map-obj@^1.0.0, map-obj@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
@ -4345,7 +4346,7 @@ performance-now@^0.2.0:
version "0.2.0" version "0.2.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
pify@^2.0.0: pify@^2.0.0, pify@^2.3.0:
version "2.3.0" version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
@ -4369,6 +4370,12 @@ pkg-dir@^1.0.0:
dependencies: dependencies:
find-up "^1.0.0" find-up "^1.0.0"
pkg-dir@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
dependencies:
find-up "^2.1.0"
pluralize@^1.2.1: pluralize@^1.2.1:
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
@ -4783,10 +4790,6 @@ rc@^1.1.7:
minimist "^1.2.0" minimist "^1.2.0"
strip-json-comments "~2.0.1" strip-json-comments "~2.0.1"
react-addons-create-fragment@^0.14.7:
version "0.14.8"
resolved "https://registry.yarnpkg.com/react-addons-create-fragment/-/react-addons-create-fragment-0.14.8.tgz#e83240d1cba49249690fcc6f148710baa11d2b7a"
react-addons-create-fragment@^15.0.0: react-addons-create-fragment@^15.0.0:
version "15.6.0" version "15.6.0"
resolved "https://registry.yarnpkg.com/react-addons-create-fragment/-/react-addons-create-fragment-15.6.0.tgz#af91a22b1fb095dd01f1afba43bfd0ef589d8b20" resolved "https://registry.yarnpkg.com/react-addons-create-fragment/-/react-addons-create-fragment-15.6.0.tgz#af91a22b1fb095dd01f1afba43bfd0ef589d8b20"
@ -4799,10 +4802,6 @@ react-dom-factories@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/react-dom-factories/-/react-dom-factories-1.0.0.tgz#f43c05e5051b304f33251618d5bc859b29e46b6d" resolved "https://registry.yarnpkg.com/react-dom-factories/-/react-dom-factories-1.0.0.tgz#f43c05e5051b304f33251618d5bc859b29e46b6d"
react-dom@^0.14.7:
version "0.14.9"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-0.14.9.tgz#05064a3dcf0fb1880a3b2bfc9d58c55d8d9f6293"
react-dom@^15.4.0: react-dom@^15.4.0:
version "15.6.1" version "15.6.1"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.1.tgz#2cb0ed4191038e53c209eb3a79a23e2a4cf99470" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.1.tgz#2cb0ed4191038e53c209eb3a79a23e2a4cf99470"
@ -4860,13 +4859,7 @@ react-simplemde-editor@^3.6.11:
react "^0.14.2" react "^0.14.2"
simplemde "^1.11.2" simplemde "^1.11.2"
react-tap-event-plugin@^0.2.2: react@^0.14.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/react-tap-event-plugin/-/react-tap-event-plugin-0.2.2.tgz#4f6f257851654f6c2b1c213a1d3ff21b353ae4e1"
dependencies:
fbjs "^0.2.1"
react@^0.14.2, react@^0.14.7:
version "0.14.9" version "0.14.9"
resolved "https://registry.yarnpkg.com/react/-/react-0.14.9.tgz#9110a6497c49d44ba1c0edd317aec29c2e0d91d1" resolved "https://registry.yarnpkg.com/react/-/react-0.14.9.tgz#9110a6497c49d44ba1c0edd317aec29c2e0d91d1"
dependencies: dependencies:
@ -6136,12 +6129,6 @@ which@1, which@^1.0.5, which@^1.2.10, which@^1.2.9:
dependencies: dependencies:
isexe "^2.0.0" isexe "^2.0.0"
why-did-you-update@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/why-did-you-update/-/why-did-you-update-0.0.8.tgz#389d97dd6c147e1edbc9f5d5470d44d985c8ae38"
dependencies:
lodash "4.12.0"
wide-align@^1.1.0: wide-align@^1.1.0:
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"