Michael Terrefortes преди 1 година
родител
ревизия
0ed0f48bc8
променени са 27 файла, в които са добавени 30058 реда и са изтрити 0 реда
  1. Двоични данни
      .DS_Store
  2. 8
    0
      App.js
  3. 72
    0
      Navigation.js
  4. 33
    0
      app.json
  5. Двоични данни
      assets/adaptive-icon.png
  6. Двоични данни
      assets/favicon.png
  7. Двоични данни
      assets/icon.png
  8. Двоични данни
      assets/splash.png
  9. 6
    0
      babel.config.js
  10. 22207
    0
      package-lock.json
  11. 30
    0
      package.json
  12. Двоични данни
      screens/.DS_Store
  13. 149
    0
      screens/Analisis.js
  14. 62
    0
      screens/Denuncias.js
  15. 127
    0
      screens/Derechos.js
  16. 180
    0
      screens/Drna.js
  17. 70
    0
      screens/Formulario.js
  18. 52
    0
      screens/Lista.js
  19. 32
    0
      screens/components/Button.js
  20. 26
    0
      screens/data/analisis.json
  21. 7
    0
      screens/data/derechos.json
  22. 17
    0
      screens/data/leyes.json
  23. 7
    0
      screens/data/leyesPR.json
  24. 14
    0
      screens/data/leyesViolaciones.json
  25. 9
    0
      screens/data/municipalities.json
  26. 18
    0
      screens/data/zipcode.json
  27. 6932
    0
      yarn.lock

Двоични данни
.DS_Store Целия файл


+ 8
- 0
App.js Целия файл

@@ -0,0 +1,8 @@
1
+import React from 'react';
2
+import Navigation from './Navigation';
3
+
4
+export default function App() {
5
+  return (
6
+    <Navigation />
7
+  );
8
+}

+ 72
- 0
Navigation.js Целия файл

@@ -0,0 +1,72 @@
1
+import React from "react";
2
+import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
3
+import { createNativeStackNavigator } from "@react-navigation/native-stack";
4
+import { NavigationContainer } from "@react-navigation/native";
5
+import { Entypo } from '@expo/vector-icons'; 
6
+import { Ionicons } from '@expo/vector-icons';
7
+
8
+// Import the screens to be used in the navigator
9
+import Denuncias from "./screens/Denuncias";
10
+import Derechos from "./screens/Derechos";
11
+import Analisis from "./screens/Analisis";
12
+import Formulario from "./screens/Formulario";
13
+import Lista from "./screens/Lista";
14
+import Drna from "./screens/Drna";
15
+import { TabBarIOSItem } from "react-native";
16
+
17
+const StackDenuncias = createNativeStackNavigator();
18
+
19
+function Stacks() {
20
+  return (
21
+    <StackDenuncias.Navigator initialRouteName="DenunciasIni">
22
+      <StackDenuncias.Screen name="Denuncias" component={Denuncias} />
23
+      <StackDenuncias.Screen name="Formulario" component={Formulario} />
24
+      <StackDenuncias.Screen name="Lista" component={Lista} />
25
+      <StackDenuncias.Screen name="Drna" component={Drna} />
26
+    </StackDenuncias.Navigator>
27
+  );
28
+}
29
+
30
+const Tab = createBottomTabNavigator();
31
+
32
+function Tabs() {
33
+  return (
34
+    <Tab.Navigator initialRouteName="DenunciasIni">
35
+      <Tab.Screen
36
+        name="Denuncias"
37
+        component={Stacks}
38
+        options={{
39
+                tabBarIcon: ({}) => (
40
+                    <Entypo name="megaphone" size={24} color="black" />
41
+                ),
42
+                 headerShown:false
43
+            }} 
44
+      />
45
+      <Tab.Screen 
46
+      name="Derechos" 
47
+      component={Derechos} 
48
+      options={{
49
+      tabBarIcon: ({}) => (
50
+                    <Ionicons name="ios-newspaper-outline" size={24} color="black" />
51
+                )
52
+            }}
53
+      />
54
+      <Tab.Screen 
55
+      name="Analisis" 
56
+      component={Analisis} 
57
+      options={{
58
+                tabBarIcon: ({}) => (
59
+                    <Ionicons name="earth" size={24} color="black" />
60
+                )
61
+            }}   />
62
+    </Tab.Navigator>
63
+  );
64
+}
65
+
66
+export default function Navigation() {
67
+  return (
68
+    <NavigationContainer>
69
+      <Tabs />
70
+    </NavigationContainer>
71
+  );
72
+}

+ 33
- 0
app.json Целия файл

