Skip to content

Commit

Permalink
Factor out createElements from resolveElements
Browse files Browse the repository at this point in the history
  • Loading branch information
taion committed Oct 29, 2016
1 parent 703b848 commit 2088c86
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 44 deletions.
46 changes: 46 additions & 0 deletions src/createElements.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import React from 'react';
import warning from 'warning';

import { isResolved } from './ResolverUtils';

export default function createElements(routeMatches, Components, matchData) {
return routeMatches.map((match, i) => {
const { route } = match;

const Component = Components[i];
const data = matchData[i];

const isComponentResolved = isResolved(Component);
const areDataResolved = isResolved(data);

if (route.render) {
// Perhaps undefined here would be more correct for "not ready", but
// Relay uses null in RelayReadyStateRenderer, so let's follow that
// convention.
return route.render({
match,
Component: isComponentResolved ? Component : null,
props: areDataResolved ? { ...match, data } : null,
data: areDataResolved ? data : null,
});
}

if (!isComponentResolved || !areDataResolved) {
// Can't render.
return undefined;
}

if (!Component) {
// Note this check would be wrong on potentially unresolved data.
warning(
data === undefined,
`Route ${i} has data, but no render method or component.`,
);

// Nothing to render.
return null;
}

return <Component {...match} data={data} />;
});
}
1 change: 1 addition & 0 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export createBaseRouter from './createBaseRouter';
export createBrowserRouter from './createBrowserRouter';
export createConnectedLink from './createConnectedLink';
export createConnectedRouter from './createConnectedRouter';
export createElements from './createElements';
export createFarceRouter from './createFarceRouter';
export createMatchEnhancer from './createMatchEnhancer';
export createRender from './createRender';
Expand Down
45 changes: 1 addition & 44 deletions src/resolveElements.js
Original file line number Diff line number Diff line change
@@ -1,53 +1,10 @@
import isPromise from 'is-promise';
import React from 'react';
import warning from 'warning';

import createElements from './createElements';
import {
checkResolved, getComponents, getRouteMatches, getRouteValues, isResolved,
} from './ResolverUtils';

function createElements(routeMatches, Components, matchData) {
return routeMatches.map((match, i) => {
const { route } = match;

const Component = Components[i];
const data = matchData[i];

const isComponentResolved = isResolved(Component);
const areDataResolved = isResolved(data);

if (route.render) {
// Perhaps undefined here would be more correct for "not ready", but
// Relay uses null in RelayReadyStateRenderer, so let's follow that
// convention.
return route.render({
match,
Component: isComponentResolved ? Component : null,
props: areDataResolved ? { ...match, data } : null,
data: areDataResolved ? data : null,
});
}

if (!isComponentResolved || !areDataResolved) {
// Can't render.
return undefined;
}

if (!Component) {
// Note this check would be wrong on potentially unresolved data.
warning(
data === undefined,
`Route ${i} has data, but no render method or component.`,
);

// Nothing to render.
return null;
}

return <Component {...match} data={data} />;
});
}

export default async function* resolveElements(match) {
const routeMatches = getRouteMatches(match);

Expand Down

0 comments on commit 2088c86

Please sign in to comment.