import React from "react" import { StyleSheet, View, Image, ScrollView, Text, TextInput, KeyboardAvoidingView, Platform, TouchableOpacity, } from "react-native" import MapView, { Marker } from "react-native-maps" import { FormBinder } from "react-form-binder" import { Icon, Header, BoundInput, BoundButton, BoundOptionStrip, BoundHeader, PhotoPanel, } from "../ui" import { MessageModal } from "../Modal" import autobind from "autobind-decorator" import KeyboardSpacer from "react-native-keyboard-spacer" import { isIphoneX } from "react-native-iphone-x-helper" import { api } from "../API" import { formatLatLng, parseLatLng } from "../util" import "url-search-params-polyfill" const styles = StyleSheet.create({ container: { flexGrow: 1, backgroundColor: "#DDDDDD", }, panel: { width: "94%", backgroundColor: "white", alignSelf: "center", marginTop: "3%", shadowColor: "gray", shadowOffset: { width: 2, height: 2 }, shadowRadius: 2, shadowOpacity: 0.5, padding: 10, }, label: { fontSize: 14, marginBottom: 4, }, }) export class Activity extends React.Component { static bindings = { header: { noValue: true, isDisabled: (r) => !(r.anyModified && r.allValid), }, dateTime: { isValid: (r, v) => v !== "", isReadOnly: true, }, details: { isValid: (r, v) => v !== "", }, resolution: { isValid: (r, v) => v !== "", }, notes: { isValid: (r, v) => v !== "", }, status: { isValid: (r, v) => v !== "", alwaysGet: true, }, location: { isValid: (r, v) => v !== "", isReadOnly: true, }, } constructor(props) { super(props) this.state = { binder: new FormBinder({}, Activity.bindings), messageModal: null, } const { search } = this.props.location if (search) { const id = new URLSearchParams(search).get("id") if (id) { api .getActivity(id) .then((activity) => { if (activity) { const [lng, lat] = activity.location.coordinates activity.location = formatLatLng(lat, lng) this.setState({ binder: new FormBinder(activity, Activity.bindings), region: { latitude: lat, longitude: lng, latitudeDelta: 0.01, longitudeDelta: 0.01, }, }) } }) .catch((err) => { this.setState({ messageModal: { icon: "hand", message: "Unable to get activity details", detail: err.message, back: true, }, }) }) } } } @autobind handleMessageDismiss() { const back = this.state.messageModal.back this.setState({ messageModal: null }) if (back) { this.handleBackPress() } } @autobind handleBackPress() { const { history } = this.props if (history.length > 1) { history.goBack() } else { history.replace("/home") } } @autobind handleDonePress() { const { binder } = this.state let obj = binder.getModifiedFieldValues() if (!obj._id) { api .createActivity(obj) .then((activity) => { this.handleBackPress() }) .catch((error) => { this.setState({ messageModal: { icon: "hand", message: "Unable to create activity", detail: error.message, }, }) }) } else { api .updateActivity(obj) .then((activity) => { this.handleBackPress() }) .catch((error) => { this.setState({ messageModal: { icon: "hand", message: "Unable to update activity", detail: error.message, }, }) }) } } render() { const { binder, messageModal, region } = this.state return ( {isIphoneX ? : null} {Platform.OS === "ios" && } ) } }