fix(auth): sync navbar user after self admin edit
continuous-integration/drone/push Build is passing

Keep the logged-in user context and cookie in sync when an admin updates their own profile so the navbar reflects name changes immediately.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
AmirReza Jamali
2026-06-27 09:37:31 +03:30
parent 9202f9a271
commit a63ba453d7
3 changed files with 28 additions and 5 deletions
+13 -1
View File
@@ -25,6 +25,7 @@ interface UserContextType {
setAuthState: (data: ILoginResponse) => void;
logout: () => void;
setUser: Dispatch<SetStateAction<IUser | null>>;
syncCurrentUser: (updates: Partial<IUser>) => void;
}
const UserContext = createContext<UserContextType | undefined>(undefined);
@@ -99,6 +100,16 @@ export const UserProvider: React.FC<UserProviderProps> = ({ children }) => {
Cookies.set(COOKIE_KEYS.user, JSON.stringify(data.user));
}, []);
const syncCurrentUser = useCallback((updates: Partial<IUser>) => {
setUser((prev) => {
if (!prev) return prev;
const next = { ...prev, ...updates };
Cookies.set(COOKIE_KEYS.user, JSON.stringify(next));
return next;
});
}, []);
const value = useMemo(
() => ({
user,
@@ -108,8 +119,9 @@ export const UserProvider: React.FC<UserProviderProps> = ({ children }) => {
setAuthState,
logout,
setUser,
syncCurrentUser,
}),
[user, accessToken, isLoading, setAuthState, logout, setUser],
[user, accessToken, isLoading, setAuthState, logout, setUser, syncCurrentUser],
);
return <UserContext.Provider value={value}>{children}</UserContext.Provider>;
+13 -2
View File
@@ -1,4 +1,5 @@
import { API_ENDPOINTS, userService } from "@/lib/api";
import { useUser } from "@/contexts";
import { API_ENDPOINTS, ICreateAdminCredentials, userService } from "@/lib/api";
import {
useInfiniteQuery,
useMutation,
@@ -9,6 +10,11 @@ import { useRouter } from "next/navigation";
import { useMemo } from "react";
import { toast } from "react-toastify";
const toCurrentUserUpdates = ({
password: _password,
...profile
}: ICreateAdminCredentials) => profile;
export const useDeleteAdmin = (onSuccessCallback: () => void) => {
const queryClient = useQueryClient();
const mutationKey = useMemo(() => [API_ENDPOINTS.USER.ADMINS, "delete"], []);
@@ -45,6 +51,7 @@ export const useCreateAdmin = () => {
export const useUpdateAdmin = (id: string) => {
const queryClient = useQueryClient();
const router = useRouter();
const { user, syncCurrentUser } = useUser();
const mutationKey = useMemo(
() => [API_ENDPOINTS.USER.ADMINS, "update", id],
[id],
@@ -52,7 +59,11 @@ export const useUpdateAdmin = (id: string) => {
return useMutation({
mutationKey,
mutationFn: userService.updateAdmin,
onSuccess: (response) => {
onSuccess: (response, { id: adminId, credentials }) => {
if (user?.id === adminId) {
syncCurrentUser(toCurrentUserUpdates(credentials));
}
toast.success(response);
queryClient.invalidateQueries({
queryKey: [API_ENDPOINTS.USER.ADMINS],
+2 -2
View File
@@ -14,7 +14,7 @@ export const useProfileQuery = () => {
});
};
export const useUpdateProfileQuery = () => {
const { setUser } = useUser();
const { syncCurrentUser } = useUser();
const queryClient = useQueryClient();
const mutationKey = useMemo(
() => [API_ENDPOINTS.PROFILE.UPDATE, "UPDATE_USER_PROFILE"],
@@ -28,7 +28,7 @@ export const useUpdateProfileQuery = () => {
queryClient.invalidateQueries({
queryKey: [API_ENDPOINTS.PROFILE.READ, "CURRENT_USER_PROFILE"],
});
setUser(response);
syncCurrentUser(response);
},
});
};