From 23549a88eef384c289c08d45f3ff41d63b6d0880 Mon Sep 17 00:00:00 2001 From: Ananta Pandey Date: Wed, 22 Aug 2018 10:55:13 -0400 Subject: [PATCH 1/9] Add form UI (#31) --- .DS_Store | Bin 6148 -> 6148 bytes expo_project/.DS_Store | Bin 0 -> 6148 bytes .../assets/fonts/SpaceMono-Regular.ttf | Bin 93252 -> 0 bytes expo_project/assets/fonts/monaco.ttf | Bin 0 -> 59872 bytes expo_project/components/ColoredButton.js | 35 + expo_project/components/MapWithMarkers.js | 82 + expo_project/components/MarkerCarousel.js | 132 + expo_project/components/PersonIcon.js | 56 + expo_project/components/Selectable.js | 100 + expo_project/components/StyledText.js | 8 - expo_project/components/Survey.js | 46 + expo_project/components/TabBarIcon.js | 17 - expo_project/config/questions.js | 113 + expo_project/constants/Colors.js | 42 +- expo_project/navigation/AppNavigator.js | 17 +- expo_project/package.json | 3 + expo_project/screens/HomeScreen.js | 323 +- expo_project/screens/SurveyScreen.js | 311 - expo_project/yarn.lock | 7169 +++++++++++++++++ 19 files changed, 8060 insertions(+), 394 deletions(-) create mode 100644 expo_project/.DS_Store delete mode 100755 expo_project/assets/fonts/SpaceMono-Regular.ttf create mode 100644 expo_project/assets/fonts/monaco.ttf create mode 100644 expo_project/components/ColoredButton.js create mode 100644 expo_project/components/MapWithMarkers.js create mode 100644 expo_project/components/MarkerCarousel.js create mode 100644 expo_project/components/PersonIcon.js create mode 100644 expo_project/components/Selectable.js delete mode 100644 expo_project/components/StyledText.js create mode 100644 expo_project/components/Survey.js delete mode 100644 expo_project/components/TabBarIcon.js create mode 100644 expo_project/config/questions.js delete mode 100644 expo_project/screens/SurveyScreen.js create mode 100644 expo_project/yarn.lock diff --git a/.DS_Store b/.DS_Store index 67fe30e4a73088c15af3b77bb377519791b1e8d0..90eb62ac3b04c4d875a8610882cd9db11f042362 100644 GIT binary patch delta 77 zcmZoMXfc=|#>B`mu~2NHo+2aj!~pAw9~yvkPbfDJLn=cBLjglRL;S>9vKyb&v2AAO e;O79U-uUo4^JIPzLk>m;28IS8-s~Z=hZz7^A{6QX delta 65 zcmZoMXfc=|#>CJ*u~2NHo+2aD!~pBb1|lqz`5A*YcQV$oOPWc;f z-LIMU1Nb|0f4o#unABD00#?Up^k<;-1F7E(l2AD@4!_Cg~`MMS$(U zgHar%ve9^C8=IA_?H#9Db*j707jGaYp7dpww*2vpszqThF!7ZT@jUi}>!>&B)b>A! zMEX(E8!x1P{uCvln6yNegsB?mqb~=@RS)Xa4yV)O=2@M;J$^T<^Xb{?d7Ym$&Sx{n zIe622e|bB+`#$|K`+2VwXS5iyJq>gJfKg$Qalh$x#c(vwc-B7@?RJ>SF2LijqdzLE zz#oe6pZ%jjY5YCNP-2M^ONj9`guqd7fpLhn@sb&>U@V#AN=9kcD;P`Gu^^cZ*Ixm% zC7jpmKUF(JtAJJDg%zOh1II$>8q77SPX{`61wgD|voeh7E>mLogLPJc7ggX18CsVr literal 0 HcmV?d00001 diff --git a/expo_project/assets/fonts/SpaceMono-Regular.ttf b/expo_project/assets/fonts/SpaceMono-Regular.ttf deleted file mode 100755 index 28d7ff717769d29e5d1f036bfa91eea660ce8a24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93252 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%0Ay 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 F?tgRoufhNT literal 0 HcmV?d00001 diff --git a/expo_project/components/ColoredButton.js b/expo_project/components/ColoredButton.js new file mode 100644 index 0000000..ee46401 --- /dev/null +++ b/expo_project/components/ColoredButton.js @@ -0,0 +1,35 @@ +import PropTypes from "prop-types"; +import React from "react"; + +import { StyleSheet, Text, TouchableOpacity } from "react-native"; + +class ColoredButton extends React.Component { + render() { + const { backgroundColor, color, onPress, label } = this.props; + return ( + + {label} + + ); + } +} + +const styles = StyleSheet.create({ + button: { + backgroundColor: "#5B93D9", + padding: 12, + marginVertical: 20, + justifyContent: "center", + alignItems: "center" + }, + text: { fontWeight: "bold" } +}); + +ColoredButton.propTypes = { + color: PropTypes.string.isRequired +}; + +export default ColoredButton; diff --git a/expo_project/components/MapWithMarkers.js b/expo_project/components/MapWithMarkers.js new file mode 100644 index 0000000..88382e2 --- /dev/null +++ b/expo_project/components/MapWithMarkers.js @@ -0,0 +1,82 @@ +import PropTypes from "prop-types"; +import React from "react"; +import { StyleSheet } from "react-native"; +import { MapView } from "expo"; +import PersonIcon from "./PersonIcon"; + +class MapWithMarkers extends React.Component { + constructor(props) { + super(props); + } + + render() { + const { + markers, + activeMarkerId, + onMarkerDragEnd, + onMarkerPress, + onMapPress, + onMapLongPress + } = this.props; + return ( + + {markers.map(marker => { + const selected = marker.id === activeMarkerId; + // Update the key when selected or delected, so the marker re renders and centers itself based on the new child size + const key = marker.id + (selected ? "-selected" : ""); + return ( + onMarkerPress(marker.id)} + anchor={{ x: 0, y: 0 }} + calloutAnchor={{ x: 0, y: 0 }} + > + + + ); + })} + + ); + } +} + +const styles = StyleSheet.create({ + mapStyle: { flex: 1 } +}); + +MapWithMarkers.propTypes = { + markers: PropTypes.arrayOf( + PropTypes.shape({ + coordinate: PropTypes.any, + color: PropTypes.string, + title: PropTypes.string, + dateLabel: PropTypes.string, + id: PropTypes.string + }) + ).isRequired, + activeMarkerId: PropTypes.string, + onMarkerDragEnd: PropTypes.func.isRequired, + onMarkerPress: PropTypes.func.isRequired, + onMapPress: PropTypes.func.isRequired, + onMapLongPress: PropTypes.func.isRequired +}; + +export default MapWithMarkers; diff --git a/expo_project/components/MarkerCarousel.js b/expo_project/components/MarkerCarousel.js new file mode 100644 index 0000000..9b6ed77 --- /dev/null +++ b/expo_project/components/MarkerCarousel.js @@ -0,0 +1,132 @@ +import PropTypes from "prop-types"; +import React from "react"; + +import PersonIcon from "./PersonIcon"; + +import { FlatList, StyleSheet, TouchableOpacity } from "react-native"; + +import * as _ from "lodash"; + +const CAROUSEL_ICON_SIZE = 50; +const CAROUSEL_ITEM_PADDING = 12; +const CAROUSEL_ITEM_LENGTH = CAROUSEL_ICON_SIZE + 2 * CAROUSEL_ITEM_PADDING; + +const VIEWABILITY_CONFIG = { itemVisiblePercentThreshold: 100 }; + +class MarkerCarousel extends React.Component { + constructor(props) { + super(props); + + this.state = { + viewableIndices: [] + }; + this.onViewableItemsChanged = this.onViewableItemsChanged.bind(this); + } + + onViewableItemsChanged({ viewableItems }) { + const viewableIndices = _.map(viewableItems, "index"); + this.setState({ viewableIndices }); + } + + componentDidUpdate(prevProps, prevState) { + // If user selects a marker, and it's not visible, scroll to it + // Note that Adding / removing markers trigger their own animation (see: onContentSizeChange) + // Therefore we stop if props.markers has changed + if ( + this.props.markers === prevProps.markers && + this.props.activeMarkerId !== prevProps.activeMarkerId + ) { + const index = _.findIndex(this.props.markers, { + id: this.props.activeMarkerId + }); + if (index > -1) { + // Only scroll if the new selection isn't already visible + if (!_.includes(this.state.viewableIndices, index)) { + this.flatList.scrollToIndex({ + index, + viewPosition: 0.5, + animated: true + }); + } + } + } + } + + render() { + const { activeMarkerId, markers, onMarkerPress } = this.props; + return ( + item.id} + extraData={activeMarkerId} + horizontal + removeClippedSubviews + showsHorizontalScrollIndicator={false} + ref={ref => (this.flatList = ref)} + onContentSizeChange={(contentWidth, contentHeight) => { + if (markers.length > 1) { + // This is janky sometimes when there's only one item for some reason ... + this.flatList.scrollToEnd({ animated: true }); + } + }} + getItemLayout={(data, index) => ({ + length: CAROUSEL_ITEM_LENGTH, + offset: CAROUSEL_ITEM_LENGTH * index, + index + })} + onViewableItemsChanged={this.onViewableItemsChanged} + viewabilityConfig={VIEWABILITY_CONFIG} + renderItem={({ item, index }) => { + const selected = item.id === activeMarkerId; + return ( + onMarkerPress(item.id)} + > + + + ); + }} + /> + ); + } +} + +const styles = StyleSheet.create({ + container: { + borderBottomColor: "rgba(0, 0, 0, 0.12)", + borderBottomWidth: 1 + }, + cell: { + padding: CAROUSEL_ITEM_PADDING, + // there's a border on selected cells, so put an inivisble border on all cells to keep cell height consistent + borderBottomColor: "transparent", + borderBottomWidth: 4, + justifyContent: "center", + alignItems: "center" + } +}); + +MarkerCarousel.propTypes = { + markers: PropTypes.arrayOf( + PropTypes.shape({ + coordinate: PropTypes.any, + color: PropTypes.string, + title: PropTypes.string, + dateLabel: PropTypes.string, + id: PropTypes.string + }) + ).isRequired, + activeMarkerId: PropTypes.string, + onMarkerPress: PropTypes.func.isRequired +}; + +export default MarkerCarousel; diff --git a/expo_project/components/PersonIcon.js b/expo_project/components/PersonIcon.js new file mode 100644 index 0000000..e080ee7 --- /dev/null +++ b/expo_project/components/PersonIcon.js @@ -0,0 +1,56 @@ +import { Icon } from "expo"; +import PropTypes from "prop-types"; +import React from "react"; + +import { Platform, View, StyleSheet } from "react-native"; + +class PersonIcon extends React.Component { + render() { + const { size, backgroundColor, shadow } = this.props; + return ( + + + + ); + } +} + +const styles = StyleSheet.create({ + container: { + justifyContent: "center", + alignItems: "center" + }, + shadow: { + ...Platform.select({ + ios: { + shadowColor: "black", + shadowOffset: { height: 3 }, + shadowOpacity: 0.5, + shadowRadius: 3 + }, + android: { + // TODO: verify + elevation: 20 + } + }) + } +}); + +PersonIcon.propTypes = { + size: PropTypes.number.isRequired, + backgroundColor: PropTypes.string.isRequired, + shadow: PropTypes.bool +}; + +export default PersonIcon; diff --git a/expo_project/components/Selectable.js b/expo_project/components/Selectable.js new file mode 100644 index 0000000..cecc1ea --- /dev/null +++ b/expo_project/components/Selectable.js @@ -0,0 +1,100 @@ +import PropTypes from "prop-types"; +import React from "react"; + +import { + View, + ScrollView, + StyleSheet, + Text, + TouchableOpacity +} from "react-native"; +import colors from "../constants/Colors"; + +import * as _ from "lodash"; + +class Selectable extends React.Component { + constructor(props) { + super(props); + + this.state = { + height: 0 + }; + this.onLayout = this.onLayout.bind(this); + } + + // TODO (Ananta): Make this more React-y + // Currently Selectable passes back its height when pressed, since the parent wants to scrol the amount + // But that's a weird API for a child that should function without knowledge of its parents' desires + onLayout(event) { + this.setState({ height: event.nativeEvent.layout.height }); + } + + render() { + const { onSelectablePress, selectedValue, title, options } = this.props; + return ( + + {title} + + {_.map(options, option => { + const { value, label } = option; + const selected = value === selectedValue; + return ( + { + onSelectablePress(value, this.state.height); + }} + > + + {label} + + + ); + })} + + + ); + } +} + +const styles = StyleSheet.create({ + container: { + paddingVertical: 10 + }, + selectable: { + flexDirection: "row" + }, + selectableCell: { + borderWidth: 1, + backgroundColor: "#FAFAFA", + borderRadius: 3, + borderColor: "rgba(0, 0, 0, 0.0980392)", + padding: 5, + marginRight: 5, + marginTop: 10 + }, + selected: { + backgroundColor: colors.colorSecondary + }, + pillText: { + fontFamily: "monaco" + }, + title: { + marginBottom: 5 + } +}); + +Selectable.propTypes = { + onSelectablePress: PropTypes.func.isRequired, + selectedValue: PropTypes.string, + title: PropTypes.string.isRequired, + options: PropTypes.arrayOf( + PropTypes.shape({ + label: PropTypes.string, + value: PropTypes.string + }) + ).isRequired +}; + +export default Selectable; diff --git a/expo_project/components/StyledText.js b/expo_project/components/StyledText.js deleted file mode 100644 index 24c7b9b..0000000 --- a/expo_project/components/StyledText.js +++ /dev/null @@ -1,8 +0,0 @@ -import React from 'react'; -import { Text } from 'react-native'; - -export class MonoText extends React.Component { - render() { - return ; - } -} diff --git a/expo_project/components/Survey.js b/expo_project/components/Survey.js new file mode 100644 index 0000000..a4c4597 --- /dev/null +++ b/expo_project/components/Survey.js @@ -0,0 +1,46 @@ +import PropTypes from "prop-types"; +import React from "react"; +import { StyleSheet, Text, View } from "react-native"; +import Selectable from "../components/Selectable"; +import * as _ from "lodash"; + +import QUESTION_CONFIG from "../config/questions"; + +class Survey extends React.Component { + render() { + const { activeMarker, onSelect } = this.props; + return ( + + + {activeMarker.title} + {activeMarker.dateLabel} + + {_.map(QUESTION_CONFIG, question => { + const { questionKey, questionLabel, options } = question; + return ( + + onSelect(activeMarker.id, questionKey, value, selectableHeight) + } + selectedValue={activeMarker[questionKey]} + title={questionLabel} + options={options} + /> + ); + })} + + ); + } +} + +const styles = StyleSheet.create({ + titleContainer: { paddingVertical: 10 }, + title: { fontWeight: "bold" } +}); + +Survey.propTypes = { + onSelect: PropTypes.func.isRequired +}; + +export default Survey; diff --git a/expo_project/components/TabBarIcon.js b/expo_project/components/TabBarIcon.js deleted file mode 100644 index 2f1ebed..0000000 --- a/expo_project/components/TabBarIcon.js +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react'; -import { Icon } from 'expo'; - -import Colors from '../constants/Colors'; - -export default class TabBarIcon extends React.Component { - render() { - return ( - - ); - } -} \ No newline at end of file diff --git a/expo_project/config/questions.js b/expo_project/config/questions.js new file mode 100644 index 0000000..e3cf049 --- /dev/null +++ b/expo_project/config/questions.js @@ -0,0 +1,113 @@ +export default [ + { + questionKey: "gender", + questionLabel: "Gender", + options: [ + { value: "male", label: "Male" }, + { value: "female", label: "Female" }, + { value: "unknown", label: "Unknown" } + ] + }, + { + questionKey: "age", + questionLabel: "Age", + options: [ + { value: "child", label: "0-14" }, + { value: "young", label: "15-24" }, + { value: "adult", label: "25-64" }, + { value: "elderly", label: "65+" } + ] + }, + { + questionKey: "mode", + questionLabel: "Mode", + options: [ + { value: "pedestrian", label: "Pedestrian" }, + { value: "bicyclist", label: "Bicyclist" } + ] + }, + { + questionKey: "groupSize", + questionLabel: "Group Size", + options: [ + { value: "alone", label: "1" }, + { value: "pair", label: "2" }, + { value: "group", label: "3+" } + ] + }, + { + questionKey: "posture", + questionLabel: "Posture", + options: [ + { value: "leaning", label: "Leaning" }, + { value: "lying", label: "Lying" }, + { value: "sitting", label: "Sitting" }, + { value: "groundSitting", label: "Sitting on the Ground" }, + { value: "standing", label: "Standing" } + ] + }, + { + questionKey: "activity", + questionLabel: "Activity", + options: [ + { value: "commercial", label: "Commercial" }, + { value: "consuming", label: "Consuming" }, + { value: "conversing", label: "Conversing" }, + { value: "electronics", label: "Electronics" }, + { value: "pets", label: "Pets" }, + { value: "idle", label: "Idle" }, + { value: "running", label: "Running" } + ] + }, + { + questionKey: "object", + questionLabel: "Object", + options: [ + { value: "luggage", label: "luggage" }, + { value: "pushcart", label: "Push Cart" }, + { value: "stroller", label: "Stroller" } + ] + }, + { + questionKey: "blahgender", + questionLabel: "Fake Question (for demo purposes)", + options: [ + { value: "male", label: "1" }, + { value: "female", label: "2" }, + { value: "unknown", label: "3" } + ] + }, + { + questionKey: "genderblah", + questionLabel: "Fake Question (for demo purposes)", + options: [ + { value: "male", label: "4" }, + { value: "female", label: "5" }, + { value: "unknown", label: "6" }, + { value: "male1", label: "7" }, + { value: "female2", label: "8" }, + { value: "unknown3", label: "9" }, + { value: "male4", label: "10" }, + { value: "female5", label: "11" }, + { value: "unknown6", label: "12" } + ] + }, + { + questionKey: "adfsasdfgender", + questionLabel: "Fake Question (for demo purposes)", + options: [ + { value: "male", label: "fakefakeffake" }, + { value: "female", label: "reallylongword" }, + { value: "unknown", label: "thisshouldmakeyouscroll" } + ] + }, + { + questionKey: "genafdsafdsder", + questionLabel: "Fake Question (for demo purposes)", + options: [ + { value: "male", label: "100" }, + { value: "female", label: "99" }, + { value: "unknown", label: "98" } + ] + } +]; diff --git a/expo_project/constants/Colors.js b/expo_project/constants/Colors.js index d8bd415..c91111d 100644 --- a/expo_project/constants/Colors.js +++ b/expo_project/constants/Colors.js @@ -1,14 +1,36 @@ -const tintColor = '#2f95dc'; +const tintColor = "#2f95dc"; +const colorPrimary = "#5B93D9"; +const colorSecondary = "#1C4442"; + +const blue = "#1565C0"; +const red = "#F44336"; +const lightGreen = "#4CAF50"; +const indigo = "#1A237E"; +const lightBlue = "#29B6F6"; +const pink = "#D81B60"; +const orange = "#EF6C00"; export default { tintColor, - tabIconDefault: '#ccc', - tabIconSelected: tintColor, - tabBar: '#fefefe', - errorBackground: 'red', - errorText: '#fff', - warningBackground: '#EAEB5E', - warningText: '#666804', - noticeBackground: tintColor, - noticeText: '#fff', + colorPrimary, + colorSecondary, + tabIconDefault: "#ccc", + tabIconSelected: colorPrimary, + tabBar: "#fefefe", + errorBackground: "red", + errorText: "#fff", + warningBackground: "#EAEB5E", + warningText: "#666804", + noticeBackground: colorPrimary, + noticeText: "#fff" +}; + +export const iconColors = { + blue, + red, + lightGreen, + indigo, + lightBlue, + pink, + orange }; diff --git a/expo_project/navigation/AppNavigator.js b/expo_project/navigation/AppNavigator.js index 874ab40..4b52af9 100644 --- a/expo_project/navigation/AppNavigator.js +++ b/expo_project/navigation/AppNavigator.js @@ -1,15 +1,22 @@ import React from "react"; import { createStackNavigator } from "react-navigation"; - +import colors from "../constants/Colors"; import HomeScreen from "../screens/HomeScreen"; -import SurveyScreen from "../screens/SurveyScreen"; export default createStackNavigator( { - Home: HomeScreen, - Survey: SurveyScreen + Home: HomeScreen }, { - initialRouteName: "Home" + initialRouteName: "Home", + navigationOptions: { + headerStyle: { + backgroundColor: colors.colorPrimary + }, + headerTintColor: "#fff", + headerTitleStyle: { + fontWeight: "bold" + } + } } ); diff --git a/expo_project/package.json b/expo_project/package.json index f7050a9..680a0f7 100644 --- a/expo_project/package.json +++ b/expo_project/package.json @@ -11,6 +11,9 @@ "@expo/samples": "2.1.1", "expo": "^28.0.0", "firebase": "^5.3.0", + "lodash": "4.17.4", + "moment": "^2.22.2", + "prop-types": "^15.6.2", "react": "16.3.1", "react-native": "https://github.com/expo/react-native/archive/sdk-28.0.0.tar.gz", "react-navigation": "2.3.1" diff --git a/expo_project/screens/HomeScreen.js b/expo_project/screens/HomeScreen.js index 79f96aa..0ead2f8 100644 --- a/expo_project/screens/HomeScreen.js +++ b/expo_project/screens/HomeScreen.js @@ -1,8 +1,30 @@ import React from "react"; -import { Platform, StyleSheet, Text, View } from "react-native"; -import { KeepAwake, MapView, Constants, Location, Permissions } from "expo"; -import { Button } from "react-native"; +import { + Dimensions, + PanResponder, + Platform, + StyleSheet, + View, + Animated +} from "react-native"; import { withNavigation } from "react-navigation"; +import * as _ from "lodash"; +import Colors, { iconColors } from "../constants/Colors"; +import { ScrollView } from "../node_modules/react-native-gesture-handler"; +const { height } = Dimensions.get("window"); +import moment from "moment"; +import { Header } from "react-navigation"; + +import MapWithMarkers from "../components/MapWithMarkers"; +import MarkerCarousel from "../components/MarkerCarousel"; +import Survey from "../components/Survey"; +import ColoredButton from "../components/ColoredButton"; + +const HEADER_HEIGHT = Header.HEIGHT; +const MIN_DRAWER_OFFSET = 0; // fix this + +const DRAWER_HEIGHT = height - HEADER_HEIGHT; +const INITIAL_DRAWER_OFFSET = DRAWER_HEIGHT; class HomeScreen extends React.Component { static navigationOptions = { @@ -12,49 +34,260 @@ class HomeScreen extends React.Component { constructor(props) { super(props); + this.drawerOffsetY = new Animated.Value(INITIAL_DRAWER_OFFSET); + this.drawerOffsetY.addListener(({ value }) => (this._value = value)); + this.state = { - markerLocation: null, - errorMessage: null + activeMarkerId: null, + markers: [], + formScrollPosition: 0, + drawerHeaderHeight: 0 }; + this.resetDrawer = this.resetDrawer.bind(this); + this.selectMarker = this.selectMarker.bind(this); + this.getRandomIconColor = this.getRandomIconColor.bind(this); + this.createNewMarker = this.createNewMarker.bind(this); this.setMarkerLocation = this.setMarkerLocation.bind(this); + this.setFormResponse = this.setFormResponse.bind(this); + + // TODO (Ananta): Make this easier to understand + // TODO (Ananta): use a "top" value instead of an offset from top, so + / - is a consistent direction between pan responder and scrollview + this._panResponder = PanResponder.create({ + // Ask to be the responder: + onStartShouldSetPanResponder: (evt, gestureState) => false, + onStartShouldSetPanResponderCapture: (evt, gestureState) => false, + onMoveShouldSetPanResponder: (evt, gestureState) => { + // Respond to downward drags if they are a long distance or the scrollview is at the top + // Upward drags are handled in onMoveShouldSetPanResponderCapture because they override all child gestures + + const verticalDistance = Math.abs(gestureState.dy); + const horizontalDistance = Math.abs(gestureState.dx); + const isVerticalPan = verticalDistance > horizontalDistance; + + if (isVerticalPan) { + // only pan if it's a long distance or you can't scroll any more + const directionDown = gestureState.dy > 0; + const scrolledToTop = !this.state.formScrollPosition; + const isLongDistance = gestureState.dy > 50; + return directionDown && (scrolledToTop || isLongDistance); + } + return false; + }, + onMoveShouldSetPanResponderCapture: (evt, gestureState) => { + // Respond and capture (disallow children from responding) if panning upward + // Returning true here will skip onMoveShouldSetPanResponder + + const verticalDistance = Math.abs(gestureState.dy); + const horizontalDistance = Math.abs(gestureState.dx); + const isVerticalPan = verticalDistance > horizontalDistance; + + if (isVerticalPan) { + const directionUp = gestureState.dy < 0; + const hasSpaceToPanUp = this.drawerOffsetY._value > MIN_DRAWER_OFFSET; + return directionUp && hasSpaceToPanUp; + } + return false; + }, + onPanResponderMove: (evt, gestureState) => { + const directionDown = gestureState.dy > 0; + const currentDrawerOffset = this.drawerOffsetY._value; + + // TODO: Make the drawer follow user's gesture + const canMoveDown = + directionDown && + currentDrawerOffset < + INITIAL_DRAWER_OFFSET - this.state.drawerHeaderHeight; + const canMoveUp = + !directionDown && currentDrawerOffset > MIN_DRAWER_OFFSET; + + if (canMoveUp || canMoveDown) { + const toValue = canMoveUp + ? MIN_DRAWER_OFFSET + : INITIAL_DRAWER_OFFSET - this.state.drawerHeaderHeight; + Animated.spring(this.drawerOffsetY, { + toValue, + useNativeDriver: true + }).start(); + if (canMoveDown && this.state.formScrollPosition) { + this.scrollView.scrollTo({ + x: 0, + y: 0, + animated: false + }); + } + } + return true; + } + }); + } + + resetDrawer() { + const isEmpty = this.state.markers.length === 0; + const offsetVal = isEmpty ? INITIAL_DRAWER_OFFSET : DRAWER_HEIGHT - 250; //fix this + if (this.drawerOffsetY._value !== offsetVal) { + Animated.timing(this.drawerOffsetY, { + toValue: offsetVal, + duration: 200, + useNativeDriver: true + }).start(); + } + + if (this.state.formScrollPosition) { + this.scrollView.scrollTo({ x: 0, y: 0, animated: false }); + } + } + + setFormResponse(id, key, value, selectableHeight) { + // TODO: add logic for updating in db + const markersCopy = [...this.state.markers]; + const marker = _.find(markersCopy, { + id + }); + + if (marker) { + marker[key] = value; + this.setState({ + markers: markersCopy + }); + + const currentScrollPosition = this.state.formScrollPosition; + const currentDrawerOffset = this.drawerOffsetY._value; + const newDrawerOffset = currentDrawerOffset - selectableHeight; + + if (newDrawerOffset >= MIN_DRAWER_OFFSET) { + Animated.timing(this.drawerOffsetY, { + toValue: newDrawerOffset, + duration: 200, + useNativeDriver: true + }).start(); + } else if (currentDrawerOffset > MIN_DRAWER_OFFSET) { + // Animate drawer to the top + // then scroll the remaining amount to ensure next question is visible + const remainder = currentDrawerOffset - MIN_DRAWER_OFFSET; + Animated.timing(this.drawerOffsetY, { + toValue: MIN_DRAWER_OFFSET, + duration: 200, + useNativeDriver: true + }).start(); + this.scrollView.scrollTo({ + y: currentScrollPosition + selectableHeight - remainder + }); + } else { + this.scrollView.scrollTo({ + y: currentScrollPosition + selectableHeight + }); + } + } + } + + selectMarker(activeMarkerId) { + this.setState({ activeMarkerId }); + this.resetDrawer(); + } + + createNewMarker(e) { + // TODO: add logic for inserting into db + const markersCopy = [...this.state.markers]; + const date = moment(); + const dateLabel = date.format("HH:mm"); + const timestamp = date.format("x"); + const id = timestamp + ""; // placeholder + const title = "Person " + (markersCopy.length + 1); + + const marker = { + coordinate: e.nativeEvent.coordinate, + color: this.getRandomIconColor(), + gender: null, + position: null, + title, + dateLabel, + id + }; + + markersCopy.push(marker); + this.setState( + { markers: markersCopy, activeMarkerId: id }, + this.resetDrawer + ); } setMarkerLocation(e) { - this.setState({ markerLocation: e.nativeEvent.coordinate }); + // TODO: add logic for updating in db + const { id, coordinate } = e.nativeEvent; + const markersCopy = [...this.state.markers]; + const marker = _.find(markersCopy, { id }); + + if (marker) { + marker.coordinate = coordinate; + this.setState({ + markers: markersCopy + }); + } + } + + getRandomIconColor() { + const iconOptions = Object.values(iconColors); + return iconOptions[Math.floor(Math.random() * iconOptions.length)]; } render() { + const { activeMarkerId, markers } = this.state; + const activeMarker = _.find(markers, { id: activeMarkerId }); return ( - + - {this.state.markerLocation && ( - + this.setState({ + drawerHeaderHeight: e.nativeEvent.layout.height + }) + } + > + - )} - - {this.state.markerLocation && ( - -