From 609f707907fd9db2be4e92889979e7f5f54070ab Mon Sep 17 00:00:00 2001 From: Majoodeh Date: Mon, 9 Feb 2026 15:01:57 +0100 Subject: [PATCH 1/2] feat: add logout logic --- client/src/api/auth/auth.api.ts | 5 ++++ .../auth/mutations/useLogoutMutation.ts | 27 +++++++++++++++++++ client/src/hooks/useLogout.ts | 14 ++++++++++ 3 files changed, 46 insertions(+) create mode 100644 client/src/features/auth/mutations/useLogoutMutation.ts create mode 100644 client/src/hooks/useLogout.ts diff --git a/client/src/api/auth/auth.api.ts b/client/src/api/auth/auth.api.ts index b49f88d..089cede 100644 --- a/client/src/api/auth/auth.api.ts +++ b/client/src/api/auth/auth.api.ts @@ -27,3 +27,8 @@ export async function refreshApi() { const res = await apiProtected.post("/api/auth/refresh-token"); return res.data as { accessToken: string }; } + +export async function logoutApi() { + const res = await apiProtected.post("/api/auth/logout"); + return res.data; +} diff --git a/client/src/features/auth/mutations/useLogoutMutation.ts b/client/src/features/auth/mutations/useLogoutMutation.ts new file mode 100644 index 0000000..811227f --- /dev/null +++ b/client/src/features/auth/mutations/useLogoutMutation.ts @@ -0,0 +1,27 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { useAuthSessionStore } from "../../../store/authSession.store"; +import { logoutApi } from "../../../api/auth/auth.api"; +import { useNavigate } from "react-router-dom"; + +export function useLogoutMutation() { + const qc = useQueryClient(); + const navigate = useNavigate(); + const clearSession = useAuthSessionStore((s) => s.clearSession); + + return useMutation({ + mutationFn: logoutApi, + onSuccess: async () => { + clearSession(); + localStorage.removeItem("hadSession"); + qc.clear(); + navigate("/", { replace: true }); + }, + onError: (error) => { + console.error("Logout failed:", error); + clearSession(); + localStorage.removeItem("hadSession"); + qc.clear(); + navigate("/", { replace: true }); + }, + }); +} diff --git a/client/src/hooks/useLogout.ts b/client/src/hooks/useLogout.ts new file mode 100644 index 0000000..5c07830 --- /dev/null +++ b/client/src/hooks/useLogout.ts @@ -0,0 +1,14 @@ +import { useLogoutMutation } from "../features/auth/mutations/useLogoutMutation"; + +export const useLogout = () => { + const logoutMutation = useLogoutMutation(); + + const logout = () => { + logoutMutation.mutate(); + }; + return { + logout, + isPending: logoutMutation.isPending, + error: logoutMutation.error, + }; +}; From b046362ca7c3fc526dafeffc135526d740d36d29 Mon Sep 17 00:00:00 2001 From: Majoodeh Date: Mon, 9 Feb 2026 17:41:51 +0100 Subject: [PATCH 2/2] feat:modified logout logic --- client/src/api/auth/auth.api.ts | 5 ++-- .../auth/mutations/useLogoutMutation.ts | 23 ++++--------------- client/src/hooks/useLogout.ts | 14 ----------- 3 files changed, 6 insertions(+), 36 deletions(-) delete mode 100644 client/src/hooks/useLogout.ts diff --git a/client/src/api/auth/auth.api.ts b/client/src/api/auth/auth.api.ts index 089cede..ba699b7 100644 --- a/client/src/api/auth/auth.api.ts +++ b/client/src/api/auth/auth.api.ts @@ -28,7 +28,6 @@ export async function refreshApi() { return res.data as { accessToken: string }; } -export async function logoutApi() { - const res = await apiProtected.post("/api/auth/logout"); - return res.data; +export async function logoutApi(): Promise { + await apiProtected.post("/api/auth/logout"); } diff --git a/client/src/features/auth/mutations/useLogoutMutation.ts b/client/src/features/auth/mutations/useLogoutMutation.ts index 811227f..4133e92 100644 --- a/client/src/features/auth/mutations/useLogoutMutation.ts +++ b/client/src/features/auth/mutations/useLogoutMutation.ts @@ -1,27 +1,12 @@ -import { useMutation, useQueryClient } from "@tanstack/react-query"; -import { useAuthSessionStore } from "../../../store/authSession.store"; +import { useMutation } from "@tanstack/react-query"; import { logoutApi } from "../../../api/auth/auth.api"; -import { useNavigate } from "react-router-dom"; +import { triggerLogout } from "../../../api/auth/logoutBus"; export function useLogoutMutation() { - const qc = useQueryClient(); - const navigate = useNavigate(); - const clearSession = useAuthSessionStore((s) => s.clearSession); - return useMutation({ mutationFn: logoutApi, - onSuccess: async () => { - clearSession(); - localStorage.removeItem("hadSession"); - qc.clear(); - navigate("/", { replace: true }); - }, - onError: (error) => { - console.error("Logout failed:", error); - clearSession(); - localStorage.removeItem("hadSession"); - qc.clear(); - navigate("/", { replace: true }); + onSettled: () => { + triggerLogout(); }, }); } diff --git a/client/src/hooks/useLogout.ts b/client/src/hooks/useLogout.ts deleted file mode 100644 index 5c07830..0000000 --- a/client/src/hooks/useLogout.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { useLogoutMutation } from "../features/auth/mutations/useLogoutMutation"; - -export const useLogout = () => { - const logoutMutation = useLogoutMutation(); - - const logout = () => { - logoutMutation.mutate(); - }; - return { - logout, - isPending: logoutMutation.isPending, - error: logoutMutation.error, - }; -};