forked from facebook/react-native
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathShare.js
More file actions
163 lines (148 loc) · 4.21 KB
/
Share.js
File metadata and controls
163 lines (148 loc) · 4.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/**
* 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;