/** * 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. * * @format * @flow */ 'use strict'; const Platform = require('Platform'); const invariant = require('fbjs/lib/invariant'); const processColor = require('processColor'); const {ActionSheetManager, ShareModule} = require('NativeModules'); type Content = | {title?: string, message: string} | {title?: string, url: string}; type Options = { dialogTitle?: string, excludedActivityTypes?: Array, tintColor?: string, subject?: string, }; class Share { /** * Open a dialog to share text content. * * In iOS, Returns a Promise which will be invoked an object containing `action`, `activityType`. * If the user dismissed the dialog, the Promise will still be resolved with action being `Share.dismissedAction` * and all the other keys being undefined. * * In Android, Returns a Promise which always be resolved with action being `Share.sharedAction`. * * ### Content * * - `message` - a message to share * - `title` - title of the message * * #### iOS * * - `url` - an URL to share * * At least one of URL and message is required. * * ### Options * * #### iOS * * - `subject` - a subject to share via email * - `excludedActivityTypes` * - `tintColor` * * #### Android * * - `dialogTitle` * */ static share(content: Content, options: Options = {}): 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', ); if (Platform.OS === 'android') { invariant( !content.title || typeof content.title === 'string', 'Invalid title: title should be a string.', ); return ShareModule.share(content, options.dialogTitle); } else if (Platform.OS === 'ios') { return new Promise((resolve, reject) => { ActionSheetManager.showShareActionSheetWithOptions( {...content, ...options, tintColor: processColor(options.tintColor)}, error => reject(error), (success, activityType) => { if (success) { resolve({ action: 'sharedAction', activityType: activityType, }); } else { resolve({ action: 'dismissedAction', }); } }, ); }); } else { return Promise.reject(new Error('Unsupported platform')); } } /** * The content was successfully shared. */ static get sharedAction(): string { return 'sharedAction'; } /** * The dialog has been dismissed. * @platform ios */ static get dismissedAction(): string { return 'dismissedAction'; } } module.exports = Share;