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}