Skip to content
This repository was archived by the owner on May 8, 2023. It is now read-only.

Commit cf7acd4

Browse files
authored
Use containerQuerySelector renderer config in Cosmos Next (#941)
1 parent 6aa7c73 commit cf7acd4

File tree

4 files changed

+50
-11
lines changed

4 files changed

+50
-11
lines changed

packages/react-cosmos-shared2/src/dom.ts

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,38 @@
1-
const CONTAINER_ID = 'root';
1+
export function getDomContainer(querySelector?: string) {
2+
if (!querySelector) {
3+
return getFallbackDomContainer();
4+
}
5+
6+
const existingContainer = document.querySelector(querySelector);
7+
if (!existingContainer) {
8+
// TODO: Move this function outside of the shared package. It contains
9+
// renderer-specific knowledge. Keep createDomContainer to reuse in
10+
// the playground package.
11+
console.warn(
12+
`Query selector "${querySelector}" doesn't match any existing DOM element. ` +
13+
`Are you using a custom HTML template? ` +
14+
`Add an element matching "${querySelector}" to your template or change the containerQuerySelector setting.`
15+
);
16+
return getFallbackDomContainer();
17+
}
218

3-
export function getDomContainer() {
4-
return document.getElementById(CONTAINER_ID) || createDomContainer();
19+
return existingContainer;
20+
}
21+
22+
function getFallbackDomContainer() {
23+
return document.querySelector('#root') || createDomContainer();
524
}
625

726
function createDomContainer() {
827
const { body } = document;
9-
1028
if (!body) {
1129
throw new Error(
1230
`Can't create DOM container because document.body is missing`
1331
);
1432
}
1533

1634
const container = document.createElement('div');
17-
container.setAttribute('id', CONTAINER_ID);
18-
35+
container.setAttribute('id', 'root');
1936
body.appendChild(container);
2037

2138
return container;

packages/react-cosmos/src/client/next/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
import { getRendererId } from './rendererId';
44
import { initErrorOverlay, dismissErrorOverlay } from './errorOverlay';
55
import { initGlobalErrorHandler } from './globalErrorHandler';
6+
import { rendererConfig } from './shared';
67

78
const rendererId = getRendererId();
89

910
function mount() {
1011
// Use dynamic import to load updated modules upon hot reloading
1112
require('./mount').mount({
1213
rendererId,
14+
rendererConfig,
1315
onFixtureChange: dismissErrorOverlay
1416
});
1517
}

packages/react-cosmos/src/client/next/mount.js

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,25 @@ import { PostMessage, WebSockets, FixtureConnect } from 'react-cosmos-fixture';
77
import { fixtures, decorators } from './userModules';
88
import { ErrorCatch } from './ErrorCatch';
99

10+
import type { RendererConfig } from './shared';
1011
import type { RendererId } from 'react-cosmos-shared2/renderer';
1112

12-
type Opts = {
13+
type RendererOptions = {
1314
rendererId: RendererId,
15+
rendererConfig: RendererConfig,
1416
onFixtureChange?: () => mixed
1517
};
1618

17-
export function mount(opts: Opts) {
19+
export function mount({
20+
rendererId,
21+
rendererConfig,
22+
onFixtureChange
23+
}: RendererOptions) {
1824
render(
19-
wrapSuitableAdaptor(createFixtureConnectRenderCb(opts)),
20-
getDomContainer()
25+
wrapSuitableAdaptor(
26+
createFixtureConnectRenderCb(rendererId, onFixtureChange)
27+
),
28+
getDomContainer(rendererConfig.containerQuerySelector)
2129
);
2230
}
2331

@@ -29,7 +37,10 @@ function wrapSuitableAdaptor(element) {
2937
return <WebSockets url={getWebSocketsUrl()}>{element}</WebSockets>;
3038
}
3139

32-
function createFixtureConnectRenderCb({ rendererId, onFixtureChange }: Opts) {
40+
function createFixtureConnectRenderCb(
41+
rendererId: RendererId,
42+
onFixtureChange?: () => mixed
43+
) {
3344
return ({ subscribe, unsubscribe, postMessage }) => (
3445
<FixtureConnect
3546
rendererId={rendererId}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// @flow
2+
3+
export type RendererConfig = {
4+
containerQuerySelector?: string
5+
};
6+
7+
declare var COSMOS_CONFIG: RendererConfig;
8+
9+
export const rendererConfig: RendererConfig = COSMOS_CONFIG;

0 commit comments

Comments
 (0)