Skip to content

Commit

Permalink
Refactor stats
Browse files Browse the repository at this point in the history
  • Loading branch information
buoto committed Jun 13, 2018
1 parent 2a700d0 commit bb16f7f
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 93 deletions.
14 changes: 8 additions & 6 deletions app/components/LocationInput.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,18 +56,20 @@ class LocationInput extends Component {
getCurrentLocation = () => {
const { onChange, locationAccess, requestPermission } = this.props;
if (locationAccess) {
RNGooglePlaces.getCurrentPlace().then(([place]) => onChange(place));
// .catch(error => console.log(error)); TODO handle error
RNGooglePlaces.getCurrentPlace()
.then(([place]) => onChange(place))
.catch(() => {}); // TODO handle
} else {
requestPermission();
}
};
openSearchModal = () => {
const { onChange } = this.props;
RNGooglePlaces.openAutocompleteModal(defaultInitialRegion).then(place => {
onChange(place);
});
// .catch(error => console.log(error)); TODO handle error
RNGooglePlaces.openAutocompleteModal(defaultInitialRegion)
.then(place => {
onChange(place);
})
.catch(() => {}); // probably user wanted it
};

render() {
Expand Down
103 changes: 69 additions & 34 deletions app/components/Stats.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,50 @@
import React from 'react';
import PropTypes from 'prop-types';
import { StyleSheet, Text, View } from 'react-native';

import { COLOR_WHITE } from '/app/config/styles';
import { sum, unique } from '/app/utils';

const stationNames = completedRoutes =>
completedRoutes
.map(({ stations }) => stations.map(({ name }) => name))
.reduce((prev, next) => [...prev, ...next], []);

const favoriteStation = names =>
Object.entries(
names.reduce(
(prev, cur) => ({
...prev,
[cur]: (prev[cur] || 0) + 1,
}),
{},
),
).reduce(
(prev, [name, count]) => (count > prev.count ? { name, count } : prev),
{ count: -1 },
);

const tripPrice = time => {
const mins = time / 60000;

let price = 0;
if (mins < 20) return price;
price += 1;
if (mins < 60) return price;

price += 3;
if (mins < 2 * 60) return price;
price += 5;
if (mins < 3 * 60) return price;
price += 7;
if (mins < 4 * 60) return price;
price += 7;
if (mins < 5 * 60) return price;
price += 7;
if (mins < 6 * 60) return price;
price += 7;
return price;
};

const styles = StyleSheet.create({
container: {
Expand Down Expand Up @@ -41,54 +84,46 @@ const getStat = (name, value) => (
</View>
);

const Stats = ({
completedRoutes,
visitedStations,
distanceSum,
timeSum,
favoriteStation: { name, count },
savedMoney,
}) => (
<View style={styles.container}>
<View style={styles.subContainer} />
{getStat('Liczba ukończonych tras', completedRoutes.length)}
const Stats = ({ completedRoutes }) => {
const names = stationNames(completedRoutes);
const visitedStations = unique(names);
const distanceSum = sum('distance')(completedRoutes);
const { name, count } = favoriteStation(names);
const timeSum = sum('time')(completedRoutes);
const savedMoney = completedRoutes.reduce(
(s, { time }) => s + tripPrice(time),
0,
);

return (
<View style={styles.container}>
<View style={styles.subContainer} />
{getStat('Liczba ukończonych tras', completedRoutes.length)}

{getStat('Liczba odwiedzonych stacji', visitedStations.length)}
{getStat('Liczba odwiedzonych stacji', visitedStations.length)}

{name && count && getStat('Ulubiona stacja', `${name} (${count})`)}
{name && count && getStat('Ulubiona stacja', `${name} (${count})`)}

{getStat('Przejechany dystans', `${(distanceSum / 1000).toFixed(2)} km`)}
{getStat('Przejechany dystans', `${(distanceSum / 1000).toFixed(2)} km`)}

{getStat('Łączny czas podróży', `${(timeSum / 60000).toFixed(0)} minut`)}
{getStat('Łączny czas podróży', `${(timeSum / 60000).toFixed(0)} minut`)}

<View style={styles.savedMoneyContainer}>
<View style={styles.subContainer}>
<Text style={styles.savedMoneyName}>Zaoszczędzono</Text>
<Text style={styles.savedMoney}>{savedMoney}</Text>
<View style={styles.savedMoneyContainer}>
<View style={styles.subContainer}>
<Text style={styles.savedMoneyName}>Zaoszczędzono</Text>
<Text style={styles.savedMoney}>{savedMoney}</Text>
</View>
</View>
</View>
</View>
);
);
};

Stats.propTypes = {
completedRoutes: PropTypes.arrayOf(PropTypes.shape()),
visitedStations: PropTypes.arrayOf(PropTypes.string),
distanceSum: PropTypes.number,
timeSum: PropTypes.number,
savedMoney: PropTypes.number,
favoriteStation: PropTypes.shape({
name: PropTypes.string,
count: PropTypes.number,
}),
};

Stats.defaultProps = {
completedRoutes: [],
visitedStations: [],
distanceSum: 0,
timeSum: 0,
favoriteStation: {},
savedMoney: 0,
};

export default Stats;
56 changes: 3 additions & 53 deletions app/screens/CompletedStats.js
Original file line number Diff line number Diff line change
@@ -1,60 +1,10 @@
import { connect } from 'react-redux';

import { sum, unique } from '/app/utils';
import Stats from '/app/components/Stats';

const stationNames = completedRoutes =>
completedRoutes
.map(({ stations }) => stations.map(({ name }) => name))
.reduce((prev, next) => [...prev, ...next], []);

const favoriteStation = names =>
Object.entries(
names.reduce(
(prev, cur) => ({
...prev,
[cur]: (prev[cur] || 0) + 1,
}),
{},
),
).reduce(
(prev, [name, count]) => (count > prev.count ? { name, count } : prev),
{ count: -1 },
);

const tripPrice = ({ time }) => {
const mins = time / 60000;

let price = 0;
if (mins < 20) return price;
price += 1;
if (mins < 60) return price;

price += 3;
if (mins < 2 * 60) return price;
price += 5;
if (mins < 3 * 60) return price;
price += 7;
if (mins < 4 * 60) return price;
price += 7;
if (mins < 5 * 60) return price;
price += 7;
if (mins < 6 * 60) return price;
price += 7;
return price;
};

const mapStateToProps = ({ completedRoutes }) => {
const names = stationNames(completedRoutes);
return {
completedRoutes,
visitedStations: unique(names),
distanceSum: sum('distance')(completedRoutes),
favoriteStation: favoriteStation(names),
timeSum: sum('time')(completedRoutes),
savedMoney: completedRoutes.reduce((s, { time }) => s + tripPrice(time), 0),
};
};
const mapStateToProps = ({ completedRoutes }) => ({
completedRoutes,
});

const CompletedStats = connect(mapStateToProps)(Stats);

Expand Down

0 comments on commit bb16f7f

Please sign in to comment.