@plusscommunities/pluss-core-app 1.4.9 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/module/actions/FollowerActions.js +34 -0
- package/dist/module/actions/FollowerActions.js.map +1 -0
- package/dist/module/actions/MediaActions.js +20 -0
- package/dist/module/actions/MediaActions.js.map +1 -0
- package/dist/module/actions/ResidentActions.js +26 -0
- package/dist/module/actions/ResidentActions.js.map +1 -0
- package/dist/module/actions/UserActions.js +214 -0
- package/dist/module/actions/UserActions.js.map +1 -0
- package/dist/module/actions/index.js +5 -0
- package/dist/module/actions/index.js.map +1 -0
- package/dist/module/actions/types.js +14 -0
- package/dist/module/actions/types.js.map +1 -0
- package/dist/module/apis/analyticsActions.js +20 -0
- package/dist/module/apis/analyticsActions.js.map +1 -0
- package/dist/module/apis/contactActions.js +27 -0
- package/dist/module/apis/contactActions.js.map +1 -0
- package/dist/module/apis/eventActions.js +163 -0
- package/dist/module/apis/eventActions.js.map +1 -0
- package/dist/module/apis/fileActions.js +96 -0
- package/dist/module/apis/fileActions.js.map +1 -0
- package/dist/module/apis/followerActions.js +38 -0
- package/dist/module/apis/followerActions.js.map +1 -0
- package/dist/module/apis/index.js +11 -0
- package/dist/module/apis/index.js.map +1 -0
- package/dist/module/apis/notificationActions.js +60 -0
- package/dist/module/apis/notificationActions.js.map +1 -0
- package/dist/module/apis/profileActions.js +14 -0
- package/dist/module/apis/profileActions.js.map +1 -0
- package/dist/module/apis/reactionActions.js +78 -0
- package/dist/module/apis/reactionActions.js.map +1 -0
- package/dist/module/apis/typeActions.js +15 -0
- package/dist/module/apis/typeActions.js.map +1 -0
- package/dist/module/apis/userActions.js +104 -0
- package/dist/module/apis/userActions.js.map +1 -0
- package/{assets → dist/module/assets}/icons/reactions/heart.png +0 -0
- package/{assets → dist/module/assets}/icons/reactions/party.png +0 -0
- package/{assets → dist/module/assets}/icons/reactions/sad.png +0 -0
- package/{assets → dist/module/assets}/icons/reactions/smile.png +0 -0
- package/dist/module/colours.js +149 -0
- package/dist/module/colours.js.map +1 -0
- package/dist/module/components/AddButton.js +45 -0
- package/dist/module/components/AddButton.js.map +1 -0
- package/dist/module/components/Attachment.js +59 -0
- package/dist/module/components/Attachment.js.map +1 -0
- package/dist/module/components/AudienceSelectorLauncher.js +70 -0
- package/dist/module/components/AudienceSelectorLauncher.js.map +1 -0
- package/dist/module/components/AudienceSelectorPage.js +376 -0
- package/dist/module/components/AudienceSelectorPage.js.map +1 -0
- package/dist/module/components/BackButton.js +62 -0
- package/dist/module/components/BackButton.js.map +1 -0
- package/dist/module/components/CategoryTabs.js +171 -0
- package/dist/module/components/CategoryTabs.js.map +1 -0
- package/dist/module/components/CommentReply.js +363 -0
- package/dist/module/components/CommentReply.js.map +1 -0
- package/dist/module/components/CommentSection.js +785 -0
- package/dist/module/components/CommentSection.js.map +1 -0
- package/dist/module/components/ConfirmPopup.js +85 -0
- package/dist/module/components/ConfirmPopup.js.map +1 -0
- package/dist/module/components/ConfirmationPopup.js +77 -0
- package/dist/module/components/ConfirmationPopup.js.map +1 -0
- package/dist/module/components/DropDownItem.js +82 -0
- package/dist/module/components/DropDownItem.js.map +1 -0
- package/dist/module/components/DropDownMenu.js +46 -0
- package/dist/module/components/DropDownMenu.js.map +1 -0
- package/dist/module/components/EmptyStateMain.js +50 -0
- package/dist/module/components/EmptyStateMain.js.map +1 -0
- package/dist/module/components/EmptyStateWidget.js +52 -0
- package/dist/module/components/EmptyStateWidget.js.map +1 -0
- package/dist/module/components/FontScaleButton.js +37 -0
- package/dist/module/components/FontScaleButton.js.map +1 -0
- package/dist/module/components/FontScalePopup.js +77 -0
- package/dist/module/components/FontScalePopup.js.map +1 -0
- package/dist/module/components/FormCard.js +28 -0
- package/dist/module/components/FormCard.js.map +1 -0
- package/dist/module/components/FormCardSection.js +240 -0
- package/dist/module/components/FormCardSection.js.map +1 -0
- package/dist/module/components/FormCardSectionOptionLauncher.js +77 -0
- package/dist/module/components/FormCardSectionOptionLauncher.js.map +1 -0
- package/dist/module/components/FormattedText.js +145 -0
- package/dist/module/components/FormattedText.js.map +1 -0
- package/dist/module/components/GenericInput.js +161 -0
- package/dist/module/components/GenericInput.js.map +1 -0
- package/dist/module/components/GenericInputSection.js +174 -0
- package/dist/module/components/GenericInputSection.js.map +1 -0
- package/dist/module/components/Header.js +491 -0
- package/dist/module/components/Header.js.map +1 -0
- package/dist/module/components/ImagePopup.js +257 -0
- package/dist/module/components/ImagePopup.js.map +1 -0
- package/dist/module/components/ImageUploadProgress.js +72 -0
- package/dist/module/components/ImageUploadProgress.js.map +1 -0
- package/dist/module/components/ImageUploader.js +850 -0
- package/dist/module/components/ImageUploader.js.map +1 -0
- package/dist/module/components/InlineButton.js +72 -0
- package/dist/module/components/InlineButton.js.map +1 -0
- package/dist/module/components/Input.js +164 -0
- package/dist/module/components/Input.js.map +1 -0
- package/dist/module/components/LoadingCircles.js +224 -0
- package/dist/module/components/LoadingCircles.js.map +1 -0
- package/dist/module/components/LoadingIndicator.js +95 -0
- package/dist/module/components/LoadingIndicator.js.map +1 -0
- package/dist/module/components/LoadingStateWidget.js +51 -0
- package/dist/module/components/LoadingStateWidget.js.map +1 -0
- package/dist/module/components/MediaPlayer.js +440 -0
- package/dist/module/components/MediaPlayer.js.map +1 -0
- package/dist/module/components/MiddlePopup.js +46 -0
- package/dist/module/components/MiddlePopup.js.map +1 -0
- package/dist/module/components/PDFPopup.js +188 -0
- package/dist/module/components/PDFPopup.js.map +1 -0
- package/dist/module/components/PlussChat.js +997 -0
- package/dist/module/components/PlussChat.js.map +1 -0
- package/dist/module/components/PlussChatMessage.js +204 -0
- package/dist/module/components/PlussChatMessage.js.map +1 -0
- package/dist/module/components/PlussChatTime.js +66 -0
- package/dist/module/components/PlussChatTime.js.map +1 -0
- package/dist/module/components/Popup.js +138 -0
- package/dist/module/components/Popup.js.map +1 -0
- package/dist/module/components/PopupMenu.js +128 -0
- package/dist/module/components/PopupMenu.js.map +1 -0
- package/dist/module/components/PositionedImage.js +333 -0
- package/dist/module/components/PositionedImage.js.map +1 -0
- package/dist/module/components/ProfilePic.js +119 -0
- package/dist/module/components/ProfilePic.js.map +1 -0
- package/dist/module/components/RadioButton.js +84 -0
- package/dist/module/components/RadioButton.js.map +1 -0
- package/dist/module/components/Reaction.js +129 -0
- package/dist/module/components/Reaction.js.map +1 -0
- package/dist/module/components/Reactions.js +84 -0
- package/dist/module/components/Reactions.js.map +1 -0
- package/dist/module/components/SharingTools.js +162 -0
- package/dist/module/components/SharingTools.js.map +1 -0
- package/dist/module/components/Spinner.js +25 -0
- package/dist/module/components/Spinner.js.map +1 -0
- package/dist/module/components/StickyFooter.js +37 -0
- package/dist/module/components/StickyFooter.js.map +1 -0
- package/dist/module/components/TextStyle.js +34 -0
- package/dist/module/components/TextStyle.js.map +1 -0
- package/dist/module/components/Toggle.js +70 -0
- package/dist/module/components/Toggle.js.map +1 -0
- package/dist/module/components/TouchableSearchBar.js +73 -0
- package/dist/module/components/TouchableSearchBar.js.map +1 -0
- package/dist/module/components/UserListPopup.js +146 -0
- package/dist/module/components/UserListPopup.js.map +1 -0
- package/dist/module/components/UserListing.js +291 -0
- package/dist/module/components/UserListing.js.map +1 -0
- package/dist/module/components/VideoPopup.js +123 -0
- package/dist/module/components/VideoPopup.js.map +1 -0
- package/dist/module/components/WarningPopup.js +87 -0
- package/dist/module/components/WarningPopup.js.map +1 -0
- package/dist/module/components/expo-image-picker-multiple/ImageBrowser.js +325 -0
- package/dist/module/components/expo-image-picker-multiple/ImageBrowser.js.map +1 -0
- package/dist/module/components/expo-image-picker-multiple/ImageTile.js +123 -0
- package/dist/module/components/expo-image-picker-multiple/ImageTile.js.map +1 -0
- package/dist/module/components/index.js +53 -0
- package/dist/module/components/index.js.map +1 -0
- package/dist/module/components/react-native-expo-image-cropper/ExpoImageManipulator.js +416 -0
- package/dist/module/components/react-native-expo-image-cropper/ExpoImageManipulator.js.map +1 -0
- package/dist/module/components/react-native-expo-image-cropper/ImageCropOverlay.js +405 -0
- package/dist/module/components/react-native-expo-image-cropper/ImageCropOverlay.js.map +1 -0
- package/dist/module/config.js +27 -0
- package/dist/module/config.js.map +1 -0
- package/dist/module/constants.js +16 -0
- package/dist/module/constants.js.map +1 -0
- package/dist/module/fonts/index.js +2 -0
- package/dist/module/fonts/index.js.map +1 -0
- package/dist/module/fonts/pluss60-icons.js +5 -0
- package/dist/module/fonts/pluss60-icons.js.map +1 -0
- package/dist/module/fonts/pluss60-icons.json +1097 -0
- package/dist/module/helper.js +436 -0
- package/dist/module/helper.js.map +1 -0
- package/dist/module/index.js +13 -0
- package/dist/module/index.js.map +1 -0
- package/dist/module/session.js +54 -0
- package/dist/module/session.js.map +1 -0
- package/dist/module/styles.js +67 -0
- package/dist/module/styles.js.map +1 -0
- package/package.json +22 -5
- package/src/assets/icons/reactions/heart.png +0 -0
- package/src/assets/icons/reactions/party.png +0 -0
- package/src/assets/icons/reactions/sad.png +0 -0
- package/src/assets/icons/reactions/smile.png +0 -0
- package/src/components/CommentReply.js +0 -2
- package/src/constants.js +4 -4
- package/src/helper.js +4 -4
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Dimensions, ImageBackground, TouchableHighlight, View, Text, StyleSheet } from 'react-native';
|
|
3
|
+
import * as MediaLibrary from 'expo-media-library';
|
|
4
|
+
import { Icon } from 'react-native-elements';
|
|
5
|
+
import moment from 'moment';
|
|
6
|
+
import { getThumb300 } from '../../helper';
|
|
7
|
+
const screenWidth = Dimensions.get('window').width;
|
|
8
|
+
|
|
9
|
+
class ImageTile extends React.PureComponent {
|
|
10
|
+
renderVideoOverlay() {
|
|
11
|
+
const {
|
|
12
|
+
item
|
|
13
|
+
} = this.props;
|
|
14
|
+
if (item.mediaType !== MediaLibrary.MediaType.video) return null;
|
|
15
|
+
let durationText = '';
|
|
16
|
+
|
|
17
|
+
if (item.duration) {
|
|
18
|
+
const duration = moment.duration(item.duration, 'seconds').asMilliseconds();
|
|
19
|
+
durationText = moment.utc(duration).format('HH:mm:ss');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return /*#__PURE__*/React.createElement(View, {
|
|
23
|
+
style: styles.defaultVideoOverlay
|
|
24
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
25
|
+
name: "video-camera",
|
|
26
|
+
type: "font-awesome",
|
|
27
|
+
iconStyle: styles.videoIcon,
|
|
28
|
+
style: styles.videoIconContainer
|
|
29
|
+
}), /*#__PURE__*/React.createElement(Text, {
|
|
30
|
+
style: styles.videoDurationText
|
|
31
|
+
}, durationText));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
renderSelectedOverlay() {
|
|
35
|
+
const {
|
|
36
|
+
selected,
|
|
37
|
+
selectedItemNumber,
|
|
38
|
+
renderSelectedComponent
|
|
39
|
+
} = this.props;
|
|
40
|
+
if (!selected) return null;
|
|
41
|
+
if (renderSelectedComponent) return renderSelectedComponent(selectedItemNumber);
|
|
42
|
+
return /*#__PURE__*/React.createElement(View, {
|
|
43
|
+
style: [styles.defaultSelectedOverlay, {
|
|
44
|
+
opacity: selected ? 0.5 : 1
|
|
45
|
+
}]
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
render() {
|
|
50
|
+
const {
|
|
51
|
+
item,
|
|
52
|
+
index,
|
|
53
|
+
selectImage,
|
|
54
|
+
width,
|
|
55
|
+
height,
|
|
56
|
+
style,
|
|
57
|
+
isRemote
|
|
58
|
+
} = this.props;
|
|
59
|
+
if (!item) return null;
|
|
60
|
+
const actualWidth = width || screenWidth / 4;
|
|
61
|
+
const actualHeight = height || screenWidth / 4;
|
|
62
|
+
const uri = isRemote ? getThumb300(item.uri) : item.uri;
|
|
63
|
+
return /*#__PURE__*/React.createElement(TouchableHighlight, {
|
|
64
|
+
underlayColor: "transparent",
|
|
65
|
+
onPress: () => selectImage(item, index)
|
|
66
|
+
}, /*#__PURE__*/React.createElement(View, {
|
|
67
|
+
style: [{
|
|
68
|
+
width: actualWidth,
|
|
69
|
+
height: actualHeight
|
|
70
|
+
}, style]
|
|
71
|
+
}, /*#__PURE__*/React.createElement(View, {
|
|
72
|
+
style: styles.imageContainer
|
|
73
|
+
}, /*#__PURE__*/React.createElement(ImageBackground, {
|
|
74
|
+
style: styles.imageBackground,
|
|
75
|
+
source: {
|
|
76
|
+
uri
|
|
77
|
+
}
|
|
78
|
+
}, this.renderVideoOverlay(), this.renderSelectedOverlay()))));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const styles = StyleSheet.create({
|
|
84
|
+
imageContainer: {
|
|
85
|
+
flex: 1,
|
|
86
|
+
alignItems: 'center',
|
|
87
|
+
justifyContent: 'center'
|
|
88
|
+
},
|
|
89
|
+
imageBackground: {
|
|
90
|
+
width: '100%',
|
|
91
|
+
height: '100%'
|
|
92
|
+
},
|
|
93
|
+
defaultSelectedOverlay: {
|
|
94
|
+
flex: 1,
|
|
95
|
+
backgroundColor: '#000'
|
|
96
|
+
},
|
|
97
|
+
defaultVideoOverlay: {
|
|
98
|
+
position: 'absolute',
|
|
99
|
+
left: 3,
|
|
100
|
+
bottom: 3,
|
|
101
|
+
right: 3,
|
|
102
|
+
flexDirection: 'row',
|
|
103
|
+
justifyContent: 'space-between',
|
|
104
|
+
alignItems: 'center'
|
|
105
|
+
},
|
|
106
|
+
videoIconContainer: {
|
|
107
|
+
flex: 1,
|
|
108
|
+
paddingRight: 8,
|
|
109
|
+
paddingBottom: 1
|
|
110
|
+
},
|
|
111
|
+
videoIcon: {
|
|
112
|
+
fontSize: 12,
|
|
113
|
+
color: '#fff',
|
|
114
|
+
textAlign: 'right'
|
|
115
|
+
},
|
|
116
|
+
videoDurationText: {
|
|
117
|
+
fontFamily: 'sf-semibold',
|
|
118
|
+
fontSize: 12,
|
|
119
|
+
color: '#fff'
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
export default ImageTile;
|
|
123
|
+
//# sourceMappingURL=ImageTile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["ImageTile.js"],"names":["React","Dimensions","ImageBackground","TouchableHighlight","View","Text","StyleSheet","MediaLibrary","Icon","moment","getThumb300","screenWidth","get","width","ImageTile","PureComponent","renderVideoOverlay","item","props","mediaType","MediaType","video","durationText","duration","asMilliseconds","utc","format","styles","defaultVideoOverlay","videoIcon","videoIconContainer","videoDurationText","renderSelectedOverlay","selected","selectedItemNumber","renderSelectedComponent","defaultSelectedOverlay","opacity","render","index","selectImage","height","style","isRemote","actualWidth","actualHeight","uri","imageContainer","imageBackground","create","flex","alignItems","justifyContent","backgroundColor","position","left","bottom","right","flexDirection","paddingRight","paddingBottom","fontSize","color","textAlign","fontFamily"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { Dimensions, ImageBackground, TouchableHighlight, View, Text, StyleSheet } from 'react-native';\nimport * as MediaLibrary from 'expo-media-library';\nimport { Icon } from 'react-native-elements';\nimport moment from 'moment';\nimport { getThumb300 } from '../../helper';\n\nconst screenWidth = Dimensions.get('window').width;\n\nclass ImageTile extends React.PureComponent {\n renderVideoOverlay() {\n const { item } = this.props;\n if (item.mediaType !== MediaLibrary.MediaType.video) return null;\n\n let durationText = '';\n if (item.duration) {\n const duration = moment.duration(item.duration, 'seconds').asMilliseconds();\n durationText = moment.utc(duration).format('HH:mm:ss');\n }\n return (\n <View style={styles.defaultVideoOverlay}>\n <Icon name=\"video-camera\" type=\"font-awesome\" iconStyle={styles.videoIcon} style={styles.videoIconContainer} />\n <Text style={styles.videoDurationText}>{durationText}</Text>\n </View>\n );\n }\n\n renderSelectedOverlay() {\n const { selected, selectedItemNumber, renderSelectedComponent } = this.props;\n if (!selected) return null;\n if (renderSelectedComponent) return renderSelectedComponent(selectedItemNumber);\n return <View style={[styles.defaultSelectedOverlay, { opacity: selected ? 0.5 : 1 }]} />;\n }\n\n render() {\n const { item, index, selectImage, width, height, style, isRemote } = this.props;\n if (!item) return null;\n\n const actualWidth = width || screenWidth / 4;\n const actualHeight = height || screenWidth / 4;\n const uri = isRemote ? getThumb300(item.uri) : item.uri;\n\n return (\n <TouchableHighlight underlayColor=\"transparent\" onPress={() => selectImage(item, index)}>\n <View style={[{ width: actualWidth, height: actualHeight }, style]}>\n <View style={styles.imageContainer}>\n <ImageBackground style={styles.imageBackground} source={{ uri }}>\n {this.renderVideoOverlay()}\n {this.renderSelectedOverlay()}\n </ImageBackground>\n </View>\n </View>\n </TouchableHighlight>\n );\n }\n}\n\nconst styles = StyleSheet.create({\n imageContainer: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n imageBackground: {\n width: '100%',\n height: '100%',\n },\n defaultSelectedOverlay: {\n flex: 1,\n backgroundColor: '#000',\n },\n defaultVideoOverlay: {\n position: 'absolute',\n left: 3,\n bottom: 3,\n right: 3,\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n videoIconContainer: {\n flex: 1,\n paddingRight: 8,\n paddingBottom: 1,\n },\n videoIcon: {\n fontSize: 12,\n color: '#fff',\n textAlign: 'right',\n },\n videoDurationText: {\n fontFamily: 'sf-semibold',\n fontSize: 12,\n color: '#fff',\n },\n});\n\nexport default ImageTile;\n"]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export * from './InlineButton';
|
|
2
|
+
export * from './FormCard';
|
|
3
|
+
export * from './FormCardSection';
|
|
4
|
+
export * from './FormCardSectionOptionLauncher';
|
|
5
|
+
export * from './ProfilePic';
|
|
6
|
+
export * from './Spinner';
|
|
7
|
+
export * from './LoadingCircles';
|
|
8
|
+
export * from './Popup';
|
|
9
|
+
export * from './ImagePopup';
|
|
10
|
+
export * from './VideoPopup';
|
|
11
|
+
export * from './SharingTools';
|
|
12
|
+
export * from './MiddlePopup';
|
|
13
|
+
export * from './ConfirmPopup';
|
|
14
|
+
export * from './ConfirmationPopup';
|
|
15
|
+
export * from './CommentSection';
|
|
16
|
+
export * from './CommentReply';
|
|
17
|
+
export * from './PopupMenu';
|
|
18
|
+
export * from './AddButton';
|
|
19
|
+
export * from './Attachment';
|
|
20
|
+
export * from './GenericInputSection';
|
|
21
|
+
export * from './GenericInput';
|
|
22
|
+
export * from './RadioButton';
|
|
23
|
+
export * from './PDFPopup';
|
|
24
|
+
export * from './TextStyle';
|
|
25
|
+
export * from './Toggle';
|
|
26
|
+
export * from './Input';
|
|
27
|
+
export * from './StickyFooter';
|
|
28
|
+
export * from './CategoryTabs';
|
|
29
|
+
export * from './DropDownMenu';
|
|
30
|
+
export * from './DropDownItem';
|
|
31
|
+
export * from './BackButton';
|
|
32
|
+
export * from './Reaction';
|
|
33
|
+
export * from './TouchableSearchBar';
|
|
34
|
+
export * from './WarningPopup';
|
|
35
|
+
export * from './FontScalePopup';
|
|
36
|
+
export * from './FontScaleButton';
|
|
37
|
+
export * from './UserListPopup';
|
|
38
|
+
export * from './Reactions';
|
|
39
|
+
export * from './AudienceSelectorLauncher';
|
|
40
|
+
export { default as EmptyStateWidget } from './EmptyStateWidget';
|
|
41
|
+
export { default as EmptyStateMain } from './EmptyStateMain';
|
|
42
|
+
export { default as LoadingStateWidget } from './LoadingStateWidget';
|
|
43
|
+
export { default as Header } from './Header';
|
|
44
|
+
export { default as LoadingIndicator } from './LoadingIndicator';
|
|
45
|
+
export { default as ImageUploader } from './ImageUploader';
|
|
46
|
+
export { default as ImageUploadProgress } from './ImageUploadProgress';
|
|
47
|
+
export { default as UserListing } from './UserListing';
|
|
48
|
+
export { default as PlussChat } from './PlussChat';
|
|
49
|
+
export { default as PositionedImage } from './PositionedImage';
|
|
50
|
+
export { default as FormattedText } from './FormattedText';
|
|
51
|
+
export { default as MediaPlayer } from './MediaPlayer';
|
|
52
|
+
export { default as AudienceSelectorPage } from './AudienceSelectorPage';
|
|
53
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["index.js"],"names":["default","EmptyStateWidget","EmptyStateMain","LoadingStateWidget","Header","LoadingIndicator","ImageUploader","ImageUploadProgress","UserListing","PlussChat","PositionedImage","FormattedText","MediaPlayer","AudienceSelectorPage"],"mappings":"AAAA,cAAc,gBAAd;AACA,cAAc,YAAd;AACA,cAAc,mBAAd;AACA,cAAc,iCAAd;AACA,cAAc,cAAd;AACA,cAAc,WAAd;AACA,cAAc,kBAAd;AACA,cAAc,SAAd;AACA,cAAc,cAAd;AACA,cAAc,cAAd;AACA,cAAc,gBAAd;AACA,cAAc,eAAd;AACA,cAAc,gBAAd;AACA,cAAc,qBAAd;AACA,cAAc,kBAAd;AACA,cAAc,gBAAd;AACA,cAAc,aAAd;AACA,cAAc,aAAd;AACA,cAAc,cAAd;AACA,cAAc,uBAAd;AACA,cAAc,gBAAd;AACA,cAAc,eAAd;AACA,cAAc,YAAd;AACA,cAAc,aAAd;AACA,cAAc,UAAd;AACA,cAAc,SAAd;AACA,cAAc,gBAAd;AACA,cAAc,gBAAd;AACA,cAAc,gBAAd;AACA,cAAc,gBAAd;AACA,cAAc,cAAd;AACA,cAAc,YAAd;AACA,cAAc,sBAAd;AACA,cAAc,gBAAd;AACA,cAAc,kBAAd;AACA,cAAc,mBAAd;AACA,cAAc,iBAAd;AACA,cAAc,aAAd;AACA,cAAc,4BAAd;AACA,SAASA,OAAO,IAAIC,gBAApB,QAA4C,oBAA5C;AACA,SAASD,OAAO,IAAIE,cAApB,QAA0C,kBAA1C;AACA,SAASF,OAAO,IAAIG,kBAApB,QAA8C,sBAA9C;AACA,SAASH,OAAO,IAAII,MAApB,QAAkC,UAAlC;AACA,SAASJ,OAAO,IAAIK,gBAApB,QAA4C,oBAA5C;AACA,SAASL,OAAO,IAAIM,aAApB,QAAyC,iBAAzC;AACA,SAASN,OAAO,IAAIO,mBAApB,QAA+C,uBAA/C;AACA,SAASP,OAAO,IAAIQ,WAApB,QAAuC,eAAvC;AACA,SAASR,OAAO,IAAIS,SAApB,QAAqC,aAArC;AACA,SAAST,OAAO,IAAIU,eAApB,QAA2C,mBAA3C;AACA,SAASV,OAAO,IAAIW,aAApB,QAAyC,iBAAzC;AACA,SAASX,OAAO,IAAIY,WAApB,QAAuC,eAAvC;AACA,SAASZ,OAAO,IAAIa,oBAApB,QAAgD,wBAAhD","sourcesContent":["export * from './InlineButton';\nexport * from './FormCard';\nexport * from './FormCardSection';\nexport * from './FormCardSectionOptionLauncher';\nexport * from './ProfilePic';\nexport * from './Spinner';\nexport * from './LoadingCircles';\nexport * from './Popup';\nexport * from './ImagePopup';\nexport * from './VideoPopup';\nexport * from './SharingTools';\nexport * from './MiddlePopup';\nexport * from './ConfirmPopup';\nexport * from './ConfirmationPopup';\nexport * from './CommentSection';\nexport * from './CommentReply';\nexport * from './PopupMenu';\nexport * from './AddButton';\nexport * from './Attachment';\nexport * from './GenericInputSection';\nexport * from './GenericInput';\nexport * from './RadioButton';\nexport * from './PDFPopup';\nexport * from './TextStyle';\nexport * from './Toggle';\nexport * from './Input';\nexport * from './StickyFooter';\nexport * from './CategoryTabs';\nexport * from './DropDownMenu';\nexport * from './DropDownItem';\nexport * from './BackButton';\nexport * from './Reaction';\nexport * from './TouchableSearchBar';\nexport * from './WarningPopup';\nexport * from './FontScalePopup';\nexport * from './FontScaleButton';\nexport * from './UserListPopup';\nexport * from './Reactions';\nexport * from './AudienceSelectorLauncher';\nexport { default as EmptyStateWidget } from './EmptyStateWidget';\nexport { default as EmptyStateMain } from './EmptyStateMain';\nexport { default as LoadingStateWidget } from './LoadingStateWidget';\nexport { default as Header } from './Header';\nexport { default as LoadingIndicator } from './LoadingIndicator';\nexport { default as ImageUploader } from './ImageUploader';\nexport { default as ImageUploadProgress } from './ImageUploadProgress';\nexport { default as UserListing } from './UserListing';\nexport { default as PlussChat } from './PlussChat';\nexport { default as PositionedImage } from './PositionedImage';\nexport { default as FormattedText } from './FormattedText';\nexport { default as MediaPlayer } from './MediaPlayer';\nexport { default as AudienceSelectorPage } from './AudienceSelectorPage';\n"]}
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
+
|
|
3
|
+
import React, { Component } from 'react';
|
|
4
|
+
import { Dimensions, Image, ScrollView, Modal, View, Text, SafeAreaView, TouchableOpacity, StyleSheet, Platform, LogBox } from 'react-native';
|
|
5
|
+
import * as ImageManipulator from 'expo-image-manipulator';
|
|
6
|
+
import PropTypes from 'prop-types';
|
|
7
|
+
import AutoHeightImage from 'react-native-auto-height-image';
|
|
8
|
+
import { isIphoneX, getStatusBarHeight } from 'react-native-iphone-x-helper';
|
|
9
|
+
import ImageCropOverlay from './ImageCropOverlay';
|
|
10
|
+
const {
|
|
11
|
+
width
|
|
12
|
+
} = Dimensions.get('window');
|
|
13
|
+
const topMargin = getStatusBarHeight() + (Platform.OS === 'ios' ? 50 : 20);
|
|
14
|
+
LogBox.ignoreLogs(['componentWillReceiveProps', 'componentWillUpdate', 'componentWillMount']);
|
|
15
|
+
LogBox.ignoreLogs(['Warning: componentWillMount is deprecated', 'Warning: componentWillReceiveProps is deprecated', 'Module RCTImageLoader requires']);
|
|
16
|
+
|
|
17
|
+
class ExpoImageManipulator extends Component {
|
|
18
|
+
constructor(props) {
|
|
19
|
+
var _this;
|
|
20
|
+
|
|
21
|
+
super(props);
|
|
22
|
+
_this = this;
|
|
23
|
+
|
|
24
|
+
_defineProperty(this, "onToggleModal", () => {
|
|
25
|
+
this.props.onToggleModal();
|
|
26
|
+
this.setState({
|
|
27
|
+
cropMode: false
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
_defineProperty(this, "onCropImage", function () {
|
|
32
|
+
let callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
|
|
33
|
+
|
|
34
|
+
_this.setState({
|
|
35
|
+
processing: true
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const {
|
|
39
|
+
uri
|
|
40
|
+
} = _this.state;
|
|
41
|
+
Image.getSize(uri, async (actualWidth, actualHeight) => {
|
|
42
|
+
let cropObj = _this.getCropBounds(actualWidth, actualHeight);
|
|
43
|
+
|
|
44
|
+
if (cropObj.height > 0 && cropObj.width > 0) {
|
|
45
|
+
let uriToCrop = uri;
|
|
46
|
+
const {
|
|
47
|
+
uri: uriCroped,
|
|
48
|
+
base64,
|
|
49
|
+
width: croppedWidth,
|
|
50
|
+
height: croppedHeight
|
|
51
|
+
} = await _this.crop(cropObj, uriToCrop);
|
|
52
|
+
_this.actualSize.width = croppedWidth;
|
|
53
|
+
_this.actualSize.height = croppedHeight;
|
|
54
|
+
|
|
55
|
+
_this.setState({
|
|
56
|
+
uri: uriCroped,
|
|
57
|
+
base64,
|
|
58
|
+
cropMode: false,
|
|
59
|
+
processing: false
|
|
60
|
+
}, () => {
|
|
61
|
+
if (callback) callback();
|
|
62
|
+
});
|
|
63
|
+
} else {
|
|
64
|
+
_this.setState({
|
|
65
|
+
cropMode: false,
|
|
66
|
+
processing: false
|
|
67
|
+
}, () => {
|
|
68
|
+
if (callback) callback();
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
_defineProperty(this, "onHandleScroll", event => {
|
|
75
|
+
this.scrollOffset = event.nativeEvent.contentOffset.y;
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
_defineProperty(this, "getCropBounds", (actualWidth, actualHeight) => {
|
|
79
|
+
let imageRatio = actualHeight / actualWidth;
|
|
80
|
+
var originalHeight = Dimensions.get('window').height - 64;
|
|
81
|
+
|
|
82
|
+
if (isIphoneX()) {
|
|
83
|
+
originalHeight = Dimensions.get('window').height - 122;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
let renderedImageWidth = imageRatio < originalHeight / width ? width : originalHeight / imageRatio;
|
|
87
|
+
let renderedImageHeight = imageRatio < originalHeight / width ? width * imageRatio : originalHeight;
|
|
88
|
+
let renderedImageY = (originalHeight - renderedImageHeight) / 2.0;
|
|
89
|
+
let renderedImageX = (width - renderedImageWidth) / 2.0;
|
|
90
|
+
const renderImageObj = {
|
|
91
|
+
left: renderedImageX,
|
|
92
|
+
top: renderedImageY,
|
|
93
|
+
width: renderedImageWidth,
|
|
94
|
+
height: renderedImageHeight
|
|
95
|
+
};
|
|
96
|
+
const cropOverlayObj = {
|
|
97
|
+
left: this.currentPos.left,
|
|
98
|
+
top: this.currentPos.top,
|
|
99
|
+
width: this.currentSize.width,
|
|
100
|
+
height: this.currentSize.height
|
|
101
|
+
};
|
|
102
|
+
var intersectAreaObj = {};
|
|
103
|
+
let x = Math.max(renderImageObj.left, cropOverlayObj.left);
|
|
104
|
+
let num1 = Math.min(renderImageObj.left + renderImageObj.width, cropOverlayObj.left + cropOverlayObj.width);
|
|
105
|
+
let y = Math.max(renderImageObj.top, cropOverlayObj.top);
|
|
106
|
+
let num2 = Math.min(renderImageObj.top + renderImageObj.height, cropOverlayObj.top + cropOverlayObj.height);
|
|
107
|
+
if (num1 >= x && num2 >= y) intersectAreaObj = {
|
|
108
|
+
originX: (x - renderedImageX) * (actualWidth / renderedImageWidth),
|
|
109
|
+
originY: (y - renderedImageY) * (actualWidth / renderedImageWidth),
|
|
110
|
+
width: (num1 - x) * (actualWidth / renderedImageWidth),
|
|
111
|
+
height: (num2 - y) * (actualWidth / renderedImageWidth)
|
|
112
|
+
};else {
|
|
113
|
+
intersectAreaObj = {
|
|
114
|
+
originX: x - renderedImageX,
|
|
115
|
+
originY: y - renderedImageY,
|
|
116
|
+
width: 0,
|
|
117
|
+
height: 0
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return intersectAreaObj;
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
_defineProperty(this, "crop", async (cropObj, uri) => {
|
|
124
|
+
const {
|
|
125
|
+
saveOptions
|
|
126
|
+
} = this.props;
|
|
127
|
+
|
|
128
|
+
if (cropObj.height > 0 && cropObj.width > 0) {
|
|
129
|
+
const manipResult = await ImageManipulator.manipulateAsync(uri, [{
|
|
130
|
+
crop: cropObj
|
|
131
|
+
}], saveOptions);
|
|
132
|
+
return manipResult;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return {
|
|
136
|
+
uri: null,
|
|
137
|
+
base64: null
|
|
138
|
+
};
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
_defineProperty(this, "calculateMaxSizes", event => {
|
|
142
|
+
let w1 = event.nativeEvent.layout.width || 100;
|
|
143
|
+
let h1 = event.nativeEvent.layout.height || 100;
|
|
144
|
+
|
|
145
|
+
if (this.state.squareAspect) {
|
|
146
|
+
if (w1 < h1) h1 = w1;else w1 = h1;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
this.maxSizes.width = w1;
|
|
150
|
+
this.maxSizes.height = h1;
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
const {
|
|
154
|
+
squareAspect
|
|
155
|
+
} = this.props;
|
|
156
|
+
this.state = {
|
|
157
|
+
cropMode: false,
|
|
158
|
+
processing: false,
|
|
159
|
+
squareAspect
|
|
160
|
+
};
|
|
161
|
+
this.scrollOffset = 0;
|
|
162
|
+
this.currentPos = {
|
|
163
|
+
left: 0,
|
|
164
|
+
top: 0
|
|
165
|
+
};
|
|
166
|
+
this.currentSize = {
|
|
167
|
+
width: 0,
|
|
168
|
+
height: 0
|
|
169
|
+
};
|
|
170
|
+
this.maxSizes = {
|
|
171
|
+
width: 0,
|
|
172
|
+
height: 0
|
|
173
|
+
};
|
|
174
|
+
this.actualSize = {
|
|
175
|
+
width: 0,
|
|
176
|
+
height: 0
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
async componentDidMount() {
|
|
181
|
+
await this.onConvertImageToEditableSize(); // Set cropping by default
|
|
182
|
+
|
|
183
|
+
this.setState({
|
|
184
|
+
cropMode: true
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
async onConvertImageToEditableSize() {
|
|
189
|
+
const {
|
|
190
|
+
photo: {
|
|
191
|
+
uri: rawUri
|
|
192
|
+
}
|
|
193
|
+
} = this.props;
|
|
194
|
+
const {
|
|
195
|
+
uri,
|
|
196
|
+
width,
|
|
197
|
+
height
|
|
198
|
+
} = await ImageManipulator.manipulateAsync(rawUri, [{
|
|
199
|
+
resize: {
|
|
200
|
+
width: 1080
|
|
201
|
+
}
|
|
202
|
+
}]);
|
|
203
|
+
this.setState({
|
|
204
|
+
uri
|
|
205
|
+
});
|
|
206
|
+
this.actualSize.width = width;
|
|
207
|
+
this.actualSize.height = height;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// eslint-disable-next-line camelcase
|
|
211
|
+
async UNSAFE_componentWillReceiveProps() {
|
|
212
|
+
await this.onConvertImageToEditableSize();
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
render() {
|
|
216
|
+
const {
|
|
217
|
+
isVisible,
|
|
218
|
+
onPictureChoosed
|
|
219
|
+
} = this.props;
|
|
220
|
+
const {
|
|
221
|
+
uri,
|
|
222
|
+
base64,
|
|
223
|
+
cropMode,
|
|
224
|
+
processing
|
|
225
|
+
} = this.state;
|
|
226
|
+
let imageRatio = this.actualSize.height / this.actualSize.width;
|
|
227
|
+
var originalHeight = Dimensions.get('window').height - 64;
|
|
228
|
+
|
|
229
|
+
if (isIphoneX()) {
|
|
230
|
+
originalHeight = Dimensions.get('window').height - 122;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
let cropRatio = originalHeight / width;
|
|
234
|
+
let cropWidth = imageRatio < cropRatio ? width : originalHeight / imageRatio;
|
|
235
|
+
let cropHeight = imageRatio < cropRatio ? width * imageRatio : originalHeight;
|
|
236
|
+
let cropInitialTop = (originalHeight - cropHeight) / 2.0;
|
|
237
|
+
let cropInitialLeft = (width - cropWidth) / 2.0;
|
|
238
|
+
|
|
239
|
+
if (this.currentSize.width == 0 && cropMode) {
|
|
240
|
+
this.currentSize.width = cropWidth;
|
|
241
|
+
this.currentSize.height = cropHeight;
|
|
242
|
+
this.currentPos.top = cropInitialTop;
|
|
243
|
+
this.currentPos.left = cropInitialLeft;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return /*#__PURE__*/React.createElement(Modal, {
|
|
247
|
+
animationType: "slide",
|
|
248
|
+
transparent: true,
|
|
249
|
+
visible: isVisible,
|
|
250
|
+
hardwareAccelerated: true,
|
|
251
|
+
onRequestClose: () => {
|
|
252
|
+
this.onToggleModal();
|
|
253
|
+
}
|
|
254
|
+
}, uri !== undefined ? /*#__PURE__*/React.createElement(View, {
|
|
255
|
+
style: styles.container
|
|
256
|
+
}, /*#__PURE__*/React.createElement(SafeAreaView, {
|
|
257
|
+
style: [{
|
|
258
|
+
width
|
|
259
|
+
}, styles.headerContainer]
|
|
260
|
+
}, !cropMode ? /*#__PURE__*/React.createElement(View, {
|
|
261
|
+
style: [styles.headerButtonContainer, {
|
|
262
|
+
justifyContent: 'flex-end'
|
|
263
|
+
}]
|
|
264
|
+
}, /*#__PURE__*/React.createElement(TouchableOpacity, {
|
|
265
|
+
onPress: () => {
|
|
266
|
+
onPictureChoosed({
|
|
267
|
+
uri,
|
|
268
|
+
base64
|
|
269
|
+
});
|
|
270
|
+
this.onToggleModal();
|
|
271
|
+
},
|
|
272
|
+
style: styles.headerButton
|
|
273
|
+
}, /*#__PURE__*/React.createElement(Text, {
|
|
274
|
+
style: styles.headerButtonText
|
|
275
|
+
}, 'Done'))) : /*#__PURE__*/React.createElement(View, {
|
|
276
|
+
style: styles.headerButtonContainer
|
|
277
|
+
}, /*#__PURE__*/React.createElement(TouchableOpacity, {
|
|
278
|
+
onPress: this.onToggleModal,
|
|
279
|
+
style: styles.headerButton
|
|
280
|
+
}, /*#__PURE__*/React.createElement(Text, {
|
|
281
|
+
style: styles.headerButtonText
|
|
282
|
+
}, 'Cancel')), /*#__PURE__*/React.createElement(TouchableOpacity, {
|
|
283
|
+
onPress: () => {
|
|
284
|
+
this.onCropImage(() => {
|
|
285
|
+
onPictureChoosed({
|
|
286
|
+
uri: this.state.uri,
|
|
287
|
+
base64: this.state.base64
|
|
288
|
+
});
|
|
289
|
+
this.onToggleModal();
|
|
290
|
+
});
|
|
291
|
+
},
|
|
292
|
+
style: styles.headerButton
|
|
293
|
+
}, /*#__PURE__*/React.createElement(Text, {
|
|
294
|
+
style: styles.headerButtonText
|
|
295
|
+
}, processing ? 'Processing' : 'Done')))), /*#__PURE__*/React.createElement(View, {
|
|
296
|
+
style: [styles.contentContainer, {
|
|
297
|
+
width: Dimensions.get('window').width
|
|
298
|
+
}]
|
|
299
|
+
}, /*#__PURE__*/React.createElement(ScrollView, {
|
|
300
|
+
style: {
|
|
301
|
+
position: 'relative',
|
|
302
|
+
flex: 1
|
|
303
|
+
},
|
|
304
|
+
contentContainerStyle: {
|
|
305
|
+
backgroundColor: 'black'
|
|
306
|
+
},
|
|
307
|
+
maximumZoomScale: 5,
|
|
308
|
+
minimumZoomScale: 0.5,
|
|
309
|
+
onScroll: this.onHandleScroll,
|
|
310
|
+
bounces: false,
|
|
311
|
+
showsHorizontalScrollIndicator: false,
|
|
312
|
+
showsVerticalScrollIndicator: false,
|
|
313
|
+
ref: c => this.scrollView = c,
|
|
314
|
+
scrollEventThrottle: 16,
|
|
315
|
+
scrollEnabled: false,
|
|
316
|
+
pinchGestureEnabled: false
|
|
317
|
+
}, /*#__PURE__*/React.createElement(AutoHeightImage, {
|
|
318
|
+
style: {
|
|
319
|
+
backgroundColor: 'black'
|
|
320
|
+
},
|
|
321
|
+
source: {
|
|
322
|
+
uri
|
|
323
|
+
},
|
|
324
|
+
resizeMode: imageRatio >= 1 ? 'contain' : 'contain',
|
|
325
|
+
width: width,
|
|
326
|
+
height: originalHeight,
|
|
327
|
+
onLayout: this.calculateMaxSizes
|
|
328
|
+
}), !!cropMode && /*#__PURE__*/React.createElement(ImageCropOverlay, {
|
|
329
|
+
onLayoutChanged: (top, left, width, height) => {
|
|
330
|
+
this.currentSize.width = width;
|
|
331
|
+
this.currentSize.height = height;
|
|
332
|
+
this.currentPos.top = top;
|
|
333
|
+
this.currentPos.left = left;
|
|
334
|
+
},
|
|
335
|
+
initialWidth: cropWidth,
|
|
336
|
+
initialHeight: cropHeight,
|
|
337
|
+
initialTop: cropInitialTop,
|
|
338
|
+
initialLeft: cropInitialLeft,
|
|
339
|
+
minHeight: 100,
|
|
340
|
+
minWidth: 100,
|
|
341
|
+
topMargin: topMargin
|
|
342
|
+
})))) : /*#__PURE__*/React.createElement(View, {
|
|
343
|
+
style: styles.container
|
|
344
|
+
}, /*#__PURE__*/React.createElement(Text, {
|
|
345
|
+
style: styles.prepareMessageText
|
|
346
|
+
}, "Preparing..."))); // }
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
const styles = StyleSheet.create({
|
|
352
|
+
headerContainer: {
|
|
353
|
+
flexDirection: 'row',
|
|
354
|
+
backgroundColor: 'black',
|
|
355
|
+
justifyContent: 'space-between'
|
|
356
|
+
},
|
|
357
|
+
headerButtonContainer: {
|
|
358
|
+
flex: 1,
|
|
359
|
+
flexDirection: 'row',
|
|
360
|
+
justifyContent: 'space-between'
|
|
361
|
+
},
|
|
362
|
+
headerButton: {
|
|
363
|
+
marginHorizontal: 10,
|
|
364
|
+
width: 60,
|
|
365
|
+
height: 40,
|
|
366
|
+
alignItems: 'center',
|
|
367
|
+
justifyContent: 'center'
|
|
368
|
+
},
|
|
369
|
+
headerButtonText: {
|
|
370
|
+
fontWeight: '500',
|
|
371
|
+
color: 'white',
|
|
372
|
+
fontSize: 18
|
|
373
|
+
},
|
|
374
|
+
contentContainer: {
|
|
375
|
+
flex: 1,
|
|
376
|
+
backgroundColor: 'black'
|
|
377
|
+
},
|
|
378
|
+
container: {
|
|
379
|
+
flex: 1,
|
|
380
|
+
backgroundColor: '#000d',
|
|
381
|
+
alignItems: 'center',
|
|
382
|
+
justifyContent: 'center'
|
|
383
|
+
},
|
|
384
|
+
prepareMessageText: {
|
|
385
|
+
fontFamily: 'sf-bold',
|
|
386
|
+
fontSize: 20,
|
|
387
|
+
color: '#fff'
|
|
388
|
+
}
|
|
389
|
+
});
|
|
390
|
+
export default ExpoImageManipulator;
|
|
391
|
+
ExpoImageManipulator.defaultProps = {
|
|
392
|
+
onPictureChoosed: _ref => {
|
|
393
|
+
let {
|
|
394
|
+
uri,
|
|
395
|
+
base64
|
|
396
|
+
} = _ref;
|
|
397
|
+
return console.log('URI:', uri, base64);
|
|
398
|
+
},
|
|
399
|
+
dragVelocity: 100,
|
|
400
|
+
resizeVelocity: 50,
|
|
401
|
+
saveOptions: {
|
|
402
|
+
compress: 1,
|
|
403
|
+
format: ImageManipulator.SaveFormat.PNG,
|
|
404
|
+
base64: false
|
|
405
|
+
}
|
|
406
|
+
};
|
|
407
|
+
ExpoImageManipulator.propTypes = {
|
|
408
|
+
isVisible: PropTypes.bool.isRequired,
|
|
409
|
+
onPictureChoosed: PropTypes.func,
|
|
410
|
+
saveOptions: PropTypes.object,
|
|
411
|
+
photo: PropTypes.object.isRequired,
|
|
412
|
+
onToggleModal: PropTypes.func.isRequired,
|
|
413
|
+
dragVelocity: PropTypes.number,
|
|
414
|
+
resizeVelocity: PropTypes.number
|
|
415
|
+
};
|
|
416
|
+
//# sourceMappingURL=ExpoImageManipulator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["ExpoImageManipulator.js"],"names":["React","Component","Dimensions","Image","ScrollView","Modal","View","Text","SafeAreaView","TouchableOpacity","StyleSheet","Platform","LogBox","ImageManipulator","PropTypes","AutoHeightImage","isIphoneX","getStatusBarHeight","ImageCropOverlay","width","get","topMargin","OS","ignoreLogs","ExpoImageManipulator","constructor","props","onToggleModal","setState","cropMode","callback","processing","uri","state","getSize","actualWidth","actualHeight","cropObj","getCropBounds","height","uriToCrop","uriCroped","base64","croppedWidth","croppedHeight","crop","actualSize","event","scrollOffset","nativeEvent","contentOffset","y","imageRatio","originalHeight","renderedImageWidth","renderedImageHeight","renderedImageY","renderedImageX","renderImageObj","left","top","cropOverlayObj","currentPos","currentSize","intersectAreaObj","x","Math","max","num1","min","num2","originX","originY","saveOptions","manipResult","manipulateAsync","w1","layout","h1","squareAspect","maxSizes","componentDidMount","onConvertImageToEditableSize","photo","rawUri","resize","UNSAFE_componentWillReceiveProps","render","isVisible","onPictureChoosed","cropRatio","cropWidth","cropHeight","cropInitialTop","cropInitialLeft","undefined","styles","container","headerContainer","headerButtonContainer","justifyContent","headerButton","headerButtonText","onCropImage","contentContainer","position","flex","backgroundColor","onHandleScroll","c","scrollView","calculateMaxSizes","prepareMessageText","create","flexDirection","marginHorizontal","alignItems","fontWeight","color","fontSize","fontFamily","defaultProps","console","log","dragVelocity","resizeVelocity","compress","format","SaveFormat","PNG","propTypes","bool","isRequired","func","object","number"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport {\n Dimensions,\n Image,\n ScrollView,\n Modal,\n View,\n Text,\n SafeAreaView,\n TouchableOpacity,\n StyleSheet,\n Platform,\n LogBox,\n} from 'react-native';\nimport * as ImageManipulator from 'expo-image-manipulator';\nimport PropTypes from 'prop-types';\nimport AutoHeightImage from 'react-native-auto-height-image';\nimport { isIphoneX, getStatusBarHeight } from 'react-native-iphone-x-helper';\nimport ImageCropOverlay from './ImageCropOverlay';\n\nconst { width } = Dimensions.get('window');\nconst topMargin = getStatusBarHeight() + (Platform.OS === 'ios' ? 50 : 20);\n\nLogBox.ignoreLogs(['componentWillReceiveProps', 'componentWillUpdate', 'componentWillMount']);\nLogBox.ignoreLogs([\n 'Warning: componentWillMount is deprecated',\n 'Warning: componentWillReceiveProps is deprecated',\n 'Module RCTImageLoader requires',\n]);\n\nclass ExpoImageManipulator extends Component {\n constructor(props) {\n super(props);\n const { squareAspect } = this.props;\n this.state = {\n cropMode: false,\n processing: false,\n squareAspect,\n };\n\n this.scrollOffset = 0;\n this.currentPos = { left: 0, top: 0 };\n this.currentSize = { width: 0, height: 0 };\n this.maxSizes = { width: 0, height: 0 };\n this.actualSize = { width: 0, height: 0 };\n }\n\n async componentDidMount() {\n await this.onConvertImageToEditableSize();\n\n // Set cropping by default\n this.setState({ cropMode: true });\n }\n\n async onConvertImageToEditableSize() {\n const {\n photo: { uri: rawUri },\n } = this.props;\n const { uri, width, height } = await ImageManipulator.manipulateAsync(rawUri, [{ resize: { width: 1080 } }]);\n this.setState({ uri });\n this.actualSize.width = width;\n this.actualSize.height = height;\n }\n\n onToggleModal = () => {\n this.props.onToggleModal();\n this.setState({ cropMode: false });\n };\n\n onCropImage = (callback = null) => {\n this.setState({ processing: true });\n const { uri } = this.state;\n Image.getSize(uri, async (actualWidth, actualHeight) => {\n let cropObj = this.getCropBounds(actualWidth, actualHeight);\n if (cropObj.height > 0 && cropObj.width > 0) {\n let uriToCrop = uri;\n const { uri: uriCroped, base64, width: croppedWidth, height: croppedHeight } = await this.crop(cropObj, uriToCrop);\n\n this.actualSize.width = croppedWidth;\n this.actualSize.height = croppedHeight;\n\n this.setState(\n {\n uri: uriCroped,\n base64,\n cropMode: false,\n processing: false,\n },\n () => {\n if (callback) callback();\n },\n );\n } else {\n this.setState({ cropMode: false, processing: false }, () => {\n if (callback) callback();\n });\n }\n });\n };\n\n onHandleScroll = event => {\n this.scrollOffset = event.nativeEvent.contentOffset.y;\n };\n\n getCropBounds = (actualWidth, actualHeight) => {\n let imageRatio = actualHeight / actualWidth;\n var originalHeight = Dimensions.get('window').height - 64;\n if (isIphoneX()) {\n originalHeight = Dimensions.get('window').height - 122;\n }\n let renderedImageWidth = imageRatio < originalHeight / width ? width : originalHeight / imageRatio;\n let renderedImageHeight = imageRatio < originalHeight / width ? width * imageRatio : originalHeight;\n\n let renderedImageY = (originalHeight - renderedImageHeight) / 2.0;\n let renderedImageX = (width - renderedImageWidth) / 2.0;\n\n const renderImageObj = {\n left: renderedImageX,\n top: renderedImageY,\n width: renderedImageWidth,\n height: renderedImageHeight,\n };\n const cropOverlayObj = {\n left: this.currentPos.left,\n top: this.currentPos.top,\n width: this.currentSize.width,\n height: this.currentSize.height,\n };\n\n var intersectAreaObj = {};\n\n let x = Math.max(renderImageObj.left, cropOverlayObj.left);\n let num1 = Math.min(renderImageObj.left + renderImageObj.width, cropOverlayObj.left + cropOverlayObj.width);\n let y = Math.max(renderImageObj.top, cropOverlayObj.top);\n let num2 = Math.min(renderImageObj.top + renderImageObj.height, cropOverlayObj.top + cropOverlayObj.height);\n if (num1 >= x && num2 >= y)\n intersectAreaObj = {\n originX: (x - renderedImageX) * (actualWidth / renderedImageWidth),\n originY: (y - renderedImageY) * (actualWidth / renderedImageWidth),\n width: (num1 - x) * (actualWidth / renderedImageWidth),\n height: (num2 - y) * (actualWidth / renderedImageWidth),\n };\n else {\n intersectAreaObj = {\n originX: x - renderedImageX,\n originY: y - renderedImageY,\n width: 0,\n height: 0,\n };\n }\n return intersectAreaObj;\n };\n\n crop = async (cropObj, uri) => {\n const { saveOptions } = this.props;\n if (cropObj.height > 0 && cropObj.width > 0) {\n const manipResult = await ImageManipulator.manipulateAsync(\n uri,\n [\n {\n crop: cropObj,\n },\n ],\n saveOptions,\n );\n return manipResult;\n }\n return {\n uri: null,\n base64: null,\n };\n };\n\n calculateMaxSizes = event => {\n let w1 = event.nativeEvent.layout.width || 100;\n let h1 = event.nativeEvent.layout.height || 100;\n if (this.state.squareAspect) {\n if (w1 < h1) h1 = w1;\n else w1 = h1;\n }\n this.maxSizes.width = w1;\n this.maxSizes.height = h1;\n };\n\n // eslint-disable-next-line camelcase\n async UNSAFE_componentWillReceiveProps() {\n await this.onConvertImageToEditableSize();\n }\n\n render() {\n const { isVisible, onPictureChoosed } = this.props;\n const { uri, base64, cropMode, processing } = this.state;\n\n let imageRatio = this.actualSize.height / this.actualSize.width;\n var originalHeight = Dimensions.get('window').height - 64;\n if (isIphoneX()) {\n originalHeight = Dimensions.get('window').height - 122;\n }\n\n let cropRatio = originalHeight / width;\n\n let cropWidth = imageRatio < cropRatio ? width : originalHeight / imageRatio;\n let cropHeight = imageRatio < cropRatio ? width * imageRatio : originalHeight;\n\n let cropInitialTop = (originalHeight - cropHeight) / 2.0;\n let cropInitialLeft = (width - cropWidth) / 2.0;\n\n if (this.currentSize.width == 0 && cropMode) {\n this.currentSize.width = cropWidth;\n this.currentSize.height = cropHeight;\n\n this.currentPos.top = cropInitialTop;\n this.currentPos.left = cropInitialLeft;\n }\n\n return (\n <Modal\n animationType=\"slide\"\n transparent={true}\n visible={isVisible}\n hardwareAccelerated\n onRequestClose={() => {\n this.onToggleModal();\n }}\n >\n {uri !== undefined ? (\n <View style={styles.container}>\n <SafeAreaView style={[{ width }, styles.headerContainer]}>\n {!cropMode ? (\n <View style={[styles.headerButtonContainer, { justifyContent: 'flex-end' }]}>\n <TouchableOpacity\n onPress={() => {\n onPictureChoosed({ uri, base64 });\n this.onToggleModal();\n }}\n style={styles.headerButton}\n >\n <Text style={styles.headerButtonText}>{'Done'}</Text>\n </TouchableOpacity>\n </View>\n ) : (\n <View style={styles.headerButtonContainer}>\n <TouchableOpacity onPress={this.onToggleModal} style={styles.headerButton}>\n <Text style={styles.headerButtonText}>{'Cancel'}</Text>\n </TouchableOpacity>\n <TouchableOpacity\n onPress={() => {\n this.onCropImage(() => {\n onPictureChoosed({ uri: this.state.uri, base64: this.state.base64 });\n this.onToggleModal();\n });\n }}\n style={styles.headerButton}\n >\n <Text style={styles.headerButtonText}>{processing ? 'Processing' : 'Done'}</Text>\n </TouchableOpacity>\n </View>\n )}\n </SafeAreaView>\n <View style={[styles.contentContainer, { width: Dimensions.get('window').width }]}>\n <ScrollView\n style={{ position: 'relative', flex: 1 }}\n contentContainerStyle={{ backgroundColor: 'black' }}\n maximumZoomScale={5}\n minimumZoomScale={0.5}\n onScroll={this.onHandleScroll}\n bounces={false}\n showsHorizontalScrollIndicator={false}\n showsVerticalScrollIndicator={false}\n ref={c => (this.scrollView = c)}\n scrollEventThrottle={16}\n scrollEnabled={false}\n pinchGestureEnabled={false}\n >\n <AutoHeightImage\n style={{ backgroundColor: 'black' }}\n source={{ uri }}\n resizeMode={imageRatio >= 1 ? 'contain' : 'contain'}\n width={width}\n height={originalHeight}\n onLayout={this.calculateMaxSizes}\n />\n {!!cropMode && (\n <ImageCropOverlay\n onLayoutChanged={(top, left, width, height) => {\n this.currentSize.width = width;\n this.currentSize.height = height;\n this.currentPos.top = top;\n this.currentPos.left = left;\n }}\n initialWidth={cropWidth}\n initialHeight={cropHeight}\n initialTop={cropInitialTop}\n initialLeft={cropInitialLeft}\n minHeight={100}\n minWidth={100}\n topMargin={topMargin}\n />\n )}\n </ScrollView>\n </View>\n </View>\n ) : (\n <View style={styles.container}>\n <Text style={styles.prepareMessageText}>Preparing...</Text>\n </View>\n )}\n </Modal>\n );\n // }\n }\n}\n\nconst styles = StyleSheet.create({\n headerContainer: {\n flexDirection: 'row',\n backgroundColor: 'black',\n justifyContent: 'space-between',\n },\n headerButtonContainer: {\n flex: 1,\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n headerButton: {\n marginHorizontal: 10,\n width: 60,\n height: 40,\n alignItems: 'center',\n justifyContent: 'center',\n },\n headerButtonText: {\n fontWeight: '500',\n color: 'white',\n fontSize: 18,\n },\n contentContainer: {\n flex: 1,\n backgroundColor: 'black',\n },\n container: {\n flex: 1,\n backgroundColor: '#000d',\n alignItems: 'center',\n justifyContent: 'center',\n },\n prepareMessageText: {\n fontFamily: 'sf-bold',\n fontSize: 20,\n color: '#fff',\n },\n});\n\nexport default ExpoImageManipulator;\n\nExpoImageManipulator.defaultProps = {\n onPictureChoosed: ({ uri, base64 }) => console.log('URI:', uri, base64),\n dragVelocity: 100,\n resizeVelocity: 50,\n saveOptions: {\n compress: 1,\n format: ImageManipulator.SaveFormat.PNG,\n base64: false,\n },\n};\n\nExpoImageManipulator.propTypes = {\n isVisible: PropTypes.bool.isRequired,\n onPictureChoosed: PropTypes.func,\n saveOptions: PropTypes.object,\n photo: PropTypes.object.isRequired,\n onToggleModal: PropTypes.func.isRequired,\n dragVelocity: PropTypes.number,\n resizeVelocity: PropTypes.number,\n};\n"]}
|