addressing feedback from @alalonde

- Moved `Honeybadger.notify()` to `errorHandler.ts` and replaced instances.
- Removed module definitions from `env.d.ts`
This commit is contained in:
luxumbra
2022-10-18 00:25:04 +01:00
committed by Alec LaLonde
parent 193781fed2
commit a53e450f81
30 changed files with 105 additions and 37 deletions

View File

@@ -39,6 +39,8 @@ ENV NEXT_PUBLIC_GRAPHQL_URL $GRAPHQL_URL
ARG NEXT_PUBLIC_FRONTEND_URL
ARG NEXT_PUBLIC_YOUTUBE_API_KEY
ARG NEXT_PUBLIC_GA4_ID
ARG NEXT_PUBLIC_HONEYBADGER_API_KEY
ARG NEXT_PUBLIC_USERBACK_TOKEN
# Build
RUN yarn web:build

View File

@@ -177,6 +177,32 @@ export const theme = extendTheme(
},
},
},
// 'ubdiv#userback_button_container': {
// '.userback-controls[wstyle]': {
// background: 'var(--chakra-colors-whiteAlpha-200)',
// backdropFilter: 'blur(7px)',
// color: 'white !important',
// '.userback-controls-step': {
// '.userback-controls-options': {
// 'ubroutemenu.userback-feedback-type-form': {
// color: 'white !important',
// transition: 'all 0.3s ease',
// '&:hover': {
// background: 'var(--chakra-colors-whiteAlpha-600) !important',
// },
// 'ubdiv': {
// color: 'white !important',
// }
// },
// '.userback-controls-form': {
// }
// }
// }
// }
// }
},
'::-webkit-scrollbar': {
width: { base: '5px', lg: '12px' },

View File

@@ -2,6 +2,7 @@ import Honeybadger from '@honeybadger-io/js';
import { Center, Link, MetaButton, Spinner, Stack, Text } from '@metafam/ds';
import { Player } from 'graphql/autogen/types';
import { useMounted, useUser, useWeb3 } from 'lib/hooks';
import { errorHandler } from 'utils/errorHandler';
type PlayerPageType = React.FC<{ player: Player }>;
@@ -40,7 +41,7 @@ export const ConnectedPage: React.FC<{
}
if (error) {
Honeybadger.notify(error);
errorHandler(error);
return (
<Center h="100vh">
<Stack align="center">

View File

@@ -31,6 +31,7 @@ import {
volIncreased,
volumeChange,
} from 'utils/dashboardHelpers';
import { errorHandler } from 'utils/errorHandler';
const SEED_TOKEN_ID = 'metagame';
const COINGECKO_API_URL = 'https://api.coingecko.com/api/v3/coins/';
@@ -103,7 +104,7 @@ export const Seed = (): ReactElement => {
return setToken(tokenData);
} catch (error) {
console.error('error fetching tokenData', error);
Honeybadger.notify(error as Error);
errorHandler(error as Error);
return null;
}
})();

View File

@@ -67,6 +67,7 @@ import React, {
useState,
} from 'react';
import { Controller, useForm } from 'react-hook-form';
import { errorHandler } from 'utils/errorHandler';
import { optimizedImage } from 'utils/imageHelpers';
import { isEmpty } from 'utils/objectHelpers';
@@ -309,7 +310,6 @@ export const EditProfileModal: React.FC<ProfileEditorProps> = ({
error ?? result.statusText
}"`,
);
Honeybadger.notify(error);
}
Object.keys(files).forEach((key: string) => {
@@ -394,7 +394,7 @@ export const EditProfileModal: React.FC<ProfileEditorProps> = ({
isClosable: true,
duration: 15000,
});
Honeybadger.notify(err as Error);
errorHandler(err as Error);
return null;
} finally {
setStatus(null);

View File

@@ -38,6 +38,7 @@ import {
gridSX,
LayoutData,
} from 'utils/boxTypes';
import { errorHandler } from 'utils/errorHandler';
import {
addBoxToLayouts,
disableAddBox,
@@ -150,7 +151,7 @@ export const EditableGridLayout: React.FC<Props> = ({
status: 'error',
isClosable: true,
});
Honeybadger.notify(err as Error);
errorHandler(err as Error);
} finally {
setSaving(false);
}

View File

@@ -25,6 +25,7 @@ import {
useEffect,
useState,
} from 'react';
import { errorHandler } from 'utils/errorHandler';
import { POLYGON } from 'utils/networks';
import { formatAddress } from 'utils/playerHelpers';
@@ -81,7 +82,7 @@ export const Chiev = ({
setClaiming(true);
await mintChiev(chievId);
} catch (error) {
Honeybadger.notify(error as Error);
errorHandler(error as Error);
console.error('handleMintingError', error);
} finally {
setClaiming(false);

View File

@@ -17,6 +17,7 @@ import { useOnScreen } from 'lib/hooks/useOnScreen';
import { get } from 'lib/store';
import { ReactElement, useCallback, useEffect, useRef, useState } from 'react';
import { MdDownloading, MdRestartAlt, MdWarning } from 'react-icons/md';
import { errorHandler } from 'utils/errorHandler';
import {
safelyParseContent,
safelyParseTextForTyping,
@@ -129,7 +130,7 @@ export const OnboardingGame: React.FC = (): JSX.Element => {
};
} catch (error) {
console.error('makeCurrentSectionDialogue error', error);
Honeybadger.notify(error as Error);
errorHandler(error as Error);
return {
currentDialogue: [],
currentChoices: [],
@@ -219,7 +220,7 @@ export const OnboardingGame: React.FC = (): JSX.Element => {
throw new Error('No connections found');
} catch (error) {
setCurrentConnections([]);
Honeybadger.notify(error as Error);
errorHandler(error as Error);
return undefined;
}
};
@@ -249,7 +250,7 @@ export const OnboardingGame: React.FC = (): JSX.Element => {
}
throw new Error('No jumpers found');
} catch (error) {
Honeybadger.notify(error as Error);
errorHandler(error as Error);
return undefined;
}
};
@@ -386,7 +387,7 @@ export const OnboardingGame: React.FC = (): JSX.Element => {
})
.catch((err) => {
console.error('handleProgress error', err);
Honeybadger.notify(err as Error);
errorHandler(err as Error);
setIsLoading(false);
});
};

View File

@@ -2,6 +2,7 @@ import Honeybadger from '@honeybadger-io/js';
import { httpLink } from '@metafam/utils';
import { CONFIG } from 'config';
import { Contract, providers } from 'ethers';
import { errorHandler } from 'utils/errorHandler';
import ABI from '../../../contracts/BulkDisbursableNFTs.abi';
@@ -36,7 +37,7 @@ export const getTokenImage = async (): Promise<IChievMetadata | void> => {
return metadata as IChievMetadata;
}
} catch (error) {
Honeybadger.notify(error as Error);
errorHandler(error as Error);
console.error('getTokenImageError', error);
}
return undefined;

