import React from "react"
import { Router, Location, BaseContext } from "@reach/router"
import { ScrollContext } from "gatsby-react-router-scroll"
import {
shouldUpdateScroll,
init as navigationInit,
RouteUpdates,
} from "./navigation"
import { apiRunner } from "./api-runner-browser"
import loader from "./loader"
import { PageQueryStore, StaticQueryStore } from "./query-result-store"
import EnsureResources from "./ensure-resources"
import { reportError, clearError } from "./error-overlay-handler"
if (window.__webpack_hot_middleware_reporter__ !== undefined) {
const overlayErrorID = `webpack`
// Report build errors
window.__webpack_hot_middleware_reporter__.useCustomOverlay({
showProblems(type, obj) {
if (type !== `errors`) {
clearError(overlayErrorID)
return
}
reportError(overlayErrorID, obj[0])
},
clear() {
clearError(overlayErrorID)
},
})
}
navigationInit()
// In gatsby v2 if Router is used in page using matchPaths
// paths need to contain full path.
// For example:
// - page have `/app/*` matchPath
// - inside template user needs to use `/app/xyz` as path
// Resetting `basepath`/`baseuri` keeps current behaviour
// to not introduce breaking change.
// Remove this in v3
const RouteHandler = props => (
)
class LocationHandler extends React.Component {
render() {
const { location } = this.props
if (!loader.isPageNotFound(location.pathname)) {
return (
{locationAndPageResources => (
)}
)
}
const dev404PageResources = loader.loadPageSync(`/dev-404-page`)
const real404PageResources = loader.loadPageSync(`/404.html`)
let custom404
if (real404PageResources) {
custom404 = (
)
}
return (
)
}
}
const Root = () => (
{locationContext => }
)
// Let site, plugins wrap the site e.g. for Redux.
const WrappedRoot = apiRunner(
`wrapRootElement`,
{ element: },
,
({ result, plugin }) => {
return { element: result }
}
).pop()
export default () => {WrappedRoot}