diff --git a/src/main/index.js b/src/main/index.js
index 2591e20f6..bb8501d93 100644
--- a/src/main/index.js
+++ b/src/main/index.js
@@ -242,8 +242,11 @@ const isSecondInstance = app.makeSingleInstance(argv => {
// 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') {
- URI = URI.replace(/\/$/, '').replace('/#', '#');
+ URI = URI.replace(/\/$/, '')
+ .replace('/#', '#')
+ .replace('/?', '?');
}
rendererWindow.webContents.send('open-uri-requested', URI);
diff --git a/src/renderer/component/router/index.js b/src/renderer/component/router/index.js
index 0e2a262cb..20933d960 100644
--- a/src/renderer/component/router/index.js
+++ b/src/renderer/component/router/index.js
@@ -1,5 +1,5 @@
import { connect } from 'react-redux';
-import { selectCurrentPage, selectCurrentParams } from 'lbry-redux';
+import { selectCurrentPage, selectCurrentParams, doNotify } from 'lbry-redux';
import Router from './view';
const select = state => ({
@@ -7,4 +7,4 @@ const select = state => ({
currentPage: selectCurrentPage(state),
});
-export default connect(select, null)(Router);
+export default connect(select, { doNotify })(Router);
diff --git a/src/renderer/component/router/view.jsx b/src/renderer/component/router/view.jsx
index f67e252a3..34728ace5 100644
--- a/src/renderer/component/router/view.jsx
+++ b/src/renderer/component/router/view.jsx
@@ -18,16 +18,21 @@ import InvitePage from 'page/invite';
import BackupPage from 'page/backup';
import SubscriptionsPage from 'page/subscriptions';
-const route = (page, routesMap) => {
+const route = (props, page, routesMap) => {
const component = routesMap[page];
-
- return component || DiscoverPage;
+ if (!component) {
+ props.doNotify({
+ message: __('Invalid page requested'),
+ displayType: ['snackbar'],
+ });
+ }
+ return component || routesMap.discover;
};
const Router = props => {
const { currentPage, params } = props;
- return route(currentPage, {
+ return route(props, currentPage, {
auth: ,
backup: ,
channel: ,
diff --git a/src/renderer/index.js b/src/renderer/index.js
index c19790f06..ceb8804f0 100644
--- a/src/renderer/index.js
+++ b/src/renderer/index.js
@@ -8,7 +8,7 @@ import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { doConditionalAuthNavigate, doDaemonReady, doAutoUpdate } from 'redux/actions/app';
-import { doNotify, doBlackListedOutpointsSubscribe } from 'lbry-redux';
+import { doNotify, doBlackListedOutpointsSubscribe, isURIValid } from 'lbry-redux';
import { doNavigate } from 'redux/actions/navigation';
import { doDownloadLanguages, doUpdateIsNightAsync } from 'redux/actions/settings';
import { doUserEmailVerify } from 'redux/actions/user';
@@ -19,6 +19,7 @@ import analytics from './analytics';
import { initContextMenu } from './util/contextMenu';
const { autoUpdater } = remote.require('electron-updater');
+const APPPAGEURL = 'lbry://?';
autoUpdater.logger = remote.require('electron-log');
@@ -42,8 +43,18 @@ ipcRenderer.on('open-uri-requested', (event, uri, newSession) => {
})
);
}
- } else {
+ } else if (uri.startsWith(APPPAGEURL)) {
+ const navpage = uri.replace(APPPAGEURL, '').toLowerCase();
+ app.store.dispatch(doNavigate(`/${navpage}`));
+ } else if (isURIValid(uri)) {
app.store.dispatch(doNavigate('/show', { uri }));
+ } else {
+ app.store.dispatch(
+ doNotify({
+ message: __('Invalid LBRY URL requested'),
+ displayType: ['snackbar'],
+ })
+ );
}
}
});