import * as React from 'react';
import { View, Text, StyleSheet, TouchableOpacity, Image, ToastAndroid, Alert } from 'react-native';
import * as MediaLibrary from "expo-media-library";
import * as ECamera from "expo-camera";
import * as ImagePicker from 'expo-image-picker';
import RevPng from "../assets/reverse.png";
import PickPng from "../assets/img-picker.png";
import SettPng from "../assets/settings-icon.png";
import { getIp } from "./Settings"
import CameraSettings from "./CameraSettings"
export default class Camera extends React.Component {
constructor(props) {
super(props)
this.state = {
hasCameraPermission: null,
type: ECamera.Constants.Type.front,
camera: null,
img: <>>,
show: false,
wb: null,
fm: null,
ra: null,
si: null,
whiteBalance: null,
flashMode: null,
ratio: null,
pictureSize: null,
settings: {
wb: [],
fm: [],
ra: [],
si: [],
},
}
this.changeCamera = this.changeCamera.bind(this)
this.settChange = this.settChange.bind(this)
}
async componentDidMount() {
let { status } = await ECamera.getCameraPermissionsAsync();
this.setState({ hasCameraPermission: status == 'granted' });
}
changeCamera() {
this.setState({
type: this.state.type === ECamera.Constants.Type.back
? ECamera.Constants.Type.front
: ECamera.Constants.Type.back,
});
}
async cameraRdy(camera) {
if (this.state.wb) return;
const ratios = await camera.getSupportedRatiosAsync()
const sizes = {}
for (const r of ratios) {
sizes[r] = await camera.getAvailablePictureSizesAsync(r)
}
this.setState({
wb: ECamera.Constants.WhiteBalance,
fm: ECamera.Constants.FlashMode,
ra: ratios,
si: sizes,
whiteBalance: ECamera.Constants.WhiteBalance[0],
flashMode: ECamera.Constants.FlashMode[0],
ratio: ratios[0],
pictureSize: sizes[ratios[0]][0],
settings: {
wb: Object.keys(ECamera.Constants.WhiteBalance),
fm: Object.keys(ECamera.Constants.FlashMode),
ra: ratios,
si: sizes,
},
})
console.log("settings", { ratios, sizes })
}
async settChange(which, nVal) {
console.log("Camera@settChange: ", { which, nVal })
const ns = {}
ns[which] = nVal
this.setState(ns)
}
render() {
let camera = null;
async function takePhoto() {
if (camera) {
let foto = await camera.takePictureAsync();
let asset = await MediaLibrary.createAssetAsync(foto.uri); // domyślnie zapisuje w folderze DCIM
this.setState({ img: })
setTimeout(() => this.setState({ img: <>> }), 4000);
ToastAndroid.showWithGravity(
'The photo has been taken',
ToastAndroid.SHORT,
ToastAndroid.CENTER
);
}
}
async function editPhoto() {
if (camera) {
let result = await ImagePicker.launchImageLibraryAsync({
mediaTypes: ImagePicker.MediaTypeOptions.All,
allowsEditing: true,
aspect: [4, 3],
quality: 1,
});
if (!result.cancelled) {
const uri = result.uri;
const body = new FormData();
body.append('photo', {
uri: uri,
type: 'image/jpeg',
name: uri.split('/').pop(),
});
console.log(body)
const url = await getIp() + "/upload"
await fetch(url, {
method: "POST",
body
}).catch(e => console.log(e, url))
Alert.alert("Alert", "Galllery - file uploaded and saved!");
}
}
}
function toggleSettings() {
this.setState({ show: !this.state.show })
}
const { hasCameraPermission } = this.state; // podstawienie zmiennej ze state
if (hasCameraPermission == null) {
return ;
} else if (hasCameraPermission === false) {
return brak dostępu do kamery;
} else {
return (
{ camera = ref }}
style={{ flex: 1 }}
type={this.state.type}
onCameraReady={() => this.cameraRdy(camera)}
ratio={this.state.ratio}
whiteBalance={this.state.whiteBalance}
pictureSize={this.state.pictureSize}
flashMode={this.state.flashMode}
key={this.state.flashMode}
>
+
{this.state.img}
);
}
}
}
const styles = StyleSheet.create({
cont: {
flex: 1,
},
btn: {
backgroundColor: "rgba(0, 0, 0, 0.6)",
borderRadius: 100,
position: "absolute",
flex: 1,
justifyContent: 'center',
alignItems: 'center',
bottom: 20,
},
btn1: {
left: 30,
width: 70,
height: 70,
},
btn2: {
left: "37%",
width: 120,
height: 120,
},
btn3: {
right: 60,
width: 70,
height: 70,
},
btn4: {
bottom: 80,
right: 20,
width: 70,
height: 70,
},
btnIco: {
width: 50,
height: 50,
},
btnIco2: {
width: 42,
height: 42,
},
btnTxt: {
fontSize: 160,
marginTop: -55,
color: "#EB1F63",
},
img: {
position: "absolute",
top: "15%",
left: "40%",
width: 90,
height: 160,
borderColor: "#EB1F63",
borderWidth: 5,
},
nav: {
flexDirection: "row",
margin: 10,
},
navTxt: {
fontSize: 26,
margin: 5,
},
navBtn: {
flex: 1
},
list: {
margin: 9,
paddingBottom: 10,
// height: "100%",
},
})