From 5962f7aae160d325f93807726b3255c4535aa3c5 Mon Sep 17 00:00:00 2001 From: rvveber Date: Wed, 7 May 2025 13:29:51 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F(frontend)=20Separate=20mutat?= =?UTF-8?q?ions=20from=20queries=20for=20auth=20logic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduces dedicated mutations (for authentication/user operations) separating them from queries to align with best practices for data fetching and state management. Queries remain responsible for READ operations, while mutations now handle CREATE, UPDATE, and DELETE actions (for user data) improving separation of concerns. Signed-off-by: Robin Weber --- .../impress/src/core/api/useUserUpdate.ts | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/frontend/apps/impress/src/core/api/useUserUpdate.ts diff --git a/src/frontend/apps/impress/src/core/api/useUserUpdate.ts b/src/frontend/apps/impress/src/core/api/useUserUpdate.ts new file mode 100644 index 00000000..6798edf0 --- /dev/null +++ b/src/frontend/apps/impress/src/core/api/useUserUpdate.ts @@ -0,0 +1,48 @@ +import { + UseMutationResult, + useMutation, + useQueryClient, +} from '@tanstack/react-query'; + +import { APIError, errorCauses, fetchAPI } from '@/api'; +import { User } from '@/features/auth/api/types'; +import { KEY_AUTH } from '@/features/auth/api/useAuthQuery'; + +type UserUpdateRequest = Partial; + +async function updateUser(userUpdateData: UserUpdateRequest): Promise { + const response = await fetchAPI(`users/${userUpdateData.id}/`, { + method: 'PATCH', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(userUpdateData), + }); + if (!response.ok) { + throw new APIError( + `Failed to update the user`, + await errorCauses(response, userUpdateData), + ); + } + return response.json() as Promise; +} + +export const useUserUpdate = (): UseMutationResult< + User, + APIError, + UserUpdateRequest +> => { + const queryClient = useQueryClient(); + + const mutationResult = useMutation({ + mutationFn: updateUser, + onSuccess: () => { + void queryClient.invalidateQueries({ queryKey: [KEY_AUTH] }); + }, + onError: (error) => { + console.error('Error updating user', error); + }, + }); + + return mutationResult; +};