From 422d13ef25784613a83091a8804a5c1b136a41d8 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Mon, 15 Dec 2025 23:36:50 +0000 Subject: [PATCH] udpate /me --- client/src/components/auth-verifier/index.tsx | 8 +++---- client/src/locales/en.json | 3 --- client/src/pages/profile/Profile.tsx | 12 +++++++++-- client/src/pages/teams/TeamMemberConfig.tsx | 21 +++++++++++++------ client/src/pages/teams/TeamMemberCreate.tsx | 18 +++++++++------- client/src/pages/teams/Teams.tsx | 10 +++++++++ client/src/pages/teams/TeamsConfig.tsx | 11 +++++++++- client/src/pages/teams/TeamsCreate.tsx | 11 +++++++++- 8 files changed, 70 insertions(+), 24 deletions(-) diff --git a/client/src/components/auth-verifier/index.tsx b/client/src/components/auth-verifier/index.tsx index fe1a316c5..9b683726c 100644 --- a/client/src/components/auth-verifier/index.tsx +++ b/client/src/components/auth-verifier/index.tsx @@ -1,5 +1,4 @@ import { useAppDispatch } from "@/hooks/AppHooks"; -import type { ApiResponse } from "@/hooks/UseApi"; import type { IUser } from "@/types/user"; import { setAuthenticated, @@ -10,7 +9,7 @@ import { import { useEffect, useState } from "react"; import { useAppSelector } from "@/hooks/AppHooks"; import type { ReactNode } from "react"; -import { get } from "@/utils/ApiClient"; +import { useGetOnDemand } from "@/hooks/UseApi"; import { useLocation, useNavigate } from "react-router-dom"; export const AuthVerifier = ({ children }: { children: ReactNode }) => { const location = useLocation(); @@ -24,6 +23,7 @@ export const AuthVerifier = ({ children }: { children: ReactNode }) => { const [isVerifying, setIsVerifying] = useState(true); const dispatch = useAppDispatch(); const selectedTeamId = useAppSelector((state) => state.auth.selectedTeamId); + const { get: getOnDemand } = useGetOnDemand(); useEffect(() => { if (isAuthRoute || isPublicRoute) { @@ -32,8 +32,8 @@ export const AuthVerifier = ({ children }: { children: ReactNode }) => { } const verify = async () => { try { - const res = await get>("/me"); - const user: IUser = res.data.data; + const res = await getOnDemand("/me"); + const user: IUser = res?.data as IUser; dispatch(setAuthenticated(true)); dispatch(setUser(user)); diff --git a/client/src/locales/en.json b/client/src/locales/en.json index 6b5b84256..250e1471c 100644 --- a/client/src/locales/en.json +++ b/client/src/locales/en.json @@ -694,9 +694,6 @@ } }, "teamMember": { - "breadcrumbOverrideConfigTeamMember": "Configure team member", - "breadcrumbOverrideConfigTeams": "Teams", - "breadcrumbOverrideCreateTeamMember": "Create team member", "form": { "role": { "description": "Choose your role for this new team. You will be the first member", diff --git a/client/src/pages/profile/Profile.tsx b/client/src/pages/profile/Profile.tsx index 17ab3177b..b99e8f772 100644 --- a/client/src/pages/profile/Profile.tsx +++ b/client/src/pages/profile/Profile.tsx @@ -4,16 +4,20 @@ import { ProfileForm } from "@/pages/profile/ProfileForm"; import { useState, useEffect } from "react"; import type { IUser } from "@/types/user"; import type { ApiResponse } from "@/hooks/UseApi"; -import { useGet, usePatch } from "@/hooks/UseApi"; +import { useGet, usePatch, useGetOnDemand } from "@/hooks/UseApi"; import { z } from "zod"; import { profileSchema } from "@/validation/zod"; import { useTranslation } from "react-i18next"; +import { useAppDispatch } from "@/hooks/AppHooks"; +import { setUser as setUserGlobal } from "@/features/authSlice"; type FormValues = z.infer; const Profile = () => { const { t } = useTranslation(); const [user, setUser] = useState | null>(null); const { response, loading } = useGet>(`/profile`, {}, {}); + const { get: getOnDemand } = useGetOnDemand(); + const dispatch = useAppDispatch(); useEffect(() => { if (response?.data) setUser(response.data); }, [response]); @@ -23,7 +27,11 @@ const Profile = () => { const onSubmit = async (data: FormValues) => { const res = await patch(`/profile`, data); if (res) { - setUser(res.data); + const me = await getOnDemand("/me"); + if (me?.data) { + setUser(me.data); + dispatch(setUserGlobal(me.data as IUser)); + } } }; const initialData = { diff --git a/client/src/pages/teams/TeamMemberConfig.tsx b/client/src/pages/teams/TeamMemberConfig.tsx index b6fbffb16..a4631ef70 100644 --- a/client/src/pages/teams/TeamMemberConfig.tsx +++ b/client/src/pages/teams/TeamMemberConfig.tsx @@ -3,13 +3,16 @@ import { Button } from "@/components/inputs"; import { Dialog } from "@/components/inputs"; import { useState } from "react"; -import { useGet, usePatch } from "@/hooks/UseApi"; +import { useGet, usePatch, useGetOnDemand } from "@/hooks/UseApi"; import { useParams } from "react-router"; import type { ApiResponse } from "@/hooks/UseApi"; import { useNavigate } from "react-router"; import { useDelete } from "@/hooks/UseApi"; import { useTranslation } from "react-i18next"; import { mutate } from "swr"; +import type { IUser } from "@/types/user"; +import { useAppDispatch } from "@/hooks/AppHooks"; +import { setUser } from "@/features/authSlice"; const TeamMemberConfig = () => { const [dialogOpen, setDialogOpen] = useState(false); @@ -18,6 +21,8 @@ const TeamMemberConfig = () => { const { t } = useTranslation(); const { id, memberId } = useParams(); const { patch, loading } = usePatch(); + const { get: getOnDemand } = useGetOnDemand(); + const dispatch = useAppDispatch(); const { response } = useGet>("/team-members"); const { response: rolesResponse } = useGet>("/roles?type=team"); @@ -30,6 +35,10 @@ const TeamMemberConfig = () => { const roleId = data.roleId; const res = await patch(`/team-members/${memberId}`, { roleId }); if (res) { + const me = await getOnDemand("/me"); + if (me?.data) { + dispatch(setUser(me.data)); + } navigate(-1); } }; @@ -38,6 +47,10 @@ const TeamMemberConfig = () => { const res = await deleteFn(`/team-members/${memberId}`); if (res) { mutate("/teams/joined"); + const me = await getOnDemand("/me"); + if (me?.data) { + dispatch(setUser(me.data)); + } navigate(-1); } setDialogOpen(false); @@ -70,11 +83,7 @@ const TeamMemberConfig = () => { {t("common.buttons.delete")} } - breadcrumbOverride={[ - t("teamMember.breadcrumbOverrideConfigTeams"), - id || "", - t("teamMember.breadcrumbOverrideConfigTeamMember"), - ]} + breadcrumbOverride={["team-members", id || "", "configure"]} /> { - const { t } = useTranslation(); const navigate = useNavigate(); + const dispatch = useAppDispatch(); + const { get: getOnDemand } = useGetOnDemand(); const { id } = useParams(); const { response } = useGet>("/team-members?type=org"); const { response: rolesResponse } = @@ -21,6 +25,10 @@ const TeamMemberCreate = () => { const res = await post("/team-members", { ...data }); if (res) { mutate("/teams/joined"); + const me = await getOnDemand("/me"); + if (me?.data) { + dispatch(setUser(me.data)); + } navigate(-1); } }; @@ -36,11 +44,7 @@ const TeamMemberCreate = () => { roles={roles} onSubmit={onSubmit} loading={false} - breadcrumbOverride={[ - t("teamMember.breadcrumbOverrideConfigTeams"), - id || "", - t("teamMember.breadcrumbOverrideCreateTeamMember"), - ]} + breadcrumbOverride={["teams", id || "", "create"]} /> ); }; diff --git a/client/src/pages/teams/Teams.tsx b/client/src/pages/teams/Teams.tsx index 75d67fd4d..1edbe6449 100644 --- a/client/src/pages/teams/Teams.tsx +++ b/client/src/pages/teams/Teams.tsx @@ -15,6 +15,10 @@ import type { ITeam } from "@/types/team"; import { useState } from "react"; import { mutate } from "swr"; import { useTheme } from "@mui/material/styles"; +import { useGetOnDemand } from "@/hooks/UseApi"; +import type { IUser } from "@/types/user"; +import { useAppDispatch } from "@/hooks/AppHooks"; +import { setUser } from "@/features/authSlice"; const TeamsPage = () => { const theme = useTheme(); @@ -24,6 +28,8 @@ const TeamsPage = () => { const { t } = useTranslation(); const { response, loading, refetch } = useGet>("/teams"); const { deleteFn, loading: isDeleting } = useDelete(); + const { get: getOnDemand } = useGetOnDemand(); + const dispatch = useAppDispatch(); const teams = response?.data || []; const handleConfirm = async () => { @@ -31,6 +37,10 @@ const TeamsPage = () => { setSelectedTeam(null); refetch(); mutate("/teams/joined"); + const me = await getOnDemand("/me"); + if (me?.data) { + dispatch(setUser(me.data)); + } }; const handleCancel = () => { setSelectedTeam(null); diff --git a/client/src/pages/teams/TeamsConfig.tsx b/client/src/pages/teams/TeamsConfig.tsx index 2aac5e783..62dbfb92e 100644 --- a/client/src/pages/teams/TeamsConfig.tsx +++ b/client/src/pages/teams/TeamsConfig.tsx @@ -3,14 +3,19 @@ import { TeamsForm } from "@/pages/teams/TeamsForm"; import { useNavigate, useParams } from "react-router"; import { z } from "zod"; import { teamSchema } from "@/validation/zod"; -import { useGet, usePatch } from "@/hooks/UseApi"; +import { useGet, usePatch, useGetOnDemand } from "@/hooks/UseApi"; import type { ApiResponse } from "@/hooks/UseApi"; +import type { IUser } from "@/types/user"; +import { useAppDispatch } from "@/hooks/AppHooks"; +import { setUser } from "@/features/authSlice"; const TeamsConfigPage = () => { type FormValues = Omit, "roleId">; const navigate = useNavigate(); const { response } = useGet>("/roles?type=team"); const { patch, loading } = usePatch>(); + const { get: getOnDemand } = useGetOnDemand(); + const dispatch = useAppDispatch(); const { id } = useParams(); const { response: teamResponse } = useGet>(`/teams/${id}`); @@ -23,6 +28,10 @@ const TeamsConfigPage = () => { description: data.description, }; await patch(`/teams/${id}`, toSubmit); + const me = await getOnDemand("/me"); + if (me?.data) { + dispatch(setUser(me.data)); + } navigate("/teams"); }; diff --git a/client/src/pages/teams/TeamsCreate.tsx b/client/src/pages/teams/TeamsCreate.tsx index 89cc72403..606eb84b1 100644 --- a/client/src/pages/teams/TeamsCreate.tsx +++ b/client/src/pages/teams/TeamsCreate.tsx @@ -3,19 +3,28 @@ import { TeamsForm } from "@/pages/teams/TeamsForm"; import { useNavigate } from "react-router"; import { z } from "zod"; import { teamSchema } from "@/validation/zod"; -import { useGet, usePost } from "@/hooks/UseApi"; +import { useGet, usePost, useGetOnDemand } from "@/hooks/UseApi"; import type { ApiResponse } from "@/hooks/UseApi"; import { mutate } from "swr"; +import type { IUser } from "@/types/user"; +import { useAppDispatch } from "@/hooks/AppHooks"; +import { setUser } from "@/features/authSlice"; const TeamsCreatePage = () => { type FormValues = z.infer; const { response } = useGet>("/roles?type=team"); const { post, loading } = usePost(); const navigate = useNavigate(); + const { get: getOnDemand } = useGetOnDemand(); + const dispatch = useAppDispatch(); const onSubmit = async (data: FormValues) => { await post("/teams", data); mutate("/teams/joined"); + const me = await getOnDemand("/me"); + if (me?.data) { + dispatch(setUser(me.data)); + } navigate("/teams"); };