UNPKG

react-navi-helmet-async

Version:

Use react-helmet-async to render your Navi routes' title and head.

86 lines 3.49 kB
"use strict"; var __spreadArrays = (this && this.__spreadArrays) || function () { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; }; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; result["default"] = mod; return result; }; Object.defineProperty(exports, "__esModule", { value: true }); var React = __importStar(require("react")); var react_helmet_async_1 = require("react-helmet-async"); exports.Helmet = react_helmet_async_1.Helmet; var react_navi_1 = require("react-navi"); function NaviHelmetProvider(_a) { var canUseDOM = _a.canUseDOM, context = _a.context, children = _a.children; var parent = React.useContext(react_navi_1.ViewHeadRendererContext); var defaultContext = React.useRef({}).current; if (!context) { context = defaultContext; } // react-helmet may thinks it's in a browser due to JSDOM, so we need to // manually let it know that we're doing static rendering. if (canUseDOM !== undefined) { ; react_helmet_async_1.HelmetProvider.canUseDOM = canUseDOM; } if (!react_helmet_async_1.HelmetProvider.canUseDOM) { context.getHelmet = function () { return context.helmet; }; } if (parent) { // If someone has already wrapped the app with a HeadProvider, e.g. for // server side rendering, then just use that. return React.createElement(React.Fragment, null, children); } else { return (React.createElement(react_helmet_async_1.HelmetProvider, { context: context }, React.createElement(react_navi_1.ViewHeadRendererContext.Provider, { value: renderViewHead }, children))); } } exports.HelmetProvider = NaviHelmetProvider; // Memoize these to stop a bizarre react-helmet infinite loop bug when titles // are recreated on each render var titles = {}; function createTitleElement(str) { var title = titles[str]; if (!title) { title = titles[str] = React.createElement("title", null, str); } return title; } function renderViewHead(chunks) { var headAndTitleChunks = chunks.filter(function (chunk) { return chunk.type === 'title' || chunk.type === 'head'; }); var helmet = headAndTitleChunks && headAndTitleChunks.length && React.createElement.apply(React, __spreadArrays([react_helmet_async_1.Helmet, null], headAndTitleChunks.map(function (chunk) { return chunk.type === 'title' ? createTitleElement(chunk.title) : chunk.head.type === React.Fragment || chunk.head.type === 'head' ? chunk.head.props.children : chunk.head; }))); return helmet || null; } exports.renderViewHead = renderViewHead; // If building with navi-scripts, we'll need to register this module so that // it can use it to add <head> tags to the build output. if (typeof window !== 'undefined') { var app = window['NaviScripts']; if (!app) { app = window['NaviScripts'] = {}; } if (!app.head) { app.head = NaviHelmetProvider; } } exports.default = NaviHelmetProvider; //# sourceMappingURL=index.js.map