From a1af516879b8b145303ec65a02f7a9ace79069b9 Mon Sep 17 00:00:00 2001 From: ducanh Date: Mon, 6 Apr 2026 22:34:44 +0700 Subject: [PATCH] profile page --- public/images/no-images.jpg | Bin 0 -> 3674 bytes .../(admin)/(others-pages)/profile/page.tsx | 28 +++++++++-- src/app/testing/page.tsx | 44 ++++++++++++++---- src/components/user-profile/UserMetaCard.tsx | 44 ++++++++++++++---- 4 files changed, 92 insertions(+), 24 deletions(-) create mode 100644 public/images/no-images.jpg diff --git a/public/images/no-images.jpg b/public/images/no-images.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f0e4bc854604d5034fd83bcc34f6dc624738f00d GIT binary patch literal 3674 zcmcH*dpr|rdpHqYL@^XjC%0{ljNlESBw_oYN0VSxivNBW~3WY!op*sM9LU!7B4)!O0 zr%)IS_Fccj{b`3lAlrWcWOf6Z09#@rzW_vKM8sr7wi^J4cM=p8`=07wATA;H(=O5P zM#KStsEDYTsHC`*gt)|?4m+aEPrGErk4hZ;Mfa?&+ut6Y3kVDFD06H8uX2mTu4pRsoIDl*^o-&6R@Dk3AQd-SZWtlPQm zLBL+I9jlC(3;+(`{Q9r`|BsTFXa7A^>r78#C7Nk$zTPt--?I*r>vgEJj=9t5e$?Wg zA3u0PU5hyhX&)A1HP_8HU)}v?5Y>b+g*~)Vj4OG(<@mr2?ENGpkmH&?l)-wiAe?`x z)$?E)WX3YLG^(u8@8MruvfEJg)yuoPB1fFCu3{PcjWeU>Q&-8+(jC>E>gnY(I?p1` zI!VMazz8ZqO;E{%wzv}LN%?O)4>nxWFA~_I3#iEnct5fe*}v#%!u*T1IB6tqda(b~ z1^g#7a56E`Bq${Z^?*Jy8c!dA*5nN$6ig%qerU=YrfQbEFs!P`qi;cs@wSj%x0n`tS>3Vtx>H>V&tkl1 zb?$~0w!b(2D$hFiGT}Wk)^U!%hdQ7mDV=z!5p8Q-Uu!uKExivmp|o zIe+|QOBDOG)s5&+vIS^AbJj2 zZ8ZQFJok33?YP5z?cYVU{-g9_S!~z03M91s+iM4J>GbKUB*J~}4R^)dbU$tF8t@Rg zo9o;VuD@AsVB)!a*!h@GRRPCCVIg@NkbY}{G7I#Y{xs6X^}j7-O%yzZ;v?C>mKN^p zm1#Bq z_FNu*>|_g;YVX8q&JU{kP`dFA@`!Q$A@r2m;HlP{U`}trQ>RJvt29wU(5gG528Hr- zA%OjsjL&>^Y<$zlE9G!O{LKLj`pjSD6C`g zoAsDgvlIPq-ixT{m^q+H`X2jDB#FpVZRL|}aY{l_1R=8>pD2Z|P46lg2@Ld}*LAD9 zda`*!?xIze(N|u{6a@p)_W$YrwS927qp_jA)xO^ol@OgI(}=g!_bEA6p7TH5__z5t zH`n8`Y`F#{r7|75 z5~a8Ub_{eU&0|Hw_val?^}|)kE*d&<=(YLv*L(k{pD&ETsfJ1akiQ_GUV8yW2$5U$ z{Xdcxecal;(hrsX5+{z2m3Z5Iu162*a&#Kl_V9_p!PLi z!0nKz#uGk=EYck~no)AmOE?Ey?e%|!!8vWuURTX87VwNBHrt+E2~BvoCD zJ)uT(oVIq+8`v}2Y&;PdA5Wefdzv?7y)hy|7`5Kp%jmrmmSM3k6;rD1Q88y{w;UM=$(xeaLS4_f)P?dqNS zD<3RkfXIC2H~J(H6jC+tyjceVxqgP^wrQ=iG#-p3@}gAh*D_sa8>VKb0_J^l(kNc3 zwa6UD>Pf3=*j(A2O-TEbVzlmHI1SOK6p+d2Y2;g1)qrrr$!d{@rj{9})N-jmkz?#xiH3IXXLR1^E@4>C`L(luw`AA<@{V?fo+zI6{ zXY(XNCc56EyA(ZDpP?OQ`PtT`n0h(9D{D6oYSa!gD@p0$&qK21%Q{GT@mzHfCi$c9 zG%1cT?rH7!HpxOU-E;MJ0+FE-Dr`zs?}{mg3QKb`f_^)(p@1G=4ZZgwCQS)m&C`8a}iHvvFUzcFqyr?esN0FZOV@xUsmE}b^BAAtslhfx{BTqwJYsk?V zS+J$%4<(vCHvM)~P&r9iDaqiNRRTYv9$Rcbi(O?ftKep3X9}b1WL_oV<8!4p2#&#( zCgFq@3%knUzQrdzGQ}rHu43I9J_(;u{lRE(=_}HeZd)5Mx@$JSuVYo`nimh-FDg+F zSNMzFVM(A2j9Nf07G_V2{XzmSc#j4MifsE3bnq)vulp!_7a%U!N73uY7TxqcFph&Uc3q)u1HwvY3%vANPL7#=DEgMNnXj@Zb;;c-%cO!Uyhn|lds5nqUP^y{ zd`*ATXS1JVv36lHvdDMMPJH7ACMGG3+coH@SaMZL(fNz)h*Ut&bQC7X8z1thtyTa z3G`WXJT?mVz)9E@n!Vz@86y1wv-|{UcolTnIW0?hFuBH}&)A?D;_qAel=T4cXPKaA_?h7GEgR`ji>hd6P8hrnSu{1WtKWpcsr@AdPvl{` zN%8QYUua6#E|uP6-7VfNVD7(w>1BXgc_{oMyLdTv%{B3p#O_cpBQ4Y&mGU^Fg633} zYsFml*lZfVv#FDrpNb%WV0f53?b@^E5U=}RJ|5o&bZr0!ZjQ9YzYELmxI$A}F;tD7 z6^!Qu{k{K%?eLz(XgyFU{tQleAp+kb3^gqkh1a!fZUdB=+V^a2aiIcg^n&q#FW%#& zN51bgQ&Woc5tW)rxswrcP{@7FNN5qTitP$uTI!RHB^Z0ZcYRbg0sVY#(oV3@YIkh$ z`fkfG8rm@PE!K2T)rs8r%g$B-u}RmJJ5Xr@3DAkmrh9 zDN*b=p~g+qo9>ih)~d{Ae#^%zMNL_V)8r~r^-|u zDl03TLDG$i<-3^C#rC!IEtZ?FPG|LS?m8WQdoM3e!G5B!o5AAqOAty=nGr5??{R8b z(AnOV^17`NnJv<^s{Ccwp>cTErW*MxS!{`;v*@-;>b@vFIL~d5pRz7`IPfM};gndO zBr+f{kW(DNPJO0bU+8ru2rO6H(8I7dtGtn%O&#ug2Gg52eBJruP?+6ZmqQ*loA1Hq zQ4~!wj~9o%Ff8qulzqH6aEYXmqyrsS2c0!GcTBcka9Oi4HF(r4L8;cI6>4fiQI@Bt zA%2U>S0pl11gz&Rnu;2kk?p73PaaLZ8FTIqUTVX`@=IWkf+fT?npzt*loOyUa^l!a z+wzCa*jOeic!i#~^1pmWe-!C|N5!@W{sEmNZrcC= literal 0 HcmV?d00001 diff --git a/src/app/(admin)/(others-pages)/profile/page.tsx b/src/app/(admin)/(others-pages)/profile/page.tsx index ef43221..aae12bb 100644 --- a/src/app/(admin)/(others-pages)/profile/page.tsx +++ b/src/app/(admin)/(others-pages)/profile/page.tsx @@ -1,14 +1,32 @@ -"use client" +"use client"; import UserAddressCard from "@/components/user-profile/UserAddressCard"; import UserInfoCard from "@/components/user-profile/UserInfoCard"; -import UserMetaCard from "@/components/user-profile/UserMetaCard"; +import UserMetaCard, { UserMetaCardProps } from "@/components/user-profile/UserMetaCard"; +import { apiGetCurrentUser } from "@/service/auth"; import { RootState } from "@/store/store"; +import { useEffect, useState } from "react"; import { useSelector } from "react-redux"; export default function Profile() { - const user = useSelector((state: RootState) => state.user.data); - console.log("Current User:", user); + const [user, setUser] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchUser = async () => { + try { + const result = await apiGetCurrentUser(); + console.log("Current User:", result); + setUser(result); + } catch (err) { + console.error("Lỗi:", err); + } finally { + setLoading(false); + } + }; + fetchUser(); + }, []); + return (
@@ -16,7 +34,7 @@ export default function Profile() { Profile
- +
diff --git a/src/app/testing/page.tsx b/src/app/testing/page.tsx index 95daeaf..6b6d555 100644 --- a/src/app/testing/page.tsx +++ b/src/app/testing/page.tsx @@ -1,11 +1,37 @@ -import { API } from "../../../api"; +'use client'; // Bắt buộc phải có dòng này -export default async function GetUser() { - let data = await fetch(API.User.CURRENT, { - credentials: "include", - }); +import { useState, useEffect } from 'react'; +import { apiGetCurrentUser } from "@/service/auth"; - let result = await data.json(); - console.log("Current User from GetUser component:", result); - return
GetUser
; -} +export default function GetUser() { + const [user, setUser] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + const fetchUser = async () => { + try { + setLoading(true); + const result = await apiGetCurrentUser(); + console.log("Current User from useEffect:", result); + setUser(result); + } catch (err) { + console.error("Lỗi 401 hoặc lỗi kết nối:", err); + // setError(err); + } finally { + setLoading(false); + } + }; + + fetchUser(); + }, []); // Dependency array rỗng để chỉ chạy 1 lần khi mount + + if (loading) return
Đang tải thông tin...
; + if (error) return
Bạn chưa đăng nhập (Lỗi 401)
; + + return ( +
+

Thông tin người dùng hiện tại:

+
+ ); +} \ No newline at end of file diff --git a/src/components/user-profile/UserMetaCard.tsx b/src/components/user-profile/UserMetaCard.tsx index 4623c44..5103533 100644 --- a/src/components/user-profile/UserMetaCard.tsx +++ b/src/components/user-profile/UserMetaCard.tsx @@ -6,15 +6,39 @@ import Button from "../ui/button/Button"; import Input from "../form/input/InputField"; import Label from "../form/Label"; import Image from "next/image"; +interface Profile { + avatar_url?: string; + bio?: string; + country_code?: string; + display_name?: string; + full_name?: string; + location?: string; + phone?: string; + website?: string; +} +interface Data { + email?: string; + profile?: Profile; + roles?: Role[]; +} +interface Role { + id?: number; + name?: string; +} +export interface UserMetaCardProps { + message?: string; + status?: boolean; + data?: Data; +} -export default function UserMetaCard() { +export default function UserMetaCard({ data }: { data: UserMetaCardProps }) { const { isOpen, openModal, closeModal } = useModal(); const handleSave = () => { - // Handle save logic here console.log("Saving changes..."); closeModal(); }; + console.log("UserMetaCard data:", data.data?.profile?.display_name); return ( <>
@@ -24,25 +48,25 @@ export default function UserMetaCard() { user

- Musharof Chowdhury + {data.data?.profile?.display_name || "Unknown User"}

- Team Manager + {data.data?.profile?.bio || "No bio available"}

- Arizona, United States + {data.data?.profile?.location || "user location"}

- */}
- + */}