Skip to content

Commit 48d03d1

Browse files
committed
Make renderOrHydrateComponent async
1 parent c00e52f commit 48d03d1

File tree

4 files changed

+25
-27
lines changed

4 files changed

+25
-27
lines changed

node_package/src/ClientSideRenderer.ts

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -220,26 +220,30 @@ class StoreRenderer {
220220

221221
const renderedRoots = new Map<string, ComponentRenderer>();
222222

223-
export function renderOrHydrateComponent(domIdOrElement: string | Element): ComponentRenderer | undefined {
223+
export function renderOrHydrateComponent(domIdOrElement: string | Element) {
224224
const domId = getDomId(domIdOrElement);
225225
debugTurbolinks('renderOrHydrateComponent', domId);
226226
let root = renderedRoots.get(domId);
227227
if (!root) {
228228
root = new ComponentRenderer(domIdOrElement);
229229
renderedRoots.set(domId, root);
230230
}
231-
return root;
231+
return root.waitUntilRendered();
232232
}
233233

234-
export function renderOrHydrateForceLoadedComponents(): void {
235-
const els = document.querySelectorAll(`.js-react-on-rails-component[data-force-load="true"]`);
236-
els.forEach((el) => renderOrHydrateComponent(el));
234+
async function forAllElementsAsync(
235+
selector: string,
236+
callback: (el: Element) => Promise<void>,
237+
): Promise<void> {
238+
const els = document.querySelectorAll(selector);
239+
await Promise.all(Array.from(els).map(callback));
237240
}
238241

239-
export function renderOrHydrateAllComponents(): void {
240-
const els = document.querySelectorAll(`.js-react-on-rails-component`);
241-
els.forEach((el) => renderOrHydrateComponent(el));
242-
}
242+
export const renderOrHydrateForceLoadedComponents = () =>
243+
forAllElementsAsync('.js-react-on-rails-component[data-force-load="true"]', renderOrHydrateComponent);
244+
245+
export const renderOrHydrateAllComponents = () =>
246+
forAllElementsAsync('.js-react-on-rails-component', renderOrHydrateComponent);
243247

244248
function unmountAllComponents(): void {
245249
renderedRoots.forEach((root) => root.unmount());
@@ -270,15 +274,11 @@ export async function hydrateStore(storeNameOrElement: string | Element) {
270274
await storeRenderer.waitUntilHydrated();
271275
}
272276

273-
export async function hydrateForceLoadedStores(): Promise<void> {
274-
const els = document.querySelectorAll(`[${REACT_ON_RAILS_STORE_ATTRIBUTE}][data-force-load="true"]`);
275-
await Promise.all(Array.from(els).map((el) => hydrateStore(el)));
276-
}
277+
export const hydrateForceLoadedStores = () =>
278+
forAllElementsAsync(`[${REACT_ON_RAILS_STORE_ATTRIBUTE}][data-force-load="true"]`, hydrateStore);
277279

278-
export async function hydrateAllStores(): Promise<void> {
279-
const els = document.querySelectorAll(`[${REACT_ON_RAILS_STORE_ATTRIBUTE}]`);
280-
await Promise.all(Array.from(els).map((el) => hydrateStore(el)));
281-
}
280+
export const hydrateAllStores = () =>
281+
forAllElementsAsync(`[${REACT_ON_RAILS_STORE_ATTRIBUTE}]`, hydrateStore);
282282

283283
function unmountAllStores(): void {
284284
storeRenderers.forEach((storeRenderer) => storeRenderer.unmount());

node_package/src/ReactOnRails.client.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,12 @@ ctx.ReactOnRails = {
148148
return ClientStartup.reactOnRailsPageLoaded();
149149
},
150150

151-
reactOnRailsComponentLoaded(domId: string): void {
152-
renderOrHydrateComponent(domId);
151+
reactOnRailsComponentLoaded(domId: string): Promise<void> {
152+
return renderOrHydrateComponent(domId);
153153
},
154154

155-
async reactOnRailsStoreLoaded(storeName: string): Promise<void> {
156-
await hydrateStore(storeName);
155+
reactOnRailsStoreLoaded(storeName: string): Promise<void> {
156+
return hydrateStore(storeName);
157157
},
158158

159159
/**

node_package/src/clientStartup.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@ import { debugTurbolinks } from './turbolinksUtils';
1111

1212
export async function reactOnRailsPageLoaded() {
1313
debugTurbolinks('reactOnRailsPageLoaded');
14-
const promise = hydrateAllStores();
15-
renderOrHydrateAllComponents();
16-
await promise;
14+
await Promise.all([hydrateAllStores(), renderOrHydrateAllComponents()]);
1715
}
1816

1917
function reactOnRailsPageUnloaded(): void {
@@ -36,10 +34,10 @@ export async function clientStartup(context: Context): Promise<void> {
3634
// eslint-disable-next-line no-underscore-dangle
3735
context.__REACT_ON_RAILS_EVENT_HANDLERS_RAN_ONCE__ = true;
3836

39-
// force loaded components and stores are rendered and hydrated immediately
40-
renderOrHydrateForceLoadedComponents();
37+
// Force loaded components and stores are rendered and hydrated immediately.
4138
// The hydration process can handle the concurrent hydration of components and stores,
4239
// so awaiting this isn't necessary.
40+
void renderOrHydrateForceLoadedComponents();
4341
void hydrateForceLoadedStores();
4442

4543
// Other components and stores are rendered and hydrated when the page is fully loaded

node_package/src/types/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ export interface ReactOnRails {
180180
setOptions(newOptions: { traceTurbolinks: boolean }): void;
181181
reactHydrateOrRender(domNode: Element, reactElement: ReactElement, hydrate: boolean): RenderReturnType;
182182
reactOnRailsPageLoaded(): Promise<void>;
183-
reactOnRailsComponentLoaded(domId: string): void;
183+
reactOnRailsComponentLoaded(domId: string): Promise<void>;
184184
reactOnRailsStoreLoaded(storeName: string): Promise<void>;
185185
authenticityToken(): string | null;
186186
authenticityHeaders(otherHeaders: Record<string, string>): AuthenticityHeaders;

0 commit comments

Comments
 (0)