You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
247 lines
6.4 KiB
247 lines
6.4 KiB
import React, { useContext, useRef, useState } from "react";
|
|
import {
|
|
StyleSheet,
|
|
Text,
|
|
TouchableOpacity,
|
|
View,
|
|
Animated,
|
|
TouchableWithoutFeedback,
|
|
Dimensions,
|
|
PixelRatio,
|
|
} from "react-native";
|
|
import { FlatList } from "react-native";
|
|
|
|
import colors from "../config/colors";
|
|
import { MaterialCommunityIcons } from "@expo/vector-icons";
|
|
import { dimensions } from "../config/dimensions";
|
|
import { MapDataContext } from "../context/MapDataContext";
|
|
import MenuItens from "./MenuItens";
|
|
|
|
const screenWidth = Dimensions.get("window").width;
|
|
const screenHeight = Dimensions.get("window").height;
|
|
|
|
|
|
function FloatButton(props) {
|
|
const animation = useRef(new Animated.Value(0)).current;
|
|
|
|
const [open, setOpen] = useState(false);
|
|
const context = useContext(MapDataContext);
|
|
|
|
const toggleMenu = () => {
|
|
const value = open ? 0 : 1;
|
|
|
|
Animated.spring(animation, {
|
|
toValue: value,
|
|
friction: 6,
|
|
useNativeDriver: true,
|
|
}).start();
|
|
const json = JSON.stringify(context.layers);
|
|
const obj = JSON.parse(json);
|
|
|
|
setLayers(obj);
|
|
setOpen(!open);
|
|
};
|
|
|
|
/*--------------------------------------------------------MENU----------------------------------------------------- */
|
|
const [changed, setChanged] = useState(true);
|
|
const [layers, setLayers] = useState({
|
|
values:
|
|
[
|
|
{
|
|
id: 1,
|
|
name: 'Chuva',
|
|
isSelected: context.layers.values[0].isSelected,
|
|
image: require("../assets/dataMenu/chuva.png"),
|
|
},
|
|
{
|
|
id: 2,
|
|
name: 'Ponto de alagamento',
|
|
isSelected: context.layers.values[1].isSelected,
|
|
image: require("../assets/dataMenu/alagamento.png"),
|
|
},
|
|
{
|
|
id: 3,
|
|
name: 'Pluviômetro artesanal',
|
|
isSelected: context.layers.values[2].isSelected,
|
|
image: require("../assets/dataMenu/pluviometroArtesanal.png"),
|
|
},
|
|
{
|
|
id: 4,
|
|
name: 'Pluviômetro oficial',
|
|
isSelected: context.layers.values[3].isSelected,
|
|
image: require("../assets/dataMenu/pluviometroOficial.png"),
|
|
},
|
|
{
|
|
id: 5,
|
|
name: 'Água no rio',
|
|
isSelected: context.layers.values[4].isSelected,
|
|
image: require("../assets/dataMenu/aguaRio.png"),
|
|
},
|
|
{
|
|
id: 6,
|
|
name: 'Área de inundação',
|
|
isSelected: context.layers.values[5].isSelected,
|
|
image: require("../assets/dataMenu/areaInundacao.png"),
|
|
},
|
|
]
|
|
});
|
|
|
|
const selectedItens = (item) => {
|
|
item.isSelected = !item.isSelected;
|
|
setChanged(!changed);
|
|
}
|
|
|
|
const renderItem = ({ item }) => {
|
|
const icon = item.isSelected ? "check-box" : "check-box-outline-blank";
|
|
return (
|
|
<MenuItens
|
|
item={item}
|
|
onPress={() => selectedItens(item)}
|
|
icon={icon}
|
|
image={item.image}
|
|
/>
|
|
);
|
|
};
|
|
|
|
const applyLayers = () => {
|
|
context.setChanges(layers.values);
|
|
setOpen(false);
|
|
}
|
|
|
|
const DataMenu = () => {
|
|
return (
|
|
<View>
|
|
<View style={styles.Menucontainer} >
|
|
<View style={{
|
|
flex: 1,
|
|
flexDirection: "column",
|
|
height: (PixelRatio.get() >= 3 ? screenHeight * 0.75 : screenHeight * 0.80), //solução temporária, procurar soluções pro menu se ajustar melhor ao layout
|
|
paddingTop: (PixelRatio.get() > 3 ? screenHeight * 0.10 : 5)
|
|
}}>
|
|
<View style={{
|
|
flex: 0.05,
|
|
marginTop: screenHeight * 0.09,
|
|
paddingBottom: 10,
|
|
zIndex: 3,
|
|
justifyContent: "center"
|
|
}}>
|
|
<Text style={styles.menuLabel}>
|
|
Selecione os dados:
|
|
</Text>
|
|
</View>
|
|
<View
|
|
style={{ flex: 0.85, flexGrow: 0.85, marginTop: 2 }}>
|
|
<FlatList
|
|
data={layers.values}
|
|
keyExtractor={(datas) => datas.id.toString()}
|
|
renderItem={renderItem}
|
|
extraData={changed}
|
|
/>
|
|
</View>
|
|
<View style={styles.submit_btn}>
|
|
<TouchableOpacity onPress={() => applyLayers()}>
|
|
<View style={styles.button}>
|
|
<Text style={styles.textBtn}>Confirmar</Text>
|
|
</View>
|
|
</TouchableOpacity>
|
|
</View>
|
|
</View>
|
|
</View>
|
|
</View>
|
|
);
|
|
}
|
|
/*------------------------------------------------------------------------------------------------------------------------ */
|
|
|
|
return (
|
|
<View style={[styles.container]}>
|
|
{open && (<View style={{
|
|
width: screenWidth * 0.70,
|
|
}}>
|
|
<Animated.View>
|
|
{DataMenu()}
|
|
</Animated.View>
|
|
</View>)}
|
|
<View style={{ flex: 0.10, margin: 12, alignSelf: "flex-end" }}>
|
|
<TouchableWithoutFeedback onPress={toggleMenu}>
|
|
<Animated.View style={[styles.floatButton, styles.menu]}>
|
|
<MaterialCommunityIcons
|
|
name="layers-plus"
|
|
size={36}
|
|
color={colors.white}
|
|
/>
|
|
</Animated.View>
|
|
</TouchableWithoutFeedback>
|
|
</View>
|
|
</View>
|
|
);
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
container: {
|
|
alignItems: "center",
|
|
position: "absolute",
|
|
bottom: 0,
|
|
right: 0,
|
|
},
|
|
floatButton: {
|
|
width: 50,
|
|
height: 50,
|
|
borderRadius: 6,
|
|
alignItems: "center",
|
|
shadowColor: colors.primary,
|
|
shadowOpacity: 0.3,
|
|
shadowOffset: {
|
|
height: 10,
|
|
},
|
|
padding: 3,
|
|
},
|
|
menu: {
|
|
backgroundColor: colors.primary,
|
|
},
|
|
Menucontainer: {
|
|
flex: 1,
|
|
flexDirection: "row",
|
|
alignSelf: "flex-end",
|
|
backgroundColor: colors.white,
|
|
},
|
|
submit_btn: {
|
|
bottom: 0,
|
|
width: "100%",
|
|
padding: 20,
|
|
flex: 0.10
|
|
},
|
|
button: {
|
|
backgroundColor: "#1976D2",
|
|
borderRadius: 20,
|
|
justifyContent: "center",
|
|
alignItems: "center",
|
|
width: "100%",
|
|
height: 42,
|
|
textAlign: "center",
|
|
},
|
|
textBtn: {
|
|
color: colors.white,
|
|
fontSize: 16,
|
|
textTransform: "uppercase",
|
|
fontWeight: "bold",
|
|
},
|
|
text: {
|
|
color: colors.lightBlue,
|
|
fontSize: 14,
|
|
fontWeight: "bold",
|
|
},
|
|
item: {
|
|
color: colors.lightBlue,
|
|
fontSize: dimensions.text.tertiary,
|
|
fontWeight: "bold",
|
|
},
|
|
menuLabel: {
|
|
color: colors.lightBlue,
|
|
fontSize: 16,
|
|
fontWeight: "bold",
|
|
padding: 10,
|
|
backgroundColor: colors.white,
|
|
},
|
|
});
|
|
|
|
export default FloatButton;
|