@@ -0,0 +1,33 @@
1
+{
2
+  "expo": {
3
+    "name": "Aco",
4
+    "slug": "Aco",
5
+    "version": "1.0.0",
6
+    "orientation": "portrait",
7
+    "icon": "./assets/icon.png",
8
+    "userInterfaceStyle": "light",
9
+    "splash": {
10
+      "image": "./assets/splash.png",
11
+      "resizeMode": "contain",
12
+      "backgroundColor": "#ffffff"
13
+    },
14
+    "updates": {
15
+      "fallbackToCacheTimeout": 0
16
+    },
17
+    "assetBundlePatterns": [
18
+      "**/*"
19
+    ],
20
+    "ios": {
21
+      "supportsTablet": true
22
+    },
23
+    "android": {
24
+      "adaptiveIcon": {
25
+        "foregroundImage": "./assets/adaptive-icon.png",
26
+        "backgroundColor": "#FFFFFF"
27
+      }
28
+    },
29
+    "web": {
30
+      "favicon": "./assets/favicon.png"
31
+    }
32
+  }
33
+}

Двоични данни
assets/adaptive-icon.png Целия файл


Двоични данни
assets/favicon.png Целия файл


Двоични данни
assets/icon.png Целия файл


Двоични данни
assets/splash.png Целия файл


+ 6
- 0
babel.config.js Целия файл

@@ -0,0 +1,6 @@
1
+module.exports = function(api) {
2
+  api.cache(true);
3
+  return {
4
+    presets: ['babel-preset-expo'],
5
+  };
6
+};

+ 22207
- 0
package-lock.json
Файловите разлики са ограничени, защото са твърде много
Целия файл


+ 30
- 0
package.json Целия файл

@@ -0,0 +1,30 @@
1
+{
2
+  "name": "aco",
3
+  "version": "1.0.0",
4
+  "main": "node_modules/expo/AppEntry.js",
5
+  "scripts": {
6
+    "start": "expo start",
7
+    "android": "expo start --android",
8
+    "ios": "expo start --ios",
9
+    "web": "expo start --web"
10
+  },
11
+  "dependencies": {
12
+    "@react-navigation/bottom-tabs": "^6.4.0",
13
+    "@react-navigation/native": "^6.0.13",
14
+    "@react-navigation/native-stack": "^6.9.1",
15
+    "expo": "~47.0.3",
16
+    "expo-status-bar": "~1.4.2",
17
+    "react": "18.1.0",
18
+    "react-native": "0.70.5",
19
+    "react-native-custom-navigation-tabs": "^3.0.1",
20
+    "react-native-dropdown-select-list": "^2.0.2",
21
+    "react-native-gesture-handler": "~2.8.0",
22
+    "react-native-keyboard-aware-scroll-view": "^0.9.5",
23
+    "react-native-safe-area-context": "4.4.1",
24
+    "react-native-screens": "~3.18.0"
25
+  },
26
+  "devDependencies": {
27
+    "@babel/core": "^7.12.9"
28
+  },
29
+  "private": true
30
+}

Двоични данни
screens/.DS_Store Целия файл


+ 149
- 0
screens/Analisis.js Целия файл

@@ -0,0 +1,149 @@
1
+import React from "react";
2
+import {
3
+  View,
4
+  Text,
5
+  StyleSheet,
6
+  Linking
7
+} from "react-native";
8
+
9
+// TOOL DESCRIPTIONS
10
+const bodyEJScreen = "EJScreen es..... Presione para ir al enlace."
11
+const bodyCEJST = "CEJST es..... Presione para ir al enlace."
12
+const bodyEJAtlas = "EJAtlas es..... Presione para ir al enlace."
13
+const bodyIPCC = "El ''Intergovernmental Panel on Climate Change'' o IPCC es..... Presione para ir al enlace."
14
+
15
+const Analisis = () => {
16
+  return (
17
+  <View>
18
+
19
+    {/* TAB TITLE CODE*/}
20
+    {/* TAB TITLE */}
21
+    <Text style={styles.Tab}> 
22
+      Enlaces a Herramientas de Análisis Externas
23
+    </Text>
24
+  
25
+    {/* FIRST TOOL CODE*/}
26
+    {/* FIRST TOOL TITLE */}
27
+    <View style={styles.Number}>
28
+      <Text style={styles.Number}>
29
+        1)
30
+      </Text>
31
+      <Text style={styles.Title} 
32
+        onPress={ ()=> Linking.openURL('https://ejscreen.epa.gov/mapper/') }>
33
+        Enlace a EJScreen
34
+      </Text>
35
+    </View>
36
+    {/* FIRST TOOL BODY */}
37
+    <View style={styles.Bullet}>
38
+      <Text style={styles.Bullet}>
39
+        {'\u002D'}
40
+      </Text>
41
+      <Text style={styles.Body}>
42
+        {bodyEJScreen}
43
+      </Text>
44
+    </View>
45
+    
46
+    {/* SECOND TOOL CODE*/}
47
+    {/* SECOND TOOL TITLE */}
48
+    <View style={styles.Number}>
49
+      <Text style={styles.Number}>
50
+        2)</Text>
51
+      <Text style={styles.Title} 
52
+        onPress={ ()=> Linking.openURL('https://screeningtool.geoplatform.gov/en/#3/33.47/-97.5') }>
53
+        Enlace a CEJST
54
+      </Text>
55
+    </View>
56
+    {/* SECOND TOOL BODY */}
57
+    <View style={styles.Bullet}>
58
+      <Text style={styles.Bullet}>
59
+        {'\u002D'}
60
+      </Text>
61
+      <Text style={styles.Body}>
62
+        {bodyCEJST}
63
+      </Text>
64
+    </View>
65
+  
66
+    {/* THIRD TOOL CODE*/}
67
+    {/* THIRD TOOL TITLE */}
68
+    <View style={styles.Number}>
69
+      <Text style={styles.Number}>
70
+        3)
71
+      </Text>
72
+      <Text style={styles.Title} 
73
+        onPress={ ()=> Linking.openURL('https://ejatlas.org/') }>
74
+        Enlace a EJAtlas
75
+      </Text>
76
+    </View>
77
+    {/* THIRD TOOL BODY */}
78
+    <View style={styles.Bullet}>
79
+      <Text style={styles.Bullet}>
80
+        {'\u002D'}
81
+      </Text>
82
+      <Text style={styles.Body}>
83
+         {bodyEJAtlas}
84
+      </Text>
85
+    </View>
86
+  
87
+    {/* FOURTH TOOL CODE*/}
88
+    {/* FOURTH TOOL TITLE */}
89
+    <View style={styles.Number}>
90
+      <Text style={styles.Number}>
91
+        4)
92
+      </Text>
93
+      <Text style={styles.Title} 
94
+        onPress={ ()=> Linking.openURL('https://www.ipcc.ch/') }>
95
+        Enlace al IPCC
96
+      </Text>
97
+    </View>
98
+    {/* FOURTH TOOL BODY */}
99
+    <View style={styles.Bullet}>
100
+      <Text style={styles.Bullet}>
101
+        {'\u002D'}
102
+      </Text>
103
+      <Text style={styles.Body}>
104
+        {bodyIPCC}
105
+      </Text>
106
+    </View>
107
+          
108
+  </View>
109
+)}
110
+  
111
+const styles = StyleSheet.create({
112
+  Tab: { fontSize: 30,
113
+         textAlign: "center",
114
+         marginTop: "12%",
115
+         marginLeft: "1.4%",
116
+         marginRight: "1.4%"
117
+        },
118
+  
119
+  Number: { fontSize: 23,
120
+            textAlign: "left",
121
+            marginLeft: "2.5%",
122
+            marginTop: "5.5%",
123
+            flexDirection: 'row'
124
+          },
125
+  
126
+  Title: { fontSize: 23,
127
+           textAlign: "left",
128
+           marginTop: "5.5%", 
129
+           color: "#6495ed",
130
+           flex: 0,
131
+           paddingLeft: 6
132
+          },
133
+  
134
+  Body: { fontSize: 18,
135
+          textAlign: "left",
136
+          marginTop: "2%",
137
+          flex: 1, 
138
+          paddingLeft: 5
139
+        },
140
+  
141
+  Bullet: { fontSize: 18,
142
+            textAlign: "left",
143
+            marginLeft: "6%",
144
+            marginTop: "2%",
145
+            flexDirection: 'row'
146
+          }
147
+});
148
+
149
+export default Analisis;

+ 62
- 0
screens/Denuncias.js Целия файл

