@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
|
+
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 { Platform, View, Modal, TouchableOpacity, StyleSheet } from 'react-native';
|
|
5
|
+
import * as ScreenOrientation from 'expo-screen-orientation';
|
|
6
|
+
import { StatusBarHeight, getCompressed, imageExists } from '../helper';
|
|
7
|
+
import { Pl60Icon } from '../fonts';
|
|
8
|
+
import { SharingTools } from './SharingTools';
|
|
9
|
+
import { MediaPlayer } from './MediaPlayer';
|
|
10
|
+
|
|
11
|
+
class VideoPopup extends Component {
|
|
12
|
+
constructor(props) {
|
|
13
|
+
super(props);
|
|
14
|
+
|
|
15
|
+
_defineProperty(this, "UNSAFE_componentWillMount", async () => {
|
|
16
|
+
this.checkCompressed(this.props.uri);
|
|
17
|
+
await ScreenOrientation.lockAsync(Platform.OS === 'ios' ? ScreenOrientation.OrientationLock.DEFAULT : ScreenOrientation.OrientationLock.ALL);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
_defineProperty(this, "componentWillUnmount", async () => {
|
|
21
|
+
await ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.PORTRAIT_UP);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
_defineProperty(this, "checkCompressed", url => {
|
|
25
|
+
const compressedUri = getCompressed(url);
|
|
26
|
+
imageExists(compressedUri).then(compressedExists => {
|
|
27
|
+
this.setState({
|
|
28
|
+
uri: compressedExists ? compressedUri : url
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
this.state = {
|
|
34
|
+
uri: '',
|
|
35
|
+
isFullScreen: false
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
UNSAFE_componentWillReceiveProps(nextProps) {
|
|
40
|
+
if (this.props.uri === nextProps.uri) return;
|
|
41
|
+
this.checkCompressed(nextProps.uri);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
renderClose() {
|
|
45
|
+
return /*#__PURE__*/React.createElement(TouchableOpacity, {
|
|
46
|
+
style: styles.menuIconContainer,
|
|
47
|
+
onPress: this.props.onClose,
|
|
48
|
+
activeOpacity: 0.6
|
|
49
|
+
}, /*#__PURE__*/React.createElement(Pl60Icon, {
|
|
50
|
+
name: "close",
|
|
51
|
+
style: styles.menuIcon
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
renderPlayer() {
|
|
56
|
+
const {
|
|
57
|
+
uri
|
|
58
|
+
} = this.state;
|
|
59
|
+
if (!uri) return null;
|
|
60
|
+
return /*#__PURE__*/React.createElement(View, {
|
|
61
|
+
style: styles.playerContainer
|
|
62
|
+
}, /*#__PURE__*/React.createElement(MediaPlayer, {
|
|
63
|
+
source: uri,
|
|
64
|
+
useVideoPlayer: true,
|
|
65
|
+
autoPlay: true,
|
|
66
|
+
orientationChanged: isFullScreen => this.setState({
|
|
67
|
+
isFullScreen
|
|
68
|
+
})
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
render() {
|
|
73
|
+
const {
|
|
74
|
+
isFullScreen
|
|
75
|
+
} = this.state;
|
|
76
|
+
const {
|
|
77
|
+
visible,
|
|
78
|
+
onClose,
|
|
79
|
+
animationType,
|
|
80
|
+
style
|
|
81
|
+
} = this.props;
|
|
82
|
+
return /*#__PURE__*/React.createElement(Modal, {
|
|
83
|
+
visible: visible,
|
|
84
|
+
animationType: animationType || 'fade',
|
|
85
|
+
onRequestClose: onClose,
|
|
86
|
+
style: [styles.container, style],
|
|
87
|
+
supportedOrientations: ['portrait', 'landscape']
|
|
88
|
+
}, this.renderPlayer(), !isFullScreen && this.renderClose(), !isFullScreen && /*#__PURE__*/React.createElement(SharingTools, {
|
|
89
|
+
uri: this.props.uri
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const styles = StyleSheet.create({
|
|
96
|
+
container: {
|
|
97
|
+
backgroundColor: '#000'
|
|
98
|
+
},
|
|
99
|
+
menuIconContainer: {
|
|
100
|
+
position: 'absolute',
|
|
101
|
+
top: StatusBarHeight(0),
|
|
102
|
+
right: 0,
|
|
103
|
+
width: 55,
|
|
104
|
+
height: 55,
|
|
105
|
+
zIndex: 3
|
|
106
|
+
},
|
|
107
|
+
menuIcon: {
|
|
108
|
+
fontSize: 25,
|
|
109
|
+
padding: 15,
|
|
110
|
+
width: 55,
|
|
111
|
+
textAlign: 'center',
|
|
112
|
+
color: '#fff',
|
|
113
|
+
zIndex: 3
|
|
114
|
+
},
|
|
115
|
+
playerContainer: {
|
|
116
|
+
flex: 1,
|
|
117
|
+
backgroundColor: '#000',
|
|
118
|
+
alignItems: 'center',
|
|
119
|
+
justifyContent: 'center'
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
export { VideoPopup };
|
|
123
|
+
//# sourceMappingURL=VideoPopup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["VideoPopup.js"],"names":["React","Component","Platform","View","Modal","TouchableOpacity","StyleSheet","ScreenOrientation","StatusBarHeight","getCompressed","imageExists","Pl60Icon","SharingTools","MediaPlayer","VideoPopup","constructor","props","checkCompressed","uri","lockAsync","OS","OrientationLock","DEFAULT","ALL","PORTRAIT_UP","url","compressedUri","then","compressedExists","setState","state","isFullScreen","UNSAFE_componentWillReceiveProps","nextProps","renderClose","styles","menuIconContainer","onClose","menuIcon","renderPlayer","playerContainer","render","visible","animationType","style","container","create","backgroundColor","position","top","right","width","height","zIndex","fontSize","padding","textAlign","color","flex","alignItems","justifyContent"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport { Platform, View, Modal, TouchableOpacity, StyleSheet } from 'react-native';\nimport * as ScreenOrientation from 'expo-screen-orientation';\nimport { StatusBarHeight, getCompressed, imageExists } from '../helper';\nimport { Pl60Icon } from '../fonts';\nimport { SharingTools } from './SharingTools';\nimport { MediaPlayer } from './MediaPlayer';\n\nclass VideoPopup extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n uri: '',\n isFullScreen: false,\n };\n }\n\n UNSAFE_componentWillMount = async () => {\n this.checkCompressed(this.props.uri);\n await ScreenOrientation.lockAsync(\n Platform.OS === 'ios' ? ScreenOrientation.OrientationLock.DEFAULT : ScreenOrientation.OrientationLock.ALL,\n );\n };\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n if (this.props.uri === nextProps.uri) return;\n this.checkCompressed(nextProps.uri);\n }\n\n componentWillUnmount = async () => {\n await ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.PORTRAIT_UP);\n };\n\n checkCompressed = url => {\n const compressedUri = getCompressed(url);\n imageExists(compressedUri).then(compressedExists => {\n this.setState({ uri: compressedExists ? compressedUri : url });\n });\n };\n\n renderClose() {\n return (\n <TouchableOpacity style={styles.menuIconContainer} onPress={this.props.onClose} activeOpacity={0.6}>\n <Pl60Icon name=\"close\" style={styles.menuIcon} />\n </TouchableOpacity>\n );\n }\n\n renderPlayer() {\n const { uri } = this.state;\n if (!uri) return null;\n\n return (\n <View style={styles.playerContainer}>\n <MediaPlayer\n source={uri}\n useVideoPlayer={true}\n autoPlay={true}\n orientationChanged={isFullScreen => this.setState({ isFullScreen })}\n />\n </View>\n );\n }\n\n render() {\n const { isFullScreen } = this.state;\n const { visible, onClose, animationType, style } = this.props;\n\n return (\n <Modal\n visible={visible}\n animationType={animationType || 'fade'}\n onRequestClose={onClose}\n style={[styles.container, style]}\n supportedOrientations={['portrait', 'landscape']}\n >\n {this.renderPlayer()}\n {!isFullScreen && this.renderClose()}\n {!isFullScreen && <SharingTools uri={this.props.uri} />}\n </Modal>\n );\n }\n}\n\nconst styles = StyleSheet.create({\n container: {\n backgroundColor: '#000',\n },\n menuIconContainer: {\n position: 'absolute',\n top: StatusBarHeight(0),\n right: 0,\n width: 55,\n height: 55,\n zIndex: 3,\n },\n menuIcon: {\n fontSize: 25,\n padding: 15,\n width: 55,\n textAlign: 'center',\n color: '#fff',\n zIndex: 3,\n },\n playerContainer: {\n flex: 1,\n backgroundColor: '#000',\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n\nexport { VideoPopup };\n"]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import React, { PureComponent } from 'react';
|
|
2
|
+
import _ from 'lodash';
|
|
3
|
+
import { View, Text, Dimensions } from 'react-native';
|
|
4
|
+
import { connect } from 'react-redux';
|
|
5
|
+
import { Pl60Icon } from '../fonts';
|
|
6
|
+
import { COLOUR_GREEN, TEXT_DARK, getMainBrandingColourFromState } from '../colours';
|
|
7
|
+
import { MiddlePopup } from './MiddlePopup';
|
|
8
|
+
import { InlineButton } from './InlineButton';
|
|
9
|
+
const SCREEN_WIDTH = Dimensions.get('window').width;
|
|
10
|
+
|
|
11
|
+
class WarningPopup extends PureComponent {
|
|
12
|
+
render() {
|
|
13
|
+
return /*#__PURE__*/React.createElement(MiddlePopup, {
|
|
14
|
+
visible: this.props.visible,
|
|
15
|
+
onClose: this.props.onClose,
|
|
16
|
+
style: styles.popup
|
|
17
|
+
}, this.props.isSuccess && /*#__PURE__*/React.createElement(Pl60Icon, {
|
|
18
|
+
style: styles.icon,
|
|
19
|
+
name: "circleoutlined"
|
|
20
|
+
}), /*#__PURE__*/React.createElement(Text, {
|
|
21
|
+
style: styles.text
|
|
22
|
+
}, this.props.confirmText), /*#__PURE__*/React.createElement(View, {
|
|
23
|
+
style: {
|
|
24
|
+
marginTop: 16,
|
|
25
|
+
paddingHorizontal: 24
|
|
26
|
+
}
|
|
27
|
+
}, /*#__PURE__*/React.createElement(Text, {
|
|
28
|
+
style: [styles.infoText, this.props.infoTextStyle]
|
|
29
|
+
}, this.props.infoText)), /*#__PURE__*/React.createElement(InlineButton, {
|
|
30
|
+
onPress: this.props.onClose,
|
|
31
|
+
color: this.props.ctaButton ? this.props.colourBrandingMain : '#fff',
|
|
32
|
+
style: styles.button,
|
|
33
|
+
textStyle: [styles.closeText, {
|
|
34
|
+
color: this.props.ctaButton ? '#fff' : this.props.colourBrandingMain
|
|
35
|
+
}],
|
|
36
|
+
large: true
|
|
37
|
+
}, !_.isUndefined(this.props.buttonText) ? this.props.buttonText : 'Close'));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const styles = {
|
|
43
|
+
popup: {
|
|
44
|
+
width: 'auto',
|
|
45
|
+
maxWidth: SCREEN_WIDTH - 34,
|
|
46
|
+
paddingVertical: 16
|
|
47
|
+
},
|
|
48
|
+
icon: {
|
|
49
|
+
marginTop: 20,
|
|
50
|
+
paddingBottom: 16,
|
|
51
|
+
fontSize: 52,
|
|
52
|
+
color: COLOUR_GREEN
|
|
53
|
+
},
|
|
54
|
+
text: {
|
|
55
|
+
fontFamily: 'sf-bold',
|
|
56
|
+
fontSize: 24,
|
|
57
|
+
lineHeight: 24,
|
|
58
|
+
color: TEXT_DARK,
|
|
59
|
+
textAlign: 'center',
|
|
60
|
+
marginTop: 8
|
|
61
|
+
},
|
|
62
|
+
infoText: {
|
|
63
|
+
fontFamily: 'sf-regular',
|
|
64
|
+
fontSize: 16,
|
|
65
|
+
lineHeight: 22,
|
|
66
|
+
color: TEXT_DARK,
|
|
67
|
+
textAlign: 'left'
|
|
68
|
+
},
|
|
69
|
+
button: {
|
|
70
|
+
width: 130,
|
|
71
|
+
marginTop: 20
|
|
72
|
+
},
|
|
73
|
+
closeText: {
|
|
74
|
+
fontFamily: 'sf-medium',
|
|
75
|
+
fontSize: 15
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const mapStateToProps = state => {
|
|
80
|
+
return {
|
|
81
|
+
colourBrandingMain: getMainBrandingColourFromState(state)
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const warningPopup = connect(mapStateToProps, {})(WarningPopup);
|
|
86
|
+
export { warningPopup as WarningPopup };
|
|
87
|
+
//# sourceMappingURL=WarningPopup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["WarningPopup.js"],"names":["React","PureComponent","_","View","Text","Dimensions","connect","Pl60Icon","COLOUR_GREEN","TEXT_DARK","getMainBrandingColourFromState","MiddlePopup","InlineButton","SCREEN_WIDTH","get","width","WarningPopup","render","props","visible","onClose","styles","popup","isSuccess","icon","text","confirmText","marginTop","paddingHorizontal","infoText","infoTextStyle","ctaButton","colourBrandingMain","button","closeText","color","isUndefined","buttonText","maxWidth","paddingVertical","paddingBottom","fontSize","fontFamily","lineHeight","textAlign","mapStateToProps","state","warningPopup"],"mappings":"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","sourcesContent":["import React, { PureComponent } from 'react';\nimport _ from 'lodash';\nimport { View, Text, Dimensions } from 'react-native';\nimport { connect } from 'react-redux';\nimport { Pl60Icon } from '../fonts';\nimport { COLOUR_GREEN, TEXT_DARK, getMainBrandingColourFromState } from '../colours';\nimport { MiddlePopup } from './MiddlePopup';\nimport { InlineButton } from './InlineButton';\n\nconst SCREEN_WIDTH = Dimensions.get('window').width;\n\nclass WarningPopup extends PureComponent {\n render() {\n return (\n <MiddlePopup visible={this.props.visible} onClose={this.props.onClose} style={styles.popup}>\n {this.props.isSuccess && <Pl60Icon style={styles.icon} name=\"circleoutlined\" />}\n <Text style={styles.text}>{this.props.confirmText}</Text>\n <View style={{ marginTop: 16, paddingHorizontal: 24 }}>\n <Text style={[styles.infoText, this.props.infoTextStyle]}>{this.props.infoText}</Text>\n </View>\n <InlineButton\n onPress={this.props.onClose}\n color={this.props.ctaButton ? this.props.colourBrandingMain : '#fff'}\n style={styles.button}\n textStyle={[styles.closeText, { color: this.props.ctaButton ? '#fff' : this.props.colourBrandingMain }]}\n large\n >\n {!_.isUndefined(this.props.buttonText) ? this.props.buttonText : 'Close'}\n </InlineButton>\n </MiddlePopup>\n );\n }\n}\n\nconst styles = {\n popup: {\n width: 'auto',\n maxWidth: SCREEN_WIDTH - 34,\n paddingVertical: 16,\n },\n icon: {\n marginTop: 20,\n paddingBottom: 16,\n fontSize: 52,\n color: COLOUR_GREEN,\n },\n text: {\n fontFamily: 'sf-bold',\n fontSize: 24,\n lineHeight: 24,\n color: TEXT_DARK,\n textAlign: 'center',\n marginTop: 8,\n },\n infoText: {\n fontFamily: 'sf-regular',\n fontSize: 16,\n lineHeight: 22,\n color: TEXT_DARK,\n textAlign: 'left',\n },\n button: {\n width: 130,\n marginTop: 20,\n },\n closeText: {\n fontFamily: 'sf-medium',\n fontSize: 15,\n },\n};\n\nconst mapStateToProps = state => {\n return {\n colourBrandingMain: getMainBrandingColourFromState(state),\n };\n};\n\nconst warningPopup = connect(mapStateToProps, {})(WarningPopup);\nexport { warningPopup as WarningPopup };\n"]}
|
|
@@ -0,0 +1,325 @@
|
|
|
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 from 'react';
|
|
4
|
+
import { StyleSheet, View, FlatList, Dimensions, ActivityIndicator, Platform } from 'react-native';
|
|
5
|
+
import _ from 'lodash';
|
|
6
|
+
import * as ScreenOrientation from 'expo-screen-orientation';
|
|
7
|
+
import * as MediaLibrary from 'expo-media-library';
|
|
8
|
+
import { Camera } from 'expo-camera';
|
|
9
|
+
import { isVideo } from '../../helper';
|
|
10
|
+
import ImageTile from './ImageTile';
|
|
11
|
+
const {
|
|
12
|
+
width
|
|
13
|
+
} = Dimensions.get('window');
|
|
14
|
+
const defaultSelectionLimit = 10;
|
|
15
|
+
const defaultLoadCount = 50;
|
|
16
|
+
export default class ImageBrowser extends React.Component {
|
|
17
|
+
constructor(props) {
|
|
18
|
+
var _this;
|
|
19
|
+
|
|
20
|
+
super(props);
|
|
21
|
+
_this = this;
|
|
22
|
+
|
|
23
|
+
_defineProperty(this, "isLocal", () => {
|
|
24
|
+
return _.isNil(this.props.remoteAlbums);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
_defineProperty(this, "getPermissionsAsync", async () => {
|
|
28
|
+
const {
|
|
29
|
+
status: camera
|
|
30
|
+
} = await Camera.requestCameraPermissionsAsync();
|
|
31
|
+
const {
|
|
32
|
+
status: cameraRoll
|
|
33
|
+
} = await MediaLibrary.requestPermissionsAsync();
|
|
34
|
+
this.setState({
|
|
35
|
+
hasCameraPermission: camera === 'granted',
|
|
36
|
+
hasCameraRollPermission: cameraRoll === 'granted'
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
_defineProperty(this, "onOrientationChange", _ref => {
|
|
41
|
+
let {
|
|
42
|
+
orientationInfo
|
|
43
|
+
} = _ref;
|
|
44
|
+
ScreenOrientation.removeOrientationChangeListeners();
|
|
45
|
+
ScreenOrientation.addOrientationChangeListener(this.onOrientationChange);
|
|
46
|
+
const numColumns = this.getNumColumns(orientationInfo.orientation);
|
|
47
|
+
this.setState({
|
|
48
|
+
numColumns
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
_defineProperty(this, "getNumColumns", orientation => orientation === ScreenOrientation.Orientation.PORTRAIT_UP || orientation === ScreenOrientation.Orientation.PORTRAIT_DOWN ? 4 : 7);
|
|
53
|
+
|
|
54
|
+
_defineProperty(this, "isVideoSelected", () => {
|
|
55
|
+
return this.state.selected.find(uri => {
|
|
56
|
+
const photo = this.state.photos.find(photo => photo.uri === uri);
|
|
57
|
+
return photo && photo.mediaType === MediaLibrary.MediaType.video;
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
_defineProperty(this, "checkSelection", item => {
|
|
62
|
+
let videoSelected = this.isVideoSelected();
|
|
63
|
+
let newSelected = [...this.state.selected]; // Check video/photo selection
|
|
64
|
+
|
|
65
|
+
if (item.mediaType === MediaLibrary.MediaType.video) {
|
|
66
|
+
if (videoSelected && videoSelected !== item.uri) {
|
|
67
|
+
// If different video is already selected, reset
|
|
68
|
+
videoSelected = null;
|
|
69
|
+
newSelected = [];
|
|
70
|
+
} else if (!videoSelected && newSelected.length > 0) {
|
|
71
|
+
// If photos selected, don't allow selecting video
|
|
72
|
+
videoSelected = null;
|
|
73
|
+
newSelected = [];
|
|
74
|
+
} // Toggle video selected
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
videoSelected = videoSelected !== item.uri ? item.uri : null;
|
|
78
|
+
} else if (videoSelected) {
|
|
79
|
+
// If video selected, reset
|
|
80
|
+
videoSelected = null;
|
|
81
|
+
newSelected = [];
|
|
82
|
+
} // Check multiple selection
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
const selectionLimit = this.props.max || defaultSelectionLimit;
|
|
86
|
+
|
|
87
|
+
if (selectionLimit && selectionLimit > 1) {
|
|
88
|
+
// Limit selection
|
|
89
|
+
if (newSelected.length === selectionLimit && newSelected.indexOf(item.uri) === -1) return {
|
|
90
|
+
isFull: true
|
|
91
|
+
};
|
|
92
|
+
} else {
|
|
93
|
+
// Force single selection
|
|
94
|
+
if (newSelected.length > 0 && newSelected[0] !== item.uri) newSelected = [];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
newSelected,
|
|
99
|
+
videoSelected
|
|
100
|
+
};
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
_defineProperty(this, "selectImage", item => {
|
|
104
|
+
const {
|
|
105
|
+
newSelected,
|
|
106
|
+
videoSelected,
|
|
107
|
+
isFull
|
|
108
|
+
} = this.checkSelection(item);
|
|
109
|
+
if (isFull) return;
|
|
110
|
+
|
|
111
|
+
if (newSelected.indexOf(item.uri) === -1) {
|
|
112
|
+
newSelected.push(item.uri);
|
|
113
|
+
} else {
|
|
114
|
+
const deleteIndex = newSelected.indexOf(item.uri);
|
|
115
|
+
newSelected.splice(deleteIndex, 1);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (newSelected.length > this.props.max) return;
|
|
119
|
+
if (!newSelected) newSelected = [];
|
|
120
|
+
this.setState({
|
|
121
|
+
selected: newSelected
|
|
122
|
+
});
|
|
123
|
+
this.props.onChange(newSelected, videoSelected, () => this.prepareCallback());
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
_defineProperty(this, "getPhotos", function () {
|
|
127
|
+
let reset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
128
|
+
const {
|
|
129
|
+
remoteAlbums,
|
|
130
|
+
allowVideo,
|
|
131
|
+
loadCount,
|
|
132
|
+
album
|
|
133
|
+
} = _this.props;
|
|
134
|
+
|
|
135
|
+
if (_this.isLocal()) {
|
|
136
|
+
// Retrieve local photos
|
|
137
|
+
const mediaType = [MediaLibrary.MediaType.photo];
|
|
138
|
+
if (allowVideo) mediaType.push(MediaLibrary.MediaType.video);
|
|
139
|
+
const params = {
|
|
140
|
+
first: loadCount || defaultLoadCount,
|
|
141
|
+
mediaType,
|
|
142
|
+
album: album || undefined,
|
|
143
|
+
sortBy: [Platform.OS === 'android' ? 'modificationTime' : 'creationTime']
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
if (reset) {
|
|
147
|
+
_this.setState({
|
|
148
|
+
photos: [],
|
|
149
|
+
after: null,
|
|
150
|
+
hasNextPage: true
|
|
151
|
+
});
|
|
152
|
+
} else {
|
|
153
|
+
if (_this.state.after) params.after = _this.state.after;
|
|
154
|
+
if (!_this.state.hasNextPage) return;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
MediaLibrary.getAssetsAsync(params).then(_this.processPhotos);
|
|
158
|
+
} else {
|
|
159
|
+
var _selectedAlbum$images;
|
|
160
|
+
|
|
161
|
+
// Use remote albums
|
|
162
|
+
const selectedAlbum = remoteAlbums.find(item => item.id === album);
|
|
163
|
+
|
|
164
|
+
if (selectedAlbum && ((_selectedAlbum$images = selectedAlbum.images) === null || _selectedAlbum$images === void 0 ? void 0 : _selectedAlbum$images.length) > 0) {
|
|
165
|
+
const ordered = _.orderBy(selectedAlbum.images, 'date', 'desc');
|
|
166
|
+
|
|
167
|
+
_this.setState({
|
|
168
|
+
photos: ordered.map(image => {
|
|
169
|
+
return {
|
|
170
|
+
uri: image.uri,
|
|
171
|
+
mediaType: isVideo(image.uri) ? MediaLibrary.MediaType.video : MediaLibrary.MediaType.photo
|
|
172
|
+
};
|
|
173
|
+
}),
|
|
174
|
+
isEmpty: false
|
|
175
|
+
});
|
|
176
|
+
} else {
|
|
177
|
+
_this.setState({
|
|
178
|
+
photos: [],
|
|
179
|
+
isEmpty: true
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
_defineProperty(this, "processPhotos", data => {
|
|
186
|
+
if (data.totalCount) {
|
|
187
|
+
if (this.state.after === data.endCursor) return;
|
|
188
|
+
const uris = data.assets;
|
|
189
|
+
this.setState({
|
|
190
|
+
photos: [...this.state.photos, ...uris],
|
|
191
|
+
after: data.endCursor,
|
|
192
|
+
hasNextPage: data.hasNextPage
|
|
193
|
+
});
|
|
194
|
+
} else {
|
|
195
|
+
this.setState({
|
|
196
|
+
isEmpty: true
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
_defineProperty(this, "getItemLayout", (data, index) => {
|
|
202
|
+
const length = this.props.itemWidth || width / 4;
|
|
203
|
+
return {
|
|
204
|
+
length,
|
|
205
|
+
offset: length * index,
|
|
206
|
+
index
|
|
207
|
+
};
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
_defineProperty(this, "renderImageTile", _ref2 => {
|
|
211
|
+
let {
|
|
212
|
+
item,
|
|
213
|
+
index
|
|
214
|
+
} = _ref2;
|
|
215
|
+
if (!item) return null;
|
|
216
|
+
const selectedIndex = this.state.selected.indexOf(item.uri);
|
|
217
|
+
const selected = selectedIndex !== -1;
|
|
218
|
+
return /*#__PURE__*/React.createElement(ImageTile, {
|
|
219
|
+
selectedItemNumber: selectedIndex + 1,
|
|
220
|
+
item: item,
|
|
221
|
+
index: index,
|
|
222
|
+
selected: selected,
|
|
223
|
+
selectImage: this.selectImage,
|
|
224
|
+
renderSelectedComponent: this.props.renderSelectedComponent,
|
|
225
|
+
style: this.props.itemStyle,
|
|
226
|
+
width: this.props.itemWidth,
|
|
227
|
+
height: this.props.itemHeight,
|
|
228
|
+
isRemote: !this.isLocal()
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
_defineProperty(this, "renderPreloader", () => this.props.preloaderComponent || /*#__PURE__*/React.createElement(ActivityIndicator, {
|
|
233
|
+
size: "large"
|
|
234
|
+
}));
|
|
235
|
+
|
|
236
|
+
_defineProperty(this, "renderEmptyState", () => this.props.emptyStateComponent || null);
|
|
237
|
+
|
|
238
|
+
this.state = {
|
|
239
|
+
hasCameraPermission: null,
|
|
240
|
+
hasCameraRollPermission: null,
|
|
241
|
+
numColumns: null,
|
|
242
|
+
photos: [],
|
|
243
|
+
selected: [],
|
|
244
|
+
isEmpty: false,
|
|
245
|
+
after: null,
|
|
246
|
+
hasNextPage: true
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
async componentDidMount() {
|
|
251
|
+
if (this.isLocal()) await this.getPermissionsAsync();
|
|
252
|
+
ScreenOrientation.addOrientationChangeListener(this.onOrientationChange);
|
|
253
|
+
const orientation = await ScreenOrientation.getOrientationAsync();
|
|
254
|
+
const numColumns = this.getNumColumns(orientation);
|
|
255
|
+
this.setState({
|
|
256
|
+
numColumns
|
|
257
|
+
}, () => {
|
|
258
|
+
this.getPhotos();
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
componentDidUpdate(prevProps) {
|
|
263
|
+
if (prevProps.album !== this.props.album) this.getPhotos(true);
|
|
264
|
+
|
|
265
|
+
if (!_.isEqual(prevProps.selected, this.props.selected)) {
|
|
266
|
+
this.setState({
|
|
267
|
+
selected: this.props.selected
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
prepareCallback() {
|
|
273
|
+
const {
|
|
274
|
+
selected,
|
|
275
|
+
photos
|
|
276
|
+
} = this.state;
|
|
277
|
+
const selectedPhotos = selected.map(uri => photos.find(p => p.uri === uri));
|
|
278
|
+
|
|
279
|
+
if (this.isLocal()) {
|
|
280
|
+
const assetsInfo = Promise.all(selectedPhotos.map(p => MediaLibrary.getAssetInfoAsync(p)));
|
|
281
|
+
this.props.callback(assetsInfo);
|
|
282
|
+
} else {
|
|
283
|
+
// No need to retrieve local assets
|
|
284
|
+
this.props.callback(selectedPhotos);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
renderImages() {
|
|
289
|
+
return /*#__PURE__*/React.createElement(FlatList, {
|
|
290
|
+
data: this.state.photos,
|
|
291
|
+
numColumns: this.state.numColumns,
|
|
292
|
+
key: this.state.numColumns,
|
|
293
|
+
renderItem: this.renderImageTile,
|
|
294
|
+
keyExtractor: (_, index) => index,
|
|
295
|
+
onEndReached: () => {
|
|
296
|
+
if (this.isLocal()) this.getPhotos();
|
|
297
|
+
},
|
|
298
|
+
onEndReachedThreshold: 0.5,
|
|
299
|
+
ListEmptyComponent: this.state.isEmpty ? this.renderEmptyState() : this.renderPreloader(),
|
|
300
|
+
initialNumToRender: 24,
|
|
301
|
+
getItemLayout: this.getItemLayout
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
render() {
|
|
306
|
+
const {
|
|
307
|
+
hasCameraPermission
|
|
308
|
+
} = this.state;
|
|
309
|
+
|
|
310
|
+
if (this.isLocal() && !hasCameraPermission) {
|
|
311
|
+
return this.props.noCameraPermissionComponent || null;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
return /*#__PURE__*/React.createElement(View, {
|
|
315
|
+
style: [styles.container, this.props.style]
|
|
316
|
+
}, this.renderImages());
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
}
|
|
320
|
+
const styles = StyleSheet.create({
|
|
321
|
+
container: {
|
|
322
|
+
flex: 1
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
//# sourceMappingURL=ImageBrowser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["ImageBrowser.js"],"names":["React","StyleSheet","View","FlatList","Dimensions","ActivityIndicator","Platform","_","ScreenOrientation","MediaLibrary","Camera","isVideo","ImageTile","width","get","defaultSelectionLimit","defaultLoadCount","ImageBrowser","Component","constructor","props","isNil","remoteAlbums","status","camera","requestCameraPermissionsAsync","cameraRoll","requestPermissionsAsync","setState","hasCameraPermission","hasCameraRollPermission","orientationInfo","removeOrientationChangeListeners","addOrientationChangeListener","onOrientationChange","numColumns","getNumColumns","orientation","Orientation","PORTRAIT_UP","PORTRAIT_DOWN","state","selected","find","uri","photo","photos","mediaType","MediaType","video","item","videoSelected","isVideoSelected","newSelected","length","selectionLimit","max","indexOf","isFull","checkSelection","push","deleteIndex","splice","onChange","prepareCallback","reset","allowVideo","loadCount","album","isLocal","params","first","undefined","sortBy","OS","after","hasNextPage","getAssetsAsync","then","processPhotos","selectedAlbum","id","images","ordered","orderBy","map","image","isEmpty","data","totalCount","endCursor","uris","assets","index","itemWidth","offset","selectedIndex","selectImage","renderSelectedComponent","itemStyle","itemHeight","preloaderComponent","emptyStateComponent","componentDidMount","getPermissionsAsync","getOrientationAsync","getPhotos","componentDidUpdate","prevProps","isEqual","selectedPhotos","p","assetsInfo","Promise","all","getAssetInfoAsync","callback","renderImages","renderImageTile","renderEmptyState","renderPreloader","getItemLayout","render","noCameraPermissionComponent","styles","container","style","create","flex"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { StyleSheet, View, FlatList, Dimensions, ActivityIndicator, Platform } from 'react-native';\nimport _ from 'lodash';\nimport * as ScreenOrientation from 'expo-screen-orientation';\nimport * as MediaLibrary from 'expo-media-library';\nimport { Camera } from 'expo-camera';\nimport { isVideo } from '../../helper';\nimport ImageTile from './ImageTile';\n\nconst { width } = Dimensions.get('window');\nconst defaultSelectionLimit = 10;\nconst defaultLoadCount = 50;\n\nexport default class ImageBrowser extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n hasCameraPermission: null,\n hasCameraRollPermission: null,\n numColumns: null,\n photos: [],\n selected: [],\n isEmpty: false,\n after: null,\n hasNextPage: true,\n };\n }\n\n async componentDidMount() {\n if (this.isLocal()) await this.getPermissionsAsync();\n\n ScreenOrientation.addOrientationChangeListener(this.onOrientationChange);\n const orientation = await ScreenOrientation.getOrientationAsync();\n const numColumns = this.getNumColumns(orientation);\n this.setState({ numColumns }, () => {\n this.getPhotos();\n });\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.album !== this.props.album) this.getPhotos(true);\n if (!_.isEqual(prevProps.selected, this.props.selected)) {\n this.setState({ selected: this.props.selected });\n }\n }\n\n isLocal = () => {\n return _.isNil(this.props.remoteAlbums);\n };\n\n getPermissionsAsync = async () => {\n const { status: camera } = await Camera.requestCameraPermissionsAsync();\n const { status: cameraRoll } = await MediaLibrary.requestPermissionsAsync();\n this.setState({\n hasCameraPermission: camera === 'granted',\n hasCameraRollPermission: cameraRoll === 'granted',\n });\n };\n\n onOrientationChange = ({ orientationInfo }) => {\n ScreenOrientation.removeOrientationChangeListeners();\n ScreenOrientation.addOrientationChangeListener(this.onOrientationChange);\n const numColumns = this.getNumColumns(orientationInfo.orientation);\n this.setState({ numColumns });\n };\n\n getNumColumns = orientation =>\n orientation === ScreenOrientation.Orientation.PORTRAIT_UP || orientation === ScreenOrientation.Orientation.PORTRAIT_DOWN ? 4 : 7;\n\n isVideoSelected = () => {\n return this.state.selected.find(uri => {\n const photo = this.state.photos.find(photo => photo.uri === uri);\n return photo && photo.mediaType === MediaLibrary.MediaType.video;\n });\n };\n\n checkSelection = item => {\n let videoSelected = this.isVideoSelected();\n let newSelected = [...this.state.selected];\n\n // Check video/photo selection\n if (item.mediaType === MediaLibrary.MediaType.video) {\n if (videoSelected && videoSelected !== item.uri) {\n // If different video is already selected, reset\n videoSelected = null;\n newSelected = [];\n } else if (!videoSelected && newSelected.length > 0) {\n // If photos selected, don't allow selecting video\n videoSelected = null;\n newSelected = [];\n }\n // Toggle video selected\n videoSelected = videoSelected !== item.uri ? item.uri : null;\n } else if (videoSelected) {\n // If video selected, reset\n videoSelected = null;\n newSelected = [];\n }\n\n // Check multiple selection\n const selectionLimit = this.props.max || defaultSelectionLimit;\n if (selectionLimit && selectionLimit > 1) {\n // Limit selection\n if (newSelected.length === selectionLimit && newSelected.indexOf(item.uri) === -1) return { isFull: true };\n } else {\n // Force single selection\n if (newSelected.length > 0 && newSelected[0] !== item.uri) newSelected = [];\n }\n\n return { newSelected, videoSelected };\n };\n\n selectImage = item => {\n const { newSelected, videoSelected, isFull } = this.checkSelection(item);\n if (isFull) return;\n\n if (newSelected.indexOf(item.uri) === -1) {\n newSelected.push(item.uri);\n } else {\n const deleteIndex = newSelected.indexOf(item.uri);\n newSelected.splice(deleteIndex, 1);\n }\n if (newSelected.length > this.props.max) return;\n if (!newSelected) newSelected = [];\n this.setState({ selected: newSelected });\n this.props.onChange(newSelected, videoSelected, () => this.prepareCallback());\n };\n\n getPhotos = (reset = false) => {\n const { remoteAlbums, allowVideo, loadCount, album } = this.props;\n\n if (this.isLocal()) {\n // Retrieve local photos\n const mediaType = [MediaLibrary.MediaType.photo];\n if (allowVideo) mediaType.push(MediaLibrary.MediaType.video);\n\n const params = {\n first: loadCount || defaultLoadCount,\n mediaType,\n album: album || undefined,\n sortBy: [Platform.OS === 'android' ? 'modificationTime' : 'creationTime'],\n };\n if (reset) {\n this.setState({ photos: [], after: null, hasNextPage: true });\n } else {\n if (this.state.after) params.after = this.state.after;\n if (!this.state.hasNextPage) return;\n }\n MediaLibrary.getAssetsAsync(params).then(this.processPhotos);\n } else {\n // Use remote albums\n const selectedAlbum = remoteAlbums.find(item => item.id === album);\n if (selectedAlbum && selectedAlbum.images?.length > 0) {\n const ordered = _.orderBy(selectedAlbum.images, 'date', 'desc');\n this.setState({\n photos: ordered.map(image => {\n return {\n uri: image.uri,\n mediaType: isVideo(image.uri) ? MediaLibrary.MediaType.video : MediaLibrary.MediaType.photo,\n };\n }),\n isEmpty: false,\n });\n } else {\n this.setState({ photos: [], isEmpty: true });\n }\n }\n };\n\n processPhotos = data => {\n if (data.totalCount) {\n if (this.state.after === data.endCursor) return;\n const uris = data.assets;\n this.setState({\n photos: [...this.state.photos, ...uris],\n after: data.endCursor,\n hasNextPage: data.hasNextPage,\n });\n } else {\n this.setState({ isEmpty: true });\n }\n };\n\n getItemLayout = (data, index) => {\n const length = this.props.itemWidth || width / 4;\n return { length, offset: length * index, index };\n };\n\n prepareCallback() {\n const { selected, photos } = this.state;\n const selectedPhotos = selected.map(uri => photos.find(p => p.uri === uri));\n if (this.isLocal()) {\n const assetsInfo = Promise.all(selectedPhotos.map(p => MediaLibrary.getAssetInfoAsync(p)));\n this.props.callback(assetsInfo);\n } else {\n // No need to retrieve local assets\n this.props.callback(selectedPhotos);\n }\n }\n\n renderImageTile = ({ item, index }) => {\n if (!item) return null;\n\n const selectedIndex = this.state.selected.indexOf(item.uri);\n const selected = selectedIndex !== -1;\n\n return (\n <ImageTile\n selectedItemNumber={selectedIndex + 1}\n item={item}\n index={index}\n selected={selected}\n selectImage={this.selectImage}\n renderSelectedComponent={this.props.renderSelectedComponent}\n style={this.props.itemStyle}\n width={this.props.itemWidth}\n height={this.props.itemHeight}\n isRemote={!this.isLocal()}\n />\n );\n };\n\n renderPreloader = () => this.props.preloaderComponent || <ActivityIndicator size=\"large\" />;\n\n renderEmptyState = () => this.props.emptyStateComponent || null;\n\n renderImages() {\n return (\n <FlatList\n data={this.state.photos}\n numColumns={this.state.numColumns}\n key={this.state.numColumns}\n renderItem={this.renderImageTile}\n keyExtractor={(_, index) => index}\n onEndReached={() => {\n if (this.isLocal()) this.getPhotos();\n }}\n onEndReachedThreshold={0.5}\n ListEmptyComponent={this.state.isEmpty ? this.renderEmptyState() : this.renderPreloader()}\n initialNumToRender={24}\n getItemLayout={this.getItemLayout}\n />\n );\n }\n\n render() {\n const { hasCameraPermission } = this.state;\n\n if (this.isLocal() && !hasCameraPermission) {\n return this.props.noCameraPermissionComponent || null;\n }\n\n return <View style={[styles.container, this.props.style]}>{this.renderImages()}</View>;\n }\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n});\n"]}
|