mirror of
https://github.com/laurent22/joplin.git
synced 2024-12-21 09:38:01 +02:00
cb3e1cf1e9
commit2fb6cee901
Merge:4e303be85f
db509955f6
Author: Laurent Cozic <laurent@cozic.net> Date: Fri Oct 16 16:24:07 2020 +0100 Merge branch 'dev' into rn_63 commit4e303be85f
Author: Laurent Cozic <laurent@cozic.net> Date: Fri Oct 16 16:14:39 2020 +0100 Clean up commite3a37ec2d6
Author: Laurent Cozic <laurent@cozic.net> Date: Fri Oct 16 15:57:55 2020 +0100 Use different script for pre-commit and manual start commitbd236648fc
Author: Laurent Cozic <laurent@cozic.net> Date: Fri Oct 16 15:56:45 2020 +0100 Removed RN eslint config commite7feda41c9
Author: Laurent Cozic <laurent@cozic.net> Date: Fri Oct 16 15:27:08 2020 +0100 Revert "Disable git hook for now" This reverts commit89263ac742
. commitcfd63fe46f
Author: Laurent Cozic <laurent@cozic.net> Date: Fri Oct 16 13:02:32 2020 +0100 Ask permission to use geo-location commit66059939a3
Author: Laurent Cozic <laurent@cozic.net> Date: Fri Oct 16 12:26:20 2020 +0100 Fixed WebView race condition commit1e0d2b7b86
Author: Laurent Cozic <laurent@cozic.net> Date: Fri Oct 16 11:56:21 2020 +0100 Fixed webview issues commitf537d22d7f
Author: Laurent Cozic <laurent@cozic.net> Date: Fri Oct 16 11:08:29 2020 +0100 Improve resource file watching commiteec32cf70a
Author: Laurent Cozic <laurent@cozic.net> Date: Thu Oct 15 18:40:13 2020 +0100 Removed cache package dependency and implemented one more suitable for React Native commitefa346fea4
Author: Laurent Cozic <laurent@cozic.net> Date: Thu Oct 15 14:57:21 2020 +0100 iOS: Added fonts to Info.plist although it was working without it commit572b647bc0
Author: Laurent Cozic <laurent@cozic.net> Date: Thu Oct 15 14:56:49 2020 +0100 Specify content-type header for OneDrive to prevent network error commitbcedf6c7f0
Author: Laurent Cozic <laurent@cozic.net> Date: Thu Oct 15 12:45:01 2020 +0100 iOS: Disable long press menu since it is already built-in commit7359dd61d1
Author: Laurent Cozic <laurent@cozic.net> Date: Thu Oct 15 12:37:40 2020 +0100 Removed unused react-native-device-info commit2d63ab36d3
Author: Laurent Cozic <laurent@cozic.net> Date: Thu Oct 15 12:35:54 2020 +0100 iOS: Fixed taking a picture commit8e2875a91c
Author: Laurent Cozic <laurent@cozic.net> Date: Thu Oct 15 12:11:13 2020 +0100 iOS: Restored camera roll functionality commit75f5edf2ad
Author: Laurent Cozic <laurent@cozic.net> Date: Thu Oct 15 11:40:13 2020 +0100 iOS: Fixed build settings commitb220c98419
Author: Laurent Cozic <laurent@cozic.net> Date: Thu Oct 15 11:40:03 2020 +0100 iOS: Got images to work with WebKit commitc34b43e841
Author: Laurent Cozic <laurent@cozic.net> Date: Thu Oct 15 10:24:52 2020 +0100 iOS: Restore more settings commit32997611e6
Author: Laurent Cozic <laurent@cozic.net> Date: Thu Oct 15 10:15:14 2020 +0100 iOS: Added back icons and other properties commitb5811d7f7c
Author: Laurent Cozic <laurent@cozic.net> Date: Wed Oct 14 23:53:14 2020 +0100 Got iOS build to work commitdc6d7c00e0
Author: Laurent Cozic <laurent@cozic.net> Date: Wed Oct 14 18:40:06 2020 +0100 Imported old settings in gradle build commitdff59f5603
Author: Laurent Cozic <laurent@cozic.net> Date: Wed Oct 14 18:20:00 2020 +0100 Restored sharing commit0bdb449e72
Author: Laurent Cozic <laurent@cozic.net> Date: Wed Oct 14 17:25:40 2020 +0100 Updated NoteBodyViewer commit0c0d228815
Author: Laurent Cozic <laurent@cozic.net> Date: Wed Oct 14 16:54:42 2020 +0100 Fixed networking commit6ff45ce485
Author: Laurent Cozic <laurent@cozic.net> Date: Wed Oct 14 13:11:00 2020 +0100 Fixed document picker commitcc889182b6
Author: Laurent Cozic <laurent@cozic.net> Date: Wed Oct 14 12:56:27 2020 +0100 Added back support for alarms commit040261abfa
Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 13 22:04:49 2020 +0100 Fixed Clipboard and remove image-picker package commit1077ad8f16
Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 13 21:54:52 2020 +0100 Fixed Select Alarm dialog and PoorManIntervals class commit8296676fd5
Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 13 21:32:52 2020 +0100 Fixed icons and warnings commit3b0e3f6f43
Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 13 17:02:59 2020 +0100 Got app to build again commit89263ac742
Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 13 15:41:17 2020 +0100 Disable git hook for now commitd6da162f67
Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 13 15:39:12 2020 +0100 Restored back all RN packages commit7f8ce3732c
Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 13 15:13:12 2020 +0100 Restored base packages commitea59726eb3
Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 13 15:05:17 2020 +0100 Started over from scratch
243 lines
7.4 KiB
TypeScript
243 lines
7.4 KiB
TypeScript
const { RNCamera } = require('react-native-camera');
|
|
const React = require('react');
|
|
const Component = React.Component;
|
|
const { connect } = require('react-redux');
|
|
const { View, TouchableOpacity, Text, Dimensions } = require('react-native');
|
|
const Icon = require('react-native-vector-icons/Ionicons').default;
|
|
const { _ } = require('lib/locale');
|
|
const shim = require('lib/shim').default;
|
|
const Setting = require('lib/models/Setting').default;
|
|
|
|
Icon.loadFont();
|
|
|
|
class CameraView extends Component {
|
|
constructor() {
|
|
super();
|
|
|
|
const dimensions = Dimensions.get('window');
|
|
|
|
this.state = {
|
|
snapping: false,
|
|
ratios: [],
|
|
screenWidth: dimensions.width,
|
|
screenHeight: dimensions.height,
|
|
};
|
|
|
|
this.back_onPress = this.back_onPress.bind(this);
|
|
this.photo_onPress = this.photo_onPress.bind(this);
|
|
this.reverse_onPress = this.reverse_onPress.bind(this);
|
|
this.ratio_onPress = this.ratio_onPress.bind(this);
|
|
this.onCameraReady = this.onCameraReady.bind(this);
|
|
this.onLayout = this.onLayout.bind(this);
|
|
}
|
|
|
|
onLayout(event:any) {
|
|
this.setState({
|
|
screenWidth: event.nativeEvent.layout.width,
|
|
screenHeight: event.nativeEvent.layout.height,
|
|
});
|
|
}
|
|
|
|
back_onPress() {
|
|
if (this.props.onCancel) this.props.onCancel();
|
|
}
|
|
|
|
reverse_onPress() {
|
|
if (this.props.cameraType === RNCamera.Constants.Type.back) {
|
|
Setting.setValue('camera.type', RNCamera.Constants.Type.front);
|
|
} else {
|
|
Setting.setValue('camera.type', RNCamera.Constants.Type.back);
|
|
}
|
|
}
|
|
|
|
ratio_onPress() {
|
|
if (this.state.ratios.length <= 1) return;
|
|
|
|
let index = this.state.ratios.indexOf(this.props.cameraRatio);
|
|
index++;
|
|
if (index >= this.state.ratios.length) index = 0;
|
|
Setting.setValue('camera.ratio', this.state.ratios[index]);
|
|
}
|
|
|
|
async photo_onPress() {
|
|
if (!this.camera || !this.props.onPhoto) return;
|
|
|
|
this.setState({ snapping: true });
|
|
|
|
const result = await this.camera.takePictureAsync({
|
|
quality: 0.8,
|
|
exif: true,
|
|
fixOrientation: true,
|
|
});
|
|
|
|
this.setState({ snapping: false });
|
|
|
|
if (this.props.onPhoto) this.props.onPhoto(result);
|
|
|
|
}
|
|
|
|
async onCameraReady() {
|
|
if (this.supportsRatios()) {
|
|
const ratios = await this.camera.getSupportedRatiosAsync();
|
|
this.setState({ ratios: ratios });
|
|
}
|
|
}
|
|
|
|
renderButton(onPress:Function, iconNameOrIcon:any, style:any) {
|
|
let icon = null;
|
|
|
|
if (typeof iconNameOrIcon === 'string') {
|
|
icon = (
|
|
<Icon
|
|
name={iconNameOrIcon}
|
|
style={{
|
|
fontSize: 40,
|
|
color: 'black',
|
|
}}
|
|
/>
|
|
);
|
|
} else {
|
|
icon = iconNameOrIcon;
|
|
}
|
|
|
|
return (
|
|
<TouchableOpacity onPress={onPress} style={Object.assign({}, style)}>
|
|
<View style={{ borderRadius: 32, width: 60, height: 60, borderColor: '#00000040', borderWidth: 1, borderStyle: 'solid', backgroundColor: '#ffffff77', justifyContent: 'center', alignItems: 'center', alignSelf: 'baseline' }}>
|
|
{ icon }
|
|
</View>
|
|
</TouchableOpacity>
|
|
);
|
|
}
|
|
|
|
fitRectIntoBounds(rect:any, bounds:any) {
|
|
const rectRatio = rect.width / rect.height;
|
|
const boundsRatio = bounds.width / bounds.height;
|
|
|
|
const newDimensions:any = {};
|
|
|
|
// Rect is more landscape than bounds - fit to width
|
|
if (rectRatio > boundsRatio) {
|
|
newDimensions.width = bounds.width;
|
|
newDimensions.height = rect.height * (bounds.width / rect.width);
|
|
} else { // Rect is more portrait than bounds - fit to height
|
|
newDimensions.width = rect.width * (bounds.height / rect.height);
|
|
newDimensions.height = bounds.height;
|
|
}
|
|
|
|
return newDimensions;
|
|
}
|
|
|
|
cameraRect(ratio:string) {
|
|
// To keep the calculations simpler, it's assumed that the phone is in
|
|
// portrait orientation. Then at the end we swap the values if needed.
|
|
const splitted = ratio.split(':');
|
|
|
|
const output = this.fitRectIntoBounds({
|
|
width: Number(splitted[1]),
|
|
height: Number(splitted[0]),
|
|
}, {
|
|
width: Math.min(this.state.screenWidth, this.state.screenHeight),
|
|
height: Math.max(this.state.screenWidth, this.state.screenHeight),
|
|
});
|
|
|
|
if (this.state.screenWidth > this.state.screenHeight) {
|
|
const w = output.width;
|
|
output.width = output.height;
|
|
output.height = w;
|
|
}
|
|
|
|
return output;
|
|
}
|
|
|
|
supportsRatios() {
|
|
return shim.mobilePlatform() === 'android';
|
|
}
|
|
|
|
render() {
|
|
const photoIcon = this.state.snapping ? 'md-checkmark' : 'md-camera';
|
|
|
|
const displayRatios = this.supportsRatios() && this.state.ratios.length > 1;
|
|
|
|
const reverseCameraButton = this.renderButton(this.reverse_onPress, 'md-camera-reverse', { flex: 1, flexDirection: 'row', justifyContent: 'flex-start', marginLeft: 20 });
|
|
const ratioButton = !displayRatios ? <View style={{ flex: 1 }}/> : this.renderButton(this.ratio_onPress, <Text style={{ fontWeight: 'bold', fontSize: 20 }}>{Setting.value('camera.ratio')}</Text>, { flex: 1, flexDirection: 'row', justifyContent: 'flex-end', marginRight: 20 });
|
|
|
|
let cameraRatio = '4:3';
|
|
const cameraProps:any = {};
|
|
|
|
if (displayRatios) {
|
|
cameraProps.ratio = this.props.cameraRatio;
|
|
cameraRatio = this.props.cameraRatio;
|
|
}
|
|
|
|
const cameraRect = this.cameraRect(cameraRatio);
|
|
cameraRect.left = (this.state.screenWidth - cameraRect.width) / 2;
|
|
cameraRect.top = (this.state.screenHeight - cameraRect.height) / 2;
|
|
|
|
return (
|
|
<View style={Object.assign({}, this.props.style, { position: 'relative' })} onLayout={this.onLayout}>
|
|
<View style={{ position: 'absolute', backgroundColor: '#000000', width: '100%', height: '100%' }}/>
|
|
<RNCamera
|
|
style={Object.assign({ position: 'absolute' }, cameraRect)}
|
|
ref={(ref:any) => {
|
|
this.camera = ref;
|
|
}}
|
|
type={this.props.cameraType}
|
|
captureAudio={false}
|
|
onCameraReady={this.onCameraReady}
|
|
androidCameraPermissionOptions={{
|
|
title: _('Permission to use camera'),
|
|
message: _('Your permission to use your camera is required.'),
|
|
buttonPositive: _('OK'),
|
|
buttonNegative: _('Cancel'),
|
|
}}
|
|
|
|
{ ...cameraProps }
|
|
>
|
|
<View style={{ flex: 1, justifyContent: 'space-between', flexDirection: 'column' }}>
|
|
<View style={{ flex: 1, justifyContent: 'flex-start' }}>
|
|
<TouchableOpacity onPress={this.back_onPress}>
|
|
<View style={{ marginLeft: 5, marginTop: 5, borderColor: '#00000040', borderWidth: 1, borderStyle: 'solid', borderRadius: 90, width: 50, height: 50, display: 'flex', backgroundColor: '#ffffff77', justifyContent: 'center', alignItems: 'center' }}>
|
|
<Icon
|
|
name={'md-arrow-back'}
|
|
style={{
|
|
fontSize: 40,
|
|
color: 'black',
|
|
}}
|
|
/>
|
|
</View>
|
|
</TouchableOpacity>
|
|
</View>
|
|
<View style={{ flex: 1, flexDirection: 'row', justifyContent: 'center', alignItems: 'flex-end' }}>
|
|
<View style={{ flex: 1, flexDirection: 'row', justifyContent: 'center', alignItems: 'center', marginBottom: 20 }}>
|
|
{ reverseCameraButton }
|
|
<TouchableOpacity onPress={this.photo_onPress}>
|
|
<View style={{ flexDirection: 'row', borderRadius: 90, width: 90, height: 90, backgroundColor: '#ffffffaa', display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
|
|
<Icon
|
|
name={photoIcon}
|
|
style={{
|
|
fontSize: 60,
|
|
color: 'black',
|
|
}}
|
|
/>
|
|
</View>
|
|
</TouchableOpacity>
|
|
{ ratioButton }
|
|
</View>
|
|
</View>
|
|
</View>
|
|
</RNCamera>
|
|
</View>
|
|
);
|
|
}
|
|
}
|
|
|
|
const mapStateToProps = (state:any) => {
|
|
return {
|
|
cameraRatio: state.settings['camera.ratio'],
|
|
cameraType: state.settings['camera.type'],
|
|
};
|
|
};
|
|
|
|
|
|
export default connect(mapStateToProps)(CameraView);
|