remix-island
Version:
utils to render remix into a dom-node instead of the whole document
3 lines (2 loc) • 1.41 kB
JavaScript
import{createElement as a,useEffect as m,useState as u}from"react";import{createPortal as l}from"react-dom";import{RemixServer as f}from"@remix-run/react";import{renderToString as p}from"react-dom/server";let i=!1;function v(r,{id:d="remix-island",cleanup:t=!0}={}){const o=n=>{const[e,s]=u(i);return m(()=>{t&&_(o),i=!0,s(!0)},[]),!e&&n.__remix_island_render_server?a(r):e?l(a(r),document.head):null};return o.displayName="RemixIslandHead",o.__remix_island_id=d,o}function g({request:r,remixContext:d,Head:t}){const o=p(a(f,{context:c(d,t),url:r.url})),n=t.__remix_island_id;return`<!--${n}-start-->${o}<!--${n}-end-->`}function c(r,d){let t=r.serverHandoffString;if(t){const e=JSON.parse(t);delete e?.state?.errors,t=JSON.stringify(e)}const{Layout:o,...n}=r.routeModules.root;return{...r,serverHandoffString:t,staticHandlerContext:{...r.staticHandlerContext,errors:null},routeModules:{...r.routeModules,root:{...n,default:()=>a(d,{__remix_island_render_server:!0})}}}}function _(r,d=document.head){let t=!1;const o=[],n=r.__remix_island_id;for(const e of d.childNodes)if(!(!t&&e.nodeName!=="#comment")){if(t&&e.nodeName==="#comment"&&e.nodeValue===`${n}-end`){o.push(e);break}(t||e.nodeName==="#comment"&&e.nodeValue===`${n}-start`)&&(t=!0,o.push(e))}for(const e of o)e.remove()}export{v as createHead,_ as removeOldHead,g as renderHeadToString,c as switchRootComponent};
//# sourceMappingURL=index.mjs.map