123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- /**
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * 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('../Utilities/Platform');
- const invariant = require('invariant');
- const processColor = require('../StyleSheet/processColor');
- import NativeActionSheetManager from '../ActionSheetIOS/NativeActionSheetManager';
- import NativeShareModule from './NativeShareModule';
- type Content =
- | {
- title?: string,
- message: string,
- ...
- }
- | {
- title?: string,
- url: string,
- ...
- };
- type Options = {
- dialogTitle?: string,
- excludedActivityTypes?: Array<string>,
- 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
- *
- * #### iOS
- *
- * - `url` - an URL to share
- *
- * At least one of URL and message is required.
- *
- * #### Android
- *
- * - `title` - title of the message
- *
- * ### Options
- *
- * #### iOS
- *
- * - `subject` - a subject to share via email
- * - `excludedActivityTypes`
- * - `tintColor`
- *
- * #### Android
- *
- * - `dialogTitle`
- *
- */
- static share(content: Content, options: Options = {}): Promise<Object> {
- 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(
- NativeShareModule,
- 'ShareModule should be registered on Android.',
- );
- invariant(
- !content.title || typeof content.title === 'string',
- 'Invalid title: title should be a string.',
- );
- const newContent = {
- title: content.title,
- message:
- typeof content.message === 'string' ? content.message : undefined,
- };
- return NativeShareModule.share(newContent, options.dialogTitle);
- } else if (Platform.OS === 'ios') {
- return new Promise((resolve, reject) => {
- const tintColor = processColor(options.tintColor);
- invariant(
- tintColor == null || typeof tintColor === 'number',
- 'Unexpected color given for options.tintColor',
- );
- invariant(
- NativeActionSheetManager,
- 'NativeActionSheetManager is not registered on iOS, but it should be.',
- );
- NativeActionSheetManager.showShareActionSheetWithOptions(
- {
- message:
- typeof content.message === 'string' ? content.message : undefined,
- url: typeof content.url === 'string' ? content.url : undefined,
- subject: options.subject,
- tintColor: typeof tintColor === 'number' ? tintColor : undefined,
- excludedActivityTypes: options.excludedActivityTypes,
- },
- 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 sharedAction: 'sharedAction' = 'sharedAction';
- /**
- * The dialog has been dismissed.
- * @platform ios
- */
- static dismissedAction: 'dismissedAction' = 'dismissedAction';
- }
- module.exports = Share;
|