Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | 3x 3x 3x 3x 3x 3x 3x 50x 50x 13x 13x 50x 50x 29x 11x 50x 15x 50x 50x 50x 2x 50x 50x 50x 50x 50x | import { useQuery, useQueryClient } from "@tanstack/react-query";
import { reactQueryRetries } from "appConstants";
import { userKey, username2Id } from "features/queryKeys";
import {
username2IdStaleTime,
userStaleTime,
} from "features/userQueries/constants";
import { RpcError, StatusCode } from "grpc-web";
import { User } from "proto/api_pb";
import { useEffect } from "react";
import { service } from "service";
export default function useUserByUsername(
username: string,
invalidate = false,
) {
//We look up the userId first from the username.
//This causes a duplicate query, but it is not made stale for a long time
//and ensures no duplication of users in the queryCache.
const usernameQuery = useQuery<
{ username: string; userId: number },
RpcError
>({
gcTime: username2IdStaleTime,
queryFn: async () => {
const user = await service.user.getUser(username);
return {
userId: user.userId,
username: user.username,
};
},
queryKey: [username2Id, username],
retry: (failureCount, error) => {
//don't retry if the user isn't found
return (
error.code !== StatusCode.NOT_FOUND && failureCount <= reactQueryRetries
);
},
staleTime: username2IdStaleTime,
enabled: !!username,
});
const queryClient = useQueryClient();
useEffect(() => {
if (invalidate && usernameQuery.data?.userId) {
queryClient.invalidateQueries({
queryKey: userKey(usernameQuery.data.userId),
});
}
}, [invalidate, queryClient, usernameQuery.data?.userId]);
const query = useQuery<User.AsObject, RpcError>({
enabled: !!usernameQuery.data,
queryFn: () =>
service.user.getUser(usernameQuery.data?.userId.toString() || ""),
queryKey: userKey(usernameQuery.data?.userId ?? 0),
staleTime: userStaleTime,
});
const errors = [];
Iif (usernameQuery.error?.message) {
errors.push(usernameQuery.error?.message || "");
}
if (query.error?.message) {
errors.push(query.error?.message || "");
}
const error = errors.join("\n");
const isLoading = usernameQuery.isLoading || query.isLoading;
const isFetching = usernameQuery.isFetching || query.isFetching;
const isError = usernameQuery.isError || query.isError;
return {
data: query.data,
error,
isError,
isFetching,
isLoading,
};
}
|