import React, {useEffect, useState} from 'react'; import {Image, SafeAreaView, ScrollView, StatusBar, StyleSheet, Switch, View} from 'react-native'; import {ThemedText} from '@/components/ThemedText'; import {ThemedView} from '@/components/ThemedView'; import {Colors} from '@/constants/Colors'; import {useColorScheme} from '@/hooks/useColorScheme'; import MapView from '@/components/map/map'; import List from '@/components/List'; import {Request} from '@/services/request'; export default function MapScreen() { const colorScheme = useColorScheme() ?? 'light'; const [types, setTypes] = useState([]); const [markers, setMarkers] = useState([]); // Load markers and types useEffect(() => { Request.get('locations').then((response) => { const {locations, types} = response; // Set types const typesList: any[] = []; types.forEach((type: any) => { typesList.push({ name: type.name, image: type.image, isEnabled: false, type: type.config_name, }); }) setTypes(typesList); // Set markers setMarkers(locations); }) }, []); // Enable/disable type const toggleSwitch = (index: any) => { const newData = types.map((item: any, key: any) => key === index ? {...item, isEnabled: !item.isEnabled} : item ); setTypes(newData); }; // Get all types that are active const getActiveTypes = (): Array => { const list: any[] = []; types.forEach((type: any) => { if (type.isEnabled) { list.push(type.type); } }); return list; } // Get all markers that needs to be visible const activeMarkers = () => { return markers.filter((marker: any) => { return getActiveTypes().includes(marker.waste_type); }); } return ( Afvalcontainers in de buurt {activeMarkers().map((marker: any, index: any) => ( ))} ( {item.name} toggleSwitch(index)} /> )}/> ); } const styles = StyleSheet.create({ container: { marginTop: StatusBar.currentHeight, paddingTop: 25, }, titleContainer: { paddingLeft: 25, paddingRight: 25, flexDirection: 'row', alignItems: 'center', gap: 8, paddingBottom: 8, }, mapContainer: { marginTop: 15, }, map: { width: '100%', height: 500, }, listContainer: { marginTop: 10, paddingLeft: 25, paddingRight: 25, }, listItem: { flex: 1, display: 'flex', justifyContent: 'space-between', flexDirection: 'row', alignItems: 'center', paddingBottom: 10, marginBottom: 10, borderBottomWidth: 1, borderBottomColor: '#f2f2f2', }, listItemTitle: { flex: 1, flexDirection: 'row', alignItems: 'center', }, listImage: { width: 30, height: 30, borderRadius: 5, marginRight: 8, } });