gabrielbull/react-router-server

View on GitHub
src/renderer/renderPass.js

Summary

Maintainability
D
1 day
Test Coverage
import React from 'react';
import { renderToString, renderToStaticMarkup } from 'react-dom/server';
import AsyncRenderer from '../components/AsyncRenderer';
import removeDuplicateModules from '../utils/removeDuplicateModules';

const renderPass = (context, element, staticMarkup = false) => {
  context.callback = () => {
    if (context.finishedLoadingModules && !context.statesRenderPass) {
      context.statesRenderPass = true;
      context.renderResult = renderPass(context, element, staticMarkup);
      if (context.fetchingStates <= 0 && context.modulesLoading <= 0) {
        context.resolve({
          html: context.renderResult,
          state: context.fetchStateResults === undefined ? null : context.fetchStateResults,
          modules: context.modules === undefined ? null : removeDuplicateModules(context.modules)
        });
      }
    } else if (context.finishedLoadingModules && context.statesRenderPass || !context.hasModules) {
      context.renderResult = renderPass(context, element, staticMarkup);
      if (context.fetchingStates <= 0 && context.modulesLoading <= 0) {
        context.resolve({
          html: context.renderResult,
          state: context.fetchStateResults === undefined ? null : context.fetchStateResults,
          modules: context.modules === undefined ? null : removeDuplicateModules(context.modules)
        });
      }
    }
  };

  let component = (
    <AsyncRenderer context={context}>
      {element}
    </AsyncRenderer>
  );

  let result;
  try {
    if (staticMarkup) {
      result = renderToStaticMarkup(component);
    } else {
      result = renderToString(component);
    }
  } catch (e) {
    return context.reject(e);
  }

  if (!context.hasModules && !context.hasStates) {
    context.resolve({
      html: result,
      state: context.fetchStateResults === undefined ? null : context.fetchStateResults,
      modules: context.modules === undefined ? null : removeDuplicateModules(context.modules)
    });
  }
  return result;
};

export default renderPass;