File tree 7 files changed +76
-1
lines changed
7 files changed +76
-1
lines changed Original file line number Diff line number Diff line change 31
31
"query-string" : " ^6.13.1" ,
32
32
"react" : " ^16.12.0" ,
33
33
"react-dom" : " ^16.12.0" ,
34
+ "react-error-boundary" : " ^3.0.1" ,
34
35
"react-helmet" : " ^6.1.0" ,
35
36
"react-icons" : " ^3.10.0" ,
36
37
"react-instantsearch-dom" : " ^5.7.0" ,
Original file line number Diff line number Diff line change
1
+ import React from "react"
2
+ import { ErrorBoundary } from "react-error-boundary"
3
+ import { useTelemetry } from "../utils/use-telemetry"
4
+
5
+ export function ErrorTracker ( {
6
+ children,
7
+ } : {
8
+ children : React . ReactNode
9
+ } ) : JSX . Element {
10
+ const { trackError } = useTelemetry ( )
11
+
12
+ return (
13
+ < ErrorBoundary
14
+ fallbackRender = { ( ) : JSX . Element => (
15
+ < div >
16
+ < h1 > Oops, something went wrong :(</ h1 >
17
+ < p > Please refresh the page to try again.</ p >
18
+ </ div >
19
+ ) }
20
+ onError = { ( err ) : void =>
21
+ trackError ( `ERROR` , {
22
+ error : err ,
23
+ } )
24
+ }
25
+ >
26
+ { children }
27
+ </ ErrorBoundary >
28
+ )
29
+ }
Original file line number Diff line number Diff line change @@ -6,6 +6,7 @@ import { merge } from "theme-ui"
6
6
import { createUrqlClient } from "../urql-client"
7
7
import "normalize.css"
8
8
import { ServicesProvider , useServices } from "./services-provider"
9
+ import { ErrorTracker } from "./error-tracker"
9
10
10
11
const baseTheme = getTheme ( )
11
12
@@ -162,7 +163,9 @@ const Providers: React.FC<{}> = ({ children }) => (
162
163
< ThemeProvider theme = { theme } >
163
164
{ /* NOTE(@mxstbr): The GraphQLProvider needs to be in the ServicesProvider */ }
164
165
< ServicesProvider >
165
- < GraphQLProvider > { children } </ GraphQLProvider >
166
+ < ErrorTracker >
167
+ < GraphQLProvider > { children } </ GraphQLProvider >
168
+ </ ErrorTracker >
166
169
</ ServicesProvider >
167
170
</ ThemeProvider >
168
171
</ StrictUIProvider >
Original file line number Diff line number Diff line change @@ -5,15 +5,28 @@ interface ITelemetry {
5
5
input : string | Array < string > ,
6
6
tags ?: { pluginName ?: string ; pathname ?: string }
7
7
) => void
8
+ trackError : ( input : string | Array < string > , tags : { error : Error } ) => void
8
9
}
9
10
10
11
const noop = ( ) : void => { }
11
12
13
+ const errorToJSON = ( err ) : Record < string , any > => {
14
+ const json = JSON . parse ( JSON . stringify ( err , Object . getOwnPropertyNames ( err ) ) )
15
+ return {
16
+ ...json ,
17
+ stack : json . stack . replace (
18
+ new RegExp ( `${ window . location . protocol } //${ window . location . host } ` , `g` ) ,
19
+ `$URL`
20
+ ) ,
21
+ }
22
+ }
23
+
12
24
export const useTelemetry = ( ) : ITelemetry => {
13
25
const services = useServices ( )
14
26
if ( ! services . telemetryserver )
15
27
return {
16
28
trackEvent : noop ,
29
+ trackError : noop ,
17
30
}
18
31
19
32
const { port } = services . telemetryserver
@@ -29,7 +42,25 @@ export const useTelemetry = (): ITelemetry => {
29
42
return
30
43
}
31
44
45
+ const trackError : ITelemetry [ "trackError" ] = ( input , tags ) => {
46
+ fetch ( `http://localhost:${ port } /trackError` , {
47
+ method : `POST` ,
48
+ body : JSON . stringify ( [
49
+ input ,
50
+ {
51
+ ...tags ,
52
+ error : errorToJSON ( tags . error ) ,
53
+ } ,
54
+ ] ) ,
55
+ headers : {
56
+ "Content-Type" : `application/json` ,
57
+ } ,
58
+ } ) . catch ( ( ) => { } )
59
+ return
60
+ }
61
+
32
62
return {
33
63
trackEvent,
64
+ trackError,
34
65
}
35
66
}
Original file line number Diff line number Diff line change @@ -12,6 +12,8 @@ function regexpEscape(str: string): string {
12
12
}
13
13
14
14
export function cleanPaths ( str : string , separator : string = sep ) : string {
15
+ if ( ! str ) return str
16
+
15
17
const stack = process . cwd ( ) . split ( separator )
16
18
17
19
while ( stack . length > 1 ) {
Original file line number Diff line number Diff line change @@ -11,6 +11,7 @@ import cors from "cors"
11
11
import {
12
12
setDefaultComponentId ,
13
13
trackCli ,
14
+ trackError ,
14
15
startBackgroundUpdate ,
15
16
} from "gatsby-telemetry"
16
17
@@ -20,6 +21,7 @@ setDefaultComponentId(`gatsby-admin`)
20
21
// http://localhost:1234/trackEvent
21
22
const ROUTES = {
22
23
trackEvent : trackCli ,
24
+ trackError,
23
25
}
24
26
25
27
const app = express ( )
Original file line number Diff line number Diff line change @@ -19475,6 +19475,13 @@ react-dom@^16.12.0:
19475
19475
prop-types "^15.6.2"
19476
19476
scheduler "^0.18.0"
19477
19477
19478
+ react-error-boundary@^3.0.1:
19479
+ version "3.0.1"
19480
+ resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-3.0.1.tgz#ac2578ccdcfc513ce2a76befc61f1aa71da5cf7b"
19481
+ integrity sha512-oY2868aEnNrGlVeQhP5faLRZp8dAN4fdPnRCUNhf6o6my/zmhGqrJ6yHtvK+hlJLzY96tGV0rtHU0YC7ZRMscw==
19482
+ dependencies:
19483
+ "@babel/runtime" "^7.11.2"
19484
+
19478
19485
react-error-overlay@^3.0.0:
19479
19486
version "3.0.0"
19480
19487
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-3.0.0.tgz#c2bc8f4d91f1375b3dad6d75265d51cd5eeaf655"
You can’t perform that action at this time.
0 commit comments