@@ -0,0 +1,62 @@
1
+import { useNavigation } from "@react-navigation/native";
2
+import { createNativeStackNavigator } from "@react-navigation/native-stack";
3
+import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
4
+import { NavigationContainer } from "@react-navigation/native";
5
+import React from "react";
6
+import { View, Text, StyleSheet, TouchableOpacity } from "react-native";
7
+
8
+const Denuncias = () => {
9
+  const currNav = useNavigation();
10
+
11
+  return (
12
+    <View>
13
+      <Text
14
+        style={{
15
+          fontSize: 30,
16
+          textAlign: "center",
17
+          marginTop: "20%",
18
+        }}
19
+      >
20
+        Llenar formulario y listado de denuncias
21
+      </Text>
22
+
23
+      <TouchableOpacity
24
+        style={styles.button}
25
+        onPress={() => currNav.navigate("Formulario")}
26
+      >
27
+        <Text style={styles.text}> Formularios </Text>
28
+      </TouchableOpacity>
29
+
30
+      <TouchableOpacity
31
+        style={styles.button}
32
+        onPress={() => currNav.navigate("Lista")}
33
+      >
34
+        <Text style={styles.text}>Listado</Text>
35
+      </TouchableOpacity>
36
+    </View>
37
+  );
38
+};
39
+
40
+export default Denuncias;
41
+
42
+const styles = StyleSheet.create({
43
+  button: {
44
+    width: 250,
45
+    alignSelf: "center",
46
+    alignItems: "center",
47
+    justifyContent: "center",
48
+    paddingVertical: 12,
49
+    paddingHorizontal: 32,
50
+    borderRadius: 4,
51
+    elevation: 3,
52
+    backgroundColor: "#009688",
53
+    marginTop: "5%",
54
+  },
55
+  text: {
56
+    fontSize: 16,
57
+    lineHeight: 21,
58
+    fontWeight: "bold",
59
+    letterSpacing: 0.25,
60
+    color: "white",
61
+  },
62
+});

+ 127
- 0
screens/Derechos.js Целия файл

@@ -0,0 +1,127 @@
1
+import React from "react";
2
+import {
3
+  View,
4
+  Text,
5
+  StyleSheet,
6
+  TouchableOpacity,
7
+  Linking,
8
+  Pressable,
9
+} from "react-native";
10
+import { FlatList, TouchableHighlight } from "react-native-gesture-handler";
11
+import { ButtonLay } from "./components/Button.js";
12
+import Leyes from "./data/leyes.json";
13
+import LeyesPR from "./data/leyesPR.json";
14
+import DerechosAmb from "./data/derechos.json";
15
+
16
+const Derechos = () => {
17
+  return (
18
+    <>
19
+      <View>
20
+        <Text style={styles.container2}>1) Leyes de la Tierra</Text>
21
+        <View >
22
+          {Leyes.map(({id, title, link}) => {
23
+            return (
24
+              <>
25
+                <TouchableOpacity
26
+                  style={styles.button}
27
+                  key={id}
28
+                  onPress={() => {
29
+                    Linking.openURL(link.toString());
30
+                  }}
31
+                >
32
+                  <Text style={styles.text}>{title}</Text>
33
+                </TouchableOpacity>
34
+              </>
35
+            );
36
+          })}
37
+        </View>
38
+      </View>
39
+
40
+      <View>
41
+        <Text style={styles.container2}>
42
+          2) Derechos del activista climatico
43
+        </Text>
44
+        <View>
45
+          {DerechosAmb.map(({id, title, link}) => {
46
+            return (
47
+              <>
48
+                <TouchableOpacity
49
+                 
50
+                  style={styles.button}
51
+                  onPress={() => {
52
+                    Linking.openURL(link.toString());
53
+                  }}
54
+                >
55
+                  <Text style={styles.text}  key={id} >{title}</Text>
56
+                </TouchableOpacity>
57
+              </>
58
+            );
59
+          })}
60
+        </View>
61
+      </View>
62
+
63
+       <View>
64
+        <Text style={styles.container2}>3) Leyes de Puerto Rico</Text>
65
+        <View>
66
+          {LeyesPR.map(({id, title, link}) => {
67
+            return (
68
+              <>
69
+                <TouchableOpacity
70
+                  style={styles.button}
71
+                  onPress={() => {
72
+                    Linking.openURL(link.toString());
73
+                  }}
74
+                >
75
+                  <Text style={styles.text} key={id}>{title}</Text>
76
+                </TouchableOpacity>
77
+              </>
78
+            );
79
+          })}
80
+        </View>
81
+      </View>
82
+    </>
83
+  );
84
+};
85
+
86
+const styles = StyleSheet.create({
87
+  container: {
88
+    fontSize: 25,
89
+    textAlign: "center",
90
+    marginTop: "10%",
91
+  },
92
+
93
+  container2: {
94
+    fontSize: 25,
95
+    textAlign: "left",
96
+    marginTop: "10%",
97
+    marginLeft: "5%",
98
+  },
99
+
100
+  laws: {
101
+    fontSize: 15,
102
+    textAlign: "center",
103
+    marginTop: "5%",
104
+  },
105
+  button: {
106
+    width: 250,
107
+    alignSelf: "center",
108
+    alignItems: "center",
109
+    justifyContent: "center",
110
+    paddingVertical: 12,
111
+    paddingHorizontal: 32,
112
+    borderRadius: 4,
113
+    elevation: 3,
114
+    backgroundColor: "#009688",
115
+    marginTop: "5%",
116
+  },
117
+  text: {
118
+    fontSize: 16,
119
+    lineHeight: 21,
120
+    fontWeight: "bold",
121
+    letterSpacing: 0.25,
122
+    color: "white",
123
+    textAlign: "center",
124
+  },
125
+});
126
+
127
+export default Derechos;

