RyanHub - file viewer
filename: app/src/screens/TestScreen.tsx
branch: main
back to repo
import React, { useState } from 'react';
import { View, Text, StyleSheet, TouchableOpacity } from 'react-native';

import { Tree, addTree } from '../utils/data';
import { useTreeData } from '../contexts/TreeDataContext';
import { useTheme } from '../contexts/ThemeContext';

import MapView, { Marker, PROVIDER_GOOGLE } from 'react-native-maps';
import { DetailModal } from '../components/DetailModal';
import { CreateModal } from '../components/CreateModal';


export function TestScreen() {
  const { trees, loading, error, refreshTrees } = useTreeData();
  const { colors } = useTheme();
  const [selectedTree, setSelectedTree] = useState<Tree | null>(null);
  const [showCreateModal, setShowCreateModal] = useState(false);
  const handleMarkerPress = (tree: Tree) => { setSelectedTree(tree); };

  const handleCreate = async (newTree: Omit<Tree, 'id'>) => {
    try {
      await addTree(newTree);
      refreshTrees();
      setShowCreateModal(false);
    } catch (error) {
      console.error('Error creating tree:', error);
    }
  };

  if(loading) {
    return (
      <View>
        <Text>loading...</Text>
      </View>
    );
  }
  if(error) {
    return (
      <View>
        <Text>error...</Text>
      </View>
    );
  }
  const validTrees = trees.filter(tree => typeof tree.y === 'number' && typeof tree.x === 'number' && !isNaN(tree.y) && !isNaN(tree.x));  if (validTrees.length === 0) {
    return (
      <View>
        <Text>No trees!</Text>
      </View>
    );
  }
  const region = {
    latitude: 40.7596,
    longitude: -74.1811,
    latitudeDelta: .025,
    longitudeDelta: .025,
  };

  const styles = StyleSheet.create({
    footer: {
      position: 'absolute',
      alignSelf: 'center',
      width: '90%',
      bottom: -5,
      borderRadius: 10,
      backgroundColor: colors.surface,
      opacity: 0.95,
      padding: 20,
      paddingBottom: 30,
      flexDirection: 'row',
      justifyContent: 'space-between',
      alignItems: 'center',
    },
    treeCount: {
      fontSize: 16,
      fontWeight: '600',
      color: colors.text,
    },
    footerBtn: {
      paddingHorizontal: 15,
      paddingVertical: 8,
      borderRadius: 5,
    },
    footerBtnText: {
      color: colors.text,
      fontWeight: '600',
    },
  });

  return (
    <View style={{ flex: 1 }}>
      <MapView
        style={StyleSheet.absoluteFill}
        provider={PROVIDER_GOOGLE}
        initialRegion={region}
        showsUserLocation >
        {validTrees.map((marker, index) => (
          <Marker
            key={index}
            coordinate={{ latitude: marker.y, longitude: marker.x }}
            onPress={() => handleMarkerPress(marker)}
          />
        ))}
      </MapView>
      <View style={styles.footer}>
        <Text style={styles.treeCount}>Trees: {validTrees.length}</Text>
        <TouchableOpacity style={styles.footerBtn} onPress={() => setShowCreateModal(true)}>
          <Text style={styles.footerBtnText}>Create New</Text>
        </TouchableOpacity>
        <TouchableOpacity style={styles.footerBtn} onPress={refreshTrees}>
          <Text style={styles.footerBtnText}>Refresh</Text>
        </TouchableOpacity>
      </View>
      <DetailModal 
        tree={selectedTree}
        onClose={() => setSelectedTree(null)}
        onUpdate={(updatedTree) => setSelectedTree(updatedTree)}
      />
      <CreateModal
        visible={showCreateModal}
        onClose={() => setShowCreateModal(false)}
        onSave={handleCreate}
      />
    </View>
  );
}