From 10407f3aa261d1b841bbe33188f70ffd9f5634bf Mon Sep 17 00:00:00 2001 From: Nicolas Gallagher Date: Tue, 22 May 2018 14:14:28 -0700 Subject: [PATCH] [add] Share API Fix #958 --- .../src/moduleMap.js | 1 + .../src/exports/Share/index.js | 60 +++++++++++++++++++ packages/react-native-web/src/index.js | 3 + 3 files changed, 64 insertions(+) create mode 100644 packages/react-native-web/src/exports/Share/index.js diff --git a/packages/babel-plugin-react-native-web/src/moduleMap.js b/packages/babel-plugin-react-native-web/src/moduleMap.js index edba8bf4..5d02dceb 100644 --- a/packages/babel-plugin-react-native-web/src/moduleMap.js +++ b/packages/babel-plugin-react-native-web/src/moduleMap.js @@ -41,6 +41,7 @@ module.exports = { SafeAreaView: true, ScrollView: true, SectionList: true, + Share: true, Slider: true, StatusBar: true, StyleSheet: true, diff --git a/packages/react-native-web/src/exports/Share/index.js b/packages/react-native-web/src/exports/Share/index.js new file mode 100644 index 00000000..0805958f --- /dev/null +++ b/packages/react-native-web/src/exports/Share/index.js @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2018-present, Nicolas Gallagher. + * Copyright (c) 2016-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow + */ + +import invariant from 'fbjs/lib/invariant'; + +type Content = + | { title?: string, message?: string, url: string } + | { title?: string, message: string, url?: string }; + +class Share { + static share(content: Content, options: Object = {}): Promise { + invariant( + typeof content === 'object' && content !== null, + 'Content to share must be a valid object' + ); + invariant( + typeof content.url === 'string' || typeof content.message === 'string', + 'At least one of URL and message is required' + ); + invariant(typeof options === 'object' && options !== null, 'Options must be a valid object'); + invariant( + !content.title || typeof content.title === 'string', + 'Invalid title: title should be a string.' + ); + + if (window.navigator.share !== undefined) { + return window.navigator.share({ + title: content.title, + text: content.message, + url: content.url + }); + } else { + return Promise.reject(new Error('Share is not supported in this browser')); + } + } + + /** + * The content was successfully shared. + */ + static get sharedAction(): string { + return 'sharedAction'; + } + + /** + * The dialog has been dismissed. + * @platform ios + */ + static get dismissedAction(): string { + return 'dismissedAction'; + } +} + +export default Share; diff --git a/packages/react-native-web/src/index.js b/packages/react-native-web/src/index.js index bb0c835d..b14e815f 100644 --- a/packages/react-native-web/src/index.js +++ b/packages/react-native-web/src/index.js @@ -29,6 +29,7 @@ import NetInfo from './exports/NetInfo'; import PanResponder from './exports/PanResponder'; import PixelRatio from './exports/PixelRatio'; import Platform from './exports/Platform'; +import Share from './exports/Share'; import StyleSheet from './exports/StyleSheet'; import UIManager from './exports/UIManager'; import Vibration from './exports/Vibration'; @@ -101,6 +102,7 @@ export { PanResponder, PixelRatio, Platform, + Share, StyleSheet, UIManager, Vibration, @@ -172,6 +174,7 @@ const ReactNative = { PanResponder, PixelRatio, Platform, + Share, StyleSheet, UIManager, Vibration,