forked from cemaden-educacao/WPD-MobileApp
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.
262 lines
7.3 KiB
262 lines
7.3 KiB
import { useState, useEffect, useReducer, useContext } from "react";
|
|
import assets from "../config/assets";
|
|
import PinIntransitavel from "../assets/floodZonesAssets/PinIntransitavel";
|
|
import PinTransitavel from "../assets/floodZonesAssets/PinTransitavel";
|
|
|
|
const custom_assets = {
|
|
pluviometer: assets.pluviometer,
|
|
officialPluviometer: assets.officialPluviometer,
|
|
floodZones: assets.floodZones,
|
|
riverLevel: ["low", "normal", "high", "flooding"].map((key) => {
|
|
return assets.riverLevel[key];
|
|
}),
|
|
rainLevel: ["rain_0_5", "rain_1_5", "rain_2_5", "rain_3_5"].map((key) => {
|
|
return assets.rainLevel[key];
|
|
}),
|
|
};
|
|
|
|
const custom_assets_pin = {
|
|
pluviometer: assets.pluviometer_pin,
|
|
officialPluviometer: assets.officialPluviometer_pin,
|
|
floodZones: {
|
|
passable: PinTransitavel,
|
|
not_passable: PinIntransitavel,
|
|
},
|
|
riverLevel: ["low_pin", "normal_pin", "high_pin", "flooding_pin"].map(
|
|
(key) => {
|
|
return assets.riverLevel[key];
|
|
}
|
|
),
|
|
rainLevel: [
|
|
"rain_0_5_pin",
|
|
"rain_1_5_pin",
|
|
"rain_2_5_pin",
|
|
"rain_3_5_pin",
|
|
].map((key) => {
|
|
return assets.rainLevel[key];
|
|
}),
|
|
};
|
|
|
|
const initialState = { markers: new Map() };
|
|
|
|
function getImage(name, situation) {
|
|
if (name == "automaticPluviometer") {
|
|
return custom_assets_pin.officialPluviometer;
|
|
}
|
|
|
|
if (name == "pluviometer") {
|
|
return custom_assets_pin.pluviometer;
|
|
}
|
|
|
|
if (name == "rain") {
|
|
if (situation == "SEM CHUVA") {
|
|
return custom_assets_pin.rainLevel[0];
|
|
} else if (situation == "CHUVA FRACA") {
|
|
return custom_assets_pin.rainLevel[1];
|
|
} else if (situation == "CHUVA MODERADA") {
|
|
return custom_assets_pin.rainLevel[2];
|
|
} else if (situation == "CHUVA FORTE") {
|
|
return custom_assets_pin.rainLevel[3];
|
|
}
|
|
return custom_assets_pin.rainLevel[3];
|
|
}
|
|
|
|
if (name == "riverFlood") {
|
|
if (situation == "BAIXO") {
|
|
return custom_assets_pin.riverLevel[0];
|
|
} else if (situation == "NORMAL") {
|
|
return custom_assets_pin.riverLevel[1];
|
|
} else if (situation == "ALTO") {
|
|
return custom_assets_pin.riverLevel[2];
|
|
} else if (situation == "INUNDAR") {
|
|
return custom_assets_pin.riverLevel[3];
|
|
}
|
|
return custom_assets_pin.riverLevel[0];
|
|
}
|
|
if (name == "floodZones") {
|
|
if (situation == "TRANSITAVEL") {
|
|
return custom_assets_pin.floodZones.passable;
|
|
} else {
|
|
return custom_assets_pin.floodZones.not_passable;
|
|
}
|
|
}
|
|
}
|
|
|
|
function getLogo(name, situation) {
|
|
if (name == "automaticPluviometer") {
|
|
return custom_assets.officialPluviometer;
|
|
}
|
|
|
|
if (name == "pluviometer") {
|
|
return custom_assets.pluviometer;
|
|
}
|
|
|
|
if (name == "rain") {
|
|
if (situation == "sem chuva") {
|
|
return custom_assets.rainLevel[0];
|
|
} else if (situation == "chuva fraca") {
|
|
return custom_assets.rainLevel[1];
|
|
} else if (situation == "chuva moderada") {
|
|
return custom_assets.rainLevel[2];
|
|
} else if (situation == "chuva forte") {
|
|
return custom_assets.rainLevel[3];
|
|
} else {
|
|
return custom_assets.rainLevel[3];
|
|
}
|
|
}
|
|
|
|
if (name == "riverFlood") {
|
|
if (situation == "baixo") {
|
|
return custom_assets.riverLevel[0];
|
|
} else if (situation == "normal") {
|
|
return custom_assets.riverLevel[1];
|
|
} else if (situation == "alto") {
|
|
return custom_assets.riverLevel[2];
|
|
} else if (situation == "inundar") {
|
|
return custom_assets.riverLevel[3];
|
|
}
|
|
return custom_assets.riverLevel[0];
|
|
}
|
|
if (name == "floodZones") {
|
|
return custom_assets.floodZones;
|
|
}
|
|
}
|
|
|
|
function buildPolygonsObject(response, name) {
|
|
var r = JSON.parse(response);
|
|
var coordinate = [];
|
|
var formsanswersgeom = r.formsanswersgeom;
|
|
if (JSON.parse(formsanswersgeom).type == "Polygon") {
|
|
const arrayCoordinates = JSON.parse(formsanswersgeom)["coordinates"][0];
|
|
var n = Object.keys(arrayCoordinates).length;
|
|
|
|
for (let i = 0; i < n; i++) {
|
|
var lat = arrayCoordinates[i][1];
|
|
var lon = arrayCoordinates[i][0];
|
|
coordinate.push([lat, lon]);
|
|
}
|
|
return {
|
|
ID: r.formsanswersid,
|
|
name: name,
|
|
title: "Titulo", //response.fieldsanswerssituation
|
|
address: "Endereço", //response.fieldsanswerseventaddress,
|
|
coordinate: coordinate,
|
|
date: "data" + " | " + "hora", //response.fieldsanswerseventdate + " | " + response.fieldsanswerseventtime,
|
|
description: "comentário", //response.fielsanswercomment,
|
|
logo: custom_assets.pluviometer,
|
|
pictures: null,
|
|
image: "", //getMarkerImage(answer.name),
|
|
};
|
|
} else {
|
|
return {
|
|
ID: r.formsanswersid,
|
|
name: name,
|
|
title: "Titulo", //response.fieldsanswerssituation
|
|
address: "Endereço", //response.fieldsanswerseventaddress,
|
|
coordinate: [null, null],
|
|
date: "data" + " | " + "hora", //response.fieldsanswerseventdate + " | " + response.fieldsanswerseventtime,
|
|
description: "comentário", //response.fielsanswercomment,
|
|
logo: custom_assets.pluviometer,
|
|
pictures: null,
|
|
image: "", //getMarkerImage(answer.name),
|
|
};;
|
|
}
|
|
}
|
|
|
|
function buildMarkerObject(response, name) {
|
|
const r = JSON.parse(response);
|
|
const resposta = r.formsanswersgeom;
|
|
const formsanswersgeom = JSON.parse(resposta).coordinates;
|
|
|
|
var situation = null;
|
|
var address = null;
|
|
var date = null;
|
|
var time = null;
|
|
var comments = null;
|
|
var pictures = null;
|
|
|
|
if (r.fias) {
|
|
r.fias.forEach(function (f) {
|
|
if (f.fieldname == "situation") {
|
|
situation = f.fieldsanswersvalue;
|
|
}
|
|
if (f.fieldname == "eventaddress") {
|
|
address = f.fieldsanswersvalue;
|
|
}
|
|
if (f.fieldname == "eventdate") {
|
|
date = f.fieldsanswersvalue;
|
|
}
|
|
if (f.fieldname == "eventtime") {
|
|
time = f.fieldsanswersvalue;
|
|
}
|
|
if (f.fieldname == "comments") {
|
|
comments = f.fieldsanswersvalue;
|
|
}
|
|
});
|
|
}
|
|
|
|
return {
|
|
ID: r.formsanswersid,
|
|
name: name,
|
|
title: situation,
|
|
address: address,
|
|
coordinate: {
|
|
latitude: formsanswersgeom[1],
|
|
longitude: formsanswersgeom[0],
|
|
},
|
|
date: date + " | " + time,
|
|
description: comments,
|
|
logo: getLogo(),
|
|
pictures: pictures,
|
|
image: getImage(name, situation),
|
|
};
|
|
}
|
|
|
|
function verifyResponse(response, name) {
|
|
var markers = [];
|
|
|
|
if (response) {
|
|
const answer = JSON.parse(response);
|
|
if (answer.success == true) {
|
|
const formAnswer = answer.responseData.array_to_json;
|
|
|
|
answer.responseData.array_to_json.forEach((r) =>
|
|
r.formcode == "FLOODZONES_OFFICIAL"
|
|
? markers.push(buildPolygonsObject(JSON.stringify(r), name))
|
|
: markers.push(buildMarkerObject(JSON.stringify(r), name))
|
|
);
|
|
}
|
|
}
|
|
return markers;
|
|
}
|
|
|
|
function getFormsAnswers(socketObject, dispatch) {
|
|
const [socketResponse, setSocketResponse] = useState();
|
|
|
|
socketObject.socketUrl.onerror = (e) => {
|
|
console.log(e.message);
|
|
};
|
|
|
|
socketObject.socketUrl.onmessage = ({ data }) => {
|
|
setSocketResponse(data);
|
|
};
|
|
|
|
useEffect(() => {
|
|
dispatch({ increment: verifyResponse(socketResponse, socketObject.name) });
|
|
}, [socketResponse]);
|
|
}
|
|
|
|
function reducer(state = initialState, action) {
|
|
action.increment.map((val) => {
|
|
state.markers.set(val.ID, val);
|
|
});
|
|
|
|
return { markers: state.markers };
|
|
}
|
|
|
|
export default function useSocketMarkers() {
|
|
const [state, dispatch] = useReducer(reducer, initialState);
|
|
global.formsSockets.forEach((socket) => getFormsAnswers(socket, dispatch));
|
|
|
|
return state;
|
|
}
|