10 次代码提交

作者 SHA1 备注 提交日期
  Michael Terrefortes 2dc595ded6 Merge remote-tracking branch 'Aco/master' into Sprint1 1年前
  Michael Terrefortes 0ed0f48bc8 fix 1年前
  Michael Terrefortes e4349965ff fix 1年前
  Michael Terrefortes 5f23dfa828 added municipalities field, fixed scroll form 1年前
  andrelfuentes 976cac4540 Pantalla de analisis añadida 1年前
  Jasiel Rivera e5842c80e8 connected front end with backend & reformated code 1年前
  Michael Terrefortes Rosado 85abb2fb55 icons tab 2 年前
  andrelfuentes 3c13f0112f pagina de analisis actualizada 2 年前
  Michael Terrefortes Rosado 3eca99d8e7 mas screens 2 年前
  Michael Terrefortes Rosado 47ebccf7d8 Aco app nav 2 年前

二进制
.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
文件差异内容过多而无法显示
查看文件