import { clipboard, shell } from 'electron'; import * as remote from '@electron/remote'; import { convertToShareLink } from 'util/lbryURI'; const isDev = process.env.NODE_ENV !== 'production'; function injectDevelopmentTemplate(event, templates) { if (!isDev) return templates; const { screenX, screenY } = event; const separator = { type: 'separator' }; const developmentTemplateAddition = [ { label: 'Inspect element', accelerator: 'CmdOrCtrl+Shift+I', click: () => { remote.getCurrentWindow().inspectElement(screenX, screenY); }, }, ]; if (templates.length > 0) { templates.push(separator); } templates.push(...developmentTemplateAddition); return templates; } export function openContextMenu(event, templates = [], canEdit = false, selection = '') { const { type, value } = event.target; const isInput = event.target.matches('input') && (type === 'text' || type === 'number'); const isTextField = canEdit || isInput || event.target.matches('textarea'); const isSomethingSelected = selection.length > 0 || window.getSelection().toString().length > 0; 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 && isTextField && 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 && isTextField) { templates.push({ label: 'Paste', accelerator: 'CmdOrCtrl+V', role: 'paste', }); } // If context menu is opened on Input if (isTextField && value) { templates.push({ label: 'Select All', accelerator: 'CmdOrCtrl+A', role: 'selectall', }); } injectDevelopmentTemplate(event, templates); remote.Menu.buildFromTemplate(templates).popup({}); } // This function is used for the markdown description on the publish page export function openEditorMenu(codeMirror, event) { const value = codeMirror.doc.getValue(); const selection = codeMirror.doc.getSelection(); const templates = [ { label: 'Select All', accelerator: 'CmdOrCtrl+A', role: 'selectall', click: () => { codeMirror.execCommand('selectAll'); }, enabled: value.length > 0, }, { label: 'Cut', accelerator: 'CmdOrCtrl+X', role: 'cut', enabled: selection.length > 0, }, ]; openContextMenu(event, templates, true, selection); } // This function is used for the CodeViewer component export function openSnippetMenu(codeMirror, event) { const value = codeMirror.doc.getValue(); const selection = codeMirror.doc.getSelection(); const templates = [ { label: 'Select All', accelerator: 'CmdOrCtrl+A', role: 'selectall', click: () => { codeMirror.execCommand('selectAll'); }, // Enabled if there is text to select enabled: value.length > 0, }, ]; openContextMenu(event, templates, false, selection); } export function openClaimPreviewMenu(claim, event) { // @if TARGET='app' let templates = []; if (claim) { const shareLink = convertToShareLink(claim.canonical_url || claim.permanent_url); const claimId = claim.claim_id; templates.push({ label: 'Copy link', click: () => { clipboard.writeText(shareLink); }, }); templates.push({ type: 'separator' }); templates.push({ label: 'Report content', click: () => { shell.openExternal(`https://lbry.com/dmca/${claimId}`); }, }); } injectDevelopmentTemplate(event, templates); if (templates.length !== 0) { remote.Menu.buildFromTemplate(templates).popup({}); } // @endif } // Block context menu export function stopContextMenu(event) { if (navigator.userAgent.toLowerCase().indexOf(' electron/') > -1) { event.preventDefault(); event.stopPropagation(); } }