+ 180
- 0
screens/Drna.js Целия файл

@@ -0,0 +1,180 @@
1
+import React from "react";
2
+import {
3
+  View,
4
+  Text,
5
+  StyleSheet,
6
+  TouchableOpacity,
7
+  TextInput,
8
+  KeyboardAvoidingView
9
+} from "react-native";
10
+import { SelectList } from "react-native-dropdown-select-list";
11
+import {KeyboardAwareScrollView} from 'react-native-keyboard-aware-scroll-view';
12
+import leyesViolaciones from "./data/leyesViolaciones.json"
13
+import Municipalities from "./data/municipalities.json";
14
+
15
+
16
+const postData = (URL, data) => {
17
+  fetch(URL, {
18
+    method: "POST",
19
+    headers: {
20
+      Accept: "application/json",
21
+      "Content-Type": "application/json",
22
+    },
23
+    body: JSON.stringify(data),
24
+  })
25
+    .then((response) => response.json())
26
+    .then((responseJson) => {
27
+      console.log(responseJson);
28
+    })
29
+    .catch((error) => {
30
+      console.error(error);
31
+    });
32
+};
33
+
34
+const Drna = () => {
35
+  const URL = "http://172.20.10.2:5001/complaints/add";
36
+  const [name, onChangeName] = React.useState(null);
37
+  const [email, onChangeEmail] = React.useState(null);
38
+  const [place, onChangePlace] = React.useState(null);
39
+  const [selected, setSelected] = React.useState("");
40
+  const [description, onChangeDescription] = React.useState(null);
41
+  const [location, onChangeLocation] = React.useState(null);
42
+  const [municipality, setMunicipality] = React.useState(null);
43
+
44
+  return (
45
+    <KeyboardAwareScrollView>
46
+      <View>
47
+        <Text
48
+          style={{
49
+            fontSize: 30,
50
+            textAlign: "center",
51
+            marginTop: "20%",
52
+          }}
53
+        >
54
+          Formulario DRNA
55
+        </Text>
56
+
57
+        <TextInput
58
+          style={styles.input}
59
+          value={name}
60
+          onChangeText={onChangeName}
61
+          placeholder="Nombre"
62
+          placeholderTextColor={"grey"}
63
+        />
64
+        <TextInput
65
+          style={styles.input}
66
+          value={email}
67
+          onChangeText={onChangeEmail}
68
+          placeholder="Email"
69
+          placeholderTextColor={"grey"}
70
+        />
71
+        {/* <TextInput
72
+              style={styles.input}
73
+              value={text}
74
+              placeholder="Fecha"
75
+              placeholderTextColor={"grey"}
76
+          /> */}
77
+        <SelectList
78
+          boxStyles={styles.input}
79
+          dropdownStyles={styles.input2}
80
+          data={
81
+            leyesViolaciones.map((der) => { 
82
+              return(
83
+                der.value
84
+                )
85
+                })
86
+            }
87
+          setSelected={setSelected}
88
+          placeholder="Leyes en violacion"
89
+        />
90
+        <SelectList
91
+          boxStyles={styles.input}
92
+          dropdownStyles={styles.input2}
93
+          data={
94
+            Municipalities.map((der) => { 
95
+              return(
96
+                der
97
+                )
98
+                })
99
+            }
100
+          setSelected={setMunicipality}
101
+          placeholder="Municipio donde ocurrio"
102
+        />
103
+        <TextInput
104
+          style={styles.input}
105
+          value={location}
106
+          onChangeText={onChangeLocation}
107
+          placeholder="Coordenadas de lo ocurrido"
108
+          placeholderTextColor={"grey"}
109
+        />
110
+        <TextInput
111
+          style={styles.input}
112
+          value={place}
113
+          onChangeText={onChangePlace}
114
+          placeholder="Lugar de los hechos"
115
+          placeholderTextColor={"grey"}
116
+        />
117
+        <TextInput
118
+          style={styles.input2}
119
+          value={description}
120
+          placeholder="Descripcion de los hechos"
121
+          onChangeText={onChangeDescription}
122
+          placeholderTextColor={"grey"}
123
+        />
124
+        <TouchableOpacity
125
+          style={styles.button}
126
+          onPress={() =>
127
+            postData(URL, {
128
+              name: name,
129
+              email: email,
130
+              place: place,
131
+              complaint_status: "pending",
132
+              complaint_type: selected.valueOf(),
133
+              complaint_description: description,
134
+            })
135
+          }
136
+        >
137
+          <Text style={styles.text}>Someter</Text>
138
+        </TouchableOpacity>
139
+      </View>
140
+    </KeyboardAwareScrollView>
141
+  );
142
+};
143
+
144
+export default Drna;
145
+
146
+const styles = StyleSheet.create({
147
+  input: {
148
+    height: 40,
149
+    margin: 12,
150
+    borderWidth: 0.5,
151
+    padding: 10,
152
+    borderRadius: 10,
153
+  },
154
+  input2: {
155
+    height: 100,
156
+    margin: 12,
157
+    borderWidth: 0.5,
158
+    padding: 15,
159
+    borderRadius: 10,
160
+  },
161
+  button: {
162
+    width: 250,
163
+    alignSelf: "center",
164
+    alignItems: "center",
165
+    justifyContent: "center",
166
+    paddingVertical: 12,
167
+    paddingHorizontal: 32,
168
+    borderRadius: 4,
169
+    elevation: 3,
170
+    backgroundColor: "#009688",
171
+    marginTop: "5%",
172
+  },
173
+  text: {
174
+    fontSize: 16,
175
+    lineHeight: 21,
176
+    fontWeight: "bold",
177
+    letterSpacing: 0.25,
178
+    color: "white",
179
+  },
180
+});

