diff --git a/src/features/auth/sign-out/model/useSignOut.ts b/src/features/auth/sign-out/model/useSignOut.ts index 8b2699a..0b13baa 100644 --- a/src/features/auth/sign-out/model/useSignOut.ts +++ b/src/features/auth/sign-out/model/useSignOut.ts @@ -1,33 +1,28 @@ -import { type DefaultError, useMutation } from '@tanstack/react-query'; +import { type DefaultError, useMutation, UseMutationOptions } from '@tanstack/react-query'; import { AuthHttp, TAuth } from 'entities/auth'; import { useRouter } from 'next/navigation'; import { AccessToken } from 'shared/api'; import { routes } from 'shared/config'; import { toast } from 'sonner'; -interface UseSignOutProps { - onSuccess?: (res: TAuth.SignoutResponse) => void; - onError?: (err: Error) => void; -} +export type UseSignOutOptions = Omit< + UseMutationOptions, + 'mutationFn' +>; -export function useSignOut({ onSuccess, onError }: UseSignOutProps = {}) { +export function useSignOut({ onSuccess, ...rest }: UseSignOutOptions = {}) { const router = useRouter(); return useMutation, DefaultError, void>({ + ...rest, mutationFn: AuthHttp.signout, - onError: (err) => { - onError?.(err); - }, - onSuccess: async (res, _v, _m, { client }) => { - onSuccess?.(res); - - await client.cancelQueries(); - client.clear(); - + onSuccess: async (res, _v, _r, context) => { + onSuccess?.(res, _v, _r, context); + await context.client.cancelQueries(); AccessToken.clear(); - - toast.success(res.message || 'Вы вышли из аккаунта'); + context.client.clear(); router.replace(routes.auth.signin()); + toast.success(res?.message || 'Вы вышли из аккаунта'); }, }); } diff --git a/src/features/auth/sign-out/ui/SignOut.tsx b/src/features/auth/sign-out/ui/SignOut.tsx index 0aa2c48..c5d5225 100644 --- a/src/features/auth/sign-out/ui/SignOut.tsx +++ b/src/features/auth/sign-out/ui/SignOut.tsx @@ -1,22 +1,46 @@ import { LogOut } from 'lucide-react'; -import type { ComponentProps } from 'react'; -import { Button } from 'shared/ui'; -import { useSignOut } from '../model/useSignOut'; +import { type ComponentProps } from 'react'; +import { Button, buttonVariants } from 'shared/ui'; +import { useSignOut, UseSignOutOptions } from '../model/useSignOut'; +import { Slot } from 'radix-ui'; +import { cn } from 'shared/lib/utils'; -function SignOut(props: Omit, 'children'>) { - const signoutMutation = useSignOut(); +type SignOutProps = ComponentProps & { + mutateOptions?: UseSignOutOptions; +}; +function SignOut({ + asChild = false, + className = '', + variant = 'link', + size = 'default', + children = null, + mutateOptions = {}, + ...props +}: SignOutProps) { + const { mutate, isPending } = useSignOut(mutateOptions); + const Com = asChild ? Slot.Root : 'button'; return ( - + {asChild ? ( + children + ) : ( + <> + Выйти + + + )} + ); } diff --git a/src/widgets/app-sidebar/ui/NavUser.tsx b/src/widgets/app-sidebar/ui/NavUser.tsx index 9960ce5..172bdb6 100644 --- a/src/widgets/app-sidebar/ui/NavUser.tsx +++ b/src/widgets/app-sidebar/ui/NavUser.tsx @@ -1,6 +1,6 @@ 'use client'; -import { BadgeCheck, ChevronsUpDown } from 'lucide-react'; +import { BadgeCheck, ChevronsUpDown, LogOut } from 'lucide-react'; import { Avatar, AvatarFallback, @@ -77,9 +77,13 @@ export function NavUser() { - - - + + + + Выйти + + +