udpate /me

This commit is contained in:
Alex Holliday committed 2025-12-15 23:36:50 +00:00
1 parent 666d522ee9
commit 422d13ef25
8 files changed
+70 -24

No files matched your search

@@ -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<IUser>();
useEffect(() => {
if (isAuthRoute || isPublicRoute) {
@@ -32,8 +32,8 @@ export const AuthVerifier = ({ children }: { children: ReactNode }) => {
}
const verify = async () => {
try {
const res = await get<ApiResponse<IUser>>("/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));
-3
View File
@@ -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",
+10 -2
View File
@@ -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<typeof profileSchema>;
const Profile = () => {
const { t } = useTranslation();
const [user, setUser] = useState<Partial<IUser> | null>(null);
const { response, loading } = useGet<ApiResponse<any>>(`/profile`, {}, {});
const { get: getOnDemand } = useGetOnDemand<IUser>();
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 = {
+15 -6
View File
@@ -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<boolean>(false);
@@ -18,6 +21,8 @@ const TeamMemberConfig = () => {
const { t } = useTranslation();
const { id, memberId } = useParams();
const { patch, loading } = usePatch();
const { get: getOnDemand } = useGetOnDemand<IUser>();
const dispatch = useAppDispatch();
const { response } = useGet<ApiResponse<any>>("/team-members");
const { response: rolesResponse } =
useGet<ApiResponse<any>>("/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")}
</Button>
}
breadcrumbOverride={[
t("teamMember.breadcrumbOverrideConfigTeams"),
id || "",
t("teamMember.breadcrumbOverrideConfigTeamMember"),
]}
breadcrumbOverride={["team-members", id || "", "configure"]}
/>
<Dialog
open={dialogOpen}
+11 -7
View File
@@ -4,11 +4,15 @@ import { useParams } from "react-router";
import { useGet, usePost } from "@/hooks/UseApi";
import type { ApiResponse } from "@/hooks/UseApi";
import { useNavigate } from "react-router";
import { useTranslation } from "react-i18next";
import { mutate } from "swr";
import { useGetOnDemand } from "@/hooks/UseApi";
import type { IUser } from "@/types/user";
import { useAppDispatch } from "@/hooks/AppHooks";
import { setUser } from "@/features/authSlice";
const TeamMemberCreate = () => {
const { t } = useTranslation();
const navigate = useNavigate();
const dispatch = useAppDispatch();
const { get: getOnDemand } = useGetOnDemand<IUser>();
const { id } = useParams();
const { response } = useGet<ApiResponse<any>>("/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"]}
/>
);
};
+10
View File
@@ -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<ApiResponse<any>>("/teams");
const { deleteFn, loading: isDeleting } = useDelete();
const { get: getOnDemand } = useGetOnDemand<IUser>();
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);
+10 -1
View File
@@ -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<z.infer<typeof teamSchema>, "roleId">;
const navigate = useNavigate();
const { response } = useGet<ApiResponse<any>>("/roles?type=team");
const { patch, loading } = usePatch<FormValues, ApiResponse<any>>();
const { get: getOnDemand } = useGetOnDemand<IUser>();
const dispatch = useAppDispatch();
const { id } = useParams();
const { response: teamResponse } = useGet<ApiResponse<any>>(`/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");
};
+10 -1
View File
@@ -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<typeof teamSchema>;
const { response } = useGet<ApiResponse<any>>("/roles?type=team");
const { post, loading } = usePost<FormValues>();
const navigate = useNavigate();
const { get: getOnDemand } = useGetOnDemand<IUser>();
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");
};