diff --git a/.eslintignore b/.eslintignore index ba423091e..74f1f559b 100644 --- a/.eslintignore +++ b/.eslintignore @@ -864,9 +864,6 @@ packages/lib/Logger.js.map packages/lib/PoorManIntervals.d.ts packages/lib/PoorManIntervals.js packages/lib/PoorManIntervals.js.map -packages/lib/ProtocolUtils.d.ts -packages/lib/ProtocolUtils.js -packages/lib/ProtocolUtils.js.map packages/lib/SyncTargetJoplinCloud.d.ts packages/lib/SyncTargetJoplinCloud.js packages/lib/SyncTargetJoplinCloud.js.map diff --git a/.gitignore b/.gitignore index 162f1a14f..07fe7e47f 100644 --- a/.gitignore +++ b/.gitignore @@ -850,9 +850,6 @@ packages/lib/Logger.js.map packages/lib/PoorManIntervals.d.ts packages/lib/PoorManIntervals.js packages/lib/PoorManIntervals.js.map -packages/lib/ProtocolUtils.d.ts -packages/lib/ProtocolUtils.js -packages/lib/ProtocolUtils.js.map packages/lib/SyncTargetJoplinCloud.d.ts packages/lib/SyncTargetJoplinCloud.js packages/lib/SyncTargetJoplinCloud.js.map diff --git a/packages/app-desktop/ElectronAppWrapper.ts b/packages/app-desktop/ElectronAppWrapper.ts index 61939a44e..cbb26217b 100644 --- a/packages/app-desktop/ElectronAppWrapper.ts +++ b/packages/app-desktop/ElectronAppWrapper.ts @@ -1,7 +1,6 @@ import Logger from '@joplin/lib/Logger'; import { PluginMessage } from './services/plugins/PluginRunner'; import shim from '@joplin/lib/shim'; -import { isCallbackUrl } from '@joplin/lib/callbackUrlUtils'; const { BrowserWindow, Tray, screen } = require('electron'); const url = require('url'); @@ -31,14 +30,12 @@ export default class ElectronAppWrapper { private buildDir_: string = null; private rendererProcessQuitReply_: RendererProcessQuitReply = null; private pluginWindows_: PluginWindows = {}; - private initialCallbackUrl_: string = null; - constructor(electronApp: any, env: string, profilePath: string, isDebugMode: boolean, initialCallbackUrl: string) { + constructor(electronApp: any, env: string, profilePath: string, isDebugMode: boolean) { this.electronApp_ = electronApp; this.env_ = env; this.isDebugMode_ = isDebugMode; this.profilePath_ = profilePath; - this.initialCallbackUrl_ = initialCallbackUrl; } electronApp() { @@ -61,10 +58,6 @@ export default class ElectronAppWrapper { return this.env_; } - initialCallbackUrl() { - return this.initialCallbackUrl_; - } - createWindow() { // Set to true to view errors if the application does not start const debugEarlyBugs = this.env_ === 'dev' || this.isDebugMode_; @@ -327,18 +320,12 @@ export default class ElectronAppWrapper { } // Someone tried to open a second instance - focus our window instead - this.electronApp_.on('second-instance', (_e: any, argv: string[]) => { + this.electronApp_.on('second-instance', () => { const win = this.window(); if (!win) return; if (win.isMinimized()) win.restore(); win.show(); win.focus(); - if (process.platform !== 'darwin') { - const url = argv.find((arg) => isCallbackUrl(arg)); - if (url) { - void this.openCallbackUrl(url); - } - } }); return false; @@ -365,16 +352,6 @@ export default class ElectronAppWrapper { this.electronApp_.on('activate', () => { this.win_.show(); }); - - this.electronApp_.on('open-url', (_event: any, url: string) => { - void this.openCallbackUrl(url); - }); - } - - async openCallbackUrl(url: string) { - this.win_.webContents.send('asynchronous-message', 'openCallbackUrl', { - url: url, - }); } } diff --git a/packages/app-desktop/gui/MainScreen/MainScreen.tsx b/packages/app-desktop/gui/MainScreen/MainScreen.tsx index ed4fa051d..ed3a60f22 100644 --- a/packages/app-desktop/gui/MainScreen/MainScreen.tsx +++ b/packages/app-desktop/gui/MainScreen/MainScreen.tsx @@ -36,8 +36,6 @@ import ShareService from '@joplin/lib/services/share/ShareService'; import { reg } from '@joplin/lib/registry'; import removeKeylessItems from '../ResizableLayout/utils/removeKeylessItems'; import { localSyncInfoFromState } from '@joplin/lib/services/synchronizer/syncInfoUtils'; -import { parseCallbackUrl } from '@joplin/lib/callbackUrlUtils'; -import ElectronAppWrapper from '../../ElectronAppWrapper'; import { showMissingMasterKeyMessage } from '@joplin/lib/services/e2ee/utils'; const { connect } = require('react-redux'); @@ -189,23 +187,6 @@ class MainScreenComponent extends React.Component { this.layoutModeListenerKeyDown = this.layoutModeListenerKeyDown.bind(this); window.addEventListener('resize', this.window_resize); - - ipcRenderer.on('asynchronous-message', (_event: any, message: string, args: any) => { - if (message === 'openCallbackUrl') { - this.openCallbackUrl(args.url); - } - }); - - const initialCallbackUrl = (bridge().electronApp() as ElectronAppWrapper).initialCallbackUrl(); - if (initialCallbackUrl) { - this.openCallbackUrl(initialCallbackUrl); - } - } - - private openCallbackUrl(url: string) { - console.log(`openUrl ${url}`); - const { command, params } = parseCallbackUrl(url); - void CommandService.instance().execute(command.toString(), params.id); } private updateLayoutPluginViews(layout: LayoutItem, plugins: PluginStates) { diff --git a/packages/app-desktop/gui/Sidebar/Sidebar.tsx b/packages/app-desktop/gui/Sidebar/Sidebar.tsx index 314944cdb..5b5eee00e 100644 --- a/packages/app-desktop/gui/Sidebar/Sidebar.tsx +++ b/packages/app-desktop/gui/Sidebar/Sidebar.tsx @@ -20,7 +20,6 @@ import Logger from '@joplin/lib/Logger'; import { FolderEntity } from '@joplin/lib/services/database/types'; import stateToWhenClauseContext from '../../services/commands/stateToWhenClauseContext'; import { store } from '@joplin/lib/reducer'; -import { getFolderCallbackUrl, getTagCallbackUrl } from '@joplin/lib/callbackUrlUtils'; const { connect } = require('react-redux'); const shared = require('@joplin/lib/components/shared/side-menu-shared.js'); const { themeStyle } = require('@joplin/lib/theme'); @@ -29,7 +28,6 @@ const Menu = bridge().Menu; const MenuItem = bridge().MenuItem; const { substrWithEllipsis } = require('@joplin/lib/string-utils'); const { ALL_NOTES_FILTER_ID } = require('@joplin/lib/reserved-ids'); -const { clipboard } = require('electron'); const logger = Logger.create('Sidebar'); @@ -328,29 +326,10 @@ class SidebarComponent extends React.Component { ); } - if (itemType === BaseModel.TYPE_FOLDER) { - menu.append( - new MenuItem({ - label: _('Copy external link'), - click: () => { - clipboard.writeText(getFolderCallbackUrl(itemId)); - }, - }) - ); - } - if (itemType === BaseModel.TYPE_TAG) { menu.append(new MenuItem( menuUtils.commandToStatefulMenuItem('renameTag', itemId) )); - menu.append( - new MenuItem({ - label: _('Copy external link'), - click: () => { - clipboard.writeText(getTagCallbackUrl(itemId)); - }, - }) - ); } const pluginViews = pluginUtils.viewsByType(this.pluginsRef.current, 'menuItem'); diff --git a/packages/app-desktop/gui/utils/NoteListUtils.ts b/packages/app-desktop/gui/utils/NoteListUtils.ts index 666955948..81c9dbfea 100644 --- a/packages/app-desktop/gui/utils/NoteListUtils.ts +++ b/packages/app-desktop/gui/utils/NoteListUtils.ts @@ -6,7 +6,6 @@ import MenuUtils from '@joplin/lib/services/commands/MenuUtils'; import InteropServiceHelper from '../../InteropServiceHelper'; import { _ } from '@joplin/lib/locale'; import { MenuItemLocation } from '@joplin/lib/services/plugins/api/types'; -import { getNoteCallbackUrl } from '@joplin/lib/callbackUrlUtils'; import BaseModel from '@joplin/lib/BaseModel'; const bridge = require('electron').remote.require('./bridge').default; @@ -15,7 +14,6 @@ const MenuItem = bridge().MenuItem; import Note from '@joplin/lib/models/Note'; import Setting from '@joplin/lib/models/Setting'; const { substrWithEllipsis } = require('@joplin/lib/string-utils'); -const { clipboard } = require('electron'); interface ContextMenuProps { notes: any[]; @@ -124,6 +122,7 @@ export default class NoteListUtils { new MenuItem({ label: _('Copy Markdown link'), click: async () => { + const { clipboard } = require('electron'); const links = []; for (let i = 0; i < noteIds.length; i++) { const note = await Note.load(noteIds[i]); @@ -134,17 +133,6 @@ export default class NoteListUtils { }) ); - if (noteIds.length == 1) { - menu.append( - new MenuItem({ - label: _('Copy external link'), - click: () => { - clipboard.writeText(getNoteCallbackUrl(noteIds[0])); - }, - }) - ); - } - if ([9, 10].includes(Setting.value('sync.target'))) { menu.append( new MenuItem( diff --git a/packages/app-desktop/main.js b/packages/app-desktop/main.js index 2d8dc44a8..e0d4159dc 100644 --- a/packages/app-desktop/main.js +++ b/packages/app-desktop/main.js @@ -7,7 +7,6 @@ const Logger = require('@joplin/lib/Logger').default; const FsDriverNode = require('@joplin/lib/fs-driver-node').default; const envFromArgs = require('@joplin/lib/envFromArgs'); const packageInfo = require('./packageInfo.js'); -const { isCallbackUrl } = require('@joplin/lib/ProtocolUtils'); // Electron takes the application name from package.json `name` and // displays this in the tray icon toolip and message box titles, however in @@ -37,11 +36,7 @@ const env = envFromArgs(process.argv); const profilePath = profileFromArgs(process.argv); const isDebugMode = !!process.argv && process.argv.indexOf('--debug') >= 0; -electronApp.setAsDefaultProtocolClient('joplin'); - -const initialCallbackUrl = process.argv.find((arg) => isCallbackUrl(arg)); - -const wrapper = new ElectronAppWrapper(electronApp, env, profilePath, isDebugMode, initialCallbackUrl); +const wrapper = new ElectronAppWrapper(electronApp, env, profilePath, isDebugMode); initBridge(wrapper); diff --git a/packages/app-desktop/package.json b/packages/app-desktop/package.json index 008456a99..4c8af0800 100644 --- a/packages/app-desktop/package.json +++ b/packages/app-desktop/package.json @@ -77,22 +77,13 @@ "icon": "../../Assets/macOs.icns", "target": "dmg", "hardenedRuntime": true, - "entitlements": "./build-mac/entitlements.mac.inherit.plist", - "extendInfo": { - "CFBundleURLTypes": [ - { - "CFBundleURLSchemes": ["joplin"], - "CFBundleTypeRole": "Editor" - } - ] - } + "entitlements": "./build-mac/entitlements.mac.inherit.plist" }, "linux": { "icon": "../../Assets/LinuxIcons", "category": "Office", "desktop": { - "Icon": "joplin", - "MimeType": "x-scheme-handler/joplin;" + "Icon": "joplin" }, "target": "AppImage" }, diff --git a/packages/lib/callbackUrlUtils.ts b/packages/lib/callbackUrlUtils.ts deleted file mode 100644 index 2018ead98..000000000 --- a/packages/lib/callbackUrlUtils.ts +++ /dev/null @@ -1,37 +0,0 @@ -const URL = require('url-parse'); - -export function isCallbackUrl(s: string) { - return s.startsWith('joplin://x-callback-url/'); -} - -export function getNoteCallbackUrl(noteId: string) { - return `joplin://x-callback-url/openNote?id=${encodeURIComponent(noteId)}`; -} - -export function getFolderCallbackUrl(folderId: string) { - return `joplin://x-callback-url/openFolder?id=${encodeURIComponent(folderId)}`; -} - -export function getTagCallbackUrl(tagId: string) { - return `joplin://x-callback-url/openTag?id=${encodeURIComponent(tagId)}`; -} - -export const enum CallbackUrlCommand { - OpenNote = 'openNote', - OpenFolder = 'openFolder', - OpenTag = 'openTag', -} - -export interface CallbackUrlInfo { - command: CallbackUrlCommand; - params: Record; -} - -export function parseCallbackUrl(s: string): CallbackUrlInfo { - if (!isCallbackUrl(s)) throw new Error(`Invalid callback url ${s}`); - const url = new URL(s, true); - return { - command: url.pathname.substring(url.pathname.lastIndexOf('/') + 1) as CallbackUrlCommand, - params: url.query, - }; -}