show profile user in header

This commit is contained in:
hamid zarghami
2025-11-27 11:51:45 +03:30
parent 9c16a6143c
commit 93fd001951
6 changed files with 66 additions and 17 deletions
+5
View File
@@ -0,0 +1,5 @@
<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="50" cy="50" r="50" fill="#E7EAF3"/>
<path d="M51.04 45.6862C50.7025 45.6525 50.2975 45.6525 49.9263 45.6862C41.8938 45.4163 35.515 38.835 35.515 30.735C35.515 22.4662 42.1975 15.75 50.5 15.75C58.7688 15.75 65.485 22.4662 65.485 30.735C65.4513 38.835 59.0725 45.4163 51.04 45.6862Z" fill="#8C90A3"/>
<path d="M34.1651 58.14C25.9976 63.6075 25.9976 72.5175 34.1651 77.9513C43.4463 84.1613 58.6676 84.1613 67.9488 77.9513C76.1163 72.4838 76.1163 63.5738 67.9488 58.14C58.7013 51.9638 43.4801 51.9638 34.1651 58.14Z" fill="#8C90A3"/>
</svg>

After

Width:  |  Height:  |  Size: 649 B

@@ -0,0 +1,10 @@
import { useQuery } from "@tanstack/react-query";
import * as api from "../service/ProfileService";
export const useGetProfile = () => {
return useQuery({
queryKey: ["profile"],
queryFn: api.getProfile,
retry: false,
});
};
@@ -0,0 +1,7 @@
import { api } from "@/config/axios";
import { GetProfileResponse } from "../types/Types";
export const getProfile = async (): Promise<GetProfileResponse> => {
const { data } = await api.get<GetProfileResponse>("/public/user/me");
return data;
};
@@ -0,0 +1,23 @@
export interface UserProfile {
id: string;
createdAt: string;
updatedAt: string;
deletedAt: string | null;
restaurant: string;
firstName: string;
lastName: string;
phone: string;
birthDate: string;
marriageDate: string;
referrer: string | null;
isActive: boolean;
gender: boolean;
wallet: number;
points: number;
}
export interface GetProfileResponse {
statusCode: number;
success: boolean;
data: UserProfile;
}
+10 -12
View File
@@ -9,7 +9,6 @@
box-sizing: border-box; box-sizing: border-box;
} }
html, html,
body { body {
@apply h-full bg-background font-irancell font-normal text-foreground; @apply h-full bg-background font-irancell font-normal text-foreground;
@@ -109,9 +108,10 @@ input:autofill {
transition: background-color 10000s ease-in-out 0s; transition: background-color 10000s ease-in-out 0s;
} }
.box-shadow-normal { .box-shadow-normal {
box-shadow: 0px 2px 16px 0px #00000014; box-shadow: 0px 2px 16px 0px #00000014;
height: fit-content;
padding-bottom: 20px;
} }
.gradient-border { .gradient-border {
@@ -128,16 +128,14 @@ input:autofill {
/* border thickness */ /* border thickness */
border-radius: inherit; border-radius: inherit;
/* inherit border-radius from parent */ /* inherit border-radius from parent */
background: linear-gradient(to bottom right, background: linear-gradient(
var(--container) 6.25%, to bottom right,
rgba(255, 253, 253, 0) 52.01%, var(--container) 6.25%,
var(--container) 96.87%); rgba(255, 253, 253, 0) 52.01%,
mask: var(--container) 96.87%
linear-gradient(#fff 0 0) content-box, );
linear-gradient(#fff 0 0); mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
-webkit-mask: -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
-webkit-mask-composite: xor; -webkit-mask-composite: xor;
mask-composite: exclude; mask-composite: exclude;
pointer-events: none; pointer-events: none;
+10 -4
View File
@@ -10,6 +10,7 @@ import Link from 'next/link'
import { useParams } from 'next/navigation' import { useParams } from 'next/navigation'
import useToggle from '@/hooks/helpers/useToggle' import useToggle from '@/hooks/helpers/useToggle'
import LogoutPrompt from '@/features/general/LogoutPrompt' import LogoutPrompt from '@/features/general/LogoutPrompt'
import { useGetProfile } from '@/app/[name]/(Profile)/profile/hooks/userProfileData'
type Props = { type Props = {
profileDropState: boolean, profileDropState: boolean,
@@ -23,9 +24,13 @@ type Props = {
} }
function TopBar({ profileDropState, toggleProfileDropState, toggleMenuState }: Props) { function TopBar({ profileDropState, toggleProfileDropState, toggleMenuState }: Props) {
const params = useParams(); const params = useParams();
const { name } = params; const { name } = params;
const { state: logoutModal, toggle: toggleLogoutModal } = useToggle(); const { state: logoutModal, toggle: toggleLogoutModal } = useToggle();
const { data: profile } = useGetProfile();
const profileData = profile?.data;
const fullName = profileData ? `${profileData.firstName} ${profileData.lastName}`.trim() : 'کاربر داناک';
return ( return (
<div className="w-full"> <div className="w-full">
@@ -76,9 +81,9 @@ function TopBar({ profileDropState, toggleProfileDropState, toggleMenuState }: P
height={24} height={24}
alt='Profile avatar' alt='Profile avatar'
className='rounded-full' className='rounded-full'
src={'/assets/images/user-avatar.png'} /> src={'/assets/images/avatar.svg'} />
<div className='pe-0 hidden xl:inline-flex items-end' > <div className='pe-0 hidden xl:inline-flex items-end' >
<div className='ps-2 pe-1 text-xs text-nowrap'>مهرداد مظفری</div> <div className='ps-2 pe-1 text-xs text-nowrap'>{fullName}</div>
<ArrowDown2 className='stroke-disabled-text' size={14} /> <ArrowDown2 className='stroke-disabled-text' size={14} />
{/* <img src={arrow} /> */} {/* <img src={arrow} /> */}
</div> </div>
@@ -91,14 +96,15 @@ function TopBar({ profileDropState, toggleProfileDropState, toggleMenuState }: P
> >
<div className='place-items-center pt-8'> <div className='place-items-center pt-8'>
<Image <Image
src={'/assets/images/user-avatar.png'} src={'/assets/images/avatar.svg'}
width={56} width={56}
height={56} height={56}
className='rounded-full' className='rounded-full'
unoptimized unoptimized
alt={'user avatar'} alt={'user avatar'}
/> />
<p className='text-xs mt-2'>mail@danakcorp.com</p> <p className='text-xs mt-2'>{profileData?.firstName + ' ' + profileData?.lastName}</p>
{/* <p className='text-xs mt-2'>{profileData?.phone}</p> */}
</div> </div>
<Seperator className='my-6' /> <Seperator className='my-6' />