+ 70
- 0
screens/Formulario.js Целия файл

@@ -0,0 +1,70 @@
1
+import { createNativeStackNavigator } from "@react-navigation/native-stack";
2
+import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
3
+import { NavigationContainer } from "@react-navigation/native";
4
+import { useNavigation } from "@react-navigation/native";
5
+import React from "react";
6
+import {
7
+  View,
8
+  Text,
9
+  StyleSheet,
10
+  TouchableOpacity,
11
+  Linking,
12
+} from "react-native";
13
+
14
+const Formulario = () => {
15
+  const currNav = useNavigation();
16
+  return (
17
+    <View>
18
+      <Text
19
+        style={{
20
+          fontSize: 30,
21
+          textAlign: "center",
22
+          marginTop: "20%",
23
+        }}
24
+      >
25
+        Llenar formulario EPA y DRNA
26
+      </Text>
27
+
28
+      <TouchableOpacity
29
+        style={styles.button}
30
+        onPress={() => currNav.navigate("Drna")}
31
+      >
32
+        <Text style={styles.text}>Formulario DRNA</Text>
33
+      </TouchableOpacity>
34
+      <TouchableOpacity
35
+        style={styles.button}
36
+        onPress={() => {
37
+          Linking.openURL(
38
+            "https://echo.epa.gov/denuncie-violaciones-ambientales"
39
+          );
40
+        }}
41
+      >
42
+        <Text style={styles.text}>Formulario EPA</Text>
43
+      </TouchableOpacity>
44
+    </View>
45
+  );
46
+};
47
+
48
+export default Formulario;
49
+
50
+const styles = StyleSheet.create({
51
+  button: {
52
+    width: 250,
53
+    alignSelf: "center",
54
+    alignItems: "center",
55
+    justifyContent: "center",
56
+    paddingVertical: 12,
57
+    paddingHorizontal: 32,
58
+    borderRadius: 4,
59
+    elevation: 3,
60
+    backgroundColor: "#009688",
61
+    marginTop: "5%",
62
+  },
63
+  text: {
64
+    fontSize: 16,
65
+    lineHeight: 21,
66
+    fontWeight: "bold",
67
+    letterSpacing: 0.25,
68
+    color: "white",
69
+  },
70
+});

+ 52
- 0
screens/Lista.js Целия файл

