Skip to content

Commit

Permalink
Dining API V2 updates
Browse files Browse the repository at this point in the history
  • Loading branch information
c3bryant committed Feb 7, 2018
1 parent 034e67d commit 2ceea30
Show file tree
Hide file tree
Showing 13 changed files with 552 additions and 499 deletions.
2 changes: 1 addition & 1 deletion app/AppSettings.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ module.exports = {
SURF_API_URL: 'https://0yi5xwy0v7.execute-api.us-west-2.amazonaws.com/dev',
SHUTTLE_STOPS_API_URL: 'https://ies4wyrlx9.execute-api.us-west-2.amazonaws.com/prod/v2/stops/',
SHUTTLE_VEHICLES_API_URL: 'https://hjr84cay81.execute-api.us-west-2.amazonaws.com/prod?route=',
DINING_API_URL: 'https://pg83tslbyi.execute-api.us-west-2.amazonaws.com/prod/v2/dining/locations',
DINING_API_URL: 'http://hdh2.ucsd.edu/diningmenu/api/DiningDataService/GetDiningInfo_V2',
EVENTS_API_URL: 'https://2jjml3hf27.execute-api.us-west-2.amazonaws.com/prod/events/student',
QUICKLINKS_API_URL: 'https://s3-us-west-2.amazonaws.com/ucsd-its-wts/now_ucsandiego/v1/quick_links/ucsd-quicklinks-v3.json',
NEWS_API_URL: 'https://s3-us-west-2.amazonaws.com/ucsd-its-wts/now_ucsandiego/v1/allstories.json',
Expand Down
2 changes: 1 addition & 1 deletion app/services/diningService.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const DiningService = {
if (data.errorMessage) {
throw (data.errorMessage);
} else {
return data.GetDiningInfoResult;
return data.dininginfo;
}
})
.catch((err) => console.log('Error fetching dining: ' + err));
Expand Down
42 changes: 15 additions & 27 deletions app/views/dining/DiningCardContainer.js
Original file line number Diff line number Diff line change
@@ -1,36 +1,24 @@
import React from 'react';

import { connect } from 'react-redux';
import { Actions } from 'react-native-router-flux';

import DataListCard from '../common/DataListCard';
import CardComponent from '../card/CardComponent';

const logger = require('../../util/logger');

export class DiningCardContainer extends CardComponent {
componentDidMount() {
logger.ga('Card Mounted: Dining');
}

render() {
const { diningData } = this.props;
// todo: use location permission
return (
<DataListCard
id="dining"
title="Dining"
data={diningData}
item={'DiningItem'}
/>
);
}
}

function mapStateToProps(state, props) {
import logger from '../../util/logger';

const DiningCardContainer = ({ diningData }) => {
logger.ga('Card Mounted: Dining');
return (
<DataListCard
id="dining"
title="Dining"
data={diningData}
item={'DiningItem'}
/>
);
};

function mapStateToProps(state) {
return {
diningData: state.dining.data,
locationPermission: state.location.permission,
};
}

Expand Down
34 changes: 34 additions & 0 deletions app/views/dining/DiningDescription.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import React from 'react';
import {
View,
Text,
StyleSheet
} from 'react-native';
import DiningHours from './DiningHours';

const DiningDescription = ({ name, description, regularHours, specialHours }) => (
<View style={styles.descriptionContainer}>
<Text style={styles.nameText}>{name}</Text>
{description ? (
<Text style={styles.subText}>{description}</Text>
) : null }

<DiningHours
regularHours={regularHours}
specialHours={specialHours}
customStyle={styles.diningHours}
/>
{specialHours ? (
<Text style={styles.subText}>Special Hours:{'\n'}{specialHours}</Text>
) : null }
</View>
);

const styles = StyleSheet.create({
descriptionContainer: { padding: 10 },
nameText: { fontSize: 26 },
subText: { paddingTop: 6 },
diningHours: { paddingTop: 10 },
});

export default DiningDescription;
250 changes: 7 additions & 243 deletions app/views/dining/DiningDetail.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
import React from 'react';
import {
View,
Text,
TouchableHighlight,
ScrollView,
Image,
ListView,
} from 'react-native';
import Icon from 'react-native-vector-icons/Ionicons';
import { Actions } from 'react-native-router-flux';
import { COLOR_SECONDARY } from '../../styles/ColorConstants';

import logger from '../../util/logger';
import DiningDescription from './DiningDescription';
import DiningImages from './DiningImages';
import DiningDirections from './DiningDirections';
import DiningMenu from './DiningMenu';

const css = require('../../styles/css');
const logger = require('../../util/logger');
const general = require('../../util/general');
const menuDataSource = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 });

class DiningDetail extends React.Component {
constructor(props) {
Expand Down Expand Up @@ -55,7 +51,7 @@ class DiningDetail extends React.Component {
const { data } = this.props;

return (
<View style={css.main_full}>
<View style={[css.main_container, css.whitebg]}>
<ScrollView contentContainerStyle={[css.scroll_main, css.whitebg]}>
<DiningDescription
name={data.name}
Expand Down Expand Up @@ -84,235 +80,3 @@ class DiningDetail extends React.Component {
}

export default DiningDetail;

/*
Presentational Components, should probably be moved out of this file
*/
const DiningDescription = ({ name, description, regularHours, specialHours }) => (
<View style={css.dl_market_name}>
<Text style={css.dl_market_name_text}>{name}</Text>
{description ? (
<Text style={css.dl_market_desc_text}>{description}</Text>
) : null }
{regularHours ? (
<Text style={css.dl_market_desc_text}>{regularHours}</Text>
) : null }
{specialHours ? (
<Text style={css.dl_market_desc_text}>Special Hours:{'\n'}{specialHours}</Text>
) : null }
</View>
);

const DiningImages = ({ images }) => (
<View>
{(images) ? (
<ScrollView
style={css.dl_market_scroller}
directionalLockEnabled={false}
horizontal={true}
>
{images.map((object, i) => (
<Image
key={i}
style={css.dl_market_scroller_image}
resizeMode={'cover'}
source={{ uri: object }}
/>
))}
</ScrollView>
) : null }
</View>
);

const DiningDirections = ({ latitude, longitude, distance }) => (
<View>
{latitude !== 0 && longitude !== 0 ? (
<TouchableHighlight
underlayColor={'rgba(200,200,200,.1)'}
onPress={() => general.gotoNavigationApp(latitude, longitude)}
>
<View style={css.dl_market_directions}>
<Text style={css.dl_dir_label}>Directions</Text>
<View style={css.dl_dir_traveltype_container}>
<Icon name="md-walk" size={32} color={COLOR_SECONDARY} />
{distance ? (
<Text style={css.dl_dir_eta}>{distance}</Text>
) : null }
</View>
</View>
</TouchableHighlight>
) : null }
</View>
);

const DiningMenu = ({ data, filters, addFilter, activeMeal }) => {
if (!data.menuItems && data.menuWebsite) {
return (
<TouchableHighlight underlayColor={'rgba(200,200,200,.1)'} onPress={() => general.openURL(data.menuWebsite)}>
<View style={css.dd_menu_container}>
{data.name.indexOf('Market') >= 0 ? (
<Text style={css.dd_menu_text}>View To Go Menu</Text>
) : (
<Text style={css.dd_menu_text}>View Menu</Text>
)}
</View>
</TouchableHighlight>
);
} else if (data.menuItems) {
return (
<View style={css.dd_dining_menu}>
<MenuFilters
filters={filters}
addFilter={addFilter}
activeMeal={activeMeal}
/>
<MenuList
filters={filters}
data={data.menuItems}
activeMeal={activeMeal}
/>
</View>
);
} else {
return null;
}
};

const DiningMenuHeader = () => (
<View style={css.dl_market_date}>
<Text style={css.dl_market_date_label}>
Menu for {general.getTimestamp('mmmm d, yyyy')}
</Text>
</View>
);

const MenuFilters = ({ filters, addFilter, activeMeal }) => (
<View>
<View style={css.dl_market_filters_foodtype}>
<TypeButton
name={'Vegetarian'}
type={'VT'}
active={filters.indexOf('VT') >= 0}
addFilter={addFilter}
/>
<TypeButton
name={'Vegan'}
type={'VG'}
active={filters.indexOf('VG') >= 0}
addFilter={addFilter}
/>
<TypeButton
name={'Gluten-Free'}
type={'GF'}
active={filters.indexOf('GF') >= 0}
addFilter={addFilter}
/>
</View>
<View style={css.dl_market_filters_mealtype}>
<MealButton
name={'Breakfast'}
active={activeMeal === 'Breakfast'}
addFilter={addFilter}
/>
<MealButton
name={'Lunch'}
active={activeMeal === 'Lunch'}
addFilter={addFilter}
/>
<MealButton
name={'Dinner'}
active={activeMeal === 'Dinner'}
addFilter={addFilter}
/>
</View>
</View>
);

/*
Breakfast, Lunch, Dinner
*/
const MealButton = ({ name, active, addFilter }) => (
<TouchableHighlight
style={css.dl_meal_button}
underlayColor={'rgba(200,200,200,.1)'}
onPress={() => addFilter(name)}
>
{ (active === true) ?
(<View style={css.dl_meal_button}>
<View style={css.dl_mealtype_circle_active} />
<Text style={css.dl_mealtype_label_active}>{name}</Text>
</View>) :
(<View style={css.dl_meal_button}>
<View style={css.dl_mealtype_circle} />
<Text style={css.dl_mealtype_label}>{name}</Text>
</View>)
}
</TouchableHighlight>
);

/*
VT, VG, GF
*/
const TypeButton = ({ name, type, active, addFilter }) => (
<TouchableHighlight
underlayColor={'rgba(200,200,200,.1)'}
onPress={() => addFilter(type)}
>
{active ? (
<Text style={css.dining_card_filter_button_active}>{name}</Text>
) : (
<Text style={css.dining_card_filter_button}>{name}</Text>
)}
</TouchableHighlight>
);

const MenuList = ({ data, filters, activeMeal }) => {
if (Array.isArray(data) && Array.isArray(filters)) {
let menuItems = [];

// Active Meal filter
menuItems = data.filter((item) => {
const itemTags = item.tags.toLowerCase();
return ((itemTags.indexOf(activeMeal.toLowerCase()) >= 0) || (itemTags.indexOf(('ALL DAY').toLowerCase()) >= 0));
});

// Food Type filters
filters.forEach((tag) => {
menuItems = menuItems.filter((item) => {
const itemTags = item.tags.toLowerCase();
return (itemTags.indexOf(tag.toLowerCase()) >= 0);
});
});

return (
<ListView
dataSource={menuDataSource.cloneWithRows(menuItems)}
renderRow={(rowData, sectionID, rowID, highlightRow) => (
<MenuItem
key={rowID}
data={rowData}
/>
)}
/>
);
} else {
return null;
}
};

const MenuItem = ({ data }) => (
<TouchableHighlight
style={css.dl_market_menu_row}
underlayColor={'rgba(200,200,200,.1)'}
onPress={() => Actions.DiningNutrition({ menuItem: data })}
>
<Text style={css.dl_menu_item_name}>
{data.name}
{(data.price && data.price !== '0' && data.price !== '0.00') ? (
<Text style={css.dl_menu_item_price}>
(${data.price})
</Text>
) : null }
</Text>
</TouchableHighlight>
);
Loading

0 comments on commit 2ceea30

Please sign in to comment.