Discussions

useSession() sur next-auth v4

Image

Dans la v4 de next-auth, la fonction useSession renvoit un objet contenant deux valeurs : data et session.

 

La valeur session n'est plus un boolean comme dans la v3 mais une chaîne de caractère pouvant prendre trois valeurs : "loading" | "authenticated" | "unauthenticated".

 

Du coup ça modifie un peu la logique et j'ai donc créé une fonction qui fait ce rendu en fonction de session. Cette fonction est ensuite mise dans le JSX.

 

C'est un parti pris mais personnellement je préfère ne pas voir le menu du tout puis afficher le bon menu, plutôt que d'afficher d'abord "Accueil | Projets" puis de compléter le menu en fonction de la session. Mais c'est vraiment une histoire de goût pour le coup, vous faites comme vous le souhaitez et comme le dit très bien Louis Nicolas, si ça ne vous convient pas, passer plutôt par getServerSideProps.

 

Mon code est donc le suivant avec cette v4 de next-auth :

 

//Lib
import classes from './Header.module.css';
import Link from 'next/link';
import { useSession, signOut } from 'next-auth/react';
import { useRouter } from 'next/router';

export default function Header() {
    //Var
    const { status } = useSession();
    const router = useRouter();

    //Functions
    const onLogoutClickedHandler = async () => {
        await signOut();
        router.replace('/');
    };

    const isConnect = () => {
        if (status === 'authenticated') {
            return (
                <>
                    <li>
                        <Link href='/'>Accueil</Link>
                    </li>
                    <li>
                        <Link href='/projets'>Projets</Link>
                    </li>
                    <li>
                        <Link href='/ajouter'>Ajouter</Link>
                    </li>
                    <li>
                        <a
                            onClick={onLogoutClickedHandler}
                            style={{ cursor: 'pointer' }}
                        >
                            Déconnexion
                        </a>
                    </li>
                </>
            );
        } else if (status === 'unauthenticated') {
            return (
                <>
                    <li>
                        <Link href='/'>Accueil</Link>
                    </li>
                    <li>
                        <Link href='/projets'>Projets</Link>
                    </li>
                    <li>
                        <Link href='/inscription'>Inscription</Link>
                    </li>
                    <li>
                        <Link href='/connexion'>Connexion</Link>
                    </li>
                </>
            );
        } else if (status === 'loading') {
            return null;
        }
    };

    return (
        <header className={classes.Header}>
            <div
                className='container'
                style={{
                    display: 'flex',
                    justifyContent: 'space-between',
                    alignItems: 'center',
                }}
            >
                <h1 style={{ margin: 0 }}>Raven</h1>
                <nav>
                    <ul
                        style={{
                            display: 'flex',
                            listStyleType: 'none',
                            margin: 0,
                            padding: 0,
                            gap: '15px',
                        }}
                    >
                        {isConnect()}
                    </ul>
                </nav>
            </div>
        </header>
    );
}
0 réponse
Image
Inscrivez-vous ou connectez-vous pour participer à la discussion.
Aide spontanée

Informations

Créée le 13 octobre 2022 16:13
Dernière activité le 13 octobre 2022 16:13