@@ -0,0 +1,52 @@
1
+import React, { useEffect, useState } from "react";
2
+import {
3
+  ActivityIndicator,
4
+  FlatList,
5
+  View,
6
+  Text,
7
+  StyleSheet,
8
+  TouchableOpacity,
9
+} from "react-native";
10
+
11
+const Lista = () => {
12
+  const [isLoading, setLoading] = useState(true);
13
+  const [data, setData] = useState([]);
14
+
15
+  const getComplaints = async () => {
16
+    try {
17
+      const response = await fetch("http://172.20.10.2:5001/complaints/all");
18
+      const json = await response.json();
19
+      setData(json.Complaints);
20
+    } catch (error) {
21
+      console.error(error);
22
+    } finally {
23
+      setLoading(false);
24
+    }
25
+  };
26
+
27
+  useEffect(() => {
28
+    getComplaints();
29
+  }, []);
30
+
31
+  return (
32
+    <View style={{ flex: 1, padding: 24 }}>
33
+      {isLoading ? (
34
+        <ActivityIndicator />
35
+      ) : (
36
+        <FlatList
37
+          data={data}
38
+          keyExtractor={({ id }, index) => id}
39
+          renderItem={({ item }) => (
40
+            <Text style={{ padding: 8 }}>
41
+              ID:{item.id}, Tipo de denuncia: {item.complaint_type}, Hecha por:{" "}
42
+              {item.name}, en el lugar: {item.place}, descripcion del problema:{" "}
43
+              {item.complaint_description}, estatus:{"En espera"}
44
+            </Text>
45
+          )}
46
+        />
47
+      )}
48
+    </View>
49
+  );
50
+};
51
+
52
+export default Lista;

+ 32
- 0
screens/components/Button.js Целия файл

@@ -0,0 +1,32 @@
1
+import React from "react";
2
+import {
3
+  View,
4
+  Text,
5
+  StyleSheet,
6
+  TouchableOpacity,
7
+  Linking,
8
+  Button,
9
+  Pressable,
10
+} from "react-native";
11
+
12
+const ButtonLay = StyleSheet.create({
13
+  button: {
14
+    width: 250,
15
+    alignSelf: "center",
16
+    alignItems: "center",
17
+    justifyContent: "center",
18
+    paddingVertical: 12,
19
+    paddingHorizontal: 32,
20
+    borderRadius: 4,
21
+    elevation: 3,
22
+    backgroundColor: "#009688",
23
+    marginTop: "5%",
24
+  },
25
+  text: {
26
+    fontSize: 16,
27
+    lineHeight: 21,
28
+    fontWeight: "bold",
29
+    letterSpacing: 0.25,
30
+    color: "white",
31
+  },
32
+});

+ 26
- 0
screens/data/analisis.json Целия файл

@@ -0,0 +1,26 @@
1
+[
2
+    {
3
+        "id": 1,
4
+        "title": "EJScreen",
5
+        "link": "https://ejscreen.epa.gov/mapper/",
6
+        "description": "EJScreen es..... Presione para ir al enlace."
7
+    },
8
+    {
9
+        "id": 2,
10
+        "title": "CEJST",
11
+        "link": "https://screeningtool.geoplatform.gov/en/#3/33.47/-97.5",
12
+        "description": "CEJST es..... Presione para ir al enlace."
13
+    },
14
+    {
15
+        "id": 3,
16
+        "title": "EJAtlas",
17
+        "link": "https://ejatlas.org/",
18
+        "description": "EJAtlas es..... Presione para ir al enlace."
19
+    },
20
+    {
21
+        "id": 4,
22
+        "title": "Intergovernmental Panel on Climate Change",
23
+        "link": "https://www.ipcc.ch/",
24
+        "description": "El Intergovernmental Panel on Climate Change (IPCC) es..... Presione para ir al enlace."
25
+    }
26
+]

+ 7
- 0
screens/data/derechos.json Целия файл

@@ -0,0 +1,7 @@
1
+[
2
+    {
3
+        "id": 1,
4
+        "title": "Declaración Universal de los Derechos de la Madre Tierra",
5
+        "link": "http://rio20.net/propuestas/declaracion-universal-de-los-derechos-de-la-madre-tierra/"
6
+    }
7
+]

+ 17
- 0
screens/data/leyes.json Целия файл

@@ -0,0 +1,17 @@
1
+[
2
+    {
3
+        "id": 2,
4
+        "title": "Ley de Tierras de Puerto Rico",
5
+        "link": "https://bvirtualogp.pr.gov/ogp/BVirtual/LeyesOrganicas/pdf/26-1941.pdf"
6
+    },
7
+    {
8
+        "id": 3,
9
+        "title": "Ley Sobre Politica Publica Ambiental",
10
+        "link": "https://www.drna.pr.gov/wp-content/uploads/2019/12/Ley-416-2004-refrencias-LPRA-2018.pdf"
11
+    },
12
+    {
13
+        "id":4,
14
+        "title":"La Carta de la Tierra",
15
+        "link":"https://cartadelatierra.org/lea-la-carta-de-la-tierra/preambulo/"
16
+    }
17
+]

