/
alt3rmann
/
label-studio
Обзор
Документация
Войти
/
alt3rmann
/
label-studio
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
web/libs/core/src/lib/hooks/useCurrentUser.ts
73 строки
2 KB
Nick Skriabin
fix: DIA-1916: [FE] User is NOT able to upload profile image on new account page (#7106)
24 фев 2025, 14:55
Не верифицирован
24 фев 2025, 14:55
9215ad6
Код
Авторство
О чём код?
import type { APIUser } from "@humansignal/core/types/user"; import { API } from "apps/labelstudio/src/providers/ApiProvider"; import { useAtomValue } from "jotai"; import { atomWithMutation, atomWithQuery, queryClientAtom } from "jotai-tanstack-query"; import { useCallback } from "react"; const currentUserAtom = atomWithQuery(() => ({ queryKey: ["current-user"], async queryFn() { return await API.invoke<APIUser>("me"); }, })); const currentUserUpdateAtom = atomWithMutation((get) => ({ mutationKey: ["update-current-user"], async mutationFn({ pk, user }: { pk: number; user: Partial<APIUser> }) { return await API.invoke<APIUser>("updateUser", { pk }, { body: user }); }, onSettled() { const queryClient = get(queryClientAtom); queryClient.invalidateQueries({ queryKey: ["current-user"] }); }, })); export function useCurrentUserAtom() { const user = useAtomValue(currentUserAtom); const updateUser = useAtomValue(currentUserUpdateAtom); const queryClient = useAtomValue(queryClientAtom); const refetch = useCallback(() => queryClient.invalidateQueries({ queryKey: ["current-user"] }), []); const update = useCallback( (userUpdate: Partial<APIUser>) => { if (!user.data) { console.error("User is not loaded. Try fetching first."); return; } updateUser.mutate({ pk: user.data.id, user: userUpdate }); }, [user.data?.id, updateUser.mutate], ); const updateAsync = useCallback( (userUpdate: Partial<APIUser>) => { if (!user.data) { console.error("User is not loaded. Try fetching first."); return; } return updateUser.mutateAsync({ pk: user.data.id, user: userUpdate }); }, [user.data?.id, updateUser.mutate], ); const commonResponse = { isInProgress: user.isFetching || updateUser.isPending, isUpdating: updateUser.isPending, loaded: user.isSuccess, fetch: refetch, update, updateAsync, } as const; return user.isSuccess ? ({ user: user.data, error: null, ...commonResponse, } as const) : ({ user: null, error: user.error, ...commonResponse, } as const); }