Quantcast
Channel: Ionic Framework - Ionic Forum
Viewing all articles
Browse latest Browse all 48979

React / Memory Leak useEffect with ionLoading component

$
0
0

Hi There !

I’m currently working on a login page with the sessionService Redux API.
I want showing the ionLoading component while the token isn’t store in the localStorage, it’s works but I’ve this error message in my console. I’m trying some cleanup function but I haven’t find a solution.
Here my code :

/* Import Authentication and Redux stack */
import { connect } from "react-redux";
import { loginUser } from "../../redux/authentication/actions/loginUser";
import { Link, useHistory } from "react-router-dom";

/* Import React Hooks */
import { useEffect, useState } from "react";

/* Import Formik and Formik Form */
import { Formik, Form } from "formik";

/* Import Initial Values for Form */
import { INIT_VALUES_LOGIN } from "../../constants/initialValues.login";

/* Import LoginSchema Validation */
import { loginSchema } from "../../validation/login.schema";

/* Import Components */
import TypePasswordSwitch from "../../components/Type.Password.Switch/Type.Password.Switch";

/* Import Ionic components */
import {
    IonList,
    IonGrid,
    IonRow,
    IonCol,
    IonItem,
    IonLabel,
    IonInput,
    IonButton,
    IonTitle,
    IonImg,
    IonCheckbox,
    IonIcon,
    IonLoading,
} from "@ionic/react";

/* Import CSS */
import Style from "./Login.module.scss";

/* Import Ionic icons */
import { help } from "ionicons/icons";

/* Import Logo */
import LogoRose from "../../assets/img/azuracom_rose.png";

/* Import Interface and Type Values */
import { ILoginUserFormValues } from "../../interfaces/interfaces";
import ModalError from "../../components/Modal.Error/Modal.Error";

const Login: React.FC<{ loginUser: Function }> = ({ loginUser }) => {
    const history = useHistory();
    const [showPassword, setShowPassword] = useState<boolean>(false);
    const [showModalError, setShowModalError] = useState<boolean>(false);
    const [showLoading, setShowLoading] = useState<boolean>(false);

    /* useEffect to handling the IonLoading async component and cleaning this component */
    useEffect(() => {
        if (showLoading && localStorage.getItem("token")) {
            setShowLoading(false);
        }
    }, [showLoading]);

    return (
        <div className={Style.form__container}>
            <ModalError
                showModalError={showModalError}
                setShowModalError={setShowModalError}
                modifiedData="Connection"
            />
            <IonImg src={LogoRose} className={Style.form__container__logo} />
            <Formik
                initialValues={INIT_VALUES_LOGIN}
                validationSchema={loginSchema}
                onSubmit={async (
                    values: ILoginUserFormValues,
                    { setSubmitting, setFieldError }
                ) => {
                    await loginUser(
                        values,
                        history,
                        setFieldError,
                        setSubmitting,
                        setShowModalError
                    );
                }}
            >
                {({
                    values,
                    errors,
                    touched,
                    handleSubmit,
                    handleChange,
                    isSubmitting,
                }) => (
                    <Form
                        onSubmit={handleSubmit}
                        className={Style.form__container__card}
                    >
                        <IonList className={Style.form__container__card__content}>
                            <IonGrid>
                                <IonRow>
                                    <IonCol>
                                        <IonTitle className={Style.form__container__card__title}>
                                            Se Connecter
                                        </IonTitle>
                                    </IonCol>
                                </IonRow>
                                <IonRow>
                                    <IonCol className={Style.form__container__card__email}>
                                        <IonItem>
                                            <IonLabel
                                                position="floating"
                                                className={Style.form__container__card__label}
                                            >
                                                Email
                                            </IonLabel>
                                            <IonInput
                                                id="email"
                                                name="email"
                                                placeholder="user@example.com"
                                                type="email"
                                                onIonChange={handleChange}
                                                value={values.email}
                                            />
                                        </IonItem>
                                    </IonCol>
                                </IonRow>
                                <div className={ Style.form__container__card__error}>
                                    {errors.email && touched.email && errors.email}
                                </div>
                                <IonRow>
                                    <IonCol className={Style.form__container__card__password}>
                                        <IonItem>
                                            <IonLabel
                                                position="floating"
                                                className={Style.form__container__card__label}
                                            >
                                                Mot de passe
                                            </IonLabel>
                                            <div className={Style.form__container__card__password__input}>
                                                <IonInput
                                                    id="password"
                                                    name="password"
                                                    type={showPassword ? "text" : "password"}
                                                    onIonChange={handleChange}
                                                    value={values.password}
                                                />
                                                <TypePasswordSwitch
                                                    setShowPassword={setShowPassword}
                                                    showPassword={showPassword}
                                                />
                                            </div>
                                        </IonItem>
                                    </IonCol>
                                </IonRow>
                                <div className={Style.form__container__card__error}>
                                    {errors.password && touched.password && errors.password}
                                </div>
                                <IonRow>
                                    <IonCol className={Style.form__container__card__forgot}>
                                        <Link
                                            className={Style.form__container__card__forgot__link}
                                            to="#"
                                        >
                                            <IonIcon
                                                icon={help}
                                                className={Style.form__container__card__forgot__icon}
                                                color="primary"
                                            />
                                            <IonLabel>
                                                Mot de passe oublié
                                            </IonLabel>
                                        </Link>
                                    </IonCol>
                                </IonRow>
                                <IonRow>
                                    <IonCol className={Style.form__container__card__remember}>
                                        <IonCheckbox
                                            name="remember"
                                            className={Style.form__container__card__remember__box}
                                        />
                                        <IonLabel>Se souvenir de moi</IonLabel>
                                    </IonCol>
                                </IonRow>
                            </IonGrid>
                            <IonButton
                                onClick={(event) => {
                                    event.preventDefault();
                                    setShowLoading(true);
                                }}
                                expand="block"
                                className={Style.form__container__card__button}
                                type="submit"
                                disabled={isSubmitting}
                                color="secondary"
                            >
                                Valider
                            </IonButton>
                            {/* Loader Component */}
                            <IonLoading
                                isOpen={showLoading}
                                onDidDismiss={() => setShowLoading(false)}
                                message={'Patientez...'}
                                duration={2000}
                            />
                        </IonList>
                    </Form>
                )}
            </Formik>
        </div>
    );
};

export default connect(null, { loginUser })(Login);

Error Message Console :

Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.
    at Login (http://localhost:8100/static/js/main.chunk.js:11106:3)
    at ConnectFunction (http://localhost:8100/static/js/vendors~main.chunk.js:73095:75)
    at Route (http://localhost:8100/static/js/vendors~main.chunk.js:76262:29)

Greetings from France.
David

1 post - 1 participant

Read full topic


Viewing all articles
Browse latest Browse all 48979

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>