Add listener in the renderer process for deeplink
Summary: - Set userPrefferedPlugin for external deeplink - Listen for deeplink in renderer process and navigate accordingly Reviewed By: passy Differential Revision: D10339035 fbshipit-source-id: 4de6249a0672f9ce02b0dfb78a4563302c308578
This commit is contained in:
committed by
Facebook Github Bot
parent
4f914a655e
commit
ce996ba8af
@@ -45,8 +45,8 @@ export class App extends React.Component<Props> {
|
||||
);
|
||||
});
|
||||
ipcRenderer.send('getLaunchTime');
|
||||
ipcRenderer.send('componentDidMount');
|
||||
}
|
||||
|
||||
render() {
|
||||
return (
|
||||
<FlexColumn fill={true}>
|
||||
|
||||
32
src/dispatcher/__tests__/deeplinkURLParsing.node.js
Normal file
32
src/dispatcher/__tests__/deeplinkURLParsing.node.js
Normal file
@@ -0,0 +1,32 @@
|
||||
/**
|
||||
* Copyright 2018-present Facebook.
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
* @format
|
||||
*/
|
||||
|
||||
import {uriComponents} from '../application.js';
|
||||
|
||||
test('test parsing of deeplink URL', () => {
|
||||
const url = 'flipper://app/plugin/meta/data';
|
||||
let components = uriComponents(url);
|
||||
expect(components).toEqual(['app', 'plugin', 'meta/data']);
|
||||
});
|
||||
|
||||
test('test parsing of deeplink URL when arguments are less', () => {
|
||||
const url = 'flipper://app/';
|
||||
let components = uriComponents(url);
|
||||
expect(components).toEqual(['app']);
|
||||
});
|
||||
|
||||
test('test parsing of deeplink URL when url is null', () => {
|
||||
// $FlowFixMe
|
||||
let components = uriComponents(null);
|
||||
expect(components).toEqual([]);
|
||||
});
|
||||
|
||||
test('test parsing of deeplink URL when pattern does not match', () => {
|
||||
const url = 'Some random string';
|
||||
let components = uriComponents(url);
|
||||
expect(components).toEqual([]);
|
||||
});
|
||||
@@ -5,10 +5,27 @@
|
||||
* @format
|
||||
*/
|
||||
|
||||
import {remote} from 'electron';
|
||||
import {remote, ipcRenderer} from 'electron';
|
||||
import type {Store} from '../reducers/index.js';
|
||||
import type Logger from '../fb-stubs/Logger.js';
|
||||
|
||||
import {selectPlugin, userPreferredPlugin} from '../reducers/connections';
|
||||
export const uriComponents = (url: string) => {
|
||||
if (!url) {
|
||||
return [];
|
||||
}
|
||||
const match: ?Array<string> = url.match(
|
||||
/^flipper:\/\/([^\/]*)\/([^\/]*)\/?(.*)$/,
|
||||
);
|
||||
if (match) {
|
||||
return (match
|
||||
.map(decodeURIComponent)
|
||||
.slice(1)
|
||||
.filter(Boolean): Array<string>);
|
||||
}
|
||||
return [];
|
||||
};
|
||||
|
||||
export default (store: Store, logger: Logger) => {
|
||||
const currentWindow = remote.getCurrentWindow();
|
||||
currentWindow.on('focus', () => {
|
||||
@@ -23,4 +40,25 @@ export default (store: Store, logger: Logger) => {
|
||||
payload: false,
|
||||
});
|
||||
});
|
||||
|
||||
ipcRenderer.on('flipper-deeplink', (event, url) => {
|
||||
// flipper://<client>/<pluginId>/<payload>
|
||||
const match = uriComponents(url);
|
||||
if (match.length > 1) {
|
||||
store.dispatch(
|
||||
selectPlugin({
|
||||
selectedApp: match[0],
|
||||
selectedPlugin: match[1],
|
||||
deepLinkPayload: match[2],
|
||||
}),
|
||||
);
|
||||
}
|
||||
});
|
||||
ipcRenderer.on('flipper-deeplink-preferred-plugin', (event, url) => {
|
||||
// flipper://<client>/<pluginId>/<payload>
|
||||
const match = uriComponents(url);
|
||||
if (match.length > 1) {
|
||||
store.dispatch(userPreferredPlugin(match[1]));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
@@ -45,6 +45,10 @@ export type Action =
|
||||
selectedApp: ?string,
|
||||
},
|
||||
}
|
||||
| {
|
||||
type: 'SELECT_USER_PREFERRED_PLUGIN',
|
||||
payload: string,
|
||||
}
|
||||
| {
|
||||
type: 'SERVER_ERROR',
|
||||
payload: ?string,
|
||||
@@ -178,7 +182,10 @@ export default function reducer(
|
||||
userPreferredPlugin: selectedPlugin,
|
||||
};
|
||||
}
|
||||
|
||||
case 'SELECT_USER_PREFERRED_PLUGIN': {
|
||||
const {payload} = action;
|
||||
return {...state, userPreferredPlugin: payload};
|
||||
}
|
||||
case 'NEW_CLIENT': {
|
||||
const {payload} = action;
|
||||
const {userPreferredApp, userPreferredPlugin} = state;
|
||||
@@ -249,3 +256,7 @@ export const selectPlugin = (payload: {
|
||||
type: 'SELECT_PLUGIN',
|
||||
payload,
|
||||
});
|
||||
export const userPreferredPlugin = (payload: string): Action => ({
|
||||
type: 'SELECT_USER_PREFERRED_PLUGIN',
|
||||
payload,
|
||||
});
|
||||
|
||||
@@ -153,6 +153,13 @@ app.on('ready', function() {
|
||||
}
|
||||
});
|
||||
|
||||
ipcMain.on('componentDidMount', event => {
|
||||
if (deeplinkURL) {
|
||||
win.webContents.send('flipper-deeplink-preferred-plugin', deeplinkURL);
|
||||
deeplinkURL = null;
|
||||
}
|
||||
});
|
||||
|
||||
ipcMain.on('getLaunchTime', event => {
|
||||
if (launchStartTime) {
|
||||
event.sender.send('getLaunchTime', launchStartTime);
|
||||
@@ -161,7 +168,6 @@ ipcMain.on('getLaunchTime', event => {
|
||||
launchStartTime = null;
|
||||
}
|
||||
});
|
||||
|
||||
// Define custom protocol handler. Deep linking works on packaged versions of the application!
|
||||
app.setAsDefaultProtocolClient('flipper');
|
||||
|
||||
@@ -219,8 +225,5 @@ function tryCreateWindow() {
|
||||
slashes: true,
|
||||
});
|
||||
win.loadURL(entryUrl);
|
||||
if (deeplinkURL) {
|
||||
win.webContents.send('flipper-deeplink', deeplinkURL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user