Skip to content

Commit 24603c3

Browse files
committed
Move JS docs to the interface
1 parent 1fc6ce0 commit 24603c3

File tree

5 files changed

+156
-163
lines changed

5 files changed

+156
-163
lines changed

docs/api/javascript-api.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ If you are using [jquery-ujs](https://github.com/rails/jquery-ujs) for AJAX call
1818

1919
## API
2020

21-
The best source of docs is the main [ReactOnRails.ts](https://github.com/shakacode/react_on_rails/blob/master/node_package/src/ReactOnRails.ts) file. Here's a quick summary. No guarantees that this won't be outdated!
21+
The best source of docs is the `interface ReactOnRails` in [types/index.ts](https://github.com/shakacode/react_on_rails/blob/master/node_package/src/types/index.ts). Here's a quick summary. No guarantees that this won't be outdated!
2222

2323
```js
2424
/**
@@ -44,7 +44,7 @@ register(components);
4444
* the setStore API is different in that it's the actual store hydrated with props.
4545
* @param stores (key is store name, value is the store generator)
4646
*/
47-
registerStore(stores);
47+
registerStoreGenerators(storesGenerators);
4848

4949
/**
5050
* Allows retrieval of the store by name. This store will be hydrated by any Rails form props.
@@ -85,14 +85,12 @@ reactOnRailsPageLoaded();
8585
* Returns CSRF authenticity token inserted by Rails csrf_meta_tags
8686
* @returns String or null
8787
*/
88-
8988
authenticityToken();
9089

9190
/**
9291
* Returns header with csrf authenticity token and XMLHttpRequest
9392
* @param {*} other headers
9493
* @returns {*} header
9594
*/
96-
9795
authenticityHeaders((otherHeaders = {}));
9896
```

node_package/src/ReactOnRails.client.ts

Lines changed: 4 additions & 146 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import type {
1515
AuthenticityHeaders,
1616
Store,
1717
StoreGenerator,
18+
ReactOnRailsOptions,
1819
} from './types';
1920
import reactHydrateOrRender from './reactHydrateOrRender';
2021

@@ -40,11 +41,7 @@ const DEFAULT_OPTIONS = {
4041

4142
ctx.ReactOnRails = {
4243
options: {},
43-
/**
44-
* Main entry point to using the react-on-rails npm package. This is how Rails will be able to
45-
* find you components for rendering.
46-
* @param components (key is component name, value is component)
47-
*/
44+
4845
register(components: Record<string, ReactComponentOrRenderFunction>): void {
4946
ComponentRegistry.register(components);
5047
},
@@ -53,12 +50,6 @@ ctx.ReactOnRails = {
5350
this.registerStoreGenerators(stores);
5451
},
5552

56-
/**
57-
* Allows registration of store generators to be used by multiple React components on one Rails
58-
* view. store generators are functions that take one arg, props, and return a store. Note that
59-
* the setStore API is different in that it's the actual store hydrated with props.
60-
* @param storeGenerators (keys are store names, values are the store generators)
61-
*/
6253
registerStoreGenerators(storeGenerators: Record<string, StoreGenerator>): void {
6354
if (!storeGenerators) {
6455
throw new Error(
@@ -70,55 +61,23 @@ ctx.ReactOnRails = {
7061
StoreRegistry.register(storeGenerators);
7162
},
7263

73-
/**
74-
* Allows retrieval of the store by name. This store will be hydrated by any Rails form props.
75-
* Pass optional param throwIfMissing = false if you want to use this call to get back null if the
76-
* store with name is not registered.
77-
* @param name
78-
* @param throwIfMissing Defaults to true. Set to false to have this call return undefined if
79-
* there is no store with the given name.
80-
* @returns Redux Store, possibly hydrated
81-
*/
8264
getStore(name: string, throwIfMissing = true): Store | undefined {
8365
return StoreRegistry.getStore(name, throwIfMissing);
8466
},
8567

86-
/**
87-
* Get a store by name, or wait for it to be registered.
88-
* @param name
89-
* @returns Promise<Store>
90-
*/
9168
getOrWaitForStore(name: string): Promise<Store> {
9269
return StoreRegistry.getOrWaitForStore(name);
9370
},
9471

95-
/**
96-
* Get a store generator by name, or wait for it to be registered.
97-
* @param name
98-
* @returns Promise<StoreGenerator>
99-
*/
10072
getOrWaitForStoreGenerator(name: string): Promise<StoreGenerator> {
10173
return StoreRegistry.getOrWaitForStoreGenerator(name);
10274
},
10375

104-
/**
105-
* Renders or hydrates the React element passed. In case React version is >=18 will use the root API.
106-
* @param domNode
107-
* @param reactElement
108-
* @param hydrate if true will perform hydration, if false will render
109-
* @returns {Root|ReactComponent|ReactElement|null}
110-
*/
11176
reactHydrateOrRender(domNode: Element, reactElement: ReactElement, hydrate: boolean): RenderReturnType {
11277
return reactHydrateOrRender(domNode, reactElement, hydrate);
11378
},
11479

115-
/**
116-
* Set options for ReactOnRails, typically before you call ReactOnRails.register
117-
* Available Options:
118-
* `traceTurbolinks: true|false Gives you debugging messages on Turbolinks events
119-
* `turbo: true|false Turbo (the follower of Turbolinks) events will be registered, if set to true.
120-
*/
121-
setOptions(newOptions: { traceTurbolinks?: boolean; turbo?: boolean }): void {
80+
setOptions(newOptions: Partial<ReactOnRailsOptions>): void {
12281
if (typeof newOptions.traceTurbolinks !== 'undefined') {
12382
this.options.traceTurbolinks = newOptions.traceTurbolinks;
12483

@@ -138,12 +97,6 @@ ctx.ReactOnRails = {
13897
}
13998
},
14099

141-
/**
142-
* Allow directly calling the page loaded script in case the default events that trigger React
143-
* rendering are not sufficient, such as when loading JavaScript asynchronously with TurboLinks:
144-
* More details can be found here:
145-
* https://github.com/shakacode/react_on_rails/blob/master/docs/additional-reading/turbolinks.md
146-
*/
147100
reactOnRailsPageLoaded() {
148101
return ClientStartup.reactOnRailsPageLoaded();
149102
},
@@ -156,21 +109,10 @@ ctx.ReactOnRails = {
156109
return hydrateStore(storeName);
157110
},
158111

159-
/**
160-
* Returns CSRF authenticity token inserted by Rails csrf_meta_tags
161-
* @returns String or null
162-
*/
163-
164112
authenticityToken(): string | null {
165113
return Authenticity.authenticityToken();
166114
},
167115

168-
/**
169-
* Returns header with csrf authenticity token and XMLHttpRequest
170-
* @param otherHeaders Other headers
171-
* @returns {*} header
172-
*/
173-
174116
authenticityHeaders(otherHeaders: Record<string, string> = {}): AuthenticityHeaders {
175117
return Authenticity.authenticityHeaders(otherHeaders);
176118
},
@@ -179,66 +121,22 @@ ctx.ReactOnRails = {
179121
// INTERNALLY USED APIs
180122
// /////////////////////////////////////////////////////////////////////////////
181123

182-
/**
183-
* Retrieve an option by key.
184-
* @param key
185-
* @returns option value
186-
*/
187-
option(key: string): string | number | boolean | undefined {
124+
option<K extends keyof ReactOnRailsOptions>(key: K): ReactOnRailsOptions[K] | undefined {
188125
return this.options[key];
189126
},
190127

191-
/**
192-
* Allows retrieval of the store generator by name. This is used internally by ReactOnRails after
193-
* a Rails form loads to prepare stores.
194-
* @param name
195-
* @returns Redux Store generator function
196-
*/
197128
getStoreGenerator(name: string): StoreGenerator {
198129
return StoreRegistry.getStoreGenerator(name);
199130
},
200131

201-
/**
202-
* Allows saving the store populated by Rails form props. Used internally by ReactOnRails.
203-
* @returns Redux Store, possibly hydrated
204-
*/
205132
setStore(name: string, store: Store): void {
206133
StoreRegistry.setStore(name, store);
207134
},
208135

209-
/**
210-
* Clears hydratedStores to avoid accidental usage of wrong store hydrated in previous/parallel
211-
* request.
212-
*/
213136
clearHydratedStores(): void {
214137
StoreRegistry.clearHydratedStores();
215138
},
216139

217-
/**
218-
* @example
219-
* ReactOnRails.render("HelloWorldApp", {name: "Stranger"}, 'app');
220-
*
221-
* Does this:
222-
* ```js
223-
* ReactDOM.render(React.createElement(HelloWorldApp, {name: "Stranger"}),
224-
* document.getElementById('app'))
225-
* ```
226-
* under React 16/17 and
227-
* ```js
228-
* const root = ReactDOMClient.createRoot(document.getElementById('app'))
229-
* root.render(React.createElement(HelloWorldApp, {name: "Stranger"}))
230-
* return root
231-
* ```
232-
* under React 18+.
233-
*
234-
* @param name Name of your registered component
235-
* @param props Props to pass to your component
236-
* @param domNodeId
237-
* @param hydrate Pass truthy to update server rendered html. Default is falsy
238-
* @returns {Root|ReactComponent|ReactElement} Under React 18+: the created React root
239-
* (see "What is a root?" in https://github.com/reactwg/react-18/discussions/5).
240-
* Under React 16/17: Reference to your component's backing instance or `null` for stateless components.
241-
*/
242140
render(name: string, props: Record<string, string>, domNodeId: string, hydrate: boolean): RenderReturnType {
243141
const componentObj = ComponentRegistry.get(name);
244142
const reactElement = createReactOutput({ componentObj, props, domNodeId });
@@ -250,88 +148,48 @@ ctx.ReactOnRails = {
250148
);
251149
},
252150

253-
/**
254-
* Get the component that you registered
255-
* @param name
256-
* @returns {name, component, renderFunction, isRenderer}
257-
*/
258151
getComponent(name: string): RegisteredComponent {
259152
return ComponentRegistry.get(name);
260153
},
261154

262-
/**
263-
* Get the component that you registered, or wait for it to be registered
264-
* @param name
265-
* @returns {name, component, renderFunction, isRenderer}
266-
*/
267155
getOrWaitForComponent(name: string): Promise<RegisteredComponent> {
268156
return ComponentRegistry.getOrWaitForComponent(name);
269157
},
270158

271-
/**
272-
* Used by server rendering by Rails
273-
* @param options
274-
*/
275159
serverRenderReactComponent(): null | string | Promise<RenderResult> {
276160
throw new Error(
277161
'serverRenderReactComponent is not available in "react-on-rails/client". Import "react-on-rails" server-side.',
278162
);
279163
},
280164

281-
/**
282-
* Used by server rendering by Rails
283-
* @param options
284-
*/
285165
streamServerRenderedReactComponent() {
286166
throw new Error(
287167
'streamServerRenderedReactComponent is only supported when using a bundle built for Node.js environments',
288168
);
289169
},
290170

291-
/**
292-
* Generates RSC payload, used by Rails
293-
*/
294171
serverRenderRSCReactComponent() {
295172
throw new Error('serverRenderRSCReactComponent is supported in RSC bundle only.');
296173
},
297174

298-
/**
299-
* Used by Rails to catch errors in rendering
300-
* @param options
301-
*/
302175
handleError(): string | undefined {
303176
throw new Error(
304177
'handleError is not available in "react-on-rails/client". Import "react-on-rails" server-side.',
305178
);
306179
},
307180

308-
/**
309-
* Used by Rails server rendering to replay console messages.
310-
*/
311181
buildConsoleReplay(): string {
312182
return buildConsoleReplay();
313183
},
314184

315-
/**
316-
* Get an Object containing all registered components. Useful for debugging.
317-
* @returns {*}
318-
*/
319185
registeredComponents(): Map<string, RegisteredComponent> {
320186
return ComponentRegistry.components();
321187
},
322188

323-
/**
324-
* Get an Object containing all registered store generators. Useful for debugging.
325-
* @returns {*}
326-
*/
327189
storeGenerators(): Map<string, StoreGenerator> {
328190
return StoreRegistry.storeGenerators();
329191
},
330192

331-
/**
332-
* Get an Object containing all hydrated stores. Useful for debugging.
333-
* @returns {*}
334-
*/
335193
stores(): Map<string, Store> {
336194
return StoreRegistry.stores();
337195
},

node_package/src/ReactOnRails.full.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,8 @@ if (typeof window !== 'undefined') {
1010
);
1111
}
1212

13-
/**
14-
* Used by Rails to catch errors in rendering
15-
* @param options
16-
*/
1713
Client.handleError = (options: ErrorOptions): string | undefined => handleError(options);
1814

19-
/**
20-
* Used by server rendering by Rails
21-
* @param options
22-
*/
2315
Client.serverRenderReactComponent = (options: RenderParams): null | string | Promise<RenderResult> =>
2416
serverRenderReactComponent(options);
2517

node_package/src/context.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { ReactOnRails as ReactOnRailsType, RailsContext } from './types';
1+
import type { ReactOnRailsInternal as ReactOnRailsType, RailsContext } from './types';
22

33
declare global {
44
interface Window {

0 commit comments

Comments
 (0)