Files
TheGame/packages/web/lib/hooks/useUser.ts
dan13ram 7bc99d4b45 Fix Onboarding + A Bunch of Other Issues (#1181)
* feat: metamask switch network support + fixed dependancy cycle

* feat: moved landing to index

* feat: updated favicon

* fix: fixed landing page issues + scrollSnap

* feat: join button

* fix: fixed seed script with new prod schema

* feat: join button redirects based on user creation date

* fix: minor ui bug fixes

* feat: connect to mainnet to continue with switch network on metamask

* fix: uniform setup screens

* fix: fixed XP on dashboard

* feat: added start page

* fix: fixed issues on landing page

* fix: fixed minor issues on dashboard

* fix: update idx profile in auth webhook for new players

* fix: minor fixes in seed page

* fix: player avatar & type

* fix: incorporated review comments from @dysbulic & @vidvidvid

* fix: more review comments
2022-03-07 10:20:26 -05:00

60 lines
1.5 KiB
TypeScript

import { Maybe } from '@metafam/utils';
import { Player, useGetMeQuery } from 'graphql/autogen/types';
import { useWeb3 } from 'lib/hooks/useWeb3';
import { useRouter } from 'next/router';
import { useEffect, useMemo } from 'react';
import { CombinedError, RequestPolicy } from 'urql';
type UseUserOpts = {
redirectTo?: string;
redirectIfNotFound?: boolean;
requestPolicy?: RequestPolicy;
};
export const useUser = ({
redirectTo,
redirectIfNotFound = false,
requestPolicy = 'cache-first',
}: UseUserOpts = {}): {
connecting: boolean;
connected: boolean;
user: Maybe<Player>;
fetching: boolean;
error?: CombinedError;
} => {
const { authToken, connecting, connected } = useWeb3();
const router = useRouter();
const [{ data, error, fetching }] = useGetMeQuery({
pause: connecting || !connected || !authToken,
requestPolicy,
});
const [me] = data?.me ?? [];
const user = useMemo(
() => (!error && authToken && me ? (me.record as Player) : null),
[error, authToken, me],
);
if (error) {
// eslint-disable-next-line no-console
console.error(`useUser Error: ${error.message}`);
}
useEffect(() => {
if (!redirectTo || fetching || connecting) return;
// If redirectTo is set and redirectIfNotFound is set then
// redirect if the user was not found.
if (redirectTo && redirectIfNotFound && !user) {
router.push(redirectTo);
}
}, [router, user, fetching, connecting, redirectIfNotFound, redirectTo]);
return {
connecting,
connected,
user,
fetching,
error,
};
};