* Add set status feature Small code refactoring Add Do Not Disturb option * Add Account Settings screen Add username, nicname, and position fields Add email field get deviceHeight from redux Clean up onPress handler in Settings Refactor each account settings item to it's own component Clean up email field and updateUser action method Use mobile localization format in en.json Update profile image Clean up ProfilePicture for editing Add loading and error components in AccountSettings Refactor updateRequest state into a function Follow design specs Remove unnecessary this.state.emailUpdated Polish AccountSettings and secondary components Refactor AttachmentButton into it's own componentg Add Account Settings icon in General Settings Add TODO comments * Update user status * Edit Profile screen refactored * Fix edit profile item text color
255 lines
8.1 KiB
JavaScript
255 lines
8.1 KiB
JavaScript
import React, {PureComponent} from 'react';
|
|
import PropTypes from 'prop-types';
|
|
import {injectIntl, intlShape} from 'react-intl';
|
|
import {
|
|
Platform,
|
|
StyleSheet,
|
|
TouchableOpacity
|
|
} from 'react-native';
|
|
import Icon from 'react-native-vector-icons/Ionicons';
|
|
import ImagePicker from 'react-native-image-picker';
|
|
|
|
import {changeOpacity} from 'app/utils/theme';
|
|
|
|
class AttachmentButton extends PureComponent {
|
|
static propTypes = {
|
|
blurTextBox: PropTypes.func.isRequired,
|
|
children: PropTypes.node,
|
|
fileCount: PropTypes.number,
|
|
intl: intlShape.isRequired,
|
|
maxFileCount: PropTypes.number.isRequired,
|
|
navigator: PropTypes.object.isRequired,
|
|
onShowFileMaxWarning: PropTypes.func,
|
|
theme: PropTypes.object.isRequired,
|
|
uploadFiles: PropTypes.func.isRequired,
|
|
wrapper: PropTypes.bool
|
|
};
|
|
|
|
static defaultProps = {
|
|
maxFileCount: 5
|
|
};
|
|
|
|
attachFileFromCamera = () => {
|
|
const {formatMessage} = this.props.intl;
|
|
const options = {
|
|
quality: 1.0,
|
|
noData: true,
|
|
storageOptions: {
|
|
cameraRoll: true,
|
|
waitUntilSaved: true
|
|
},
|
|
permissionDenied: {
|
|
title: formatMessage({
|
|
id: 'mobile.android.camera_permission_denied_title',
|
|
defaultMessage: 'Camera access is required'
|
|
}),
|
|
text: formatMessage({
|
|
id: 'mobile.android.camera_permission_denied_description',
|
|
defaultMessage: 'To take photos and videos with your camera, please change your permission settings.'
|
|
}),
|
|
reTryTitle: formatMessage({
|
|
id: 'mobile.android.permission_denied_retry',
|
|
defaultMessage: 'Set Permission'
|
|
}),
|
|
okTitle: formatMessage({id: 'mobile.android.permission_denied_dismiss', defaultMessage: 'Dismiss'})
|
|
}
|
|
};
|
|
|
|
ImagePicker.launchCamera(options, (response) => {
|
|
if (response.error || response.didCancel) {
|
|
return;
|
|
}
|
|
|
|
this.uploadFiles([response]);
|
|
});
|
|
};
|
|
|
|
attachFileFromLibrary = () => {
|
|
const {formatMessage} = this.props.intl;
|
|
const options = {
|
|
quality: 1.0,
|
|
noData: true,
|
|
permissionDenied: {
|
|
title: formatMessage({
|
|
id: 'mobile.android.photos_permission_denied_title',
|
|
defaultMessage: 'Photo library access is required'
|
|
}),
|
|
text: formatMessage({
|
|
id: 'mobile.android.photos_permission_denied_description',
|
|
defaultMessage: 'To upload images from your library, please change your permission settings.'
|
|
}),
|
|
reTryTitle: formatMessage({
|
|
id: 'mobile.android.permission_denied_retry',
|
|
defaultMessage: 'Set Permission'
|
|
}),
|
|
okTitle: formatMessage({id: 'mobile.android.permission_denied_dismiss', defaultMessage: 'Dismiss'})
|
|
}
|
|
};
|
|
|
|
if (Platform.OS === 'ios') {
|
|
options.mediaType = 'mixed';
|
|
}
|
|
|
|
ImagePicker.launchImageLibrary(options, (response) => {
|
|
if (response.error || response.didCancel) {
|
|
return;
|
|
}
|
|
|
|
this.uploadFiles([response]);
|
|
});
|
|
};
|
|
|
|
attachVideoFromLibraryAndroid = () => {
|
|
const {formatMessage} = this.props.intl;
|
|
const options = {
|
|
quality: 1.0,
|
|
mediaType: 'video',
|
|
noData: true,
|
|
permissionDenied: {
|
|
title: formatMessage({
|
|
id: 'mobile.android.videos_permission_denied_title',
|
|
defaultMessage: 'Video library access is required'
|
|
}),
|
|
text: formatMessage({
|
|
id: 'mobile.android.videos_permission_denied_description',
|
|
defaultMessage: 'To upload videos from your library, please change your permission settings.'
|
|
}),
|
|
reTryTitle: formatMessage({
|
|
id: 'mobile.android.permission_denied_retry',
|
|
defaultMessage: 'Set Permission'
|
|
}),
|
|
okTitle: formatMessage({id: 'mobile.android.permission_denied_dismiss', defaultMessage: 'Dismiss'})
|
|
}
|
|
};
|
|
|
|
ImagePicker.launchImageLibrary(options, (response) => {
|
|
if (response.error || response.didCancel) {
|
|
return;
|
|
}
|
|
|
|
this.uploadFiles([response]);
|
|
});
|
|
};
|
|
|
|
uploadFiles = (images) => {
|
|
this.props.uploadFiles(images);
|
|
};
|
|
|
|
handleFileAttachmentOption = (action) => {
|
|
this.props.navigator.dismissModal({
|
|
animationType: 'none'
|
|
});
|
|
|
|
// Have to wait to launch the library attachment action.
|
|
// If we call the action after dismissModal with no delay then the
|
|
// Wix navigator will dismiss the library attachment modal as well.
|
|
setTimeout(() => {
|
|
if (typeof action === 'function') {
|
|
action();
|
|
}
|
|
}, 100);
|
|
};
|
|
|
|
showFileAttachmentOptions = () => {
|
|
const {fileCount, maxFileCount, onShowFileMaxWarning} = this.props;
|
|
|
|
if (fileCount === maxFileCount) {
|
|
onShowFileMaxWarning();
|
|
return;
|
|
}
|
|
|
|
this.props.blurTextBox();
|
|
const options = {
|
|
items: [{
|
|
action: () => this.handleFileAttachmentOption(this.attachFileFromCamera),
|
|
text: {
|
|
id: 'mobile.file_upload.camera',
|
|
defaultMessage: 'Take Photo or Video'
|
|
},
|
|
icon: 'camera'
|
|
}, {
|
|
action: () => this.handleFileAttachmentOption(this.attachFileFromLibrary),
|
|
text: {
|
|
id: 'mobile.file_upload.library',
|
|
defaultMessage: 'Photo Library'
|
|
},
|
|
icon: 'photo'
|
|
}]
|
|
};
|
|
|
|
if (Platform.OS === 'android') {
|
|
options.items.push({
|
|
action: () => this.handleFileAttachmentOption(this.attachVideoFromLibraryAndroid),
|
|
text: {
|
|
id: 'mobile.file_upload.video',
|
|
defaultMessage: 'Video Library'
|
|
},
|
|
icon: 'file-video-o'
|
|
});
|
|
}
|
|
|
|
this.props.navigator.showModal({
|
|
screen: 'OptionsModal',
|
|
title: '',
|
|
animationType: 'none',
|
|
passProps: {
|
|
items: options.items
|
|
},
|
|
navigatorStyle: {
|
|
navBarHidden: true,
|
|
statusBarHidden: false,
|
|
statusBarHideWithNavBar: false,
|
|
screenBackgroundColor: 'transparent',
|
|
modalPresentationStyle: 'overCurrentContext'
|
|
}
|
|
});
|
|
};
|
|
|
|
render() {
|
|
const {theme, wrapper, children} = this.props;
|
|
|
|
if (wrapper) {
|
|
return (
|
|
<TouchableOpacity
|
|
onPress={this.showFileAttachmentOptions}
|
|
>
|
|
{children}
|
|
</TouchableOpacity>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<TouchableOpacity
|
|
onPress={this.showFileAttachmentOptions}
|
|
style={style.buttonContainer}
|
|
>
|
|
<Icon
|
|
size={30}
|
|
style={style.attachIcon}
|
|
color={changeOpacity(theme.centerChannelColor, 0.9)}
|
|
name='md-add'
|
|
/>
|
|
</TouchableOpacity>
|
|
);
|
|
}
|
|
}
|
|
|
|
const style = StyleSheet.create({
|
|
attachIcon: {
|
|
marginTop: Platform.select({
|
|
ios: 2,
|
|
android: 0
|
|
})
|
|
},
|
|
buttonContainer: {
|
|
height: Platform.select({
|
|
ios: 34,
|
|
android: 36
|
|
}),
|
|
width: 45,
|
|
alignItems: 'center',
|
|
justifyContent: 'center'
|
|
}
|
|
});
|
|
|
|
export default injectIntl(AttachmentButton);
|