From ebb6f47455d00e08c050a6802b0e78ed0af4256a Mon Sep 17 00:00:00 2001 From: Mike Fitzpatrick Date: Thu, 8 Aug 2019 16:18:08 -0400 Subject: [PATCH] - The fix is in! Linty fresh and pretty... --- app/actions/profile.js | 25 ++++++ app/api/index.js | 4 +- app/api/profile.js | 9 ++- app/components/AppHeader/AppHeader.js | 2 - app/components/AppHeader/AppHeader.styles.js | 0 app/components/AppHeader/HeaderContentLeft.js | 11 ++- .../AppHeader/HeaderContentRight.container.js | 4 +- .../EventTitle/EventTitle.container.js | 1 + .../HeaderTitle/EventTitle/EventTitle.js | 16 ++-- .../EventTitle/EventTitle.styles.js | 4 +- .../AppHeader/HeaderTitle/HeaderTitle.js | 8 +- .../HeaderTitle/HeaderTitle.styles.js | 4 +- .../AppHeader/IconButtons/BackIcon.js | 2 +- .../UserProfileButton.container.js | 8 +- .../UserProfileButton/UserProfileButton.js | 23 ++++-- app/components/Auction/AuctionListItem.js | 10 +-- .../Auction/AuctionPriceAndBidCount.js | 4 +- app/components/Auction/BidStatus.js | 2 +- app/components/Auction/FilterBar.js | 9 ++- app/components/Events/EventListItem.js | 16 ++-- app/components/Login/LocalLogin.js | 81 +++++++++---------- app/components/Login/Login.styles.js | 8 ++ .../Profile/EditNomDeBid.container.js | 20 +++++ app/components/Profile/EditNomDeBid.js | 79 ++++++++++++++++++ .../Profile/EditProfile.container.js | 8 +- app/components/Profile/EditProfile.js | 79 ++++++++++-------- app/components/Profile/Profile.container.js | 8 +- app/components/Profile/Profile.js | 3 +- app/components/Profile/Profile.styles.js | 8 ++ .../Profile/ViewProfile.container.js | 12 ++- app/components/Profile/ViewProfile.js | 57 ++++++------- app/constants/actionTypes.js | 3 + app/containers/Events/EventListItem.js | 4 +- app/domain/Profile.js | 4 +- app/router.js | 40 --------- app/screens/Auction.container.js | 13 ++- app/screens/Auction.styles.js | 4 +- app/screens/Checkout.js | 4 +- app/screens/Event.js | 2 +- app/screens/Event.styles.js | 4 +- app/screens/Events.js | 2 +- app/screens/ImageDetail.js | 4 +- app/screens/Item.js | 4 +- app/screens/Login.js | 26 ------ app/screens/Marketplace.js | 2 +- app/screens/Profile.js | 16 +++- app/screens/Register.js | 18 +++-- app/screens/SignInOrRegister.js | 6 +- app/screens/SignInOrRegister.styles.js | 4 +- app/screens/Ticketing.js | 4 +- app/selectors/auctions.js | 3 +- app/selectors/profile.js | 20 +++++ 52 files changed, 453 insertions(+), 259 deletions(-) delete mode 100644 app/components/AppHeader/AppHeader.styles.js create mode 100644 app/components/Login/Login.styles.js create mode 100644 app/components/Profile/EditNomDeBid.container.js create mode 100644 app/components/Profile/EditNomDeBid.js delete mode 100644 app/screens/Login.js diff --git a/app/actions/profile.js b/app/actions/profile.js index 412a6bc..b7fb866 100644 --- a/app/actions/profile.js +++ b/app/actions/profile.js @@ -5,6 +5,7 @@ import { getNomAvailaibility, loginUser, registerNewUser, + setNomDeBid as setNomDeBidApi, } from '../api/profile.js'; import { @@ -15,11 +16,16 @@ import { PROFILE_NOM_AVAILABLE, REGISTRATION_FAILURE, REGISTRATION_SUCCESS, + SET_NOM_FAILURE, + SET_NOM_SUCCESS, UNSET_AUTH, UNSET_PROFILE, UPDATE_PROFILE, } from '../constants/actionTypes.js'; +import { getAuthToken } from '../selectors/auth.js'; +import { getUserId } from '../selectors/profile.js'; + const isValidEmail = (payload) => ({ type: PROFILE_EMAIL_AVAILABLE, payload, @@ -44,6 +50,16 @@ const logoutUser = () => ({ type: DO_LOGOUT, }); +export const setNomFailure = ({ info }) => ({ + type: SET_NOM_FAILURE, + payload: info, +}); + +export const setNomSuccess = ({ nomDeBid }) => ({ + type: SET_NOM_SUCCESS, + payload: nomDeBid, +}); + const registrationFailure = (payload) => ({ type: REGISTRATION_FAILURE, payload, @@ -71,6 +87,15 @@ export const checkEmailAvailability = (email) => (dispatch) => {}; export const checkNomAvailability = (nomDeBid) => (dispatch) => {}; +export const setNomDeBid = (nomDeBid) => (dispatch, getState) => { + const id = getUserId(getState()); + const auth = getAuthToken(getState()); + + setNomDeBidApi({ id, nomDeBid }, auth) + .then((result) => dispatch(setNomSuccess(result))) + .catch((err) => dispatch(setNomFailure(err))); +}; + export const login = (username, password) => (dispatch) => { dispatch(blockUI()); loginUser(username, password) diff --git a/app/api/index.js b/app/api/index.js index 89c035c..b31a991 100644 --- a/app/api/index.js +++ b/app/api/index.js @@ -45,11 +45,11 @@ const cacheBuster = () => { }; export const getEndpointUrl = (endpoint) => { - if (!endpoints[endpoint]) { + if (!API_ENDPOINTS[endpoint]) { throw new Error('Invalid API endpoint specified'); } - return `${API_URL}${endpoints[endpoint]}`; //`${cacheBuster()}`; + return `${API_URL}${API_ENDPOINTS[endpoint]}`; //`${cacheBuster()}`; }; export const requestGet = (path, queryParams = [], requestOptions = {}) => { diff --git a/app/api/profile.js b/app/api/profile.js index 639e907..28bc3d3 100644 --- a/app/api/profile.js +++ b/app/api/profile.js @@ -1,4 +1,4 @@ -import { API_ENDPOINTS, requestGet } from './index.js'; +import { API_ENDPOINTS, requestGet, requestPost } from './index.js'; export const getEmailAvailability = (email) => requestGet(`${API_ENDPOINTS.VALIDATE_SIGNUP_EMAIL}/&{encodeURI(email)}`); @@ -17,3 +17,10 @@ export const registerNewUser = (user) => path: API_ENDPOINTS.USER_SIGNUP, body: { user }, }); + +export const setNomDeBid = (id, auth) => (nomDeBid) => + requestPost({ + path: `${API_ENDPOINTS.SET_NOM}/${id}`, + body: { nomDeBid }, + requestOptions: { Authorization: auth ? `Bearer ${auth}` : null }, + }); diff --git a/app/components/AppHeader/AppHeader.js b/app/components/AppHeader/AppHeader.js index c6218f3..dac5132 100644 --- a/app/components/AppHeader/AppHeader.js +++ b/app/components/AppHeader/AppHeader.js @@ -7,8 +7,6 @@ import HeaderTitle from './HeaderTitle/HeaderTitle.container.js'; import HeaderContentLeft from './HeaderContentLeft.container.js'; import HeaderContentRight from './HeaderContentRight.container.js'; -import styles from './AppHeader.styles.js'; - export default class AppHeader extends Component { static get propTypes() { return { diff --git a/app/components/AppHeader/AppHeader.styles.js b/app/components/AppHeader/AppHeader.styles.js deleted file mode 100644 index e69de29..0000000 diff --git a/app/components/AppHeader/HeaderContentLeft.js b/app/components/AppHeader/HeaderContentLeft.js index 4915467..37c9f6f 100644 --- a/app/components/AppHeader/HeaderContentLeft.js +++ b/app/components/AppHeader/HeaderContentLeft.js @@ -1,12 +1,15 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Text, TouchableOpacity, View } from 'react-native'; - import BackIcon from './IconButtons/BackIcon.js'; import EventsIcon from './IconButtons/EventsIcon.js'; -export default function HeaderContentLeft({ activeRoute, hasMultipleEvents, navigation }) { +export default function HeaderContentLeft({ + activeRoute, + hasActiveEvent, + hasMultipleEvents, + navigation, +}) { const _goBack = () => { if (hasActiveEvent) { navigation.goBack(); @@ -35,9 +38,11 @@ export default function HeaderContentLeft({ activeRoute, hasMultipleEvents, navi HeaderContentLeft.propTypes = { activeRoute: PropTypes.string.isRequired, hasActiveEvent: PropTypes.bool, + hasMultipleEvents: PropTypes.bool, navigation: PropTypes.func.isRequired, }; HeaderContentLeft.defaultProps = { hasActiveEvent: false, + hasMultipleEvents: false, }; diff --git a/app/components/AppHeader/HeaderContentRight.container.js b/app/components/AppHeader/HeaderContentRight.container.js index 52f77c4..286b43a 100644 --- a/app/components/AppHeader/HeaderContentRight.container.js +++ b/app/components/AppHeader/HeaderContentRight.container.js @@ -6,7 +6,9 @@ import HeaderContentRight from './HeaderContentRight.js'; const matchStateToProps = (state, ownProps) => ({ avatarUrl: getProfileAvatarUrl(state), - hideUserProfileButton: ownProps.navigation.state.routeName === 'Profile', + hideUserProfileButton: + ['Profile', 'Register', 'SignInOrRegister'].indexOf(ownProps.navigation.state.routeName) > + -1, }); export default connect( diff --git a/app/components/AppHeader/HeaderTitle/EventTitle/EventTitle.container.js b/app/components/AppHeader/HeaderTitle/EventTitle/EventTitle.container.js index 69ea31e..db36b07 100644 --- a/app/components/AppHeader/HeaderTitle/EventTitle/EventTitle.container.js +++ b/app/components/AppHeader/HeaderTitle/EventTitle/EventTitle.container.js @@ -1,5 +1,6 @@ import { connect } from 'react-redux'; +import { hasActiveEvent } from '../../../../selectors/activeEvent.js'; import { getActiveEvent, getDefaultEvent } from '../../../../selectors/events.js'; import EventTitle from './EventTitle.js'; diff --git a/app/components/AppHeader/HeaderTitle/EventTitle/EventTitle.js b/app/components/AppHeader/HeaderTitle/EventTitle/EventTitle.js index 6a0958a..e619ab1 100644 --- a/app/components/AppHeader/HeaderTitle/EventTitle/EventTitle.js +++ b/app/components/AppHeader/HeaderTitle/EventTitle/EventTitle.js @@ -6,12 +6,16 @@ import { Text, TouchableOpacity, View } from 'react-native'; import styles from './EventTitle.styles.js'; export default function EventTitle({ action, date, end, name, start }) { - const _generateEventTitle = () => ( - - {name} - {`${date} | ${start} - ${end}`} - - ); + const _generateEventTitle = () => { + const whenString = `${date} | ${start} - ${end}`; + + return ( + + {name} + {whenString} + + ); + }; if (action) { return {_generateEventTitle()}; diff --git a/app/components/AppHeader/HeaderTitle/EventTitle/EventTitle.styles.js b/app/components/AppHeader/HeaderTitle/EventTitle/EventTitle.styles.js index 16fe7ff..127a527 100644 --- a/app/components/AppHeader/HeaderTitle/EventTitle/EventTitle.styles.js +++ b/app/components/AppHeader/HeaderTitle/EventTitle/EventTitle.styles.js @@ -1,6 +1,6 @@ import { StyleSheet } from 'react-native'; -export default (styles = StyleSheet.create({ +export default StyleSheet.create({ eventInfo: { flexDirection: 'row', }, @@ -11,4 +11,4 @@ export default (styles = StyleSheet.create({ eventDate: { flex: 1, }, -})); +}); diff --git a/app/components/AppHeader/HeaderTitle/HeaderTitle.js b/app/components/AppHeader/HeaderTitle/HeaderTitle.js index 6429c4e..5556270 100644 --- a/app/components/AppHeader/HeaderTitle/HeaderTitle.js +++ b/app/components/AppHeader/HeaderTitle/HeaderTitle.js @@ -7,6 +7,10 @@ import EventTitle from './EventTitle/EventTitle.container.js'; import styles from './HeaderTitle.styles.js'; +const STRINGS = { + PROFILE: 'Profile', +}; + export default function HeaderTitle({ activeRoute, hasActiveEvent, @@ -30,13 +34,13 @@ export default function HeaderTitle({ if (activeRoute === 'Events') { return ( - Profile + {STRINGS.PROFILE} ); } if (activeRoute === 'Profile') { - return Profile; + return {STRINGS.PROFILE}; } return ; diff --git a/app/components/AppHeader/HeaderTitle/HeaderTitle.styles.js b/app/components/AppHeader/HeaderTitle/HeaderTitle.styles.js index e4c5889..30ef859 100644 --- a/app/components/AppHeader/HeaderTitle/HeaderTitle.styles.js +++ b/app/components/AppHeader/HeaderTitle/HeaderTitle.styles.js @@ -1,6 +1,6 @@ import { StyleSheet } from 'react-native'; -export default (styles = StyleSheet.create({ +export default StyleSheet.create({ filterBar: { backgroundColor: '#0F0', flexDirection: 'row', @@ -11,4 +11,4 @@ export default (styles = StyleSheet.create({ view: { flex: 2, }, -})); +}); diff --git a/app/components/AppHeader/IconButtons/BackIcon.js b/app/components/AppHeader/IconButtons/BackIcon.js index c2e314d..f839cfb 100644 --- a/app/components/AppHeader/IconButtons/BackIcon.js +++ b/app/components/AppHeader/IconButtons/BackIcon.js @@ -7,7 +7,7 @@ import { Icon } from 'react-native-elements'; export default function BackIcon({ action }) { return ( - ; + ); } diff --git a/app/components/AppHeader/UserProfileButton/UserProfileButton.container.js b/app/components/AppHeader/UserProfileButton/UserProfileButton.container.js index 0832bbb..463fdc3 100644 --- a/app/components/AppHeader/UserProfileButton/UserProfileButton.container.js +++ b/app/components/AppHeader/UserProfileButton/UserProfileButton.container.js @@ -1,11 +1,17 @@ import { connect } from 'react-redux'; -import { getProfileAvatarUrl } from '../../../selectors/profile.js'; +import { + getProfileAvatarUrl, + getUserInitials, + isRegisteredAccount, +} from '../../../selectors/profile.js'; import UserProfileButton from './UserProfileButton.js'; const matchStateToProps = (state) => ({ avatarUrl: getProfileAvatarUrl(state), + initials: getUserInitials(state), + isRegisteredAccount: isRegisteredAccount(state), }); export default connect( diff --git a/app/components/AppHeader/UserProfileButton/UserProfileButton.js b/app/components/AppHeader/UserProfileButton/UserProfileButton.js index 1897118..d422310 100644 --- a/app/components/AppHeader/UserProfileButton/UserProfileButton.js +++ b/app/components/AppHeader/UserProfileButton/UserProfileButton.js @@ -2,11 +2,16 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Image, TouchableOpacity, View } from 'react-native'; -import { Icon } from 'react-native-elements'; +import { Avatar, Icon } from 'react-native-elements'; import styles from './UserProfileButton.styles.js'; -export default function UserProfileButton({ avatarUrl, navigation }) { +export default function UserProfileButton({ + avatarUrl, + initials, + isRegisteredAccount, + navigation, +}) { const _goToProfile = () => { navigation.navigate('Profile'); return false; @@ -14,10 +19,12 @@ export default function UserProfileButton({ avatarUrl, navigation }) { return ( - {avatarUrl !== null ? ( - - - + {isRegisteredAccount !== null ? ( + avatarUrl !== null ? ( + + ) : ( + + ) ) : ( )} @@ -27,8 +34,12 @@ export default function UserProfileButton({ avatarUrl, navigation }) { UserProfileButton.propTypes = { avatarUrl: PropTypes.string, + initials: PropTypes.string, + isRegisteredAccount: PropTypes.bool, }; UserProfileButton.propTypes = { avatarUrl: null, + initials: null, + isRegisteredAccount: false, }; diff --git a/app/components/Auction/AuctionListItem.js b/app/components/Auction/AuctionListItem.js index 341b85d..df3b2b9 100644 --- a/app/components/Auction/AuctionListItem.js +++ b/app/components/Auction/AuctionListItem.js @@ -83,28 +83,28 @@ export default class AuctionListItem extends Component { )} {type === ITEM_TYPES.AUCTION && } - + {title} - + {subtitle} {donor && ( - + {donor} )} {type === ITEM_TYPES.AUCTION ? ( ) : ( - + {formatPrice(startingPrice)} )} {this._getBidTime()} - + {description} diff --git a/app/components/Auction/AuctionPriceAndBidCount.js b/app/components/Auction/AuctionPriceAndBidCount.js index 2d25cdd..87a7e9d 100644 --- a/app/components/Auction/AuctionPriceAndBidCount.js +++ b/app/components/Auction/AuctionPriceAndBidCount.js @@ -6,9 +6,11 @@ import { formatPrice } from '../../library/helpers.js'; import { StyleSheet, Text } from 'react-native'; const AuctionPriceAndBidCount = ({ bidCount, currentPrice }) => { + const _getPriceAndBidString = () => `${formatPrice(currentPrice)} (${bidCount} bids)`; + return ( - {`${formatPrice(currentPrice)} (${bidCount} bids)`} + {_getPriceAndBidString()} ); }; diff --git a/app/components/Auction/BidStatus.js b/app/components/Auction/BidStatus.js index eceed62..5771673 100644 --- a/app/components/Auction/BidStatus.js +++ b/app/components/Auction/BidStatus.js @@ -9,7 +9,7 @@ const BidStatus = ({ isBidding, isWinning }) => { } const statusBarStyle = isWinning - ? [styles.bidStatus, styes.isWinning] + ? [styles.bidStatus, styles.isWinning] : [styles.bidStatus, styles.isOutbid]; return ( diff --git a/app/components/Auction/FilterBar.js b/app/components/Auction/FilterBar.js index 95b926e..3cb434a 100644 --- a/app/components/Auction/FilterBar.js +++ b/app/components/Auction/FilterBar.js @@ -3,10 +3,15 @@ import PropTypes from 'prop-types'; import { StyleSheet, Text, View } from 'react-native'; +const STRINGS = { + FILTER: 'Filter', + VIEW: 'View', +}; + const FilterBar = ({ changeFilterer, changeViewMode, filterMode, viewMode }) => ( - Filter - View + {STRINGS.FILTER} + {STRINGS.VIEW} ); diff --git a/app/components/Events/EventListItem.js b/app/components/Events/EventListItem.js index ed99893..685ebad 100644 --- a/app/components/Events/EventListItem.js +++ b/app/components/Events/EventListItem.js @@ -33,24 +33,28 @@ export default class EventListItem extends Component { constructor(props) { super(props); + this._viewEventDetail = this._viewEventDetail.bind(this); } - _viewEventDetail = () => { + getTimeString() { + const { end, start } = this.props; + return `${start} - ${end}`; + } + + _viewEventDetail() { this.props.setActiveEvent(this.props.id); this.props.navigation.navigate('Event'); - }; + } render() { - const { date, description, end, name, start } = this.props; + const { date, description, name } = this.props; return ( {name} {date} - - {start} - {end} - + {this.getTimeString()} {description} diff --git a/app/components/Login/LocalLogin.js b/app/components/Login/LocalLogin.js index f048815..1bee62d 100644 --- a/app/components/Login/LocalLogin.js +++ b/app/components/Login/LocalLogin.js @@ -3,54 +3,51 @@ import PropTypes from 'prop-types'; import { Button, TextInput, View } from 'react-native'; +import styles from './Login.styles.js'; + export default function LocalLogin({ doLoginAction }) { + const [enabled, setEnableSubmit] = useState(false); + const [password, setPassword] = useState(null); + const [username, setUsername] = useState(null); - const [ enabled, setEnableSubmit ] = useState(false); - const [ password, setPassword ] = useState(null); - const [ username, setUsername ] = useState(null); + const _handleLoginSubmit = () => { + doLoginAction(username, password); + }; - const _handleLoginSubmit = () => { - doLoginAction(username, password); - }; + const _updateState = (field, value) => { + if (field === 'username') { + setUsername(value); + } - const _updateState = (field, value) => { - if (field === 'username') { - setUsername(value); - } + if (field === 'password') { + setPassword(value); + } - if (field === 'password') { - setPassword(value); - } + if (!!username && !!password) { + setEnableSubmit(true); + } + }; - if (!!username && !!password) { - setEnableSubmit(true); - } - }; - - return ( - - _updateState('username', text)} - placeholder="email" - style={{height: 40}} - value={username} - /> - _updateState('password', text)} - placeholder="password" - secureTextEntry - style={{height: 40}} - value={password} - /> -