From 11d92e9aea7cfa5b44f1733160bc98d739c4a380 Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Tue, 11 Aug 2020 20:25:50 -0700 Subject: [PATCH] Added sign in errors and logos. --- app.json | 12 +-- assets/logo1024.png | Bin 0 -> 18480 bytes assets/logo240.png | Bin 0 -> 2390 bytes babel-translations.babel | 94 ++++++++++++++++ .../screen-sign-in.component.jsx | 101 +++++++++--------- .../sign-in-error-alert.component.jsx | 52 +++++++++ components/styles.js | 15 +++ redux/user/user.reducer.js | 39 ++----- redux/user/user.selectors.js | 5 + redux/user/user.types.js | 1 - translations/en-US/common.json | 8 ++ translations/es-MX/common.json | 8 ++ translations/fr-CA/common.json | 8 ++ 13 files changed, 257 insertions(+), 86 deletions(-) create mode 100644 assets/logo1024.png create mode 100644 assets/logo240.png create mode 100644 components/sign-in-error-alert/sign-in-error-alert.component.jsx create mode 100644 components/styles.js diff --git a/app.json b/app.json index f17801e..71c1336 100644 --- a/app.json +++ b/app.json @@ -3,24 +3,22 @@ "name": "imexmobile", "slug": "imexmobile", "version": "1.0.0", - "orientation": "portrait", - "icon": "./assets/icon.png", + "orientation": "both", + "icon": "./assets/icon240.png", "splash": { - "image": "./assets/splash.png", + "image": "./assets/logo1024.png", "resizeMode": "contain", "backgroundColor": "#ffffff" }, "updates": { "fallbackToCacheTimeout": 0 }, - "assetBundlePatterns": [ - "**/*" - ], + "assetBundlePatterns": ["**/*"], "ios": { "supportsTablet": true }, "web": { - "favicon": "./assets/favicon.png" + "favicon": "./assets/logo240.png" } } } diff --git a/assets/logo1024.png b/assets/logo1024.png new file mode 100644 index 0000000000000000000000000000000000000000..ad76341692b6c0c7e3813b828aa7c5f807155a0b GIT binary patch literal 18480 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 literal 0 HcmV?d00001 diff --git a/babel-translations.babel b/babel-translations.babel index 5a0bee0..62ee034 100644 --- a/babel-translations.babel +++ b/babel-translations.babel @@ -21,6 +21,32 @@ translation + + app + + + title + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + general @@ -200,6 +226,74 @@ + + errors + + + emailformat + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + usernotfound + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + wrongpassword + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + fields diff --git a/components/screen-sign-in/screen-sign-in.component.jsx b/components/screen-sign-in/screen-sign-in.component.jsx index 00f0c61..ed6ecd6 100644 --- a/components/screen-sign-in/screen-sign-in.component.jsx +++ b/components/screen-sign-in/screen-sign-in.component.jsx @@ -1,26 +1,34 @@ import { Formik } from "formik"; import { - Input, - Header, - Item, - Label, - Form, Button, - Text, Container, Content, + Form, + Input, + Item, + H1, + Label, + Text, } from "native-base"; import React from "react"; import { useTranslation } from "react-i18next"; -import { SafeAreaView, TextInput, View } from "react-native"; +import { StyleSheet, View, ActivityIndicator, Image } from "react-native"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; -import { emailSignInStart, signOutStart } from "../../redux/user/user.actions"; -import { selectCurrentUser } from "../../redux/user/user.selectors"; -import { StyleSheet } from "react-native"; +import { emailSignInStart } from "../../redux/user/user.actions"; +import { + selectCurrentUser, + selectSignInError, + selectSigningIn, +} from "../../redux/user/user.selectors"; +import SignInErrorAlertComponent from "../sign-in-error-alert/sign-in-error-alert.component"; +import styles from "../styles"; +import Logo from "../../assets/logo240.png"; const mapStateToProps = createStructuredSelector({ currentUser: selectCurrentUser, + signInError: selectSignInError, + signingIn: selectSigningIn, }); const mapDispatchToProps = (dispatch) => ({ @@ -28,7 +36,7 @@ const mapDispatchToProps = (dispatch) => ({ dispatch(emailSignInStart({ email, password })), }); -export function SignIn({ emailSignInStart }) { +export function SignIn({ emailSignInStart, signInError, signingIn }) { const { t } = useTranslation(); const formSubmit = (values) => { @@ -39,42 +47,45 @@ export function SignIn({ emailSignInStart }) { return ( + + +

{t("app.title")}

+
{({ handleChange, handleBlur, handleSubmit, values }) => ( -
- - - - - - - - - - - -
+ + + + + + + + + +
)}
@@ -83,19 +94,11 @@ export function SignIn({ emailSignInStart }) { ); } -const styles = StyleSheet.create({ - contentContainer: { - justifyContent: "center", - flex: 1, - }, +const localStyles = StyleSheet.create({ content: { paddingBottom: 150, - // flex: 1, - // backgroundColor: "#fff", - // alignItems: "center", - //justifyContent: "space-between", - // //justifyContent: "center", }, + logo: { width: 100, height: 100 }, }); export default connect(mapStateToProps, mapDispatchToProps)(SignIn); diff --git a/components/sign-in-error-alert/sign-in-error-alert.component.jsx b/components/sign-in-error-alert/sign-in-error-alert.component.jsx new file mode 100644 index 0000000..51c047f --- /dev/null +++ b/components/sign-in-error-alert/sign-in-error-alert.component.jsx @@ -0,0 +1,52 @@ +import React, { useState, useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { Container, Content, Text } from "native-base"; +import { View, StyleSheet } from "react-native"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectSignInError } from "../../redux/user/user.selectors"; +const mapStateToProps = createStructuredSelector({ + signInError: selectSignInError, +}); + +export function SignInErrorAlertComponent({ signInError }) { + const [errorText, setErrorText] = useState(""); + const { t } = useTranslation(); + + useEffect(() => { + let text; + if (signInError && signInError.code) + switch (signInError.code) { + case "auth/user-not-found": + text = t("signin.errors.usernotfound"); + break; + case "auth/invalid-email": + text = t("signin.errors.emailformat"); + break; + case "auth/wrong-password": + text = t("signin.errors.wrongpassword"); + break; + default: + text = signInError.code + " " + signInError.message; + break; + } + + setErrorText(text); + }, [signInError, setErrorText]); + return ( + + {errorText ? {errorText} : null} + + ); +} + +export default connect(mapStateToProps, null)(SignInErrorAlertComponent); + +const localStyles = StyleSheet.create({ + alert: { + color: "red", + textAlign: "center", + margin: 15, + padding: 15, + }, +}); diff --git a/components/styles.js b/components/styles.js new file mode 100644 index 0000000..8032c61 --- /dev/null +++ b/components/styles.js @@ -0,0 +1,15 @@ +import { StyleSheet } from "react-native"; +import { Row } from "native-base"; + +export default StyleSheet.create({ + contentContainer__centered: { + justifyContent: "center", + flex: 1, + }, + + evenlySpacedRow: { + flexDirection: "row", + justifyContent: "space-evenly", + alignItems: "center", + }, +}); diff --git a/redux/user/user.reducer.js b/redux/user/user.reducer.js index c320b81..69eab5f 100644 --- a/redux/user/user.reducer.js +++ b/redux/user/user.reducer.js @@ -6,39 +6,23 @@ const INITIAL_STATE = { }, bodyshop: null, fingerprint: null, + signingIn: false, error: null, conflict: false, - passwordreset: { - email: null, - error: null, - success: false, - }, }; const userReducer = (state = INITIAL_STATE, action) => { switch (action.type) { - // case UserActionTypes.VALIDATE_PASSWORD_RESET_START: - // case UserActionTypes.SEND_PASSWORD_RESET_EMAIL_START: - // return { - // ...state, - // passwordreset: { - // email: action.payload, - // error: null, - // success: false, - // }, - // }; - // case UserActionTypes.VALIDATE_PASSWORD_RESET_FAILURE: - // case UserActionTypes.SEND_PASSWORD_RESET_EMAIL_FAILURE: - // return { ...state, passwordreset: { error: action.payload } }; - // case UserActionTypes.VALIDATE_PASSWORD_RESET_SUCCESS: - // case UserActionTypes.SEND_PASSWORD_RESET_EMAIL_SUCCESS: - // return { - // ...state, - // passwordreset: { ...state.passwordreset, success: true }, - // }; + case UserActionTypes.EMAIL_SIGN_IN_START: + return { + ...state, + signingIn: true, + error: null, + }; case UserActionTypes.SIGN_IN_SUCCESS: return { ...state, + signingIn: false, currentUser: action.payload, error: null, }; @@ -54,11 +38,7 @@ const userReducer = (state = INITIAL_STATE, action) => { error: null, currentUser: { authorized: false }, }; - // case UserActionTypes.SET_USER_LANGUAGE: - // return { - // ...state, - // language: action.payload, - // }; + case UserActionTypes.UPDATE_USER_DETAILS_SUCCESS: return { ...state, @@ -75,6 +55,7 @@ const userReducer = (state = INITIAL_STATE, action) => { case UserActionTypes.EMAIL_SIGN_UP_FAILURE: return { ...state, + signingIn: false, error: action.payload, }; default: diff --git a/redux/user/user.selectors.js b/redux/user/user.selectors.js index 6d4a0bc..b6b762a 100644 --- a/redux/user/user.selectors.js +++ b/redux/user/user.selectors.js @@ -26,3 +26,8 @@ export const selectPasswordReset = createSelector( [selectUser], (user) => user.passwordreset ); + +export const selectSigningIn = createSelector( + [selectUser], + (user) => user.signingIn +); diff --git a/redux/user/user.types.js b/redux/user/user.types.js index e394beb..faa717c 100644 --- a/redux/user/user.types.js +++ b/redux/user/user.types.js @@ -1,6 +1,5 @@ const UserActionTypes = { SET_CURRENT_USER: "SET_CURRENT_USER", - GOOGLE_SIGN_IN_START: "GOOGLE_SIGN_IN_START", SIGN_IN_SUCCESS: "SIGN_IN_SUCCESS", SIGN_IN_FAILURE: "SIGN_IN_FAILURE", EMAIL_SIGN_IN_START: "EMAIL_SIGN_IN_START", diff --git a/translations/en-US/common.json b/translations/en-US/common.json index 2fcdee3..3d41e62 100644 --- a/translations/en-US/common.json +++ b/translations/en-US/common.json @@ -1,5 +1,8 @@ { "translation": { + "app": { + "title": "ImEX Mobile" + }, "general": { "actions": { "signout": "Sign Out" @@ -27,6 +30,11 @@ "actions": { "signin": "Sign In" }, + "errors": { + "emailformat": "The email you have entered is not formatted correctly. ", + "usernotfound": "No user found.", + "wrongpassword": "The password you entered is not correct." + }, "fields": { "email": "Email", "password": "Password" diff --git a/translations/es-MX/common.json b/translations/es-MX/common.json index 6e47227..d0409db 100644 --- a/translations/es-MX/common.json +++ b/translations/es-MX/common.json @@ -1,5 +1,8 @@ { "translation": { + "app": { + "title": "" + }, "general": { "actions": { "signout": "" @@ -27,6 +30,11 @@ "actions": { "signin": "" }, + "errors": { + "emailformat": "", + "usernotfound": "", + "wrongpassword": "" + }, "fields": { "email": "Email", "password": "" diff --git a/translations/fr-CA/common.json b/translations/fr-CA/common.json index 6e47227..d0409db 100644 --- a/translations/fr-CA/common.json +++ b/translations/fr-CA/common.json @@ -1,5 +1,8 @@ { "translation": { + "app": { + "title": "" + }, "general": { "actions": { "signout": "" @@ -27,6 +30,11 @@ "actions": { "signin": "" }, + "errors": { + "emailformat": "", + "usernotfound": "", + "wrongpassword": "" + }, "fields": { "email": "Email", "password": ""