Open in desktop #6667

Closed
btzr-io wants to merge 13 commits from protocol into master
6 changed files with 55 additions and 7 deletions

View file

@ -45,9 +45,15 @@ let daemon;
let lbryFirst; let lbryFirst;
const appState = {}; const appState = {};
const PROTOCOL = 'lbry';
if (process.platform !== 'linux') { if (isDev && process.platform === 'win32') {
app.setAsDefaultProtocolClient('lbry'); // Setting this is required to get this working in dev mode.
app.setAsDefaultProtocolClient(PROTOCOL, process.execPath, [
path.resolve(process.argv[1]),
]);
} else {
app.setAsDefaultProtocolClient(PROTOCOL);
} }
app.name = 'LBRY'; app.name = 'LBRY';
@ -149,9 +155,15 @@ if (!gotSingleInstanceLock) {
app.on('second-instance', (event, argv) => { app.on('second-instance', (event, argv) => {
// Send the url to the app to navigate first, then focus // Send the url to the app to navigate first, then focus
if (rendererWindow) { if (rendererWindow) {
if ((process.platform === 'win32' || process.platform === 'linux') && String(argv[1]).startsWith('lbry')) { // External uri (last item on argv):
let URI = argv[1]; const EXTERNAL_URI = (argv.length) ? argv[argv.length - 1] : '';
// Handle protocol requests for windows and linux
const platforms = (process.platform === 'win32' || process.platform === 'linux');
// Is LBRY protocol
const isProtocolURI = String(EXTERNAL_URI).startsWith(PROTOCOL + '://');
// External protocol requested:
if (platforms && isProtocolURI) {
let URI = EXTERNAL_URI;
// Keep only command line / deep linked arguments // Keep only command line / deep linked arguments
// Windows normalizes URIs when they're passed in from other apps. On Windows, this tries to // Windows normalizes URIs when they're passed in from other apps. On Windows, this tries to
// restore the original URI that was typed. // restore the original URI that was typed.

View file

@ -2058,14 +2058,15 @@
"Only select creators can receive tips at this time": "Only select creators can receive tips at this time", "Only select creators can receive tips at this time": "Only select creators can receive tips at this time",
"The payment will be made from your saved card": "The payment will be made from your saved card", "The payment will be made from your saved card": "The payment will be made from your saved card",
"Commenting...": "Commenting...", "Commenting...": "Commenting...",
"Show %count% replies": "Show %count% replies",
"Show reply": "Show reply",
"added to": "added to", "added to": "added to",
"removed from": "removed from", "removed from": "removed from",
"Skip Navigation": "Skip Navigation", "Skip Navigation": "Skip Navigation",
"Reset": "Reset", "Reset": "Reset",
"Reset to original (previous) publish date": "Reset to original (previous) publish date", "Reset to original (previous) publish date": "Reset to original (previous) publish date",
"Search for something...": "Search for something...", "Search for something...": "Search for something...",
"Open in Desktop": "Open in Desktop",
"Show %count% replies": "Show %count% replies",
"Show reply": "Show reply",
"Confirm Comment Deletion": "Confirm Comment Deletion", "Confirm Comment Deletion": "Confirm Comment Deletion",
"Remove Comment": "Remove Comment", "Remove Comment": "Remove Comment",
"Are you sure you want to remove this comment?": "Are you sure you want to remove this comment?", "Are you sure you want to remove this comment?": "Are you sure you want to remove this comment?",

View file

@ -9,6 +9,7 @@ import { Menu, MenuButton, MenuList, MenuItem } from '@reach/menu-button';
import Icon from 'component/common/icon'; import Icon from 'component/common/icon';
import { generateShareUrl, generateRssUrl, generateLbryContentUrl } from 'util/url'; import { generateShareUrl, generateRssUrl, generateLbryContentUrl } from 'util/url';
import { useHistory } from 'react-router'; import { useHistory } from 'react-router';
import { useIsMobile } from 'effects/use-screensize';
import { buildURI, parseURI, COLLECTIONS_CONSTS } from 'lbry-redux'; import { buildURI, parseURI, COLLECTIONS_CONSTS } from 'lbry-redux';
const SHARE_DOMAIN = SHARE_DOMAIN_URL || URL; const SHARE_DOMAIN = SHARE_DOMAIN_URL || URL;
@ -94,6 +95,7 @@ function ClaimMenuList(props: Props) {
editedCollection, editedCollection,
isAuthenticated, isAuthenticated,
} = props; } = props;
const isMobile = useIsMobile();
const incognitoClaim = contentChannelUri && !contentChannelUri.includes('@'); const incognitoClaim = contentChannelUri && !contentChannelUri.includes('@');
const isChannel = !incognitoClaim && !contentSigningChannel; const isChannel = !incognitoClaim && !contentSigningChannel;
const { channelName } = parseURI(contentChannelUri); const { channelName } = parseURI(contentChannelUri);
@ -229,6 +231,10 @@ function ClaimMenuList(props: Props) {
push(`/$/${PAGES.REPORT_CONTENT}?claimId=${contentClaim && contentClaim.claim_id}`); push(`/$/${PAGES.REPORT_CONTENT}?claimId=${contentClaim && contentClaim.claim_id}`);
} }
function handleOpenInDesktop() {
window.open(claim.permanent_url, '_top');
}
return ( return (
<Menu> <Menu>
<MenuButton <MenuButton
@ -410,6 +416,15 @@ function ClaimMenuList(props: Props) {
</MenuItem> </MenuItem>
)} )}
{IS_WEB && !isMobile && (
<MenuItem className="comment__menu-option" onSelect={handleOpenInDesktop}>
<div className="menu__link">
<Icon aria-hidden icon={ICONS.DESKTOP} />
{__('Open in Desktop')}
</div>
</MenuItem>
)}
{!claimIsMine && !isMyCollection && ( {!claimIsMine && !isMyCollection && (
<MenuItem className="comment__menu-option" onSelect={handleReportContent}> <MenuItem className="comment__menu-option" onSelect={handleReportContent}>
<div className="menu__link"> <div className="menu__link">

View file

@ -2331,4 +2331,11 @@ export const icons = {
<path d="M4.954 14.753l3.535 3.535-1.768 1.768-3.535-3.535z" /> <path d="M4.954 14.753l3.535 3.535-1.768 1.768-3.535-3.535z" />
</g> </g>
), ),
[ICONS.DESKTOP]: buildIcon(
<g>
<rect x="2" y="3" width="20" height="14" rx="2" ry="2" />
<line x1="8" y1="21" x2="16" y2="21" />
<line x1="12" y1="17" x2="12" y2="21" />
</g>
),
}; };

View file

@ -113,6 +113,10 @@ function FileActions(props: Props) {
} }
} }
function handleOpenInDesktop() {
window.open(claim.permanent_url, '_top');
}
const lhsSection = ( const lhsSection = (
<> <>
{ENABLE_FILE_REACTIONS && !reactionsDisabled && <FileReactions uri={uri} livestream={isLivestreamClaim} />} {ENABLE_FILE_REACTIONS && !reactionsDisabled && <FileReactions uri={uri} livestream={isLivestreamClaim} />}
@ -188,6 +192,14 @@ function FileActions(props: Props) {
</MenuItem> </MenuItem>
)} )}
{/* @endif */} {/* @endif */}
{IS_WEB && !isMobile && (
<MenuItem className="comment__menu-option" onSelect={handleOpenInDesktop}>
<div className="menu__link">
<Icon aria-hidden icon={ICONS.DESKTOP} />
{__('Open in Desktop')}
</div>
</MenuItem>
)}
{!claimIsMine && ( {!claimIsMine && (
<MenuItem <MenuItem
className="comment__menu-option" className="comment__menu-option"

View file

@ -165,3 +165,4 @@ export const GLOBE = 'globe';
export const RSS = 'rss'; export const RSS = 'rss';
export const STAR = 'star'; export const STAR = 'star';
export const MUSIC = 'MusicCategory'; export const MUSIC = 'MusicCategory';
export const DESKTOP = 'desktop';