+ 7
- 0
screens/data/leyesPR.json Целия файл

@@ -0,0 +1,7 @@
1
+[
2
+    {
3
+        "id": 1,
4
+        "title": "Constitucion", 
5
+        "link": "https://www2.pr.gov/sobrepuertorico/documents/elaconstitucion.pdf"
6
+    }
7
+]

+ 14
- 0
screens/data/leyesViolaciones.json Целия файл

@@ -0,0 +1,14 @@
1
+[
2
+    { "key": 1, "value": "Descarga de águas contaminadas" },
3
+    { "key": 2, "value": "Olores objetables-fuertes" },
4
+    { "key": 3, "value": "Tala y/o poda de árboles" },
5
+    { "key": 4, "value": "Rellenando un bosque" },
6
+    { "key": 5, "value": "Rellenando una quebrada" },
7
+    { "key": 6, "value": "Realizando perforaciones en el suelo" },
8
+    { "key": 7, "value": "Moviendo con maquinaria tierra de un lugar a otro" },
9
+    { "key": 8, "value": "Peces y/o otros organismos muertos" },
10
+    { "key": 9, "value": "Tapando la vegetación" },
11
+    { "key": 10, "value": "Destrucción de humedal" },
12
+    { "key": 11, "value": "Construcción sospechosa" },
13
+    { "key": 12, "value": "Otros (vertederos clandestinos, entre otros)" }
14
+  ]

+ 9
- 0
screens/data/municipalities.json Целия файл

@@ -0,0 +1,9 @@
1
+["Adjuntas","Aguada","Aguadilla","Aguas Buenas","Aibonito","Arecibo","Arroyo","Añasco",
2
+"Barceloneta","Barranquitas","Bayamón","Cabo Rojo","Caguas","Camuy","Canóvanas","Carolina",
3
+"Cataño","Cayey","Ceiba","Ciales","Cidra","Coamo","Comerío","Corozal","Culebra","Dorado",
4
+"Fajardo","Florida","Guayama","Guayanilla","Guaynabo","Gurabo","Guánica","Hatillo","Hormigueros",
5
+"Humacao","Isabela","Jayuya","Juana Díaz","Juncos","Lajas","Lares","Las Marías","Las Piedras",
6
+"Loiza","Luquillo","Manatí","Maricao","Maunabo","Mayagüez","Moca","Morovis","Naguabo","Naranjito",
7
+"Orocovis","Patillas","Peñuelas","Ponce","Quebradillas","Rincón","Rio Grande","Sabana Grande"
8
+,"Salinas","San Germán","San Juan","San Lorenzo","San Sebastián","Santa Isabel","Toa Alta",
9
+"Toa Baja","Trujillo Alto","Utuado","Vega Alta","Vega Baja","Vieques","Villalba","Yabucoa","Yauco"]

+ 18
- 0
screens/data/zipcode.json Целия файл

@@ -0,0 +1,18 @@
1
+["00601","00602","00603","00604","00605","00606","00610","00611","00611",
2
+"00612","00613","00614","00616","00617","00622","00623","00624","00627","00631",
3
+"00631","00636","00637","00638","00641","00646","00647","00650","00652","00653",
4
+"00656","00659","00660","00662","00664","00667","00669","00670","00674","00676",
5
+"00677","00678","00680","00681","00682","00683","00685","00687","00688","00690",
6
+"00692","00693","00694","00698","00703","00704","00705","00707","00714","00715",
7
+"00716","00717","00718","00719","00720","00721","00721","00723","00725","00726",
8
+"00727","00728","00729","00730","00731","00732","00733","00734","00735","00736",
9
+"00737","00738","00739","00740","00741","00742","00744","00745","00745","00751",
10
+"00754","00757","00765","00766","00767","00769","00771","00772","00773","00775",
11
+"00777","00778","00780","00782","00783","00784","00785","00786","00791","00792",
12
+"00794","00795","00901","00902","00906","00907","00908","00909","00910","00911",
13
+"00912","00913","00914","00915","00916","00917","00919","00920","00921","00923",
14
+"00924","00925","00926","00927","00928","00929","00930","00931","00933","00934",
15
+"00936","00940","00949","00950","00951","00952","00953","00954","00956","00957",
16
+"00958","00959","00960","00961","00962","00963","00965","00966","00968","00969",
17
+"00970","00971","00976","00977","00978","00979","00981","00982","00983","00984",
18
+"00985","00986","00987","00988"]

+ 6932
- 0
yarn.lock
Файловите разлики са ограничени, защото са твърде много
Целия файл