From 17beeead64622bcd38ac4d0481c6344f9c36a8c5 Mon Sep 17 00:00:00 2001 From: Eduardo Moroni Date: Tue, 3 Oct 2017 05:26:12 -0300 Subject: [PATCH 01/13] fix: fix YourRidesOffer state --- .../rideOffer/containers/YourRideOffersScreen.js | 11 ++++------- src/services/firebase/database/RideOffer.js | 4 ++++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/modules/rideOffer/containers/YourRideOffersScreen.js b/src/modules/rideOffer/containers/YourRideOffersScreen.js index 9bbf937..24f5651 100644 --- a/src/modules/rideOffer/containers/YourRideOffersScreen.js +++ b/src/modules/rideOffer/containers/YourRideOffersScreen.js @@ -31,14 +31,11 @@ export class YourRideOffersScreen extends Component { this.props.navigator.setOnNavigatorEvent(onNavigatorEvent.bind(this)) } - async componentDidMount () { - const rides = await getUserRideOffers(this.props.uid) - this.setState({rides}) - } - async componentDidUpdate (prevProps) { - if (prevProps.uid !== this.props.uid) { - await this.componentDidMount() + const { uid } = this.props + if (uid && prevProps.uid !== uid) { + const rides = await getUserRideOffers(uid) + this.setState({rides}) } } diff --git a/src/services/firebase/database/RideOffer.js b/src/services/firebase/database/RideOffer.js index 6a3d7b7..f99c9ac 100644 --- a/src/services/firebase/database/RideOffer.js +++ b/src/services/firebase/database/RideOffer.js @@ -34,6 +34,10 @@ export const getAllRideOffers = async (): Array => { export const getUserRideOffers = async (userId: string): Array => { const rides = await getAllRideOffers() + console.log(userId, 'is ===> userId') + console.log('Object rides !!!') + console.log(JSON.stringify(rides.filter(ride => ride.driverId === userId))) + console.log('--------------------') return rides.filter(ride => ride.driverId === userId) } From d25f212d1f692f8e437f5f5af8f76e805bb97a5b Mon Sep 17 00:00:00 2001 From: Eduardo Moroni Date: Tue, 3 Oct 2017 05:37:47 -0300 Subject: [PATCH 02/13] test: add test for updateYourOffers --- .../actions/sync/RideOfferActions.test.js | 16 +++++++++++++-- .../actions/sync/RideRequestsActions.test.js | 2 +- .../redux/reducers/RideOfferReducers.test.js | 20 +++++++++++++------ src/redux/actions/sync/RideOfferActions.js | 11 ++++++++-- src/redux/actions/sync/RideRequestActions.js | 2 +- src/redux/reducers/RideReducers.js | 13 +++++++++--- src/redux/types/RideOfferTypes.js | 1 + src/services/firebase/database/RideOffer.js | 3 --- 8 files changed, 50 insertions(+), 18 deletions(-) diff --git a/__tests__/src/redux/actions/sync/RideOfferActions.test.js b/__tests__/src/redux/actions/sync/RideOfferActions.test.js index 939c4ad..8d267ef 100644 --- a/__tests__/src/redux/actions/sync/RideOfferActions.test.js +++ b/__tests__/src/redux/actions/sync/RideOfferActions.test.js @@ -1,16 +1,28 @@ import { UPDATE_RIDE_OFFERS } from '../../../../../src/redux/types' -import { updateRideOffers } from '../../../../../src/redux/actions/sync/RideOfferActions' +import { updateRideOffers, updateYourRideOffers } from '../../../../../src/redux/actions/sync/RideOfferActions' import { rideOfferFixture } from '../../../../resources/fixtures/ride/offer' +import { UPDATE_YOUR_RIDE_OFFERS } from '../../../../../src/redux/types/RideOfferTypes' describe('RideOffer sync actions', () => { it('Should create an action for update ride offers', async () => { const rides = [rideOfferFixture] const expectedAction = { type: UPDATE_RIDE_OFFERS, - payload: rides + offers: rides } const action = updateRideOffers(rides) expect(action).toEqual(expectedAction) }) + + it('Should create an action for update your ride offers', async () => { + const rides = [rideOfferFixture] + const expectedAction = { + type: UPDATE_YOUR_RIDE_OFFERS, + yourOffers: rides + } + const action = updateYourRideOffers(rides) + + expect(action).toEqual(expectedAction) + }) }) diff --git a/__tests__/src/redux/actions/sync/RideRequestsActions.test.js b/__tests__/src/redux/actions/sync/RideRequestsActions.test.js index c5acb82..ea6a469 100644 --- a/__tests__/src/redux/actions/sync/RideRequestsActions.test.js +++ b/__tests__/src/redux/actions/sync/RideRequestsActions.test.js @@ -7,7 +7,7 @@ describe('RideRequest sync actions', () => { const rides = [rideRequestFixture] const expectedAction = { type: UPDATE_RIDE_REQUESTS, - payload: rides + requests: rides } const action = updateRideRequests(rides) diff --git a/__tests__/src/redux/reducers/RideOfferReducers.test.js b/__tests__/src/redux/reducers/RideOfferReducers.test.js index fa5cea4..c0a6c61 100644 --- a/__tests__/src/redux/reducers/RideOfferReducers.test.js +++ b/__tests__/src/redux/reducers/RideOfferReducers.test.js @@ -1,21 +1,29 @@ import RideOfferReducers, { INITIAL_STATE } from '../../../../src/redux/reducers/RideReducers' import { updateRideRequests } from '../../../../src/redux/actions/sync/RideRequestActions' -import { updateRideOffers } from '../../../../src/redux/actions/sync/RideOfferActions' -import { rideOffer } from '../../../resources/fixtures/ride/offer' +import { updateRideOffers, updateYourRideOffers } from '../../../../src/redux/actions/sync/RideOfferActions' +import { rideOfferFixture } from '../../../resources/fixtures/ride/offer' describe('RideOfferReducers', () => { it('Should handle UPDATE_RIDE_OFFERS action type', async () => { - const action = updateRideOffers([rideOffer]) + const action = updateRideOffers([rideOfferFixture]) const state = RideOfferReducers(INITIAL_STATE, action) - const expectedState = { offers: action.payload, requests: [] } + const expectedState = { ...INITIAL_STATE, offers: action.offers } + + expect(state).toEqual(expectedState) + }) + + it('Should handle UPDATE_YOUR_RIDE_OFFERS action type', async () => { + const action = updateYourRideOffers([rideOfferFixture]) + const state = RideOfferReducers(INITIAL_STATE, action) + const expectedState = { ...INITIAL_STATE, yourOffers: action.yourOffers } expect(state).toEqual(expectedState) }) it('Should handle UPDATE_RIDE_REQUESTS action type', async () => { - const action = updateRideRequests([rideOffer]) + const action = updateRideRequests([rideOfferFixture]) const state = RideOfferReducers(INITIAL_STATE, action) - const expectedState = { requests: action.payload, offers: [] } + const expectedState = { ...INITIAL_STATE, requests: action.requests } expect(state).toEqual(expectedState) }) diff --git a/src/redux/actions/sync/RideOfferActions.js b/src/redux/actions/sync/RideOfferActions.js index e9d7f91..827724e 100644 --- a/src/redux/actions/sync/RideOfferActions.js +++ b/src/redux/actions/sync/RideOfferActions.js @@ -1,9 +1,16 @@ -import { UPDATE_RIDE_OFFERS } from '../../types' +import { UPDATE_RIDE_OFFERS, UPDATE_YOUR_RIDE_OFFERS } from '../../types' import type { RideType } from '../../../services/firebase/types' export const updateRideOffers = (rides: Array) => { return { type: UPDATE_RIDE_OFFERS, - payload: rides + offers: rides + } +} + +export const updateYourRideOffers = (rides: Array) => { + return { + type: UPDATE_YOUR_RIDE_OFFERS, + yourOffers: rides } } diff --git a/src/redux/actions/sync/RideRequestActions.js b/src/redux/actions/sync/RideRequestActions.js index ff758bf..6fe5389 100644 --- a/src/redux/actions/sync/RideRequestActions.js +++ b/src/redux/actions/sync/RideRequestActions.js @@ -4,6 +4,6 @@ import type { RideRequestFlowType } from '../../../services/firebase/types' export const updateRideRequests = (rides: Array) => { return { type: UPDATE_RIDE_REQUESTS, - payload: rides + requests: rides } } diff --git a/src/redux/reducers/RideReducers.js b/src/redux/reducers/RideReducers.js index 3264ca9..f53416e 100644 --- a/src/redux/reducers/RideReducers.js +++ b/src/redux/reducers/RideReducers.js @@ -1,16 +1,23 @@ -import { UPDATE_RIDE_OFFERS, UPDATE_RIDE_REQUESTS } from '../types' +import { + UPDATE_RIDE_OFFERS, + UPDATE_YOUR_RIDE_OFFERS, + UPDATE_RIDE_REQUESTS +} from '../types' export const INITIAL_STATE = { offers: [], + yourOffers: [], requests: [] } export default (state = INITIAL_STATE, action) => { switch (action.type) { case UPDATE_RIDE_OFFERS: - return { ...state, offers: action.payload } + return { ...state, offers: action.offers } + case UPDATE_YOUR_RIDE_OFFERS: + return { ...state, yourOffers: action.yourOffers } case UPDATE_RIDE_REQUESTS: - return { ...state, requests: action.payload } + return { ...state, requests: action.requests } default: return state } diff --git a/src/redux/types/RideOfferTypes.js b/src/redux/types/RideOfferTypes.js index 0e0085a..60bb2bf 100644 --- a/src/redux/types/RideOfferTypes.js +++ b/src/redux/types/RideOfferTypes.js @@ -1,2 +1,3 @@ export const UPDATE_RIDE_OFFERS = 'update_ride_offers' +export const UPDATE_YOUR_RIDE_OFFERS = 'update_your_ride_offers' export const UPDATE_RIDE_REQUESTS = 'update_rides_requests' diff --git a/src/services/firebase/database/RideOffer.js b/src/services/firebase/database/RideOffer.js index f99c9ac..dbcf0da 100644 --- a/src/services/firebase/database/RideOffer.js +++ b/src/services/firebase/database/RideOffer.js @@ -34,10 +34,7 @@ export const getAllRideOffers = async (): Array => { export const getUserRideOffers = async (userId: string): Array => { const rides = await getAllRideOffers() - console.log(userId, 'is ===> userId') - console.log('Object rides !!!') console.log(JSON.stringify(rides.filter(ride => ride.driverId === userId))) - console.log('--------------------') return rides.filter(ride => ride.driverId === userId) } From c1b73048d8e42e2d7f0467e6a86a453c89370878 Mon Sep 17 00:00:00 2001 From: Eduardo Moroni Date: Tue, 3 Oct 2017 05:43:21 -0300 Subject: [PATCH 03/13] refactor(YourRideOffersScreen): move rides to redux state --- .../containers/YourRideOffersScreen.test.js | 2 ++ .../containers/YourRideOffersScreen.js | 31 ++++++++++--------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/__tests__/src/modules/rideOffer/containers/YourRideOffersScreen.test.js b/__tests__/src/modules/rideOffer/containers/YourRideOffersScreen.test.js index 83a7465..9bf989a 100644 --- a/__tests__/src/modules/rideOffer/containers/YourRideOffersScreen.test.js +++ b/__tests__/src/modules/rideOffer/containers/YourRideOffersScreen.test.js @@ -5,6 +5,8 @@ import { profileFixture } from '../../../../resources/fixtures/user' const props = { uid: profileFixture.uid, + updateYourOffers: jest.fn(), + yourOffers: [], navigator: { setOnNavigatorEvent: jest.fn() } diff --git a/src/modules/rideOffer/containers/YourRideOffersScreen.js b/src/modules/rideOffer/containers/YourRideOffersScreen.js index 24f5651..e6de598 100644 --- a/src/modules/rideOffer/containers/YourRideOffersScreen.js +++ b/src/modules/rideOffer/containers/YourRideOffersScreen.js @@ -12,30 +12,26 @@ import { getUserRideOffers, removeRideOffer } from '../../../services/firebase/database/RideOffer' - -// TODO: This should've be on redux -export const INITIAL_STATE = { - rides: [] -} +import { updateYourRideOffers } from '../../../redux/actions/sync/RideOfferActions' export class YourRideOffersScreen extends Component { static propTypes = { navigator: PropTypes.object.isRequired, - uid: PropTypes.string.isRequired + uid: PropTypes.string.isRequired, + updateYourOffers: PropTypes.func.isRequired, + yourOffers: PropTypes.array.isRequired } - state = INITIAL_STATE - constructor (props) { super(props) this.props.navigator.setOnNavigatorEvent(onNavigatorEvent.bind(this)) } async componentDidUpdate (prevProps) { - const { uid } = this.props + const { uid, updateYourOffers } = this.props if (uid && prevProps.uid !== uid) { const rides = await getUserRideOffers(uid) - this.setState({rides}) + updateYourOffers(rides) } } @@ -52,7 +48,7 @@ export class YourRideOffersScreen extends Component { return ( item.rideId} renderItem={({ item }) => } /> @@ -66,10 +62,17 @@ export class YourRideOffersScreen extends Component { } } -const mapStateToProps = (state) => { +const mapStateToProps = state => { + return { + uid: state.auth.profile.uid, + yourOffers: state.ride.yourOffers + } +} + +const mapDispatchToProps = dispatch => { return { - uid: state.auth.profile.uid + updateYourOffers: rides => dispatch(updateYourRideOffers(rides)) } } -export default connect(mapStateToProps)(YourRideOffersScreen) +export default connect(mapStateToProps, mapDispatchToProps)(YourRideOffersScreen) From 08e3fa5cb1d4c9c384efc9e7a27d3f35866593d8 Mon Sep 17 00:00:00 2001 From: Eduardo Moroni Date: Tue, 3 Oct 2017 05:56:25 -0300 Subject: [PATCH 04/13] refactor: rename RideRequestsListContainer to RideRequestsListContainer --- .../modules/rideRequest/containers/RideList.test.js | 2 +- .../containers/RideRequestsListContainer.js | 8 +++----- .../rideRequest/containers/styles/RideList.style.js | 8 -------- src/navigation/Screens.js | 10 +++++----- src/navigation/Tabs.js | 12 ++++++------ 5 files changed, 15 insertions(+), 25 deletions(-) rename src/modules/{rideRequest => rideOffer}/containers/RideRequestsListContainer.js (88%) delete mode 100644 src/modules/rideRequest/containers/styles/RideList.style.js diff --git a/__tests__/src/modules/rideRequest/containers/RideList.test.js b/__tests__/src/modules/rideRequest/containers/RideList.test.js index 5ba0f98..223580a 100644 --- a/__tests__/src/modules/rideRequest/containers/RideList.test.js +++ b/__tests__/src/modules/rideRequest/containers/RideList.test.js @@ -1,7 +1,7 @@ import 'react-native' import React from 'react' import { shallow } from 'enzyme' -import { RideList } from '../../../../../src/modules/rideRequest/containers/RideRequestsListContainer' +import { RideList } from '../../../../../src/modules/rideOffer/containers/RideRequestsListContainer' import { rideOfferFixture } from '../../../../resources/fixtures/ride/offer' const props = { diff --git a/src/modules/rideRequest/containers/RideRequestsListContainer.js b/src/modules/rideOffer/containers/RideRequestsListContainer.js similarity index 88% rename from src/modules/rideRequest/containers/RideRequestsListContainer.js rename to src/modules/rideOffer/containers/RideRequestsListContainer.js index 7859ee8..330a14b 100644 --- a/src/modules/rideRequest/containers/RideRequestsListContainer.js +++ b/src/modules/rideOffer/containers/RideRequestsListContainer.js @@ -3,11 +3,10 @@ import { connect } from 'react-redux' import { ListView } from 'react-native' import React, { Component } from 'react' -import { RidePropType } from '../types' -import { Ride } from '../components/Ride' -import styles from './styles/RideList.style' +import { RidePropType } from '../../rideRequest/types/index' +import { Ride } from '../../rideRequest/components/Ride' import { screens } from '../../../navigation/Screens' -import { fetchAllRideOffers } from '../../../redux/actions' +import { fetchAllRideOffers } from '../../../redux/actions/index' import { onNavigatorEvent } from '../../../navigation/NavBar' export class RideList extends Component { @@ -46,7 +45,6 @@ export class RideList extends Component { render () { return ( } enableEmptySections diff --git a/src/modules/rideRequest/containers/styles/RideList.style.js b/src/modules/rideRequest/containers/styles/RideList.style.js deleted file mode 100644 index e122728..0000000 --- a/src/modules/rideRequest/containers/styles/RideList.style.js +++ /dev/null @@ -1,8 +0,0 @@ -import { StyleSheet } from 'react-native' - -export default StyleSheet.create({ - container: { - flex: 1, - paddingTop: 20 - } -}) diff --git a/src/navigation/Screens.js b/src/navigation/Screens.js index 1928d45..654978e 100644 --- a/src/navigation/Screens.js +++ b/src/navigation/Screens.js @@ -1,7 +1,7 @@ import SignUpScreen from '../modules/authentication/containers/SignUpScreen' import ForgotPasswordScreen from '../modules/authentication/containers/ForgotPasswordScreen' import ProfileScreen from '../modules/authentication/containers/ProfileScreen' -import RideList from '../modules/rideRequest/containers/RideRequestsListContainer' +import RideList from '../modules/rideOffer/containers/RideRequestsListContainer' import RideOffer from '../modules/rideOffer/containers/NewRideOfferContainer' import RideRequest from '../modules/rideRequest/containers/NewRideRequestContainer' import YourRideOfferList from '../modules/rideOffer/containers/YourRideOffersScreen' @@ -26,11 +26,11 @@ export const screens = { component: ProfileScreen, title: 'Profile' }, - rideList: { + rideOfferList: { id: 'ride.list', component: RideList, - label: 'Ride List', - title: 'Ride List' + label: 'Offer List', + title: 'Offer List' }, rideOffer: { id: 'ride.offer', @@ -44,7 +44,7 @@ export const screens = { label: 'Ride Request', title: 'Ride Request' }, - rideOfferList: { + yourRideOffersList: { id: 'ride.offer.list', component: YourRideOfferList, label: 'Your Ride Offers', diff --git a/src/navigation/Tabs.js b/src/navigation/Tabs.js index 7b2e985..15da917 100644 --- a/src/navigation/Tabs.js +++ b/src/navigation/Tabs.js @@ -11,17 +11,17 @@ export const tabs = [ rightButtons: [profileButton] } }, { - label: screens.rideList.label, - screen: screens.rideList.id, - title: screens.rideList.title, + label: screens.rideOfferList.label, + screen: screens.rideOfferList.id, + title: screens.rideOfferList.title, icon: require('../assets/images/swap.png'), navigatorButtons: { rightButtons: [profileButton] } }, { - label: screens.rideOfferList.label, - screen: screens.rideOfferList.id, - title: screens.rideOfferList.title, + label: screens.yourRideOffersList.label, + screen: screens.yourRideOffersList.id, + title: screens.yourRideOffersList.title, icon: require('../assets/images/swap.png'), navigatorButtons: { rightButtons: [profileButton] From 5122764160edee95209eb4ba6557256dc46e0e8b Mon Sep 17 00:00:00 2001 From: Eduardo Moroni Date: Tue, 3 Oct 2017 06:05:17 -0300 Subject: [PATCH 05/13] refactor(RideList): set a loading view --- .../__snapshots__/Ride.test.js.snap | 266 +++++++++--------- .../rideRequest/containers/RideList.test.js | 2 +- .../__snapshots__/RideList.test.js.snap | 28 +- ...ontainer.js => RideOffersListContainer.js} | 26 +- src/modules/rideRequest/components/Ride.js | 33 +-- src/navigation/Screens.js | 2 +- src/services/firebase/database/RideOffer.js | 1 - 7 files changed, 180 insertions(+), 178 deletions(-) rename src/modules/rideOffer/containers/{RideRequestsListContainer.js => RideOffersListContainer.js} (73%) diff --git a/__tests__/src/modules/rideRequest/components/__snapshots__/Ride.test.js.snap b/__tests__/src/modules/rideRequest/components/__snapshots__/Ride.test.js.snap index ba4d5f8..ad3bec7 100644 --- a/__tests__/src/modules/rideRequest/components/__snapshots__/Ride.test.js.snap +++ b/__tests__/src/modules/rideRequest/components/__snapshots__/Ride.test.js.snap @@ -1,173 +1,169 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[` Should have a snapshot 1`] = ` - - - + + + + Bomfim + + - Bomfim + PUC - + - - - PUC - - - + + - - - Bomfim - - + Bomfim + + + - + - - - Seg-Sex - - - + + + + - - - 19h - - - + + + + - - - Eduardo Moroni - - + Eduardo Moroni + - - - - + + + + `; diff --git a/__tests__/src/modules/rideRequest/containers/RideList.test.js b/__tests__/src/modules/rideRequest/containers/RideList.test.js index 223580a..f6cc43f 100644 --- a/__tests__/src/modules/rideRequest/containers/RideList.test.js +++ b/__tests__/src/modules/rideRequest/containers/RideList.test.js @@ -1,7 +1,7 @@ import 'react-native' import React from 'react' import { shallow } from 'enzyme' -import { RideList } from '../../../../../src/modules/rideOffer/containers/RideRequestsListContainer' +import { RideList } from '../../../../../src/modules/rideOffer/containers/RideOffersListContainer' import { rideOfferFixture } from '../../../../resources/fixtures/ride/offer' const props = { diff --git a/__tests__/src/modules/rideRequest/containers/__snapshots__/RideList.test.js.snap b/__tests__/src/modules/rideRequest/containers/__snapshots__/RideList.test.js.snap index 06aa896..0eb2733 100644 --- a/__tests__/src/modules/rideRequest/containers/__snapshots__/RideList.test.js.snap +++ b/__tests__/src/modules/rideRequest/containers/__snapshots__/RideList.test.js.snap @@ -1,20 +1,18 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[` Should have a snapshot 1`] = ` - + + enableEmptySections={true} + renderRow={[Function]} + renderScrollComponent={[Function]} + /> + `; diff --git a/src/modules/rideOffer/containers/RideRequestsListContainer.js b/src/modules/rideOffer/containers/RideOffersListContainer.js similarity index 73% rename from src/modules/rideOffer/containers/RideRequestsListContainer.js rename to src/modules/rideOffer/containers/RideOffersListContainer.js index 330a14b..f8aee73 100644 --- a/src/modules/rideOffer/containers/RideRequestsListContainer.js +++ b/src/modules/rideOffer/containers/RideOffersListContainer.js @@ -8,6 +8,7 @@ import { Ride } from '../../rideRequest/components/Ride' import { screens } from '../../../navigation/Screens' import { fetchAllRideOffers } from '../../../redux/actions/index' import { onNavigatorEvent } from '../../../navigation/NavBar' +import { LoadingSpinnerView } from '../../shared/components/LoadingSpinnerView' export class RideList extends Component { static propTypes = { @@ -16,6 +17,10 @@ export class RideList extends Component { userId: PropTypes.string.isRequired } + state = { + loading: false + } + constructor (props) { super(props) const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1.id !== r2.id}) @@ -30,8 +35,13 @@ export class RideList extends Component { } } - componentDidMount () { - this.props.fetchRides() + async componentDidUpdate (prevProps) { + const { userId, fetchRides } = this.props + if (userId && prevProps.userId !== userId) { + this.setState({loading: true}) + await fetchRides() + this.setState({loading: false}) + } } onPress = (props) => { @@ -44,11 +54,13 @@ export class RideList extends Component { render () { return ( - } - enableEmptySections - /> + + } + enableEmptySections + /> + ) } } diff --git a/src/modules/rideRequest/components/Ride.js b/src/modules/rideRequest/components/Ride.js index 5f5de31..29a0c68 100644 --- a/src/modules/rideRequest/components/Ride.js +++ b/src/modules/rideRequest/components/Ride.js @@ -6,7 +6,6 @@ import { View, Text, TouchableOpacity } from 'react-native' import { RidePropType } from '../types' import Styles from './styles/Ride.style' -import { LoadingSpinnerView } from '../../shared/components/LoadingSpinnerView' export class Ride extends Component { static propTypes = { @@ -50,23 +49,21 @@ export class Ride extends Component { } = ride return ( - - this.onPress({ ride })}> - - - {destination} - { this.renderLine(origin, 'radio-button-unchecked') } - { this.renderLine(destination, 'radio-button-unchecked') } - - - { this.renderLine(days, 'today') } - { this.renderLine(hours, 'schedule') } - { this.renderLine(profile.name, 'directions-car') } - - {this.renderIcon()} - - - + this.onPress({ ride })}> + + + {destination} + { this.renderLine(origin, 'radio-button-unchecked') } + { this.renderLine(destination, 'radio-button-unchecked') } + + + { this.renderLine(days, 'today') } + { this.renderLine(hours, 'schedule') } + { this.renderLine(profile.name, 'directions-car') } + + {this.renderIcon()} + + ) } } diff --git a/src/navigation/Screens.js b/src/navigation/Screens.js index 654978e..148971f 100644 --- a/src/navigation/Screens.js +++ b/src/navigation/Screens.js @@ -1,7 +1,7 @@ import SignUpScreen from '../modules/authentication/containers/SignUpScreen' import ForgotPasswordScreen from '../modules/authentication/containers/ForgotPasswordScreen' import ProfileScreen from '../modules/authentication/containers/ProfileScreen' -import RideList from '../modules/rideOffer/containers/RideRequestsListContainer' +import RideList from '../modules/rideOffer/containers/RideOffersListContainer' import RideOffer from '../modules/rideOffer/containers/NewRideOfferContainer' import RideRequest from '../modules/rideRequest/containers/NewRideRequestContainer' import YourRideOfferList from '../modules/rideOffer/containers/YourRideOffersScreen' diff --git a/src/services/firebase/database/RideOffer.js b/src/services/firebase/database/RideOffer.js index dbcf0da..6a3d7b7 100644 --- a/src/services/firebase/database/RideOffer.js +++ b/src/services/firebase/database/RideOffer.js @@ -34,7 +34,6 @@ export const getAllRideOffers = async (): Array => { export const getUserRideOffers = async (userId: string): Array => { const rides = await getAllRideOffers() - console.log(JSON.stringify(rides.filter(ride => ride.driverId === userId))) return rides.filter(ride => ride.driverId === userId) } From 6cd422021cf1fc51585cba7d898fc9294657057e Mon Sep 17 00:00:00 2001 From: Eduardo Moroni Date: Tue, 3 Oct 2017 06:10:02 -0300 Subject: [PATCH 06/13] refactor: set a loading view to tab screens --- .../__snapshots__/RideOffer.test.js.snap | 228 +++++++++--------- .../YourRideOffersScreen.test.js.snap | 10 +- src/modules/rideOffer/components/RideOffer.js | 39 ++- .../containers/YourRideOffersScreen.js | 14 +- .../containers/YourRideRequestsScreen.js | 18 +- 5 files changed, 155 insertions(+), 154 deletions(-) diff --git a/__tests__/src/modules/rideOffer/components/__snapshots__/RideOffer.test.js.snap b/__tests__/src/modules/rideOffer/components/__snapshots__/RideOffer.test.js.snap index 3b2cfa2..d48f652 100644 --- a/__tests__/src/modules/rideOffer/components/__snapshots__/RideOffer.test.js.snap +++ b/__tests__/src/modules/rideOffer/components/__snapshots__/RideOffer.test.js.snap @@ -1,148 +1,144 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[` Should have a snapshot 1`] = ` - - - + + - + - - - PUC - - - + + + + - - - Bomfim - - + Bomfim + + + - + - - - Seg-Sex - - - + + + + - - - 19h - - + 19h + - + - - - + } + /> + + `; diff --git a/__tests__/src/modules/rideOffer/containers/__snapshots__/YourRideOffersScreen.test.js.snap b/__tests__/src/modules/rideOffer/containers/__snapshots__/YourRideOffersScreen.test.js.snap index b88ba83..cc1a3d5 100644 --- a/__tests__/src/modules/rideOffer/containers/__snapshots__/YourRideOffersScreen.test.js.snap +++ b/__tests__/src/modules/rideOffer/containers/__snapshots__/YourRideOffersScreen.test.js.snap @@ -1,12 +1,8 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[` Should have a snapshot 1`] = ` - Should have a snapshot 1`] = ` icon="md-create" onPress={[Function]} /> - + `; diff --git a/src/modules/rideOffer/components/RideOffer.js b/src/modules/rideOffer/components/RideOffer.js index c6c0a54..f0b881a 100644 --- a/src/modules/rideOffer/components/RideOffer.js +++ b/src/modules/rideOffer/components/RideOffer.js @@ -6,7 +6,6 @@ import { View, Text, TouchableOpacity } from 'react-native' import Styles from './styles/RideOffer.style' import { RkCard } from 'react-native-ui-kitten' import { RidePropType } from '../../rideRequest/types' -import { LoadingSpinnerView } from '../../shared/components/LoadingSpinnerView' export class RideOffer extends React.Component { static propTypes = { @@ -43,26 +42,24 @@ export class RideOffer extends React.Component { } = this.props.ride return ( - - this.onPress(rideId)}> - - - { this.renderLine(origin, 'radio-button-unchecked') } - { this.renderLine(destination, 'radio-button-unchecked') } - - - { this.renderLine(days, 'today') } - { this.renderLine(hours, 'schedule') } - - - - - + this.onPress(rideId)}> + + + { this.renderLine(origin, 'radio-button-unchecked') } + { this.renderLine(destination, 'radio-button-unchecked') } + + + { this.renderLine(days, 'today') } + { this.renderLine(hours, 'schedule') } + + + + ) } } diff --git a/src/modules/rideOffer/containers/YourRideOffersScreen.js b/src/modules/rideOffer/containers/YourRideOffersScreen.js index e6de598..91fcabb 100644 --- a/src/modules/rideOffer/containers/YourRideOffersScreen.js +++ b/src/modules/rideOffer/containers/YourRideOffersScreen.js @@ -1,7 +1,7 @@ import PropTypes from 'prop-types' import { connect } from 'react-redux' import React, { Component } from 'react' -import { FlatList, View } from 'react-native' +import { FlatList } from 'react-native' import { alert } from '../../../navigation/Alert' import { RideOffer } from '../components/RideOffer' @@ -13,6 +13,7 @@ import { removeRideOffer } from '../../../services/firebase/database/RideOffer' import { updateYourRideOffers } from '../../../redux/actions/sync/RideOfferActions' +import { LoadingSpinnerView } from '../../shared/components/LoadingSpinnerView' export class YourRideOffersScreen extends Component { static propTypes = { @@ -22,6 +23,10 @@ export class YourRideOffersScreen extends Component { yourOffers: PropTypes.array.isRequired } + state = { + loading: false + } + constructor (props) { super(props) this.props.navigator.setOnNavigatorEvent(onNavigatorEvent.bind(this)) @@ -30,8 +35,10 @@ export class YourRideOffersScreen extends Component { async componentDidUpdate (prevProps) { const { uid, updateYourOffers } = this.props if (uid && prevProps.uid !== uid) { + this.setState({loading: true}) const rides = await getUserRideOffers(uid) updateYourOffers(rides) + this.setState({loading: false}) } } @@ -46,7 +53,7 @@ export class YourRideOffersScreen extends Component { render () { return ( - + item.rideId} @@ -56,8 +63,7 @@ export class YourRideOffersScreen extends Component { icon='md-create' onPress={() => this.pushRideRequestScreen()} /> - - + ) } } diff --git a/src/modules/rideRequest/containers/YourRideRequestsScreen.js b/src/modules/rideRequest/containers/YourRideRequestsScreen.js index 0080f2b..1a41661 100644 --- a/src/modules/rideRequest/containers/YourRideRequestsScreen.js +++ b/src/modules/rideRequest/containers/YourRideRequestsScreen.js @@ -13,10 +13,12 @@ import { removeDuplicatedRequests, removeRideRequest } from '../../../services/firebase/database/RideRequest' +import { LoadingSpinnerView } from '../../shared/components/LoadingSpinnerView' export const INITIAL_STATE = { rides: [], - rideRequestsMap: {} + rideRequestsMap: {}, + loading: false } export class YourRideOffersScreen extends Component { @@ -33,11 +35,13 @@ export class YourRideOffersScreen extends Component { } async componentDidMount () { + this.setState({loading: true}) const rideRequests = await getUserRideRequests(this.props.uid) const rideRequestsMap = await removeDuplicatedRequests(rideRequests) const rideOffersPromises = rideRequests.map(({ rideId }) => findRideOfferById(rideId)) const rides = await Promise.all(rideOffersPromises) this.setState({rides, rideRequestsMap}) + this.setState({loading: false}) } async componentDidUpdate (prevProps) { @@ -70,11 +74,13 @@ export class YourRideOffersScreen extends Component { render () { return ( - rideId} - renderItem={({ item }) => } - /> + + rideId} + renderItem={({ item }) => } + /> + ) } } From 2c2e69ecd9ab6cf1ac4bdcd90d8f17476ed8e8ea Mon Sep 17 00:00:00 2001 From: Eduardo Moroni Date: Tue, 3 Oct 2017 06:18:28 -0300 Subject: [PATCH 07/13] refactor: move ridesRequest to redux state --- .../actions/async/RideRequestsActions.test.js | 4 ++-- .../actions/sync/RideRequestsActions.test.js | 4 ++-- .../redux/reducers/RideOfferReducers.test.js | 4 ++-- .../containers/YourRideRequestsScreen.js | 22 ++++++++++++++----- src/redux/actions/async/RideRequestActions.js | 4 ++-- src/redux/actions/sync/RideRequestActions.js | 2 +- 6 files changed, 25 insertions(+), 15 deletions(-) diff --git a/__tests__/src/redux/actions/async/RideRequestsActions.test.js b/__tests__/src/redux/actions/async/RideRequestsActions.test.js index 1363f4d..3e8d944 100644 --- a/__tests__/src/redux/actions/async/RideRequestsActions.test.js +++ b/__tests__/src/redux/actions/async/RideRequestsActions.test.js @@ -1,5 +1,5 @@ import { fetchAllRideRequests } from '../../../../../src/redux/actions/index' -import { updateRideRequests } from '../../../../../src/redux/actions/sync/RideRequestActions' +import { updateYourRideRequests } from '../../../../../src/redux/actions/sync/RideRequestActions' import * as FirebaseService from '../../../../../src/services/firebase/index' import { rideRequestFixture } from '../../../../resources/fixtures/ride/request' jest.mock('../../../../../src/services/firebase') @@ -10,7 +10,7 @@ describe('RideRequest async actions', () => { it('Should create a thunk for fetching all ride requests', async () => { FirebaseService.getAllRideRequests = jest.fn(() => rideRequestFixture) - const expectedAction = updateRideRequests(rideRequestFixture) + const expectedAction = updateYourRideRequests(rideRequestFixture) const thunk = fetchAllRideRequests() await thunk(dispatchMock) diff --git a/__tests__/src/redux/actions/sync/RideRequestsActions.test.js b/__tests__/src/redux/actions/sync/RideRequestsActions.test.js index ea6a469..c665c37 100644 --- a/__tests__/src/redux/actions/sync/RideRequestsActions.test.js +++ b/__tests__/src/redux/actions/sync/RideRequestsActions.test.js @@ -1,5 +1,5 @@ import { UPDATE_RIDE_REQUESTS } from '../../../../../src/redux/types/index' -import { updateRideRequests } from '../../../../../src/redux/actions/sync/RideRequestActions' +import { updateYourRideRequests } from '../../../../../src/redux/actions/sync/RideRequestActions' import { rideRequestFixture } from '../../../../resources/fixtures/ride/request' describe('RideRequest sync actions', () => { @@ -9,7 +9,7 @@ describe('RideRequest sync actions', () => { type: UPDATE_RIDE_REQUESTS, requests: rides } - const action = updateRideRequests(rides) + const action = updateYourRideRequests(rides) expect(action).toEqual(expectedAction) }) diff --git a/__tests__/src/redux/reducers/RideOfferReducers.test.js b/__tests__/src/redux/reducers/RideOfferReducers.test.js index c0a6c61..df962d2 100644 --- a/__tests__/src/redux/reducers/RideOfferReducers.test.js +++ b/__tests__/src/redux/reducers/RideOfferReducers.test.js @@ -1,5 +1,5 @@ import RideOfferReducers, { INITIAL_STATE } from '../../../../src/redux/reducers/RideReducers' -import { updateRideRequests } from '../../../../src/redux/actions/sync/RideRequestActions' +import { updateYourRideRequests } from '../../../../src/redux/actions/sync/RideRequestActions' import { updateRideOffers, updateYourRideOffers } from '../../../../src/redux/actions/sync/RideOfferActions' import { rideOfferFixture } from '../../../resources/fixtures/ride/offer' @@ -21,7 +21,7 @@ describe('RideOfferReducers', () => { }) it('Should handle UPDATE_RIDE_REQUESTS action type', async () => { - const action = updateRideRequests([rideOfferFixture]) + const action = updateYourRideRequests([rideOfferFixture]) const state = RideOfferReducers(INITIAL_STATE, action) const expectedState = { ...INITIAL_STATE, requests: action.requests } diff --git a/src/modules/rideRequest/containers/YourRideRequestsScreen.js b/src/modules/rideRequest/containers/YourRideRequestsScreen.js index 1a41661..c330cef 100644 --- a/src/modules/rideRequest/containers/YourRideRequestsScreen.js +++ b/src/modules/rideRequest/containers/YourRideRequestsScreen.js @@ -14,15 +14,17 @@ import { removeRideRequest } from '../../../services/firebase/database/RideRequest' import { LoadingSpinnerView } from '../../shared/components/LoadingSpinnerView' +import { updateYourRideRequests } from '../../../redux/actions/sync/RideRequestActions' export const INITIAL_STATE = { - rides: [], rideRequestsMap: {}, loading: false } -export class YourRideOffersScreen extends Component { +export class YourRideRequestsScreen extends Component { static propTypes = { + updateYourRequests: PropTypes.func.isRequired, + yourRideRequests: PropTypes.array.isRequired, navigator: PropTypes.object.isRequired, uid: PropTypes.string.isRequired } @@ -40,7 +42,8 @@ export class YourRideOffersScreen extends Component { const rideRequestsMap = await removeDuplicatedRequests(rideRequests) const rideOffersPromises = rideRequests.map(({ rideId }) => findRideOfferById(rideId)) const rides = await Promise.all(rideOffersPromises) - this.setState({rides, rideRequestsMap}) + this.setState({rideRequestsMap}) + this.props.updateYourRequests(rides) this.setState({loading: false}) } @@ -76,7 +79,7 @@ export class YourRideOffersScreen extends Component { return ( rideId} renderItem={({ item }) => } /> @@ -87,8 +90,15 @@ export class YourRideOffersScreen extends Component { const mapStateToProps = (state) => { return { - uid: state.auth.profile.uid + uid: state.auth.profile.uid, + yourRideRequests: state.ride.requests } } -export default connect(mapStateToProps)(YourRideOffersScreen) +const mapDispatchToProps = dispatch => { + return { + updateYourRequests: rides => dispatch(updateYourRideRequests(rides)) + } +} + +export default connect(mapStateToProps, mapDispatchToProps)(YourRideRequestsScreen) diff --git a/src/redux/actions/async/RideRequestActions.js b/src/redux/actions/async/RideRequestActions.js index 6bedf15..d053fba 100644 --- a/src/redux/actions/async/RideRequestActions.js +++ b/src/redux/actions/async/RideRequestActions.js @@ -1,10 +1,10 @@ import { getAllRideRequests } from '../../../services/firebase' -import { updateRideRequests } from '../sync/RideRequestActions' +import { updateYourRideRequests } from '../sync/RideRequestActions' export function fetchAllRideRequests () { return async (dispatch) => { const rides = await getAllRideRequests() - const action = updateRideRequests(rides) + const action = updateYourRideRequests(rides) dispatch(action) } } diff --git a/src/redux/actions/sync/RideRequestActions.js b/src/redux/actions/sync/RideRequestActions.js index 6fe5389..e0cb862 100644 --- a/src/redux/actions/sync/RideRequestActions.js +++ b/src/redux/actions/sync/RideRequestActions.js @@ -1,7 +1,7 @@ import { UPDATE_RIDE_REQUESTS } from '../../types/index' import type { RideRequestFlowType } from '../../../services/firebase/types' -export const updateRideRequests = (rides: Array) => { +export const updateYourRideRequests = (rides: Array) => { return { type: UPDATE_RIDE_REQUESTS, requests: rides From be0a069518cc3da404433e43f6155846d22c7833 Mon Sep 17 00:00:00 2001 From: Eduardo Moroni Date: Tue, 3 Oct 2017 06:29:43 -0300 Subject: [PATCH 08/13] refactor: improve alert message --- .../rideOffer/containers/NewRideOfferContainer.js | 8 ++++++-- .../rideRequest/containers/NewRideRequestContainer.js | 10 ++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/modules/rideOffer/containers/NewRideOfferContainer.js b/src/modules/rideOffer/containers/NewRideOfferContainer.js index 029a933..4b7a3fd 100644 --- a/src/modules/rideOffer/containers/NewRideOfferContainer.js +++ b/src/modules/rideOffer/containers/NewRideOfferContainer.js @@ -18,8 +18,12 @@ export class NewRideOfferContainer extends Component { } offerRide = async (rideOffer) => { - const saved = await saveRideOffer(rideOffer, this.props.userId) - if (saved) alert('Success') + try { + await saveRideOffer(rideOffer, this.props.userId) + alert('Success') + } catch (error) { + alert('Error') + } } render () { diff --git a/src/modules/rideRequest/containers/NewRideRequestContainer.js b/src/modules/rideRequest/containers/NewRideRequestContainer.js index 7657bcf..e31aea0 100644 --- a/src/modules/rideRequest/containers/NewRideRequestContainer.js +++ b/src/modules/rideRequest/containers/NewRideRequestContainer.js @@ -11,10 +11,12 @@ export class RideRequestScreen extends Component { userId: PropTypes.string.isRequired } - askForRide = (rideId: string) => async () => { - const ride = await saveRideRequest(rideId, this.props.userId) - if (ride) { + newRideRequest = (rideId: string) => async () => { + try { + await saveRideRequest(rideId, this.props.userId) alert('Success') + } catch (error) { + alert('Error') } } @@ -22,7 +24,7 @@ export class RideRequestScreen extends Component { return ( ) } From c101fc982fb76534a1f8ff4cc8cac397955c1183 Mon Sep 17 00:00:00 2001 From: Eduardo Moroni Date: Tue, 3 Oct 2017 06:38:53 -0300 Subject: [PATCH 09/13] feat: add thunk for update user ride offers --- .../containers/YourRideOffersScreen.test.js | 2 +- .../containers/RideOfferScreen.test.js | 1 + .../redux/actions/async/RideOfferActions.test.js | 16 +++++++++++++--- .../containers/NewRideOfferContainer.js | 12 +++++++++++- .../rideOffer/containers/YourRideOffersScreen.js | 12 ++++-------- src/redux/actions/async/RideOfferActions.js | 12 ++++++++++-- 6 files changed, 40 insertions(+), 15 deletions(-) diff --git a/__tests__/src/modules/rideOffer/containers/YourRideOffersScreen.test.js b/__tests__/src/modules/rideOffer/containers/YourRideOffersScreen.test.js index 9bf989a..a6822a0 100644 --- a/__tests__/src/modules/rideOffer/containers/YourRideOffersScreen.test.js +++ b/__tests__/src/modules/rideOffer/containers/YourRideOffersScreen.test.js @@ -4,7 +4,7 @@ import { YourRideOffersScreen } from '../../../../../src/modules/rideOffer/conta import { profileFixture } from '../../../../resources/fixtures/user' const props = { - uid: profileFixture.uid, + uid: profileFixture.contact.uid, updateYourOffers: jest.fn(), yourOffers: [], navigator: { diff --git a/__tests__/src/modules/rideRequest/containers/RideOfferScreen.test.js b/__tests__/src/modules/rideRequest/containers/RideOfferScreen.test.js index f8a94f2..4308ded 100644 --- a/__tests__/src/modules/rideRequest/containers/RideOfferScreen.test.js +++ b/__tests__/src/modules/rideRequest/containers/RideOfferScreen.test.js @@ -6,6 +6,7 @@ const props = { navigator: { setOnNavigatorEvent: jest.fn() }, + updateYourOffers: jest.fn(), userId: 'someId' } diff --git a/__tests__/src/redux/actions/async/RideOfferActions.test.js b/__tests__/src/redux/actions/async/RideOfferActions.test.js index c826a21..cfe524a 100644 --- a/__tests__/src/redux/actions/async/RideOfferActions.test.js +++ b/__tests__/src/redux/actions/async/RideOfferActions.test.js @@ -1,7 +1,7 @@ -import { fetchAllRideOffers } from '../../../../../src/redux/actions/index' -import * as FirebaseService from '../../../../../src/services/firebase/index' -import { updateRideOffers } from '../../../../../src/redux/actions/sync/RideOfferActions' import { rideOfferFixture } from '../../../../resources/fixtures/ride/offer' +import { fetchAllRideOffers, fetchYourRideOffers } from '../../../../../src/redux/actions' +import { updateRideOffers, updateYourRideOffers } from '../../../../../src/redux/actions/sync/RideOfferActions' +import * as FirebaseService from '../../../../../src/services/firebase' jest.mock('../../../../../src/services/firebase') describe('RideOffer async actions', () => { @@ -16,4 +16,14 @@ describe('RideOffer async actions', () => { expect(dispatchMock).toHaveBeenCalledWith(expectedAction) }) + + it('Should create a thunk for fetching your ride offers', async () => { + FirebaseService.getUserRideOffers = jest.fn(() => rideOfferFixture) + + const expectedAction = updateYourRideOffers(rideOfferFixture) + const thunk = fetchYourRideOffers('uid') + await thunk(dispatchMock) + + expect(dispatchMock).toHaveBeenCalledWith(expectedAction) + }) }) diff --git a/src/modules/rideOffer/containers/NewRideOfferContainer.js b/src/modules/rideOffer/containers/NewRideOfferContainer.js index 4b7a3fd..7be6f69 100644 --- a/src/modules/rideOffer/containers/NewRideOfferContainer.js +++ b/src/modules/rideOffer/containers/NewRideOfferContainer.js @@ -5,10 +5,12 @@ import PropTypes from 'prop-types' import { onNavigatorEvent } from '../../../navigation/NavBar' import { saveRideOffer } from '../../../services/firebase' import { NewRideOffer } from '../components/NewRideOffer' +import { fetchYourRideOffers } from '../../../redux/actions/async/RideOfferActions' export class NewRideOfferContainer extends Component { static propTypes = { navigator: PropTypes.object.isRequired, + updateYourOffers: PropTypes.func.isRequired, userId: PropTypes.string.isRequired } @@ -18,8 +20,10 @@ export class NewRideOfferContainer extends Component { } offerRide = async (rideOffer) => { + const { updateYourOffers, userId } = this.props try { await saveRideOffer(rideOffer, this.props.userId) + await updateYourOffers(userId) alert('Success') } catch (error) { alert('Error') @@ -37,4 +41,10 @@ const mapStateToProps = (state) => { } } -export default connect(mapStateToProps)(NewRideOfferContainer) +const mapDispatchToProps = dispatch => { + return { + updateYourOffers: uid => dispatch(fetchYourRideOffers(uid)) + } +} + +export default connect(mapStateToProps, mapDispatchToProps)(NewRideOfferContainer) diff --git a/src/modules/rideOffer/containers/YourRideOffersScreen.js b/src/modules/rideOffer/containers/YourRideOffersScreen.js index 91fcabb..49862ef 100644 --- a/src/modules/rideOffer/containers/YourRideOffersScreen.js +++ b/src/modules/rideOffer/containers/YourRideOffersScreen.js @@ -8,12 +8,9 @@ import { RideOffer } from '../components/RideOffer' import { screens } from '../../../navigation/Screens' import { onNavigatorEvent } from '../../../navigation/NavBar' import { FloatingActionButton } from '../../shared/components/FloatingActionButton' -import { - getUserRideOffers, - removeRideOffer -} from '../../../services/firebase/database/RideOffer' -import { updateYourRideOffers } from '../../../redux/actions/sync/RideOfferActions' +import { removeRideOffer } from '../../../services/firebase/database/RideOffer' import { LoadingSpinnerView } from '../../shared/components/LoadingSpinnerView' +import { fetchYourRideOffers } from '../../../redux/actions/async/RideOfferActions' export class YourRideOffersScreen extends Component { static propTypes = { @@ -36,8 +33,7 @@ export class YourRideOffersScreen extends Component { const { uid, updateYourOffers } = this.props if (uid && prevProps.uid !== uid) { this.setState({loading: true}) - const rides = await getUserRideOffers(uid) - updateYourOffers(rides) + updateYourOffers(uid) this.setState({loading: false}) } } @@ -77,7 +73,7 @@ const mapStateToProps = state => { const mapDispatchToProps = dispatch => { return { - updateYourOffers: rides => dispatch(updateYourRideOffers(rides)) + updateYourOffers: uid => dispatch(fetchYourRideOffers(uid)) } } diff --git a/src/redux/actions/async/RideOfferActions.js b/src/redux/actions/async/RideOfferActions.js index d346d89..41f4968 100644 --- a/src/redux/actions/async/RideOfferActions.js +++ b/src/redux/actions/async/RideOfferActions.js @@ -1,5 +1,5 @@ -import { getAllRideOffers } from '../../../services/firebase' -import { updateRideOffers } from '../sync/RideOfferActions' +import { getAllRideOffers, getUserRideOffers } from '../../../services/firebase' +import { updateRideOffers, updateYourRideOffers } from '../sync/RideOfferActions' export function fetchAllRideOffers () { return async (dispatch) => { @@ -8,3 +8,11 @@ export function fetchAllRideOffers () { dispatch(action) } } + +export function fetchYourRideOffers (uid: string) { + return async (dispatch) => { + const rides = await getUserRideOffers(uid) + const action = updateYourRideOffers(rides) + dispatch(action) + } +} From cfd8386f616f43a736ff5387d503e48034acde99 Mon Sep 17 00:00:00 2001 From: Eduardo Moroni Date: Tue, 3 Oct 2017 07:11:55 -0300 Subject: [PATCH 10/13] feat: add thunk for update user ride requests --- .../rideOffer/components/RideOffer.test.js | 3 ++- .../actions/async/RideRequestsActions.test.js | 19 -------------- .../redux/reducers/RideOfferReducers.test.js | 3 ++- .../containers/NewRideRequestContainer.js | 12 ++++++++- .../containers/YourRideRequestsScreen.js | 25 ++++++------------- src/redux/actions/async/RideRequestActions.js | 12 ++++++--- src/redux/actions/sync/RideRequestActions.js | 7 +++--- src/redux/reducers/RideReducers.js | 6 +++-- src/services/firebase/database/RideRequest.js | 4 +-- src/services/firebase/types.js | 4 +++ 10 files changed, 45 insertions(+), 50 deletions(-) delete mode 100644 __tests__/src/redux/actions/async/RideRequestsActions.test.js diff --git a/__tests__/src/modules/rideOffer/components/RideOffer.test.js b/__tests__/src/modules/rideOffer/components/RideOffer.test.js index 83dadbc..1ec59ea 100644 --- a/__tests__/src/modules/rideOffer/components/RideOffer.test.js +++ b/__tests__/src/modules/rideOffer/components/RideOffer.test.js @@ -4,7 +4,8 @@ import { RideOffer } from '../../../../../src/modules/rideOffer/components/RideO import { rideOfferFixture } from '../../../../resources/fixtures/ride/offer' const props = { - ride: rideOfferFixture + ride: rideOfferFixture, + onPress: jest.fn() } describe('', () => { diff --git a/__tests__/src/redux/actions/async/RideRequestsActions.test.js b/__tests__/src/redux/actions/async/RideRequestsActions.test.js deleted file mode 100644 index 3e8d944..0000000 --- a/__tests__/src/redux/actions/async/RideRequestsActions.test.js +++ /dev/null @@ -1,19 +0,0 @@ -import { fetchAllRideRequests } from '../../../../../src/redux/actions/index' -import { updateYourRideRequests } from '../../../../../src/redux/actions/sync/RideRequestActions' -import * as FirebaseService from '../../../../../src/services/firebase/index' -import { rideRequestFixture } from '../../../../resources/fixtures/ride/request' -jest.mock('../../../../../src/services/firebase') - -describe('RideRequest async actions', () => { - const dispatchMock = jest.fn() - - it('Should create a thunk for fetching all ride requests', async () => { - FirebaseService.getAllRideRequests = jest.fn(() => rideRequestFixture) - - const expectedAction = updateYourRideRequests(rideRequestFixture) - const thunk = fetchAllRideRequests() - await thunk(dispatchMock) - - expect(dispatchMock).toHaveBeenCalledWith(expectedAction) - }) -}) diff --git a/__tests__/src/redux/reducers/RideOfferReducers.test.js b/__tests__/src/redux/reducers/RideOfferReducers.test.js index df962d2..9d623ec 100644 --- a/__tests__/src/redux/reducers/RideOfferReducers.test.js +++ b/__tests__/src/redux/reducers/RideOfferReducers.test.js @@ -23,7 +23,8 @@ describe('RideOfferReducers', () => { it('Should handle UPDATE_RIDE_REQUESTS action type', async () => { const action = updateYourRideRequests([rideOfferFixture]) const state = RideOfferReducers(INITIAL_STATE, action) - const expectedState = { ...INITIAL_STATE, requests: action.requests } + const { requests, requestsIdMap } = action + const expectedState = { ...INITIAL_STATE, requests, requestsIdMap } expect(state).toEqual(expectedState) }) diff --git a/src/modules/rideRequest/containers/NewRideRequestContainer.js b/src/modules/rideRequest/containers/NewRideRequestContainer.js index e31aea0..def9c99 100644 --- a/src/modules/rideRequest/containers/NewRideRequestContainer.js +++ b/src/modules/rideRequest/containers/NewRideRequestContainer.js @@ -4,16 +4,20 @@ import { connect } from 'react-redux' import { NewRideRequest } from '../components/NewRideRequest' import { RidePropType } from '../types' import { saveRideRequest } from '../../../services/firebase' +import { fetchYourRideRequests } from '../../../redux/actions/async/RideRequestActions' export class RideRequestScreen extends Component { static propTypes = { ride: RidePropType.isRequired, + updateYourRequests: PropTypes.func.isRequired, userId: PropTypes.string.isRequired } newRideRequest = (rideId: string) => async () => { + const { updateYourRequests, userId } = this.props try { await saveRideRequest(rideId, this.props.userId) + await updateYourRequests(userId) alert('Success') } catch (error) { alert('Error') @@ -36,4 +40,10 @@ const mapStateToProps = (state) => { } } -export default connect(mapStateToProps)(RideRequestScreen) +const mapDispatchToProps = dispatch => { + return { + updateYourRequests: uid => dispatch(fetchYourRideRequests(uid)) + } +} + +export default connect(mapStateToProps, mapDispatchToProps)(RideRequestScreen) diff --git a/src/modules/rideRequest/containers/YourRideRequestsScreen.js b/src/modules/rideRequest/containers/YourRideRequestsScreen.js index c330cef..8d3c253 100644 --- a/src/modules/rideRequest/containers/YourRideRequestsScreen.js +++ b/src/modules/rideRequest/containers/YourRideRequestsScreen.js @@ -7,17 +7,11 @@ import Icon from 'react-native-vector-icons/MaterialIcons' import { Ride } from '../components/Ride' import { alert } from '../../../navigation/Alert' import { onNavigatorEvent } from '../../../navigation/NavBar' -import { findRideOfferById } from '../../../services/firebase/database/RideOffer' -import { - getUserRideRequests, - removeDuplicatedRequests, - removeRideRequest -} from '../../../services/firebase/database/RideRequest' +import { removeRideRequest } from '../../../services/firebase/database/RideRequest' import { LoadingSpinnerView } from '../../shared/components/LoadingSpinnerView' -import { updateYourRideRequests } from '../../../redux/actions/sync/RideRequestActions' +import { fetchYourRideRequests } from '../../../redux/actions/async/RideRequestActions' export const INITIAL_STATE = { - rideRequestsMap: {}, loading: false } @@ -25,6 +19,7 @@ export class YourRideRequestsScreen extends Component { static propTypes = { updateYourRequests: PropTypes.func.isRequired, yourRideRequests: PropTypes.array.isRequired, + rideRequestsMap: PropTypes.object.isRequired, navigator: PropTypes.object.isRequired, uid: PropTypes.string.isRequired } @@ -38,12 +33,7 @@ export class YourRideRequestsScreen extends Component { async componentDidMount () { this.setState({loading: true}) - const rideRequests = await getUserRideRequests(this.props.uid) - const rideRequestsMap = await removeDuplicatedRequests(rideRequests) - const rideOffersPromises = rideRequests.map(({ rideId }) => findRideOfferById(rideId)) - const rides = await Promise.all(rideOffersPromises) - this.setState({rideRequestsMap}) - this.props.updateYourRequests(rides) + this.props.updateYourRequests(this.props.uid) this.setState({loading: false}) } @@ -69,7 +59,7 @@ export class YourRideRequestsScreen extends Component { } onPressRide = (props) => { - const { rideRequestsMap } = this.state + const { rideRequestsMap } = this.props const { rideId } = props.ride const rideRequest = rideRequestsMap[rideId] alert('Delete Ride Request', () => removeRideRequest(rideRequest)) @@ -91,13 +81,14 @@ export class YourRideRequestsScreen extends Component { const mapStateToProps = (state) => { return { uid: state.auth.profile.uid, - yourRideRequests: state.ride.requests + yourRideRequests: state.ride.requests, + rideRequestsMap: state.ride.requestsIdMap } } const mapDispatchToProps = dispatch => { return { - updateYourRequests: rides => dispatch(updateYourRideRequests(rides)) + updateYourRequests: uid => dispatch(fetchYourRideRequests(uid)) } } diff --git a/src/redux/actions/async/RideRequestActions.js b/src/redux/actions/async/RideRequestActions.js index d053fba..f075d7b 100644 --- a/src/redux/actions/async/RideRequestActions.js +++ b/src/redux/actions/async/RideRequestActions.js @@ -1,10 +1,14 @@ -import { getAllRideRequests } from '../../../services/firebase' import { updateYourRideRequests } from '../sync/RideRequestActions' +import { getUserRideRequests, removeDuplicatedRequests } from '../../../services/firebase/database/RideRequest' +import { findRideOfferById } from '../../../services/firebase/database/RideOffer' -export function fetchAllRideRequests () { +export function fetchYourRideRequests (uid: string) { return async (dispatch) => { - const rides = await getAllRideRequests() - const action = updateYourRideRequests(rides) + const rideRequests = await getUserRideRequests(uid) + const rideRequestsMap = await removeDuplicatedRequests(rideRequests) + const rideOffersPromises = rideRequests.map(({ rideId }) => findRideOfferById(rideId)) + const rides = await Promise.all(rideOffersPromises) + const action = updateYourRideRequests(rides, rideRequestsMap) dispatch(action) } } diff --git a/src/redux/actions/sync/RideRequestActions.js b/src/redux/actions/sync/RideRequestActions.js index e0cb862..f0f13ff 100644 --- a/src/redux/actions/sync/RideRequestActions.js +++ b/src/redux/actions/sync/RideRequestActions.js @@ -1,9 +1,10 @@ import { UPDATE_RIDE_REQUESTS } from '../../types/index' -import type { RideRequestFlowType } from '../../../services/firebase/types' +import type { RideRequestFlowType, RideRequestIdMapFlowType } from '../../../services/firebase/types' -export const updateYourRideRequests = (rides: Array) => { +export const updateYourRideRequests = (rides: Array, rideRequestsMap: RideRequestIdMapFlowType) => { return { type: UPDATE_RIDE_REQUESTS, - requests: rides + requests: rides, + requestsIdMap: rideRequestsMap } } diff --git a/src/redux/reducers/RideReducers.js b/src/redux/reducers/RideReducers.js index f53416e..7cfa5fc 100644 --- a/src/redux/reducers/RideReducers.js +++ b/src/redux/reducers/RideReducers.js @@ -7,7 +7,8 @@ import { export const INITIAL_STATE = { offers: [], yourOffers: [], - requests: [] + requests: [], + requestsIdMap: {} } export default (state = INITIAL_STATE, action) => { @@ -17,7 +18,8 @@ export default (state = INITIAL_STATE, action) => { case UPDATE_YOUR_RIDE_OFFERS: return { ...state, yourOffers: action.yourOffers } case UPDATE_RIDE_REQUESTS: - return { ...state, requests: action.requests } + const { requests, requestsIdMap } = action + return { ...state, requests, requestsIdMap } default: return state } diff --git a/src/services/firebase/database/RideRequest.js b/src/services/firebase/database/RideRequest.js index 02c9393..4cb0e34 100644 --- a/src/services/firebase/database/RideRequest.js +++ b/src/services/firebase/database/RideRequest.js @@ -2,7 +2,7 @@ import { toArrayOfRideRequests } from '../Conversion' import { getUserProfile } from './Profile' -import type { RideRequestFlowType, ProfileType } from '../types' +import type { RideRequestFlowType, ProfileType, RideRequestIdMapFlowType } from '../types' import { rideGroup, ref } from './' export const saveRideRequest = async (rideId: string, userId: string) => { @@ -33,7 +33,7 @@ export const removeRideRequest = async (ride: RideRequestFlowType) => { } export const removeDuplicatedRequests = async (rides: Array) - : {[rideId: string]: RideRequestFlowType} => { + : RideRequestIdMapFlowType => { let rideRequestsMap = {} let promiseArray = [] diff --git a/src/services/firebase/types.js b/src/services/firebase/types.js index 62cb9b4..94a95cf 100644 --- a/src/services/firebase/types.js +++ b/src/services/firebase/types.js @@ -52,3 +52,7 @@ export type FirebaseRideRequests = { } } } + +export type RideRequestIdMapFlowType = { + [rideId: string]: RideRequestFlowType +} From afbddb9341190fa0f7aac91bed6071c0dddfcc1b Mon Sep 17 00:00:00 2001 From: Eduardo Moroni Date: Tue, 3 Oct 2017 07:23:02 -0300 Subject: [PATCH 11/13] feat: don't authenticate during sigup --- __tests__/resources/mocks/firebase.js | 23 ++++++++++++++++++ .../services/firebase/Authentication.test.js | 16 +++++-------- .../src/services/firebase/Database.test.js | 6 ++--- src/services/firebase/Authentication.js | 24 +++++++++---------- src/services/firebase/database/index.js | 2 +- 5 files changed, 44 insertions(+), 27 deletions(-) diff --git a/__tests__/resources/mocks/firebase.js b/__tests__/resources/mocks/firebase.js index e69de29..074c258 100644 --- a/__tests__/resources/mocks/firebase.js +++ b/__tests__/resources/mocks/firebase.js @@ -0,0 +1,23 @@ +import { firebaseUserFixture } from '../fixtures/firebase' + +export const mockCreateUser = jest.fn(() => Promise.resolve(firebaseUserFixture)) +export const mockSignInUser = jest.fn(() => Promise.resolve(firebaseUserFixture)) + +export const authMock = { + signInWithEmailAndPassword: mockSignInUser, + createUserWithEmailAndPassword: mockCreateUser, + signOut: jest.fn(), + fetchProvidersForEmail: jest.fn(), + currentUser: { uid: '12345' }, + setPersistence: jest.fn() +} + +export const mockUpdate = jest.fn(() => Promise.resolve()) +export const databaseMock = { + ref: jest.fn(() => ({ + update: mockUpdate, + child: () => ({ + once: () => Promise.resolve({ val: jest.fn() }) + }) + })) +} diff --git a/__tests__/src/services/firebase/Authentication.test.js b/__tests__/src/services/firebase/Authentication.test.js index c02e38b..3d69100 100644 --- a/__tests__/src/services/firebase/Authentication.test.js +++ b/__tests__/src/services/firebase/Authentication.test.js @@ -2,31 +2,27 @@ import { signUp, checkEmailRegistration, signIn, - sendVerificationEmail, initializeAuthModule + sendVerificationEmail, + initializeAuthModule } from '../../../../src/services/firebase/Authentication' import { firebaseUserFixture } from '../../../resources/fixtures/firebase' +import { initializeDatabaseModule } from '../../../../src/services/firebase/database/index' +import { authMock, databaseMock, mockCreateUser, mockSignInUser, mockUpdate } from '../../../resources/mocks/firebase' describe('Firebase authentication service', () => { const email = 'new@user.com' const password = 'pass123' - const mockCreateUser = jest.fn(() => Promise.resolve(firebaseUserFixture)) - const mockSignInUser = jest.fn(() => Promise.resolve(firebaseUserFixture)) - const authMock = { - signInWithEmailAndPassword: mockSignInUser, - createUserWithEmailAndPassword: mockCreateUser, - fetchProvidersForEmail: jest.fn(), - currentUser: { uid: '12345' }, - setPersistence: jest.fn() - } beforeAll(() => { initializeAuthModule(authMock) + initializeDatabaseModule(databaseMock) }) it('Should register new user and send a verification mail', async () => { await signUp(email, password) expect(mockCreateUser).toHaveBeenCalledWith(email, password) expect(firebaseUserFixture.sendEmailVerification).toHaveBeenCalledWith() + expect(mockUpdate).toHaveBeenCalledWith({ name: email, uid: firebaseUserFixture.uid }) }) it('Should sign in user with a verified email', async () => { diff --git a/__tests__/src/services/firebase/Database.test.js b/__tests__/src/services/firebase/Database.test.js index 7d654bf..bd1e40e 100644 --- a/__tests__/src/services/firebase/Database.test.js +++ b/__tests__/src/services/firebase/Database.test.js @@ -6,15 +6,15 @@ import { updateRideOffer, removeRideOffer } from '../../../../src/services/firebase' -import RidesResponse from '../../../resources/fixtures/firebase/FirebaseRidesResponse.json' import ProfileResponse from '../../../resources/fixtures/firebase/FirebaseProfileResponse.json' +export const mockUpdate = jest.fn(() => Promise.resolve()) const mockRef = { remove: jest.fn(() => Promise.resolve()), - update: jest.fn(() => Promise.resolve()), push: jest.fn(() => Promise.resolve()), + update: mockUpdate, child: () => ({ - once: () => Promise.resolve({ val: () => RidesResponse }) + once: () => Promise.resolve({ val: jest.fn() }) }), once: () => Promise.resolve({ val: () => ProfileResponse }) } diff --git a/src/services/firebase/Authentication.js b/src/services/firebase/Authentication.js index baa386d..88afbed 100644 --- a/src/services/firebase/Authentication.js +++ b/src/services/firebase/Authentication.js @@ -1,4 +1,5 @@ import Firebase from 'firebase' +import { saveProfile } from './database/Profile' let auth @@ -21,12 +22,14 @@ export const signIn = async (email: string, password: string) => { } export const signUp = async (email: string, password: string) => { - try { - const user = await auth.createUserWithEmailAndPassword(email, password) - await sendVerificationEmail(user) - } catch (error) { - console.error(error) - } + const user = await auth.createUserWithEmailAndPassword(email, password) + await saveProfile({name: email, uid: user.uid}) + await sendVerificationEmail(user) + await signOut() +} + +export const signOut = async () => { + return auth.signOut() } export const checkEmailRegistration = async (email: string) => { @@ -35,14 +38,9 @@ export const checkEmailRegistration = async (email: string) => { } export const sendVerificationEmail = async (user) => { - try { - await user.sendEmailVerification() - console.log('Email de verificação enviado') - } catch (error) { - console.error(error) - } + return user.sendEmailVerification() } -export const forgotPassword = (email) => { +export const forgotPassword = async (email) => { return auth.sendPasswordResetEmail(email) } diff --git a/src/services/firebase/database/index.js b/src/services/firebase/database/index.js index 8e455cd..b28b6c8 100644 --- a/src/services/firebase/database/index.js +++ b/src/services/firebase/database/index.js @@ -8,7 +8,7 @@ export * from './RideOffer' let database -export const initializeDatabaseModule = (module) => { +export const initializeDatabaseModule = module => { database = module } From 88d5bc64fcfedd03994112bb371b9d3296ac4b8d Mon Sep 17 00:00:00 2001 From: Eduardo Moroni Date: Tue, 3 Oct 2017 08:22:20 -0300 Subject: [PATCH 12/13] fix(RideOfferList): navigate to newRideRequest --- src/modules/rideOffer/components/RideOffer.js | 21 ++----- .../rideOffer/components/YourRideOffer.js | 58 +++++++++++++++++++ .../components/styles/RideOffer.style.js | 4 -- .../components/styles/YourRideOffer.style.js | 4 ++ .../containers/RideOffersListContainer.js | 17 +++--- .../containers/YourRideOffersScreen.js | 6 +- .../rideRequest/components/NewRideRequest.js | 2 +- src/modules/rideRequest/components/Ride.js | 33 ++++++----- .../containers/NewRideRequestContainer.js | 2 +- .../containers/YourRideRequestsScreen.js | 2 +- 10 files changed, 99 insertions(+), 50 deletions(-) create mode 100644 src/modules/rideOffer/components/YourRideOffer.js diff --git a/src/modules/rideOffer/components/RideOffer.js b/src/modules/rideOffer/components/RideOffer.js index f0b881a..340d4a8 100644 --- a/src/modules/rideOffer/components/RideOffer.js +++ b/src/modules/rideOffer/components/RideOffer.js @@ -13,14 +13,8 @@ export class RideOffer extends React.Component { onPress: PropTypes.func.isRequired } - state = { - loading: false - } - - onPress = async (rideId) => { - this.setState({loading: true}) - await this.props.onPress(rideId) - this.setState({loading: false}) + onPress = () => { + this.props.onPress(this.props.ride) } renderLine = (text, icon) => { @@ -37,12 +31,11 @@ export class RideOffer extends React.Component { origin, destination, days, - hours, - rideId + hours } = this.props.ride return ( - this.onPress(rideId)}> + this.onPress()}> { this.renderLine(origin, 'radio-button-unchecked') } @@ -52,12 +45,6 @@ export class RideOffer extends React.Component { { this.renderLine(days, 'today') } { this.renderLine(hours, 'schedule') } - ) diff --git a/src/modules/rideOffer/components/YourRideOffer.js b/src/modules/rideOffer/components/YourRideOffer.js new file mode 100644 index 0000000..ef7cbc3 --- /dev/null +++ b/src/modules/rideOffer/components/YourRideOffer.js @@ -0,0 +1,58 @@ +import React from 'react' +import PropTypes from 'prop-types' +import Icon from 'react-native-vector-icons/MaterialIcons' +import { View, Text, TouchableOpacity } from 'react-native' + +import Styles from './styles/YourRideOffer.style' +import { RkCard } from 'react-native-ui-kitten' +import { RidePropType } from '../../rideRequest/types' + +export class YourRideOffer extends React.Component { + static propTypes = { + ride: RidePropType.isRequired, + onPress: PropTypes.func.isRequired + } + + onPress = () => { + this.props.onPress(this.props.ride) + } + + renderLine = (text, icon) => { + return ( + + + {text} + + ) + } + + render () { + const { + origin, + destination, + days, + hours + } = this.props.ride + + return ( + this.onPress()}> + + + { this.renderLine(origin, 'radio-button-unchecked') } + { this.renderLine(destination, 'radio-button-unchecked') } + + + { this.renderLine(days, 'today') } + { this.renderLine(hours, 'schedule') } + + + + + ) + } +} diff --git a/src/modules/rideOffer/components/styles/RideOffer.style.js b/src/modules/rideOffer/components/styles/RideOffer.style.js index f3f8e16..95bdb30 100644 --- a/src/modules/rideOffer/components/styles/RideOffer.style.js +++ b/src/modules/rideOffer/components/styles/RideOffer.style.js @@ -7,10 +7,6 @@ export default StyleSheet.create({ alignItems: 'flex-start', margin: Metrics.baseMargin }, - deleteIcon: { - alignSelf: 'flex-end', - margin: Metrics.baseMargin - }, title: { ...Fonts.style.h4 }, diff --git a/src/modules/rideOffer/components/styles/YourRideOffer.style.js b/src/modules/rideOffer/components/styles/YourRideOffer.style.js index b11320c..be4fbaf 100644 --- a/src/modules/rideOffer/components/styles/YourRideOffer.style.js +++ b/src/modules/rideOffer/components/styles/YourRideOffer.style.js @@ -7,6 +7,10 @@ export default StyleSheet.create({ justifyContent: 'space-around', flex: 1 }, + deleteIcon: { + alignSelf: 'flex-end', + margin: Metrics.baseMargin + }, title: { fontSize: Fonts.size.h1, textAlign: 'center' diff --git a/src/modules/rideOffer/containers/RideOffersListContainer.js b/src/modules/rideOffer/containers/RideOffersListContainer.js index f8aee73..ff5edff 100644 --- a/src/modules/rideOffer/containers/RideOffersListContainer.js +++ b/src/modules/rideOffer/containers/RideOffersListContainer.js @@ -3,17 +3,17 @@ import { connect } from 'react-redux' import { ListView } from 'react-native' import React, { Component } from 'react' -import { RidePropType } from '../../rideRequest/types/index' -import { Ride } from '../../rideRequest/components/Ride' +import { RideOffer } from '../components/RideOffer' import { screens } from '../../../navigation/Screens' -import { fetchAllRideOffers } from '../../../redux/actions/index' +import { RidePropType } from '../../rideRequest/types' +import { fetchAllRideOffers } from '../../../redux/actions' import { onNavigatorEvent } from '../../../navigation/NavBar' import { LoadingSpinnerView } from '../../shared/components/LoadingSpinnerView' export class RideList extends Component { static propTypes = { navigator: PropTypes.object.isRequired, - rides: PropTypes.arrayOf(RidePropType), + rides: PropTypes.arrayOf(RidePropType).isRequired, userId: PropTypes.string.isRequired } @@ -44,11 +44,12 @@ export class RideList extends Component { } } - onPress = (props) => { - const { userId, navigator } = this.props + onPress = (ride) => { + const { navigator } = this.props navigator.push({ screen: screens.rideRequest.id, - passProps: {...props, userId} + title: screens.rideRequest.title, + passProps: {ride} }) } @@ -57,7 +58,7 @@ export class RideList extends Component { } + renderRow={(ride) => } enableEmptySections /> diff --git a/src/modules/rideOffer/containers/YourRideOffersScreen.js b/src/modules/rideOffer/containers/YourRideOffersScreen.js index 49862ef..69ea752 100644 --- a/src/modules/rideOffer/containers/YourRideOffersScreen.js +++ b/src/modules/rideOffer/containers/YourRideOffersScreen.js @@ -4,13 +4,13 @@ import React, { Component } from 'react' import { FlatList } from 'react-native' import { alert } from '../../../navigation/Alert' -import { RideOffer } from '../components/RideOffer' import { screens } from '../../../navigation/Screens' import { onNavigatorEvent } from '../../../navigation/NavBar' import { FloatingActionButton } from '../../shared/components/FloatingActionButton' import { removeRideOffer } from '../../../services/firebase/database/RideOffer' import { LoadingSpinnerView } from '../../shared/components/LoadingSpinnerView' import { fetchYourRideOffers } from '../../../redux/actions/async/RideOfferActions' +import { YourRideOffer } from '../components/YourRideOffer' export class YourRideOffersScreen extends Component { static propTypes = { @@ -33,7 +33,7 @@ export class YourRideOffersScreen extends Component { const { uid, updateYourOffers } = this.props if (uid && prevProps.uid !== uid) { this.setState({loading: true}) - updateYourOffers(uid) + await updateYourOffers(uid) this.setState({loading: false}) } } @@ -53,7 +53,7 @@ export class YourRideOffersScreen extends Component { item.rideId} - renderItem={({ item }) => } + renderItem={({ item }) => } /> this.onPress(rideId)} /> diff --git a/src/modules/rideRequest/components/Ride.js b/src/modules/rideRequest/components/Ride.js index 29a0c68..5f5de31 100644 --- a/src/modules/rideRequest/components/Ride.js +++ b/src/modules/rideRequest/components/Ride.js @@ -6,6 +6,7 @@ import { View, Text, TouchableOpacity } from 'react-native' import { RidePropType } from '../types' import Styles from './styles/Ride.style' +import { LoadingSpinnerView } from '../../shared/components/LoadingSpinnerView' export class Ride extends Component { static propTypes = { @@ -49,21 +50,23 @@ export class Ride extends Component { } = ride return ( - this.onPress({ ride })}> - - - {destination} - { this.renderLine(origin, 'radio-button-unchecked') } - { this.renderLine(destination, 'radio-button-unchecked') } - - - { this.renderLine(days, 'today') } - { this.renderLine(hours, 'schedule') } - { this.renderLine(profile.name, 'directions-car') } - - {this.renderIcon()} - - + + this.onPress({ ride })}> + + + {destination} + { this.renderLine(origin, 'radio-button-unchecked') } + { this.renderLine(destination, 'radio-button-unchecked') } + + + { this.renderLine(days, 'today') } + { this.renderLine(hours, 'schedule') } + { this.renderLine(profile.name, 'directions-car') } + + {this.renderIcon()} + + + ) } } diff --git a/src/modules/rideRequest/containers/NewRideRequestContainer.js b/src/modules/rideRequest/containers/NewRideRequestContainer.js index def9c99..1a71862 100644 --- a/src/modules/rideRequest/containers/NewRideRequestContainer.js +++ b/src/modules/rideRequest/containers/NewRideRequestContainer.js @@ -13,7 +13,7 @@ export class RideRequestScreen extends Component { userId: PropTypes.string.isRequired } - newRideRequest = (rideId: string) => async () => { + newRideRequest = async (rideId: string) => { const { updateYourRequests, userId } = this.props try { await saveRideRequest(rideId, this.props.userId) diff --git a/src/modules/rideRequest/containers/YourRideRequestsScreen.js b/src/modules/rideRequest/containers/YourRideRequestsScreen.js index 8d3c253..b633420 100644 --- a/src/modules/rideRequest/containers/YourRideRequestsScreen.js +++ b/src/modules/rideRequest/containers/YourRideRequestsScreen.js @@ -33,7 +33,7 @@ export class YourRideRequestsScreen extends Component { async componentDidMount () { this.setState({loading: true}) - this.props.updateYourRequests(this.props.uid) + await this.props.updateYourRequests(this.props.uid) this.setState({loading: false}) } From 1b1d60ee6d6818e6a5c5cfce07830ee4309d7cf7 Mon Sep 17 00:00:00 2001 From: Eduardo Moroni Date: Tue, 3 Oct 2017 08:23:14 -0300 Subject: [PATCH 13/13] test: update snapshots --- .../__snapshots__/RideOffer.test.js.snap | 12 - .../__snapshots__/Ride.test.js.snap | 266 +++++++++--------- .../containers/YourRideOffersScreen.js | 11 +- 3 files changed, 142 insertions(+), 147 deletions(-) diff --git a/__tests__/src/modules/rideOffer/components/__snapshots__/RideOffer.test.js.snap b/__tests__/src/modules/rideOffer/components/__snapshots__/RideOffer.test.js.snap index d48f652..d0d6eb4 100644 --- a/__tests__/src/modules/rideOffer/components/__snapshots__/RideOffer.test.js.snap +++ b/__tests__/src/modules/rideOffer/components/__snapshots__/RideOffer.test.js.snap @@ -127,18 +127,6 @@ exports[` Should have a snapshot 1`] = ` - `; diff --git a/__tests__/src/modules/rideRequest/components/__snapshots__/Ride.test.js.snap b/__tests__/src/modules/rideRequest/components/__snapshots__/Ride.test.js.snap index ad3bec7..ba4d5f8 100644 --- a/__tests__/src/modules/rideRequest/components/__snapshots__/Ride.test.js.snap +++ b/__tests__/src/modules/rideRequest/components/__snapshots__/Ride.test.js.snap @@ -1,169 +1,173 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[` Should have a snapshot 1`] = ` - - - - - Bomfim - + + - - PUC + Bomfim - - - - - Bomfim - - - - - - + + PUC + + + - - Seg-Sex - + + + Bomfim + + - - - 19h - - - + + Seg-Sex + + + - + + + 19h + + + - - Eduardo Moroni - + + + Eduardo Moroni + + - - - - + + + + `; diff --git a/src/modules/rideOffer/containers/YourRideOffersScreen.js b/src/modules/rideOffer/containers/YourRideOffersScreen.js index 69ea752..7e8a062 100644 --- a/src/modules/rideOffer/containers/YourRideOffersScreen.js +++ b/src/modules/rideOffer/containers/YourRideOffersScreen.js @@ -30,7 +30,7 @@ export class YourRideOffersScreen extends Component { } async componentDidUpdate (prevProps) { - const { uid, updateYourOffers } = this.props + const {uid, updateYourOffers} = this.props if (uid && prevProps.uid !== uid) { this.setState({loading: true}) await updateYourOffers(uid) @@ -39,11 +39,14 @@ export class YourRideOffersScreen extends Component { } pushRideRequestScreen () { - this.props.navigator.push({screen: screens.rideOffer.id}) + this.props.navigator.push({ + screen: screens.rideOffer.id, + title: screens.rideOffer.title + }) } onPressRide = (rideId: string) => { - const { uid } = this.props.profile + const {uid} = this.props.profile alert('Delete Ride Offer', () => removeRideOffer(rideId, uid)) } @@ -53,7 +56,7 @@ export class YourRideOffersScreen extends Component { item.rideId} - renderItem={({ item }) => } + renderItem={({item}) => } />