get profile details from token

PHOTO EMBED

Sun Jul 23 2023 17:00:42 GMT+0000 (Coordinated Universal Time)

Saved by @nelson22

src > helpers > getDataFromToken.ts

import jwt from "jsonwebtoken";
import { NextRequest } from "next/server";

export const getDataFromToken = (request: NextRequest) => {
    try {
        const token = request.cookies.get('token')?.value || '';
        const decodedToken: any = jwt.verify(token, process.env.TOKEN_SECRET!);
        return decodedToken.id;
    } catch (error: any) {
        throw new Error(error.message);
    }
}

-------------------------------------------------------------------------------
  
src > app > api > users > me > route.ts

import { getDataFromToken } from "@/helpers/getDataFromToken";
import Users from "@/models/userModel";
import {connect} from '@/dbConfig/dbConfig';
import { NextRequest, NextResponse } from "next/server";

connect();

export async function GET(request: NextRequest){
    try {
        const userId = await getDataFromToken(request);
        const user = await Users.findOne({_id: userId}).select("-password -isAdmin");
        return NextResponse.json({
            message: 'User found',
            data: user
        })
    } catch (error: any) {
        return NextResponse.json({error: error.message}, {status: 404})
    }
}

-------------------------------------------------------------------------------
  
src > app > profile > page.tsx

"use client"
import axios from "axios";
import { useRouter } from "next/navigation";
import { useEffect, useState } from "react";

export default function profilePage(){
    const router = useRouter();
    const [userData, setUserData] = useState({});

    const logout = async () =>{
        try {
            await axios.get('/api/users/logout');
            router.push('/login');
        } catch (error) {
            console.log(error);
        }
    }

    const getUserDetails = async () => {
        const response = await axios.get('/api/users/me');
        console.log("r=",response.data.data);
        setUserData(response.data.data);
    }

    useEffect(() => {
        getUserDetails();
    }, [])

    return(
        <div>
            <h1 className="page-hd">Profile page</h1>
            <h2>Username: {userData.username}</h2>
            <h2>Email: {userData.email}</h2>
            <button onClick={logout}>Logout</button>
        </div>
    )
}
content_copyCOPY