View File

@@ -8,6 +8,7 @@ import {
MenuButton,
MenuItem,
MenuList,
MetaButton,
Profile,
} from '@metafam/ds';
import { MetaLink } from 'components/Link';
@@ -16,6 +17,7 @@ import { PlayerAvatar } from 'components/Player/PlayerAvatar';
import { Player } from 'graphql/autogen/types';
import { useWeb3 } from 'lib/hooks';
import React from 'react';
import { errorHandler } from 'utils/errorHandler';
import { getPlayerURL } from 'utils/playerHelpers';
type PlayerStatsProps = {
@@ -44,6 +46,15 @@ export const DesktopPlayerStats: React.FC<PlayerStatsProps> = ({ player }) => {
_hover={{ transform: 'scale(0.9)' }}
/>
</MenuButton>
<MetaButton
onClick={(): void => {
throw new Error('Honeybadger test from dev');
}}
>
Test error
</MetaButton>
<MenuList
mt="8px"
color="white"

View File

@@ -5,6 +5,7 @@ import { Player } from 'graphql/autogen/types';
import { useProfileField, useWeb3 } from 'lib/hooks';
import React, { useEffect, useMemo, useState } from 'react';
import { FieldValues, UseFormSetValue } from 'react-hook-form';
import { errorHandler } from 'utils/errorHandler';
import { getPlayerMeetwithWalletCalendarUrl } from 'utils/playerHelpers';
interface MeetWithWalletProps {
@@ -69,7 +70,7 @@ const MeetWithWalletProfileEdition: React.FC<MeetWithWalletProps> = ({
}
} catch (e) {
console.error('Failed to verify Meet with wallet account', e);
Honeybadger.notify(e as Error);
errorHandler(e as Error);
}
setLoading(false);
};
@@ -113,7 +114,7 @@ const MeetWithWalletProfileEdition: React.FC<MeetWithWalletProps> = ({
).calendar_url;
} catch (e) {
console.error('Meet with wallet account creation failed', e);
Honeybadger.notify(e as Error);
errorHandler(e as Error);
}
}

View File

@@ -17,6 +17,7 @@ import {
import { getCompletedQuestsByPlayerQuery } from 'graphql/getQuests';
import React, { useEffect, useState } from 'react';
import { BoxTypes } from 'utils/boxTypes';
import { errorHandler } from 'utils/errorHandler';
type Props = {
player: Player;
@@ -44,7 +45,7 @@ export const PlayerCompletedQuests: React.FC<Props> = ({
}
} catch (error) {
console.error("Couldn't fetch quests", error);
Honeybadger.notify(error as Error);
errorHandler(error as Error);
}
};
loadQuests();

View File

@@ -11,6 +11,7 @@ import {
import { contracts, graphql, helpers } from '@quest-chains/sdk';
import { useWeb3 } from 'lib/hooks';
import { useCallback, useRef, useState } from 'react';
import { errorHandler } from 'utils/errorHandler';
import {
getQuestChainContract,
QuestChainDetails,
@@ -93,7 +94,7 @@ export const MintNFTTile: React.FC<MintNFTTileProps> = ({
duration: 2000,
isClosable: true,
});
Honeybadger.notify(error as Error);
errorHandler(error as Error);
} finally {
setMinting(false);
}

View File

@@ -24,6 +24,7 @@ import { useWeb3 } from 'lib/hooks';
import { useDropFiles, useDropImage } from 'lib/hooks/useDropFiles';
import { useInputText } from 'lib/hooks/useInputText';
import { useCallback, useRef, useState } from 'react';
import { errorHandler } from 'utils/errorHandler';
import { NETWORK_INFO } from 'utils/networks';
import {
getQuestChainContract,
@@ -152,7 +153,7 @@ export const UploadProof: React.FC<{
duration: 2000,
isClosable: true,
});
Honeybadger.notify(error as Error);
errorHandler(error as Error);
}
setSubmitting(false);

View File

@@ -13,6 +13,7 @@ import { Maybe } from 'graphql/autogen/types';
import { useDelay } from 'lib/hooks/useDelay';
import React, { useCallback, useEffect, useState } from 'react';
import { BoxMetadata } from 'utils/boxTypes';
import { errorHandler } from 'utils/errorHandler';
const metadataLink = '/api/metadata?url=';
@@ -45,7 +46,7 @@ export const EmbeddedUrl: React.FC<EmbeddedUrlProps> = ({
setMetadata(response.og as unknown as URIMetadata);
} catch (err) {
console.error(`No metadata found for the URL "${uri}"`, err);
Honeybadger.notify(err as Error);
errorHandler(err as Error);
setMetadata(null);
} finally {
setLoading(false);

View File

@@ -27,6 +27,7 @@ import {
useState,
} from 'react';
import { Control, useForm, UseFormRegisterReturn } from 'react-hook-form';
import { errorHandler } from 'utils/errorHandler';
export type MaybeModalProps = {
buttonLabel?: string | ReactElement;
@@ -121,7 +122,7 @@ export const WizardPane = <T,>({
isClosable: true,
duration: 12000,
});
Honeybadger.notify(err as Error);
errorHandler(err as Error);
setStatus(null);
}
},

View File

@@ -18,6 +18,7 @@ import React, {
useMemo,
useState,
} from 'react';
import { errorHandler } from 'utils/errorHandler';
import { NETWORK_INFO, POLYGON } from 'utils/networks';
import gameJson from '../components/Landing/OnboardingGame/metagame-onboarding-game.json';
@@ -120,7 +121,7 @@ export const GameContextProvider: React.FC = ({ children }) => {
throw new Error('Game progression failed');
} catch (error) {
// eslint-disable-next-line no-console
Honeybadger.notify(error as Error);
errorHandler(error as Error);
console.error(error);
return undefined;
}
@@ -244,7 +245,7 @@ export const GameContextProvider: React.FC = ({ children }) => {
isClosable: true,
duration: 5000,
});
Honeybadger.notify(error as Error);
errorHandler(error as Error);
return msg;
} finally {
setTxLoading(false);

View File

@@ -21,6 +21,7 @@ import React, {
useMemo,
useState,
} from 'react';
import { errorHandler } from 'utils/errorHandler';
import { providerOptions } from 'utils/walletOptions';
import Web3Modal from 'web3modal';
@@ -74,7 +75,7 @@ export async function getExistingAuth(
await did.verifyToken(token, ethersProvider, connectedAddress);
return token;
} catch (e) {
Honeybadger.notify(e as Error);
errorHandler(e as Error);
clearToken();
return null;
}
@@ -198,7 +199,7 @@ export const Web3ContextProvider: React.FC<Web3ContextProviderOptions> = ({
});
} catch (error) {
console.error('`connect` Error', error); // eslint-disable-line no-console
Honeybadger.notify(error as Error);
errorHandler(error as Error);
disconnect();
} finally {
setConnecting(false);

View File

@@ -3,6 +3,7 @@ import { Optional } from '@metafam/utils';
import { CONFIG } from 'config';
import { Player } from 'graphql/autogen/types';
import { useEffect, useMemo } from 'react';
import { errorHandler } from 'utils/errorHandler';
const BRIGHTID_CONTEXT = 'MetaGame';
const DEEPLINK_ENDPOINT = `brightid://link-verification/${CONFIG.brightIdNodeURL}/${BRIGHTID_CONTEXT}`;
@@ -55,7 +56,7 @@ const fetchVerificationData = async (
const responseData = await response.json();
return responseData.data;
} catch (err) {
Honeybadger.notify(err as Error);
errorHandler(err as Error);
return null;
}
};

View File

@@ -2,6 +2,7 @@ import Honeybadger from '@honeybadger-io/js';
import { Maybe } from '@metafam/utils';
import { Player } from 'graphql/autogen/types';
import { useEffect, useState } from 'react';
import { errorHandler } from 'utils/errorHandler';
import { Collectible } from 'utils/openseaHelpers';
export const useOpenSeaCollectibles = ({
@@ -28,7 +29,7 @@ export const useOpenSeaCollectibles = ({
setData(allData);
setFavorites(allData.slice(0, 3));
} catch (err) {
Honeybadger.notify(err as Error);
errorHandler(err as Error);
setError((err as Error).message);
} finally {
setLoading(false);

View File

@@ -1,6 +1,7 @@
import Honeybadger from '@honeybadger-io/js';
import { graphql } from '@quest-chains/sdk';
import { useEffect, useState } from 'react';
import { errorHandler } from 'utils/errorHandler';
import { useRefresh } from '../useRefresh';
@@ -34,7 +35,7 @@ export const useLatestQuestChainData = (
} catch (err) {
setError(err);
setQuestChain(inputQuestChain);
Honeybadger.notify(err as Error);
errorHandler(err as Error);
} finally {
setFetching(false);
}

View File

@@ -1,6 +1,7 @@
import Honeybadger from '@honeybadger-io/js';
import { graphql } from '@quest-chains/sdk';
import { useEffect, useState } from 'react';
import { errorHandler } from 'utils/errorHandler';
import { useRefresh } from '../useRefresh';
@@ -38,7 +39,7 @@ export const useLatestQuestStatusesForUserAndChainData = (
} catch (err) {
setError(err);
setQuestStatuses([]);
Honeybadger.notify(err as Error);
errorHandler(err as Error);
} finally {
setFetching(false);
}

View File

@@ -28,6 +28,7 @@ import { useUser } from 'lib/hooks/useUser';
import { useWeb3 } from 'lib/hooks/useWeb3';
import { useRouter } from 'next/router';
import { ReactElement, useCallback } from 'react';
import { errorHandler } from 'utils/errorHandler';
import { isEmpty } from 'utils/objectHelpers';
import { dispositionFor } from 'utils/playerHelpers';
@@ -93,7 +94,7 @@ export const useSaveCeramicProfile = ({
if ((err as Error).message === '"undefined" is not valid JSON') {
throw new CeramicError('Could not authenticate with Ceramic API');
}
Honeybadger.notify(err as Error);
errorHandler(err as Error);
throw err;
}
}

View File

@@ -3,6 +3,7 @@ import Honeybadger from '@honeybadger-io/js';
import { Constants } from '@metafam/utils';
import { useEffect, useState } from 'react';
import { SCAccount, SCAccountsData } from 'sourcecred';
import { errorHandler } from 'utils/errorHandler';
interface XPProps {
userTotalXP: number;
@@ -63,8 +64,7 @@ const getXP = async (userAddress: string): Promise<XPProps | null> => {
userWeeklyCred,
};
} catch (err: unknown) {
// throw new Error(err);
Honeybadger.notify(err as Error);
errorHandler(err as Error);
return null;
}
};

View File

@@ -4,5 +4,3 @@ declare module '*.png';
declare module '*.jpg';
declare module '*.jpeg';
declare module '*.svg';
declare module '@honeybadger-io/webpack';
declare module '@honeybadger-io/js';

View File

@@ -13,6 +13,7 @@ import { useRouter } from 'next/router';
import Page404 from 'pages/404';
import React, { useCallback, useEffect, useState } from 'react';
import useSWR from 'swr';
import { errorHandler } from 'utils/errorHandler';
import { uploadFile } from 'utils/uploadHelpers';
const EditGuild: React.FC = () => {
@@ -59,7 +60,7 @@ const EditGuild: React.FC = () => {
isClosable: true,
duration: 8000,
});
Honeybadger.notify(error as Error);
errorHandler(error as Error);
return;
}
}

View File

@@ -13,6 +13,7 @@ import { useRouter } from 'next/router';
import Page404 from 'pages/404';
import React, { useCallback, useEffect, useState } from 'react';
import useSWR from 'swr';
import { errorHandler } from 'utils/errorHandler';
import { uploadFile } from 'utils/uploadHelpers';
const SetupGuild: React.FC = () => {
@@ -59,7 +60,7 @@ const SetupGuild: React.FC = () => {
isClosable: true,
duration: 8000,
});
Honeybadger.notify(error as Error);
errorHandler(error as Error);
return;
}
}

