From 5cbd366cf2b37ad3480d99cebb5f85f63e95841c Mon Sep 17 00:00:00 2001 From: Daniel Dominguez Date: Sun, 3 Jun 2018 21:17:58 -0300 Subject: [PATCH 01/11] Add copy text on contex menu. --- src/renderer/component/app/view.jsx | 3 +- src/renderer/component/fileCard/view.jsx | 2 + src/renderer/index.js | 5 +- src/renderer/util/contextMenu.js | 64 +++++++++++++----------- 4 files changed, 40 insertions(+), 34 deletions(-) diff --git a/src/renderer/component/app/view.jsx b/src/renderer/component/app/view.jsx index 8f3472213..a6a225df0 100644 --- a/src/renderer/component/app/view.jsx +++ b/src/renderer/component/app/view.jsx @@ -7,6 +7,7 @@ import ReactModal from 'react-modal'; import throttle from 'util/throttle'; import SideBar from 'component/sideBar'; import Header from 'component/header'; +import { openContextMenu } from '../../util/contextMenu'; type Props = { alertError: (string | {}) => void, @@ -79,7 +80,7 @@ class App extends React.PureComponent { render() { return ( -
+
openContextMenu(e)}>
diff --git a/src/renderer/component/fileCard/view.jsx b/src/renderer/component/fileCard/view.jsx index 3655c7c61..6189ac7bd 100644 --- a/src/renderer/component/fileCard/view.jsx +++ b/src/renderer/component/fileCard/view.jsx @@ -62,6 +62,8 @@ class FileCard extends React.PureComponent { const shouldObscureNsfw = obscureNsfw && metadata && metadata.nsfw; const isRewardContent = claim && rewardedContentClaimIds.includes(claim.claim_id); const handleContextMenu = event => { + event.preventDefault(); + event.stopPropagation(); openCopyLinkMenu(convertToShareLink(uri), event); }; diff --git a/src/renderer/index.js b/src/renderer/index.js index 811a48b47..974df0384 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -17,7 +17,6 @@ import store from 'store'; import app from './app'; import analytics from './analytics'; import doLogWarningConsoleMessage from './logWarningConsoleMessage'; -import { initContextMenu } from './util/contextMenu'; const { autoUpdater } = remote.require('electron-updater'); const APPPAGEURL = 'lbry://?'; @@ -113,8 +112,6 @@ document.addEventListener('click', event => { } }); -document.addEventListener('contextmenu', initContextMenu); - const init = () => { autoUpdater.on('update-downloaded', () => { app.store.dispatch(doAutoUpdate()); @@ -149,7 +146,7 @@ const init = () => { ReactDOM.render(
- openContextMenu(e)} /> +
, diff --git a/src/renderer/util/contextMenu.js b/src/renderer/util/contextMenu.js index 79f47da5b..900ebf54a 100644 --- a/src/renderer/util/contextMenu.js +++ b/src/renderer/util/contextMenu.js @@ -21,26 +21,41 @@ function injectDevelopmentTemplate(event, templates) { return templates; } -export function openContextMenu(event, templates = [], addDefaultTemplates = true) { - if (addDefaultTemplates) { - const { value } = event.target; - const inputTemplates = [ - { label: 'Cut', accelerator: 'CmdOrCtrl+X', role: 'cut' }, - { label: 'Copy', accelerator: 'CmdOrCtrl+C', role: 'copy' }, - { - label: 'Paste', - accelerator: 'CmdOrCtrl+V', - role: 'paste', - enabled: clipboard.readText().length > 0, - }, - { - label: 'Select All', - accelerator: 'CmdOrCtrl+A', - role: 'selectall', - enabled: !!value, - }, - ]; - templates.push(...inputTemplates); +export function openContextMenu(event, templates = []) { + const isSomethingSelected = window.getSelection().toString().length > 0; + const { type } = event.target; + const isInput = event.target.matches('input') && (type === 'text' || type === 'number'); + const { value } = event.target; + + templates.push({ + label: 'Copy', + accelerator: 'CmdOrCtrl+C', + role: 'copy', + enabled: isSomethingSelected, + }); + + // If context menu is opened on Input and there is text on the input and something is selected. + const { selectionStart, selectionEnd } = event.target; + if (!!value && isInput && selectionStart !== selectionEnd) { + templates.push({ label: 'Cut', accelerator: 'CmdOrCtrl+X', role: 'cut' }); + } + + // If context menu is opened on Input and text is present on clipboard + if (clipboard.readText().length > 0 && isInput) { + templates.push({ + label: 'Paste', + accelerator: 'CmdOrCtrl+V', + role: 'paste', + }); + } + + // If context menu is opened on Input + if (isInput && value) { + templates.push({ + label: 'Select All', + accelerator: 'CmdOrCtrl+A', + role: 'selectall', + }); } injectDevelopmentTemplate(event, templates); @@ -57,12 +72,3 @@ export function openCopyLinkMenu(text, event) { ]; openContextMenu(event, templates, false); } - -export function initContextMenu(event) { - const { type } = event.target; - if (event.target.matches('input') && (type === 'text' || type === 'number')) { - openContextMenu(event); - } else { - event.preventDefault(); - } -} From 50e7010a5b2b27bd9076f2230495dcf067cc24c4 Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Thu, 24 May 2018 12:51:40 -0400 Subject: [PATCH 02/11] add search page to router --- src/renderer/component/router/view.jsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/renderer/component/router/view.jsx b/src/renderer/component/router/view.jsx index 34728ace5..fa1a0fea3 100644 --- a/src/renderer/component/router/view.jsx +++ b/src/renderer/component/router/view.jsx @@ -17,6 +17,7 @@ import AuthPage from 'page/auth'; import InvitePage from 'page/invite'; import BackupPage from 'page/backup'; import SubscriptionsPage from 'page/subscriptions'; +import SearchPage from 'page/search'; const route = (props, page, routesMap) => { const component = routesMap[page]; @@ -51,6 +52,7 @@ const Router = props => { show: , wallet: , subscriptions: , + search: , }); }; From 0ca5941deedf7127b0d677b776def8f2bafbd9fc Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Thu, 24 May 2018 13:48:51 -0400 Subject: [PATCH 03/11] remove search bar and padding from search page --- src/renderer/page/search/view.jsx | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/renderer/page/search/view.jsx b/src/renderer/page/search/view.jsx index 763848def..f4e75b9e1 100644 --- a/src/renderer/page/search/view.jsx +++ b/src/renderer/page/search/view.jsx @@ -37,16 +37,8 @@ class SearchPage extends React.PureComponent { render() { const { query, updateSearchQuery } = this.props; return ( - +
- (this.input = input)} - className="search__input" - value={query} - placeholder={__('Search for anything...')} - onChange={event => updateSearchQuery(event.target.value)} - /> - {isURIValid(query) && (
From 731e3a15465d2d8524bd1ffb3aece835c397febd Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Thu, 24 May 2018 13:54:52 -0400 Subject: [PATCH 04/11] alter onSearch mechanics --- src/renderer/component/wunderbar/index.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/renderer/component/wunderbar/index.js b/src/renderer/component/wunderbar/index.js index 7cdd0ca80..6b22c7876 100644 --- a/src/renderer/component/wunderbar/index.js +++ b/src/renderer/component/wunderbar/index.js @@ -7,6 +7,7 @@ import { MODALS, doFocusSearchInput, doBlurSearchInput, + doSearch, } from 'lbry-redux'; import { doNavigate } from 'redux/actions/navigation'; import Wunderbar from './view'; @@ -27,8 +28,8 @@ const select = state => { const perform = dispatch => ({ onSearch: query => { - dispatch(doUpdateSearchQuery(query)); - dispatch(doNotify({ id: MODALS.SEARCH })); + dispatch(doSearch(query)); + dispatch(doNavigate(`/search`, { query })); }, onSubmit: (uri, extraParams) => dispatch(doNavigate('/show', { uri, ...extraParams })), updateSearchQuery: query => dispatch(doUpdateSearchQuery(query)), From b79ec0daa778924ba19bd9c49f37074747968ecb Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Mon, 4 Jun 2018 22:40:46 -0400 Subject: [PATCH 05/11] update lbry-redux --- package.json | 2 +- yarn.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index f7007f5b7..c44816496 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "formik": "^0.10.4", "hast-util-sanitize": "^1.1.2", "keytar": "^4.2.1", - "lbry-redux": "lbryio/lbry-redux#a32e8835c238c0ba1081fe6979763c5b0fade76c", + "lbry-redux": "lbryio/lbry-redux#02e47f922e5ba8908b5848c15b84196c87b9804d", "localforage": "^1.7.1", "mixpanel-browser": "^2.17.1", "moment": "^2.22.0", diff --git a/yarn.lock b/yarn.lock index 8dbc8d895..9cb6db041 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5647,9 +5647,9 @@ lazy-val@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.3.tgz#bb97b200ef00801d94c317e29dc6ed39e31c5edc" -lbry-redux@lbryio/lbry-redux#a32e8835c238c0ba1081fe6979763c5b0fade76c: +lbry-redux@lbryio/lbry-redux#02e47f922e5ba8908b5848c15b84196c87b9804d: version "0.0.1" - resolved "https://codeload.github.com/lbryio/lbry-redux/tar.gz/a32e8835c238c0ba1081fe6979763c5b0fade76c" + resolved "https://codeload.github.com/lbryio/lbry-redux/tar.gz/02e47f922e5ba8908b5848c15b84196c87b9804d" dependencies: proxy-polyfill "0.1.6" reselect "^3.0.0" From 3c3cf98b1d4db2038d3888cbc9fa57e156b19873 Mon Sep 17 00:00:00 2001 From: Thomas Zarebczan Date: Tue, 5 Jun 2018 11:22:15 -0400 Subject: [PATCH 06/11] fix 1549 --- src/main/createWindow.js | 6 +++++- src/renderer/page/rewards/view.jsx | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/createWindow.js b/src/main/createWindow.js index 764003c65..4d4a5bc25 100644 --- a/src/main/createWindow.js +++ b/src/main/createWindow.js @@ -64,8 +64,12 @@ export default appState => { // path, so we just strip it off. // - In a URI with a claim ID, like lbry://channel#claimid, Windows interprets the hash mark as // an anchor and converts it to lbry://channel/#claimid. We remove the slash here as well. + // - ? also interpreted as an anchor, remove slash also. if (process.platform === 'win32') { - deepLinkingURI = deepLinkingURI.replace(/\/$/, '').replace('/#', '#'); + deepLinkingURI = deepLinkingURI + .replace(/\/$/, '') + .replace('/#', '#') + .replace('/?', '?'); } } else { deepLinkingURI = appState.macDeepLinkingURI; diff --git a/src/renderer/page/rewards/view.jsx b/src/renderer/page/rewards/view.jsx index c7b076439..c1ad7d57f 100644 --- a/src/renderer/page/rewards/view.jsx +++ b/src/renderer/page/rewards/view.jsx @@ -49,7 +49,7 @@ class RewardsPage extends React.PureComponent { renderPageHeader() { const { doAuth, navigate, user, daemonSettings } = this.props; - if (user && !user.is_reward_approved && daemonSettings.share_usage_data) { + if (user && !user.is_reward_approved && daemonSettings && daemonSettings.share_usage_data) { if (!user.primary_email || !user.has_verified_email || !user.is_identity_verified) { return (
@@ -98,7 +98,7 @@ class RewardsPage extends React.PureComponent { renderUnclaimedRewards() { const { fetching, rewards, user, daemonSettings, navigate } = this.props; - if (!daemonSettings.share_usage_data) { + if (daemonSettings && !daemonSettings.share_usage_data) { return (
{__('Disabled')}
From e0557e0674611e45c034f863ff268699fa9a72bc Mon Sep 17 00:00:00 2001 From: Thomas Zarebczan Date: Tue, 5 Jun 2018 13:22:32 -0400 Subject: [PATCH 07/11] Fix issue 1494 - uri and outpoint to API This will send the same unique URI for all claims, regardless of what URI the user navigated to. Also fix sending of outpoint (was passed as output, which was blank, previously) --- CHANGELOG.md | 1 + src/renderer/redux/actions/content.js | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84485766f..a75a308d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/). * Fix markdown render ([#1179](https://github.com/lbryio/lbry-app/issues/1179)) * Fix new lines not showing correctly after markdown changes ([#1504](https://github.com/lbryio/lbry-app/issues/1504)) * Fix claim ID being null when reporting a claim that was not previously download ([issue#1512](https://github.com/lbryio/lbry-app/issues/1512)) ([PR#1530](https://github.com/lbryio/lbry-app/pull/1530)) + * Fix URI and outpoint not being passed properly to API ([#1494](https://github.com/lbryio/lbry-app/issues/1494)) ## [0.21.3] - 2018-04-23 diff --git a/src/renderer/redux/actions/content.js b/src/renderer/redux/actions/content.js index 7278beb3d..f16d89f6f 100644 --- a/src/renderer/redux/actions/content.js +++ b/src/renderer/redux/actions/content.js @@ -225,7 +225,11 @@ export function doDownloadFile(uri, streamInfo) { return dispatch => { dispatch(doStartDownload(uri, streamInfo.outpoint)); - analytics.apiLogView(uri, streamInfo.output, streamInfo.claim_id); + analytics.apiLogView( + `${streamInfo.claim_name}#${streamInfo.claim_id}`, + streamInfo.outpoint, + streamInfo.claim_id + ); dispatch(doClaimEligiblePurchaseRewards()); }; From 2dd6529d82fad8574ca9bdddccdab9d7b60489f3 Mon Sep 17 00:00:00 2001 From: Mark Beamer Jr Date: Fri, 25 May 2018 22:38:06 -0400 Subject: [PATCH 08/11] -Added description and changed css so the search screen is more presentable to the user. --- src/renderer/component/fileTile/view.jsx | 10 +++++++--- src/renderer/scss/_vars.scss | 4 ++-- src/renderer/scss/component/_card.scss | 2 ++ src/renderer/scss/component/_file-list.scss | 6 ++++-- src/renderer/scss/component/_search.scss | 3 ++- 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/renderer/component/fileTile/view.jsx b/src/renderer/component/fileTile/view.jsx index 626dc39fc..8674c15a1 100644 --- a/src/renderer/component/fileTile/view.jsx +++ b/src/renderer/component/fileTile/view.jsx @@ -68,6 +68,7 @@ class FileTile extends React.PureComponent { const uri = normalizeURI(this.props.uri); const isClaimed = !!claim; + const description = isClaimed && metadata && metadata.description ? metadata.description : ''; const title = isClaimed && metadata && metadata.title ? metadata.title : parseURI(uri).contentName; const thumbnail = metadata && metadata.thumbnail ? metadata.thumbnail : null; @@ -97,16 +98,19 @@ class FileTile extends React.PureComponent { {isResolvingUri &&
{__('Loading...')}
} {!isResolvingUri && ( +
+ +
{title || name}
+
+ {description} +
{showUri ? uri : channel || __('Anonymous')} {isRewardContent && } {showLocal && isDownloaded && } -
- -
{!name && ( diff --git a/src/renderer/scss/_vars.scss b/src/renderer/scss/_vars.scss index a30c51765..2b5fbbeec 100644 --- a/src/renderer/scss/_vars.scss +++ b/src/renderer/scss/_vars.scss @@ -150,8 +150,8 @@ $large-breakpoint: 1760px; --success-msg-bg: var(--color-green-light); /* File Tile Card */ - --file-tile--media-height: 60px; - --file-tile--media-width: 94px; // 60 * (1 + 9/16) + --file-tile--media-height: 150px; + --file-tile--media-width: 200px; // 60 * (1 + 9/16) /* Modal */ --modal-width: 440px; diff --git a/src/renderer/scss/component/_card.scss b/src/renderer/scss/component/_card.scss index e9f38fbd1..93fb135ec 100644 --- a/src/renderer/scss/component/_card.scss +++ b/src/renderer/scss/component/_card.scss @@ -103,6 +103,7 @@ .card__title--file { font-family: 'metropolis-bold'; font-size: 28px; + margin-bottom: 0; line-height: 36px; padding-top: 20px; } @@ -119,6 +120,7 @@ } .card__subtitle { + margin: 0; font-size: 14px; font-family: 'metropolis-medium'; color: var(--card-text-color); diff --git a/src/renderer/scss/component/_file-list.scss b/src/renderer/scss/component/_file-list.scss index 30b2de303..719947f35 100644 --- a/src/renderer/scss/component/_file-list.scss +++ b/src/renderer/scss/component/_file-list.scss @@ -13,7 +13,7 @@ .file-list__header { margin-top: $spacing-vertical * 4/3; - font-size: 18px; + font-size: 40px; .tooltip { margin-left: 5px; @@ -23,7 +23,6 @@ .file-tile { display: flex; margin-top: $spacing-vertical; - max-width: 260px; .card__media { height: var(--file-tile--media-height); @@ -40,7 +39,10 @@ } .file-tile__info { + display: flex; + flex-direction: column; margin-left: $spacing-vertical * 1/3; + max-width: 500px; } .file-tile__uri { diff --git a/src/renderer/scss/component/_search.scss b/src/renderer/scss/component/_search.scss index ea3234369..23b484a21 100644 --- a/src/renderer/scss/component/_search.scss +++ b/src/renderer/scss/component/_search.scss @@ -98,9 +98,10 @@ .search__results { display: flex; padding-bottom: $spacing-vertical; + flex-flow: wrap column; .search-result__column { - flex: 0 0 270px; + flex: 0 0 500px; .card__media { background-color: var(--color-search-placeholder); } From 8be48a84cf903e5e58d4e605e9b757bb4fe50fa3 Mon Sep 17 00:00:00 2001 From: Mark Beamer Jr Date: Tue, 5 Jun 2018 22:14:15 -0400 Subject: [PATCH 09/11] Made changes recommended on PR review. --- .idea/inspectionProfiles/Project_Default.xml | 6 - .idea/lbry-app.iml | 12 - .idea/misc.xml | 6 - .idea/modules.xml | 8 - .idea/vcs.xml | 6 - .idea/workspace.xml | 547 ------------------- package.json | 2 +- src/renderer/component/fileTile/view.jsx | 12 +- src/renderer/scss/_vars.scss | 4 +- src/renderer/scss/component/_card.scss | 2 + 10 files changed, 11 insertions(+), 594 deletions(-) delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/lbry-app.iml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml delete mode 100644 .idea/workspace.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index c6cc8c819..000000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/lbry-app.iml b/.idea/lbry-app.iml deleted file mode 100644 index 24643cc37..000000000 --- a/.idea/lbry-app.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 3668dc8ca..000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index b37b46a86..000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f4..000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index a51b0ec12..000000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,547 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TYPE_FEATURED_DOWNLOAD - TYPE_FEATURED_DOW - doOpen - doNotify - settings - - - - - - - - - - - - - true - - false - true - true - - - true - DEFINITION_ORDER - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -