feat: introduce snackbars for GQL errors
This commit is contained in:
@@ -1,11 +1,23 @@
|
|||||||
|
import * as React from 'react';
|
||||||
import { ApolloProvider as BaseApolloProvider } from '@apollo/client';
|
import { ApolloProvider as BaseApolloProvider } from '@apollo/client';
|
||||||
import client from 'graphql/client';
|
import { useSnackbar } from 'notistack';
|
||||||
|
import client, { setLink } from 'graphql/client';
|
||||||
|
|
||||||
type ApolloProviderProps = {
|
type ApolloProviderProps = {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
};
|
};
|
||||||
|
|
||||||
const ApolloProvider = (props: ApolloProviderProps) => {
|
const ApolloProvider = (props: ApolloProviderProps) => {
|
||||||
|
const { enqueueSnackbar } = useSnackbar();
|
||||||
|
|
||||||
|
const onError = React.useCallback((message) => {
|
||||||
|
enqueueSnackbar(message, { variant: 'error' });
|
||||||
|
}, [enqueueSnackbar]);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
setLink({ onError })
|
||||||
|
}, [onError]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<BaseApolloProvider client={client} {...props} />
|
<BaseApolloProvider client={client} {...props} />
|
||||||
);
|
);
|
||||||
|
@@ -1,10 +1,23 @@
|
|||||||
import { ApolloClient } from '@apollo/client';
|
import { ApolloClient } from '@apollo/client';
|
||||||
import cache from './cache';
|
import cache from './cache';
|
||||||
|
import createLink from './link';
|
||||||
import appConfig from 'config/app';
|
import appConfig from 'config/app';
|
||||||
|
|
||||||
|
type CreateClientOptions = {
|
||||||
|
onError?: (message: string) => void;
|
||||||
|
};
|
||||||
|
|
||||||
const client = new ApolloClient({
|
const client = new ApolloClient({
|
||||||
uri: appConfig.graphqlUrl,
|
cache,
|
||||||
cache
|
link: createLink({ uri: appConfig.graphqlUrl })
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export function setLink({ onError }: CreateClientOptions) {
|
||||||
|
const link = createLink({ uri: appConfig.graphqlUrl, onError });
|
||||||
|
|
||||||
|
client.setLink(link);
|
||||||
|
|
||||||
|
return client;
|
||||||
|
};
|
||||||
|
|
||||||
export default client;
|
export default client;
|
||||||
|
31
packages/web/src/graphql/link.ts
Normal file
31
packages/web/src/graphql/link.ts
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import { HttpLink, from } from "@apollo/client";
|
||||||
|
import { onError } from "@apollo/client/link/error";
|
||||||
|
|
||||||
|
type CreateLinkOptions = {
|
||||||
|
uri: string;
|
||||||
|
onError?: (message: string) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
const createHttpLink = (uri: CreateLinkOptions['uri']) => new HttpLink({ uri });
|
||||||
|
|
||||||
|
const createErrorLink = (callback: CreateLinkOptions['onError']) => onError(({ graphQLErrors, networkError }) => {
|
||||||
|
if (graphQLErrors)
|
||||||
|
graphQLErrors.forEach(({ message, locations, path }) => {
|
||||||
|
callback?.(message);
|
||||||
|
|
||||||
|
console.log(
|
||||||
|
`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (networkError) {
|
||||||
|
callback?.(networkError.toString())
|
||||||
|
console.log(`[Network error]: ${networkError}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const createLink = ({ uri, onError = function() {} }: CreateLinkOptions) => {
|
||||||
|
return from([createErrorLink(onError), createHttpLink(uri)]);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createLink;
|
@@ -10,19 +10,19 @@ import routes from 'routes';
|
|||||||
import reportWebVitals from './reportWebVitals';
|
import reportWebVitals from './reportWebVitals';
|
||||||
|
|
||||||
ReactDOM.render(
|
ReactDOM.render(
|
||||||
|
<SnackbarProvider>
|
||||||
<ApolloProvider>
|
<ApolloProvider>
|
||||||
<IntlProvider>
|
<IntlProvider>
|
||||||
<ThemeProvider>
|
<ThemeProvider>
|
||||||
<SnackbarProvider>
|
|
||||||
<Router>
|
<Router>
|
||||||
<Layout>
|
<Layout>
|
||||||
{routes}
|
{routes}
|
||||||
</Layout>
|
</Layout>
|
||||||
</Router>
|
</Router>
|
||||||
</SnackbarProvider>
|
|
||||||
</ThemeProvider>
|
</ThemeProvider>
|
||||||
</IntlProvider>
|
</IntlProvider>
|
||||||
</ApolloProvider>,
|
</ApolloProvider>
|
||||||
|
</SnackbarProvider>,
|
||||||
document.getElementById('root')
|
document.getElementById('root')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user