View File

@@ -16,6 +16,7 @@ import {
import { GetStaticPaths, GetStaticPropsContext } from 'next';
import React, { useCallback } from 'react';
import { FaArrowLeft } from 'react-icons/fa';
import { errorHandler } from 'utils/errorHandler';
import {
QuestChainDetails,
QuestChains,
@@ -151,7 +152,7 @@ export const getStaticProps = async (
} catch (error) {
// eslint-disable-next-line no-console
console.error('error', error);
Honeybadger.notify(error as Error);
errorHandler(error as Error);
}
return {

View File

@@ -0,0 +1,7 @@
import Honeybadger from '@honeybadger-io/js';
import { CombinedError } from 'urql';
export const errorHandler = (error: Error | CombinedError): void => {
console.error(error);
Honeybadger.notify(error);
};

View File

@@ -1,6 +1,8 @@
import Honeybadger from '@honeybadger-io/js';
import { NETWORK_INFO } from 'utils/networks';
import { errorHandler } from './errorHandler';
export const switchChainOnMetaMask = async (
chainId: string,
): Promise<boolean> => {
@@ -48,7 +50,7 @@ export const switchChainOnMetaMask = async (
} catch (addError) {
// eslint-disable-next-line no-console
console.error(`Unable to add chainId ${chainId} to MetaMask`, addError);
Honeybadger.notify(addError as Error);
errorHandler(addError as Error);
}
} else {
// eslint-disable-next-line no-console
@@ -56,7 +58,7 @@ export const switchChainOnMetaMask = async (
`Unable to switch to chainId ${chainId} on MetaMask`,
switchError,
);
Honeybadger.notify(switchError as Error);
errorHandler(switchError as Error);
}
}
return false;
@@ -88,7 +90,7 @@ export const addTokenToMetamask = async ({
} catch (addError) {
// eslint-disable-next-line no-console
console.error(`Unable to add token ${symbol} to MetaMask`, addError);
Honeybadger.notify(addError as Error);
errorHandler(addError as Error);
}
return false;
};