import React, { Component } from "react";
import {
StyleSheet,
Text,
View,
ScrollView,
Image,
Switch,
TextInput,
Picker,
Slider,
WebView
} from "react-native";
import omit from "lodash/omit";
import { captureRef } from "react-native-view-shot";
import { Surface } from "gl-react-native";
import GL from "gl-react";
import MapView from "react-native-maps";
import Video from "react-native-video";
import Btn from "./Btn";
const catsSource = {
uri: "https://i.imgur.com/5EOyTDQ.jpg"
};
const shaders = GL.Shaders.create({
helloGL: {
frag: `
precision highp float;
varying vec2 uv;
uniform float blue;
void main () {
gl_FragColor = vec4(uv.x, uv.y, blue, 1.0);
}`
}
});
const HelloGL = GL.createComponent(
({ blue }) => ,
{ displayName: "HelloGL" }
);
export default class App extends Component {
state = {
previewSource: catsSource,
error: null,
res: null,
value: {
format: "png",
quality: 0.9,
result: "tmpfile",
snapshotContentContainer: false
}
};
snapshot = refname => () =>
captureRef(this.refs[refname], this.state.value)
.then(
res =>
this.state.value.result !== "tmpfile"
? res
: new Promise((success, failure) =>
// just a test to ensure res can be used in Image.getSize
Image.getSize(
res,
(width, height) => (
console.log(res, width, height), success(res)
),
failure
)
)
)
.then(res =>
this.setState({
error: null,
res,
previewSource: {
uri:
this.state.value.result === "base64"
? "data:image/" + this.state.value.format + ";base64," + res
: res
}
})
)
.catch(
error => (
console.warn(error),
this.setState({ error, res: null, previewSource: null })
)
);
render() {
const { value, previewSource, error, res } = this.state;
const {
format,
quality,
width,
height,
result,
snapshotContentContainer
} = value;
return (
😃 ViewShot Example 😜
This is a
react-native-view-shot
showcase.
{error ? (
{"" + (error.message || error)}
) : (
)}
{res ? res.slice(0, 200) : ""}
this.setState({ previewSource: catsSource })}
/>
Format
this.setState({ value: { ...value, format } })}
>
Quality
this.setState({ value: { ...value, quality } })}
/>
{(quality * 100).toFixed(0)}%
Size
this.setState({
value: omit(
{
...value,
width: 300,
height: 300
},
checked ? [] : ["width", "height"]
)
})}
/>
{width !== undefined ? (
!isNaN(txt) &&
this.setState({
value: { ...value, width: parseInt(txt, 10) }
})}
/>
) : (
(auto)
)}
x
{height !== undefined ? (
!isNaN(txt) &&
this.setState({
value: { ...value, height: parseInt(txt, 10) }
})}
/>
) : (
(auto)
)}
Result
this.setState({ value: { ...value, result } })}
>
snapshotContentContainer
this.setState({
value: { ...value, snapshotContentContainer }
})}
/>
Experimental Stuff
);
}
}
const styles = StyleSheet.create({
root: {
flex: 1,
backgroundColor: "#f6f6f6"
},
container: {
paddingVertical: 20,
backgroundColor: "#f6f6f6"
},
title: {
fontSize: 20,
textAlign: "center",
margin: 10
},
experimental: {
padding: 10,
flexDirection: "column",
alignItems: "center"
},
experimentalTitle: {
fontSize: 16,
margin: 10
},
p1: {
marginBottom: 10,
flexDirection: "row",
flexWrap: "wrap",
justifyContent: "center",
alignItems: "center"
},
text: {
color: "#333"
},
code: {
fontWeight: "bold",
color: "#000"
},
field: {
flexDirection: "row",
alignItems: "center",
paddingVertical: 4,
paddingHorizontal: 10
},
label: {
minWidth: 80,
fontStyle: "italic",
color: "#888"
},
switch: {
marginRight: 50
},
input: {
flex: 1,
marginHorizontal: 5
},
inputText: {
flex: 1,
marginHorizontal: 5,
color: "red",
textAlign: "center"
},
preview: {
flexDirection: "row",
alignItems: "center",
justifyContent: "space-around"
},
previewImage: {
width: 375,
height: 300
},
previewUriText: {
fontSize: 12,
fontStyle: "italic",
color: "#666",
textAlign: "center",
padding: 10,
paddingBottom: 0
},
previewError: {
width: 375,
height: 300,
paddingTop: 20,
textAlign: "center",
fontSize: 20,
fontWeight: "bold",
color: "#fff",
backgroundColor: "#c00"
},
header: {
backgroundColor: "#f6f6f6",
borderColor: "#000",
borderWidth: 1,
paddingBottom: 20
},
form: {
backgroundColor: "#fff"
},
btns: {
flexDirection: "row",
flexWrap: "wrap",
alignItems: "center",
justifyContent: "center",
paddingVertical: 10,
margin: 4
}
});