Files
imexmobile/components/screen-camera/screen-camera.component.jsx
2020-11-12 21:45:57 -08:00

188 lines
5.3 KiB
JavaScript

import { Ionicons } from "@expo/vector-icons";
import { useNavigation } from "@react-navigation/native";
import { Camera } from "expo-camera";
import * as FileSystem from "expo-file-system";
import React, { useEffect, useRef, useState } from "react";
import { SafeAreaView, Text, TouchableOpacity, View } from "react-native";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import {
selectCurrentCameraJob,
selectCurrentCameraJobId,
} from "../../redux/app/app.selectors";
import { addPhoto } from "../../redux/photos/photos.actions";
import CameraControls from "../camera-controls/camera-controls.component";
const mapStateToProps = createStructuredSelector({
cameraJobId: selectCurrentCameraJobId,
cameraJob: selectCurrentCameraJob,
});
const mapDispatchToProps = (dispatch) => ({
addPhoto: (photo) => dispatch(addPhoto(photo)),
});
export function ScreenCamera({ cameraJobId, cameraJob, addPhoto }) {
const navigation = useNavigation();
const [hasPermission, setHasPermission] = useState(null);
const [state, setState] = useState({
flashMode: Camera.Constants.FlashMode.off,
capturing: null,
cameraType: Camera.Constants.Type.back,
});
const cameraRef = useRef(null);
useEffect(() => {
(async () => {
const { status } = await Camera.requestPermissionsAsync();
setHasPermission(status === "granted");
})();
}, []);
const setFlashMode = (flashMode) => setState({ ...state, flashMode });
const setCameraType = (cameraType) => setState({ ...state, cameraType });
const handleCaptureIn = () => setState({ ...state, capturing: true });
const handleCaptureOut = () => {
if (state.capturing) cameraRef.current.stopRecording();
};
const handleShortCapture = async () => {
console.log("Taking the picture!");
if (cameraRef.current) {
const options = {
//quality: 0.5,
//base64: true,
//skipProcessing: true,
};
let photo = await cameraRef.current.takePictureAsync(options);
setState({ ...state, capturing: false });
console.log("ScreenCamera -> photo", photo);
const filename = photo.uri.substring(photo.uri.lastIndexOf("/") + 1);
const newUri = FileSystem.documentDirectory + "photos/" + filename;
await FileSystem.copyAsync({
from: photo.uri,
to: newUri,
});
addPhoto({
...photo,
id: filename,
uri: newUri,
jobId: cameraJobId,
video: false,
});
}
};
const handleLongCapture = async () => {
console.log("Taking a video!");
if (cameraRef.current) {
let video = await cameraRef.current.recordAsync();
setState({ ...state, capturing: false });
const filename = video.uri.substring(video.uri.lastIndexOf("/") + 1);
const newUri = FileSystem.documentDirectory + "photos/" + filename;
await FileSystem.copyAsync({
from: video.uri,
to: newUri,
});
addPhoto({
...video,
id: filename,
uri: newUri,
jobId: cameraJobId,
video: true,
});
}
};
if (hasPermission === null) {
return <View />;
}
if (hasPermission === false) {
return <Text>No access to camera</Text>;
}
const { hasCameraPermission, flashMode, cameraType, capturing } = state;
return (
<View style={{ display: "flex", flex: 1 }}>
<Camera
style={{ flex: 1, display: "flex" }}
type={state.cameraType}
ref={cameraRef}
>
<SafeAreaView
style={{
flex: 1,
}}
>
<TouchableOpacity
onPress={() => navigation.push("CameraJobSearch")}
style={{
display: "flex",
width: "100%",
alignSelf: "flex-start",
alignItems: "center",
backgroundColor: "rgba(112, 128, 144, 0.3)",
fontSize: 20,
fontWeight: "bold",
}}
>
<Text
style={{
fontSize: 20,
fontWeight: "bold",
}}
>
{cameraJob && cameraJob.ro_number}
</Text>
<Text>
{cameraJob &&
`${cameraJob && cameraJob.ownr_fn} ${
cameraJob && cameraJob.ownr_ln
}`}
</Text>
<Text>{cameraJobId}</Text>
</TouchableOpacity>
<TouchableOpacity
onPress={() => {
navigation.push("MediaCache");
}}
style={{
alignSelf: "flex-start",
alignItems: "center",
fontSize: 20,
fontWeight: "bold",
}}
>
<Ionicons
name="ios-photos"
style={{ color: "#fff", fontSize: 40 }}
/>
</TouchableOpacity>
<CameraControls
capturing={capturing}
flashMode={flashMode}
cameraType={cameraType}
setFlashMode={setFlashMode}
setCameraType={setCameraType}
onCaptureIn={handleCaptureIn}
onCaptureOut={handleCaptureOut}
onLongCapture={handleLongCapture}
onShortCapture={handleShortCapture}
/>
</SafeAreaView>
</Camera>
</View>
);
}
export default connect(mapStateToProps, mapDispatchToProps)(ScreenCamera);