diff --git a/app/actions/profile.js b/app/actions/profile.js
index b7fb866..8cf39f3 100644
--- a/app/actions/profile.js
+++ b/app/actions/profile.js
@@ -87,7 +87,7 @@ export const checkEmailAvailability = (email) => (dispatch) => {};
export const checkNomAvailability = (nomDeBid) => (dispatch) => {};
-export const setNomDeBid = (nomDeBid) => (dispatch, getState) => {
+export const setNomDeBid = ({ nomDeBid }) => (dispatch, getState) => {
const id = getUserId(getState());
const auth = getAuthToken(getState());
diff --git a/app/components/AppHeader/AppHeader.js b/app/components/AppHeader/AppHeader.js
index dac5132..9da604b 100644
--- a/app/components/AppHeader/AppHeader.js
+++ b/app/components/AppHeader/AppHeader.js
@@ -24,9 +24,9 @@ export default class AppHeader extends Component {
return (
}
centerComponent={}
- rightComponent={}
+ leftComponent={}
+ rightComponent={}
/>
);
}
diff --git a/app/components/AppHeader/HeaderContentLeft.js b/app/components/AppHeader/HeaderContentLeft.js
index 4485c24..1baa754 100644
--- a/app/components/AppHeader/HeaderContentLeft.js
+++ b/app/components/AppHeader/HeaderContentLeft.js
@@ -32,7 +32,11 @@ export default function HeaderContentLeft({
return ;
}
- return ;
+ if (hasMultipleEvents) {
+ return ;
+ }
+
+ return null;
}
HeaderContentLeft.propTypes = {
diff --git a/app/components/AppHeader/HeaderContentRight.js b/app/components/AppHeader/HeaderContentRight.js
index 07b90df..0b08f9a 100644
--- a/app/components/AppHeader/HeaderContentRight.js
+++ b/app/components/AppHeader/HeaderContentRight.js
@@ -8,7 +8,7 @@ export default function HeaderContentRight({ hideUserProfileButton, navigation }
return null;
}
- return ;
+ return ;
}
HeaderContentRight.propTypes = {
diff --git a/app/components/AppHeader/HeaderTitle/HeaderTitle.js b/app/components/AppHeader/HeaderTitle/HeaderTitle.js
index 06e5d36..43e4ef8 100644
--- a/app/components/AppHeader/HeaderTitle/HeaderTitle.js
+++ b/app/components/AppHeader/HeaderTitle/HeaderTitle.js
@@ -8,6 +8,7 @@ import EventTitle from './EventTitle/EventTitle.container.js';
import styles from './HeaderTitle.styles.js';
const STRINGS = {
+ EVENTS: 'Events',
PROFILE: 'Profile',
};
@@ -34,7 +35,7 @@ export default function HeaderTitle({
if (activeRoute === 'Events') {
return (
- {STRINGS.PROFILE}
+ {STRINGS.EVENTS}
);
}
diff --git a/app/components/AppHeader/UserProfileButton/UserProfileButton.js b/app/components/AppHeader/UserProfileButton/UserProfileButton.js
index ce99358..f255ece 100644
--- a/app/components/AppHeader/UserProfileButton/UserProfileButton.js
+++ b/app/components/AppHeader/UserProfileButton/UserProfileButton.js
@@ -13,8 +13,12 @@ export default function UserProfileButton({
navigation,
}) {
const _goToProfile = () => {
- navigation.navigate('Profile');
- return false;
+ if (isRegisteredAccount) {
+ navigation.navigate('Profile');
+ return false;
+ }
+
+ navigation.navigate('SignInOrRegister');
};
return (
diff --git a/app/components/Profile/EditNomDeBid.js b/app/components/Profile/EditNomDeBid.js
index 235683e..305772b 100644
--- a/app/components/Profile/EditNomDeBid.js
+++ b/app/components/Profile/EditNomDeBid.js
@@ -29,14 +29,14 @@ export default function EditNomDeBid({
setValidNom(result.available);
if (isStandalone) {
- updateNomDeBid(nomDeBid);
+ updateNomDeBid({ nomDeBid });
}
});
};
const _handleSubmitNom = () => {
if (isNomValid) {
- updateNomDeBid(newNom);
+ updateNomDeBid({ newNom });
}
};
diff --git a/app/components/Profile/EditProfile.js b/app/components/Profile/EditProfile.js
index 42997c5..b6c2a7d 100644
--- a/app/components/Profile/EditProfile.js
+++ b/app/components/Profile/EditProfile.js
@@ -1,48 +1,57 @@
+import { List } from 'immutable';
import React, { Component } from 'react';
import PropTypes from 'prop-types';
-import { Button, Text, TextInput, View } from 'react-native';
+import { Button, Picker, ScrollView, Text, TextInput, View } from 'react-native';
import { Avatar } from 'react-native-elements';
import { getEmailAvailability, getNomAvailability } from '../../api/profile.js';
import EditNomDeBid from './EditNomDeBid.js';
+import PhoneListInput from './PhoneInput/PhoneListInput.js';
import styles from './Profile.styles.js';
const STRINGS = {
CANCEL: 'Cancel',
+ NOM_HEADING: 'Nom de Bid',
+ PASSWORD_HEADING: 'Password',
+ PERSONAL_HEADING: 'A bit about you...',
SAVE_PROFILE: 'Save profile',
};
export default class EditProfile extends Component {
static get propTypes() {
return {
- addresses: PropTypes.array,
+ addresses: PropTypes.oneOfType([PropTypes.array, PropTypes.instanceOf(List)]),
avatar: PropTypes.string,
cancelEditAction: PropTypes.func.isRequired,
email: PropTypes.string,
firstName: PropTypes.string,
initials: PropTypes.string,
isGeneratedNomDeBid: PropTypes.bool,
+ isRegsiteredAccount: PropTypes.bool,
lastName: PropTypes.string,
nomDeBid: PropTypes.string,
- phones: PropTypes.array,
+ phones: PropTypes.oneOfType([PropTypes.array, PropTypes.instanceOf(List)]),
saveProfileAction: PropTypes.func.isRequired,
saveProfileLabel: PropTypes.string,
+ showPasswordEntry: PropTypes.bool,
};
}
static get defaultProps() {
return {
- addresses: null,
+ addresses: new List(),
avatar: null,
email: null,
firstName: null,
initials: null,
isGeneratedNomDeBid: false,
+ isRegsiteredAccount: false,
lastName: null,
nomDeBid: null,
- phones: null,
+ phones: new List(),
saveProfileLabel: STRINGS.SAVE_PROFILE,
+ showPasswordEntry: false,
};
}
@@ -59,6 +68,7 @@ export default class EditProfile extends Component {
invalidNomDeBid: false,
nomDeBid: this.props.nomDeBid,
password: this.props.password,
+ passwordsMismatch: false,
phones: this.props.phones,
};
@@ -67,15 +77,21 @@ export default class EditProfile extends Component {
}
_validateEmail() {
- getEmailAvailability(this.state.email, (result) =>
- this.setState('invalidEmail', !result.available),
- );
+ getEmailAvailability(this.state.email)
+ .then(({ available = false }) =>
+ this.setState('invalidEmail', !available),
+ );
}
_validateNomDeBid() {
- getNomAvailability(this.state.nomDeBid, (result) =>
- this.setState('invalidNomDeBid', !result.available),
- );
+ getNomAvailability(this.state.nomDeBid)
+ .then(({ available = false }) =>
+ this.setState('invalidNomDeBid', !available),
+ );
+ }
+
+ _validatePasswordMatch(password) {
+ this.setState({ passwordsMismatch: this.state.password !== password });
}
getProfileFromState() {
@@ -106,6 +122,9 @@ export default class EditProfile extends Component {
}
isFormComplete() {
+ const { showPasswordEntry } = this.props;
+ const { password } = this.state;
+
return (
!this.state.invalidEmail &&
!this.state.invalidNomDeBid &&
@@ -113,27 +132,28 @@ export default class EditProfile extends Component {
!!this.state.lastName &&
!!this.state.email &&
!!this.state.nomDeBid &&
- !!this.state.phones.length &&
- !!this.state.password
+ !!this.state.phones.size &&
+ ((showPasswordEntry && !!password) || !showPasswordEntry)
);
}
render() {
- const { isGeneratedNomDeBid } = this.props;
- const { avatar, firstName, lastName } = this.state;
+ const { isGeneratedNomDeBid, isRegsiteredAccount, showPasswordEntry } = this.props;
+ const { addresses, avatar, firstName, lastName, phones } = this.state;
const addressesTitle = 'Addresses';
const numbersTitle = 'Numbers';
return (
-
-
+
+
{avatar !== null ? (
) : (
)}
-
+
+ {STRINGS.PERSONAL_HEADING}
this.setState({ firstName: text })}
placeholder="first name"
@@ -147,7 +167,7 @@ export default class EditProfile extends Component {
value={this.state.lastName}
/>
-
+
this.setState({ email: text })}
@@ -157,27 +177,45 @@ export default class EditProfile extends Component {
value={this.state.email}
/>
- {isGeneratedNomDeBid && (
-
+ {showPasswordEntry && (
+
+ {STRINGS.PASSWORD_HEADING}
+ this.setState({ password: text })}
+ placeholder="password"
+ secureTextEntry
+ style={[styles.textInput, styles.requiredInput]}
+ />
+ this._validatePasswordMatch(text)}
+ placeholder="re-enter password"
+ secureTextEntry
+ style={[styles.textInput, styles.requiredInput]}
+ />
+
+ )}
+ {(isGeneratedNomDeBid || !isRegsiteredAccount) && (
+
+ {STRINGS.NOM_HEADING}
this.setState({ nomDeBid })}
/>
)}
-
- {numbersTitle}
- {this.props.phones.length > 0 && (
- /* LIST PHONES */
-
- )}
-
);
}
}
diff --git a/app/components/Profile/PhoneInput/PhoneListInput.js b/app/components/Profile/PhoneInput/PhoneListInput.js
new file mode 100644
index 0000000..00dc9e7
--- /dev/null
+++ b/app/components/Profile/PhoneInput/PhoneListInput.js
@@ -0,0 +1,110 @@
+import { List } from 'immutable';
+import PropTypes from 'prop-types';
+import React, { Component } from 'react';
+import { Button, Picker, Text, TextInput, View } from 'react-native';
+
+import { PHONE_TYPE_DEFAULT, PHONE_TYPES } from '../../../constants/constants.js';
+
+import PhoneListItem from './PhoneListItem.js';
+
+import styles from '../Profile.styles.js';
+
+const defaultState = {
+ editingIndex: null,
+ isEditing: false,
+ newPhone: null,
+ newPhoneType: PHONE_TYPE_DEFAULT,
+};
+
+export default class PhoneListInput extends Component {
+ static get propTypes() {
+ return {
+ handleAdd: PropTypes.func.isRequired,
+ handleDelete: PropTypes.func.isRequired,
+ handleEdit: PropTypes.func,
+ phones: PropTypes.instanceOf(List).isRequired,
+ };
+ };
+
+ static get defaultProps() {
+ return {
+ handleEdit: null,
+ };
+ };
+
+ constructor(props) {
+ super(props);
+ this.state = { ...defaultState };
+ }
+
+ handleAdd() {
+ const { phones } = this.props;
+ const { newPhone, newPhoneType } = this.state;
+ this.props.handleAdd(phones.push({ number: newPhone, label: newPhoneType }));
+ this.setState(defaultState);
+ }
+
+ handleEdit(index) {
+ const { phones } = this.props;
+ const { newPhone, newPhoneType } = this.state;
+ this.props.handleEdit(phones.set(index, { number: newPhone, label: newPhoneType }));
+ this.setState(defaultState);
+ }
+
+ handleEditStart(index) {
+ const toBeEdited = this.props.phones.get(index);
+ this.setState({
+ editingIndex: index,
+ isEditing: true,
+ newPhone: toBeEdited.get('number'),
+ newPhoneType: toBeEdited.get('label'),
+ });
+ }
+
+ handleEditCancel(index) {
+ this.setState(defaultState);
+ }
+
+ render() {
+ const { phones } = this.props;
+ const { isEditing, newPhone, newPhoneType } = this.state;
+ const numbersTitle = 'Numbers';
+
+ return (
+
+ {numbersTitle}
+ {phones !== null && phones.size > 0 && (
+
+ {phones.map((phone, index) =>
+
+ )}
+
+ )}
+ this.setState({ editingPhone: text })}
+ placeholder="phone number"
+ style={[styles.textInput, styles.requiredInput]}
+ value={this.state.newPhone}
+ />
+ this.setState({ newPhoneType: type })}
+ selectedValue={this.state.newPhoneType}
+ >
+ {PHONE_TYPES.map((type) => )}
+
+ this.handleEdit(index) : this.handleAdd}
+ title={isEditing ? 'update' : 'add number'}
+ />
+
+ );
+ }
+}
diff --git a/app/components/Profile/PhoneInput/PhoneListItem.js b/app/components/Profile/PhoneInput/PhoneListItem.js
new file mode 100644
index 0000000..52810bd
--- /dev/null
+++ b/app/components/Profile/PhoneInput/PhoneListItem.js
@@ -0,0 +1,37 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+
+import { Button, Text, View } from 'react-native';
+
+import styles from '../Profile.styles.js';
+
+export default function PhoneListItem({ index, label, number, handleDelete, handleEdit, handleEditStart }) {
+ return (
+
+
+ {phone.get('number')}
+ {phone.get('label')}
+
+
+ {handleEdit !== null && this.handleEditStart(index)} />}
+ this.props.handleDelete(index)} />
+
+
+ );
+}
+
+PhoneListItem.propTypes = {
+ index: PropTypes.number.isRequired,
+ label: PropTypes.string.isRequired,
+ number: PropTypes.string.isRequired,
+ handleDelete: PropTypes.func.isRequired,
+ handleEdit: PropTypes.func,
+ handleEditStart: PropTypes.func.isRequired,
+};
+
+PhoneListItem.defaultProps = {
+ handleEdit: null,
+};
+
+
+
diff --git a/app/components/Profile/Profile.stateProps.js b/app/components/Profile/Profile.stateProps.js
index cdcb45e..e4eea74 100644
--- a/app/components/Profile/Profile.stateProps.js
+++ b/app/components/Profile/Profile.stateProps.js
@@ -1,14 +1,15 @@
-import { getProfile, isGeneratedNomDeBid } from '../../selectors/profile.js';
+import { getProfile, isGeneratedNomDeBid, isRegisteredAccount } from '../../selectors/profile.js';
export const matchStateToProps = (state) => {
const profile = getProfile(state);
return {
- addresses: profile.get('addresses').toArray(),
+ addresses: profile.get('addresses'),
avatar: profile.get('avatar'),
email: profile.get('email'),
initials: profile.get('initials'),
isGeneratedNomDeBid: isGeneratedNomDeBid(state),
+ isRegisteredAccount: isRegisteredAccount(state),
nomDeBid: profile.get('nomDeBid'),
phones: profile.get('phones'),
};
diff --git a/app/components/Profile/Profile.styles.js b/app/components/Profile/Profile.styles.js
index bdaab72..d22edfb 100644
--- a/app/components/Profile/Profile.styles.js
+++ b/app/components/Profile/Profile.styles.js
@@ -2,7 +2,35 @@ import { StyleSheet } from 'react-native';
export default StyleSheet.create({
container: {
+ alignItems: 'flex-start',
+ backgroundColor: '#F5FCFF',
flex: 1,
+ justifyContent: 'center',
+ paddingLeft: 10,
+ paddingRight: 10,
+ },
+ sectionWrap: {
+ marginBottom: 15,
+ },
+ avatarWrap: {
+ marginBottom: 40,
+ marginTop: 30,
+ textAlign: 'center',
+ },
+ groupHeading: {
+ fontSize: 18,
+ fontWeight: 'bold',
+ margin: 10,
+ textAlign: 'center',
+ },
+ hintText: {
+ color: '#666666',
+ fontSize: 14,
+ margin: 5,
+ },
+ textInput: {
+ fontSize: 24,
+ margin: 10,
+ textAlign: 'center',
},
- textInput: {},
});
diff --git a/app/components/Profile/ViewProfile.container.js b/app/components/Profile/ViewProfile.container.js
index 4d1b9d3..931d6bf 100644
--- a/app/components/Profile/ViewProfile.container.js
+++ b/app/components/Profile/ViewProfile.container.js
@@ -2,7 +2,6 @@ import { connect } from 'react-redux';
import { getProfile } from '../../selectors/profile.js';
import { matchStateToProps as matchCommonStateProps } from './Profile.stateProps.js';
-import { isRegisteredAccount } from '../../selectors/profile.js';
import ViewProfile from './ViewProfile.js';
@@ -13,7 +12,6 @@ const matchStateToProps = (state) => {
return {
...commonProps,
fullName: profile.get('fullName'),
- isRegisteredAccount: isRegisteredAccount(state),
};
};
diff --git a/app/components/Profile/ViewProfile.js b/app/components/Profile/ViewProfile.js
index bcb8910..f04b6f6 100644
--- a/app/components/Profile/ViewProfile.js
+++ b/app/components/Profile/ViewProfile.js
@@ -1,6 +1,7 @@
+import { List } from 'immutable';
import React, { useState } from 'react';
import PropTypes from 'prop-types';
-import { Button, Text, TextInput, View } from 'react-native';
+import { Button, ScrollView, Text, TextInput, View } from 'react-native';
import { Avatar } from 'react-native-elements';
import EditNomDeBid from './EditNomDeBid.container.js';
@@ -23,9 +24,9 @@ export default function ViewProfile({
nomDeBid,
phones,
}) {
- const _getSavedText = (count) => `${count} saved`;
- const addressesCountString = _getSavedText(addresses.length);
- const phonesCountString = _getSavedText(phones.length);
+ const _getSavedText = (count) => count > 0 ? `${count} saved` : 'None saved';
+ const addressesCountString = _getSavedText(addresses.size);
+ const phonesCountString = _getSavedText(phones.size);
const [isEditingNom, setEditNom] = useState(false);
@@ -34,7 +35,7 @@ export default function ViewProfile({
const numbersTitle = 'numbers';
return (
-
+
{avatar !== null ? (
@@ -72,12 +73,12 @@ export default function ViewProfile({
)}
-
+
);
}
ViewProfile.propTypes = {
- addresses: PropTypes.array,
+ addresses: PropTypes.oneOfType([PropTypes.array, PropTypes.instanceOf(List)]),
avatar: PropTypes.string,
editProfileAction: PropTypes.func,
email: PropTypes.string,
@@ -86,11 +87,11 @@ ViewProfile.propTypes = {
isGeneratedNomDeBid: PropTypes.bool,
isRegisteredAccount: PropTypes.bool,
nomDeBid: PropTypes.string,
- phones: PropTypes.array,
+ phones: PropTypes.oneOfType([PropTypes.array, PropTypes.instanceOf(List)]),
};
ViewProfile.defaultProps = {
- addresses: [],
+ addresses: new List(),
avatar: null,
editProfileAction: null,
email: null,
@@ -99,5 +100,5 @@ ViewProfile.defaultProps = {
isGeneratedNomDeBid: false,
isRegisteredAccount: false,
nomDeBid: null,
- phones: [],
+ phones: new List(),
};
diff --git a/app/constants/constants.js b/app/constants/constants.js
index 61f63ae..d7c9129 100644
--- a/app/constants/constants.js
+++ b/app/constants/constants.js
@@ -51,3 +51,11 @@ export const API_ENDPOINTS = {
export const PERMISSIONS = {
FACEBOOK: ['email', 'public_profile'],
};
+
+export const PHONE_TYPES = {
+ HOME: { label: 'home', value: 'home' },
+ MOBILE: { label: 'mobile', value: 'mobile' },
+ WORK: { label: 'work', value: 'work' },
+};
+
+export const PHONE_TYPE_DEFAULT = PHONE_TYPES.HOME.value;
diff --git a/app/router.js b/app/router.js
index 0bfd54e..5bb9732 100644
--- a/app/router.js
+++ b/app/router.js
@@ -13,9 +13,20 @@ import ImageDetail from './screens/ImageDetail.js';
import Item from './screens/Item.js';
import Marketplace from './screens/Marketplace.js';
import Profile from './screens/Profile.container.js';
-import Register from './screens/Register.js';
+import Register from './screens/Register.container.js';
import SignInOrRegister from './screens/SignInOrRegister.js';
+const tabBarVisibility = ({ navigation }) => {
+ let tabBarVisible = true;
+ if (navigation.state.index > 0) {
+ tabBarVisible = false;
+ }
+
+ return {
+ tabBarVisible,
+ };
+};
+
export const SignInOrRegisterStack = createStackNavigator({
SignInOrRegister: {
screen: SignInOrRegister,
@@ -35,6 +46,33 @@ export const SignInOrRegisterStack = createStackNavigator({
},
});
+SignInOrRegisterStack.navigationOptions = tabBarVisibility;
+
+export const ProfileStack = createStackNavigator({
+ Profile: {
+ screen: Profile,
+ navigationOptions: ({ navigation }) => ({
+ header: ,
+ }),
+ },
+ SignInOrRegister: {
+ screen: SignInOrRegister,
+ navigationOptions: ({ navigation }) => ({
+ header: null,
+ gesturesEnabled: false,
+ }),
+ },
+ Register: {
+ screen: Register,
+ navigationOptions: ({ navigation }) => ({
+ header: null,
+ gesturesEnabled: false,
+ }),
+ },
+});
+
+ProfileStack.navigationOptions = tabBarVisibility;
+
export const AuctionStack = createStackNavigator({
Auction: {
screen: Auction,
@@ -60,6 +98,8 @@ export const AuctionStack = createStackNavigator({
},
});
+AuctionStack.navigationOptions = tabBarVisibility;
+
export const BazaarStack = createStackNavigator({
Bazaar: {
screen: Marketplace,
@@ -93,12 +133,13 @@ export const BazaarStack = createStackNavigator({
},
});
+BazaarStack.navigationOptions = tabBarVisibility;
+
export const EventsStack = createStackNavigator({
Events: {
screen: Events,
navigationOptions: ({ navigation }) => ({
header: ,
- tabBarVisible: false,
gesturesEnabled: false,
}),
},
@@ -106,12 +147,13 @@ export const EventsStack = createStackNavigator({
screen: Event,
navigationOptions: ({ navigation }) => ({
header: ,
- tabBarVisible: false,
gesturesEnabled: false,
}),
},
});
+EventsStack.navigationOptions = tabBarVisibility;
+
export const Tabs = createBottomTabNavigator({
Event: {
screen: EventsStack,
@@ -141,7 +183,7 @@ export const Tabs = createBottomTabNavigator({
},
},
Profile: {
- screen: Profile,
+ screen: ProfileStack,
navigationOptions: {
tabBarLabel: 'Profile',
tabBarIcon: ({ tintColor }) => (
@@ -149,4 +191,4 @@ export const Tabs = createBottomTabNavigator({
),
},
},
-});
+}, { initialRouteName: 'Event' });
diff --git a/app/screens/Events.js b/app/screens/Events.js
index f95f6c5..9e5ce49 100644
--- a/app/screens/Events.js
+++ b/app/screens/Events.js
@@ -9,7 +9,7 @@ import EventListItem from '../components/Events/EventListItem.container.js';
export default class Events extends Component {
static get propTypes() {
return {
- events: PropTypes.instanceOf(List),
+ events: PropTypes.oneOfType([PropTypes.array, PropTypes.instanceOf(List)]),
fetchEvents: PropTypes.func.isRequired,
setActiveEvent: PropTypes.func.isRequired,
};
@@ -23,6 +23,7 @@ export default class Events extends Component {
constructor(props) {
super(props);
+ this._renderEventListItem = this._renderEventListItem.bind(this);
this._setActiveEvent = this.setActiveEvent.bind(this);
}
@@ -32,9 +33,9 @@ export default class Events extends Component {
_keyExtractor = (event, index) => `${event.id}_${index}`;
- _renderEventListItem = ({ event }) => (
-
- );
+ _renderEventListItem({ event }) {
+ return ;
+ };
render() {
const { events } = this.props;
@@ -50,7 +51,7 @@ export default class Events extends Component {
style={styles.eventList}
/>
) : (
-
+
)}
);
diff --git a/app/screens/Marketplace.js b/app/screens/Marketplace.js
index 4db0446..a1a02ce 100644
--- a/app/screens/Marketplace.js
+++ b/app/screens/Marketplace.js
@@ -7,7 +7,7 @@ import { FlatList, Text, View } from 'react-native';
import { SORT_MODES, AUCTION_VIEW_MODES } from '../constants/constants.js';
import FilterBar from '../components/Auction/FilterBar.js';
-import AuctionListItem from '../containers/Auction/AuctionListItem.js';
+import AuctionListItem from '../components/Auction/AuctionListItem.container.js';
import styles from './Auction.styles.js';
diff --git a/app/screens/Register.js b/app/screens/Register.js
index 21d5277..68619ed 100644
--- a/app/screens/Register.js
+++ b/app/screens/Register.js
@@ -21,9 +21,10 @@ export default function Register({ doRegistration, navigation }) {
{title}
navigation.goBack()}
+ cancelEditAction={() => navigation.goBack()}
saveProfileAction={_doRegistration}
saveProfileLabel="Register"
+ showPasswordEntry
/>
);
diff --git a/ios/Eventment.xcodeproj/project.pbxproj b/ios/Eventment.xcodeproj/project.pbxproj
index cdba7cd..4e8c38d 100644
--- a/ios/Eventment.xcodeproj/project.pbxproj
+++ b/ios/Eventment.xcodeproj/project.pbxproj
@@ -848,9 +848,43 @@
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Eventment/Pods-Eventment-resources.sh",
+ "${PODS_ROOT}/FBSDKCoreKit/FacebookSDKStrings.bundle",
+ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf",
+ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Entypo.ttf",
+ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf",
+ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Feather.ttf",
+ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf",
+ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf",
+ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf",
+ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf",
+ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Fontisto.ttf",
+ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Foundation.ttf",
+ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf",
+ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf",
+ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf",
+ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Octicons.ttf",
+ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf",
+ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Zocial.ttf",
);
name = "[CP] Copy Pods Resources";
outputPaths = (
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FacebookSDKStrings.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AntDesign.ttf",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Entypo.ttf",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EvilIcons.ttf",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Feather.ttf",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome.ttf",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Brands.ttf",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Regular.ttf",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Solid.ttf",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Fontisto.ttf",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Foundation.ttf",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Ionicons.ttf",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialCommunityIcons.ttf",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialIcons.ttf",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Octicons.ttf",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SimpleLineIcons.ttf",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Zocial.ttf",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index e060d51..89b3be2 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -1,6 +1,16 @@
PODS:
- boost-for-react-native (1.63.0)
- DoubleConversion (1.1.6)
+ - FBSDKCoreKit (5.3.0):
+ - FBSDKCoreKit/Basics (= 5.3.0)
+ - FBSDKCoreKit/Core (= 5.3.0)
+ - FBSDKCoreKit/Basics (5.3.0)
+ - FBSDKCoreKit/Core (5.3.0):
+ - FBSDKCoreKit/Basics
+ - FBSDKLoginKit (5.3.0):
+ - FBSDKCoreKit (~> 5.0)
+ - FBSDKShareKit (5.3.0):
+ - FBSDKCoreKit (~> 5.0)
- Folly (2018.10.22.00):
- boost-for-react-native
- DoubleConversion
@@ -57,6 +67,20 @@ PODS:
- React-cxxreact (= 0.60.0)
- React-jsi (= 0.60.0)
- React-jsinspector (0.60.0)
+ - react-native-fbsdk (1.0.1):
+ - React
+ - react-native-fbsdk/Core (= 1.0.1)
+ - react-native-fbsdk/Login (= 1.0.1)
+ - react-native-fbsdk/Share (= 1.0.1)
+ - react-native-fbsdk/Core (1.0.1):
+ - FBSDKCoreKit (~> 5.0)
+ - React
+ - react-native-fbsdk/Login (1.0.1):
+ - FBSDKLoginKit (~> 5.0)
+ - React
+ - react-native-fbsdk/Share (1.0.1):
+ - FBSDKShareKit (~> 5.0)
+ - React
- React-RCTActionSheet (0.60.0):
- React-Core (= 0.60.0)
- React-RCTAnimation (0.60.0):
@@ -81,10 +105,14 @@ PODS:
- React-RCTWebSocket (0.60.0):
- React-Core (= 0.60.0)
- React-fishhook (= 0.60.0)
+ - RNCAsyncStorage (1.6.1):
+ - React
- RNGestureHandler (1.3.0):
- React
- RNScreens (1.0.0-alpha.23):
- React
+ - RNSecureStorage (0.1.2):
+ - React
- RNVectorIcons (6.6.0):
- React
- yoga (0.60.0.React)
@@ -101,6 +129,7 @@ DEPENDENCIES:
- React-jsi (from `../node_modules/react-native/ReactCommon/jsi`)
- React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`)
- React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`)
+ - react-native-fbsdk (from `/Users/mfitzpatrick/Documents/Personal/eventment-app/node_modules/react-native-fbsdk`)
- React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
- React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
- React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`)
@@ -111,14 +140,19 @@ DEPENDENCIES:
- React-RCTText (from `../node_modules/react-native/Libraries/Text`)
- React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
- React-RCTWebSocket (from `../node_modules/react-native/Libraries/WebSocket`)
- - RNGestureHandler (from `/Users/mifi/Temporary Projects/eventment-app/node_modules/react-native-gesture-handler`)
- - RNScreens (from `/Users/mifi/Temporary Projects/eventment-app/node_modules/react-native-screens`)
- - RNVectorIcons (from `/Users/mifi/Temporary Projects/eventment-app/node_modules/react-native-vector-icons`)
+ - "RNCAsyncStorage (from `/Users/mfitzpatrick/Documents/Personal/eventment-app/node_modules/@react-native-community/async-storage`)"
+ - RNGestureHandler (from `/Users/mfitzpatrick/Documents/Personal/eventment-app/node_modules/react-native-gesture-handler`)
+ - RNScreens (from `/Users/mfitzpatrick/Documents/Personal/eventment-app/node_modules/react-native-screens`)
+ - RNSecureStorage (from `/Users/mfitzpatrick/Documents/Personal/eventment-app/node_modules/react-native-secure-storage`)
+ - RNVectorIcons (from `../node_modules/react-native-vector-icons`)
- yoga (from `../node_modules/react-native/ReactCommon/yoga`)
SPEC REPOS:
https://github.com/cocoapods/specs.git:
- boost-for-react-native
+ - FBSDKCoreKit
+ - FBSDKLoginKit
+ - FBSDKShareKit
EXTERNAL SOURCES:
DoubleConversion:
@@ -143,6 +177,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/ReactCommon/jsiexecutor"
React-jsinspector:
:path: "../node_modules/react-native/ReactCommon/jsinspector"
+ react-native-fbsdk:
+ :path: "/Users/mfitzpatrick/Documents/Personal/eventment-app/node_modules/react-native-fbsdk"
React-RCTActionSheet:
:path: "../node_modules/react-native/Libraries/ActionSheetIOS"
React-RCTAnimation:
@@ -163,18 +199,25 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/Libraries/Vibration"
React-RCTWebSocket:
:path: "../node_modules/react-native/Libraries/WebSocket"
+ RNCAsyncStorage:
+ :path: "/Users/mfitzpatrick/Documents/Personal/eventment-app/node_modules/@react-native-community/async-storage"
RNGestureHandler:
- :path: "/Users/mifi/Temporary Projects/eventment-app/node_modules/react-native-gesture-handler"
+ :path: "/Users/mfitzpatrick/Documents/Personal/eventment-app/node_modules/react-native-gesture-handler"
RNScreens:
- :path: "/Users/mifi/Temporary Projects/eventment-app/node_modules/react-native-screens"
+ :path: "/Users/mfitzpatrick/Documents/Personal/eventment-app/node_modules/react-native-screens"
+ RNSecureStorage:
+ :path: "/Users/mfitzpatrick/Documents/Personal/eventment-app/node_modules/react-native-secure-storage"
RNVectorIcons:
- :path: "/Users/mifi/Temporary Projects/eventment-app/node_modules/react-native-vector-icons"
+ :path: "../node_modules/react-native-vector-icons"
yoga:
:path: "../node_modules/react-native/ReactCommon/yoga"
SPEC CHECKSUMS:
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
DoubleConversion: 5805e889d232975c086db112ece9ed034df7a0b2
+ FBSDKCoreKit: 39748deefe37a005f983722e433be2ddcdd83ae7
+ FBSDKLoginKit: bc0329e10045789e8d40b12d4f15ddbd07a898e2
+ FBSDKShareKit: f61d03f36ce4f1b379c7de7dbfe173662e68be44
Folly: 30e7936e1c45c08d884aa59369ed951a8e68cf51
glog: 1f3da668190260b06b429bb211bfbee5cd790c28
React: 4b3c068e793e96672dcd186a2b572fac43e4b031
@@ -185,6 +228,7 @@ SPEC CHECKSUMS:
React-jsi: 8e128c4d0d8febc2977ef617d1c09bb54326069c
React-jsiexecutor: 7a3554f703a58963ec80b860144ea0f0e9b910e1
React-jsinspector: d4ed52225912efe0019bb7f1a225aec20f23049a
+ react-native-fbsdk: 080f3bb23513c5b59b6528543206fe0d1436bb7e
React-RCTActionSheet: b27ff3cf3a68f917c46d2b94abf938b625b96570
React-RCTAnimation: 9e4708e5bd65fca8285ce7c0aa076f3f4fa5c2f8
React-RCTBlob: 6eafcc3a24f33785692a7be24918ade607bc8719
@@ -195,11 +239,13 @@ SPEC CHECKSUMS:
React-RCTText: 685fca2e13b024271048e7e247ef24476f28a41e
React-RCTVibration: 4ee1cf208ab17a50fafb1c16ffe28fe594a64e4f
React-RCTWebSocket: fca087d583724aa0e5fef7d911f0f2a28d0f2736
+ RNCAsyncStorage: 2e2e3feb9bdadc752a026703d8c4065ca912e75a
RNGestureHandler: 5329a942fce3d41c68b84c2c2276ce06a696d8b0
RNScreens: f28b48b8345f2f5f39ed6195518291515032a788
+ RNSecureStorage: 24d433f7673a0daade43689de805933a70641731
RNVectorIcons: 0bb4def82230be1333ddaeee9fcba45f0b288ed4
yoga: 616fde658be980aa60a2158835170f3f9c2d04b4
-PODFILE CHECKSUM: 26223b0d86281b1c70ae009fe120443ad6ad9bf9
+PODFILE CHECKSUM: 9a233bb7438f412e17eeb945a7c5f563882773de
-COCOAPODS: 1.7.4
+COCOAPODS: 1.6.1