Skip to content

Commit 174b83e

Browse files
authored
🤖 Merge PR DefinitelyTyped#74508 Add @wordpress/server-side-render types by @rafaucau
1 parent 006ffd0 commit 174b83e

File tree

6 files changed

+146
-0
lines changed

6 files changed

+146
-0
lines changed

attw.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@
328328
"webscopeio__react-textarea-autocomplete",
329329
"when",
330330
"wnumb",
331+
"wordpress__server-side-render",
331332
"yargs-parser",
332333
"yargs-parser/v20",
333334
"yargs/v16",
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
*
2+
!**/*.d.ts
3+
!**/*.d.cts
4+
!**/*.d.mts
5+
!**/*.d.*.ts
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import type { ComponentType, JSX, PropsWithChildren } from "react";
2+
3+
export interface ServerSideRenderProps {
4+
/** The identifier of the block to be serverside rendered. */
5+
block: string;
6+
/** The block attributes to be sent to the server for rendering. */
7+
attributes?: Record<string, unknown> | null;
8+
/** Additional classes to apply to the wrapper element. */
9+
className?: string;
10+
/** The HTTP method to use (‘GET’ or ‘POST’). Default is ‘GET’ */
11+
httpMethod?: "GET" | "POST";
12+
/** Additional query arguments to append to the request URL. */
13+
urlQueryArgs?: Record<string, string | number | boolean | undefined>;
14+
/** Whether to remove block support attributes before sending. */
15+
skipBlockSupportAttributes?: boolean;
16+
/** Component rendered when the API response is empty. */
17+
EmptyResponsePlaceholder?: ComponentType<ServerSideRenderProps>;
18+
/** Component rendered when the API response is an error. */
19+
ErrorResponsePlaceholder?: ComponentType<ServerSideRenderProps & { message: string }>;
20+
/** Component rendered while the API request is loading. */
21+
LoadingResponsePlaceholder?: ComponentType<PropsWithChildren<ServerSideRenderProps>>;
22+
}
23+
24+
/** A component that renders server-side content for blocks. */
25+
export function ServerSideRender(props: ServerSideRenderProps): JSX.Element;
26+
27+
/**
28+
* @deprecated Use `ServerSideRender` non-default export instead:
29+
* ```js
30+
* import { ServerSideRender } from '@wordpress/server-side-render';
31+
* ```
32+
*/
33+
declare const ServerSideRenderDefault: typeof ServerSideRender;
34+
export default ServerSideRenderDefault;
35+
36+
export type UseServerSideRenderArgs = Pick<
37+
ServerSideRenderProps,
38+
"block" | "attributes" | "httpMethod" | "urlQueryArgs" | "skipBlockSupportAttributes"
39+
>;
40+
41+
export type ServerSideRenderStatus = "idle" | "loading" | "success" | "error";
42+
43+
export interface ServerSideRenderResponse {
44+
/** The current request status: 'idle', 'loading', 'success', or 'error'. */
45+
status: ServerSideRenderStatus;
46+
/** The rendered block content (available when status is 'success'). */
47+
content?: string;
48+
/** The error message (available when status is 'error'). */
49+
error?: string;
50+
}
51+
52+
/**
53+
* A hook for server-side rendering a preview of dynamic blocks to display in the editor.
54+
*
55+
* Handles fetching server-rendered previews for blocks, managing loading states,
56+
* and automatically debouncing requests to prevent excessive API calls. It supports both
57+
* GET and POST requests, with POST requests used for larger attribute payloads.
58+
*
59+
* @example
60+
* Basic usage:
61+
*
62+
* ```jsx
63+
* import { RawHTML } from '@wordpress/element';
64+
* import { useServerSideRender } from '@wordpress/server-side-render';
65+
*
66+
* function MyServerSideRender( { attributes, block } ) {
67+
* const { content, status, error } = useServerSideRender( {
68+
* attributes,
69+
* block,
70+
* } );
71+
*
72+
* if ( status === 'loading' ) {
73+
* return <div>Loading...</div>;
74+
* }
75+
*
76+
* if ( status === 'error' ) {
77+
* return <div>Error: { error }</div>;
78+
* }
79+
*
80+
* return <RawHTML>{ content }</RawHTML>;
81+
* }
82+
* ```
83+
*/
84+
export function useServerSideRender(args: UseServerSideRenderArgs): ServerSideRenderResponse;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"private": true,
3+
"name": "@types/wordpress__server-side-render",
4+
"version": "6.15.9999",
5+
"projects": [
6+
"https://github.com/WordPress/gutenberg/tree/HEAD/packages/server-side-render/README.md"
7+
],
8+
"dependencies": {
9+
"@types/react": "^18"
10+
},
11+
"devDependencies": {
12+
"@types/wordpress__server-side-render": "workspace:."
13+
},
14+
"owners": [
15+
{
16+
"name": "Rafał Całka",
17+
"githubUsername": "rafaucau"
18+
}
19+
]
20+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"compilerOptions": {
3+
"module": "node16",
4+
"lib": [
5+
"es6"
6+
],
7+
"jsx": "preserve",
8+
"noImplicitAny": true,
9+
"noImplicitThis": true,
10+
"strictFunctionTypes": true,
11+
"strictNullChecks": true,
12+
"types": [],
13+
"noEmit": true,
14+
"forceConsistentCasingInFileNames": true
15+
},
16+
"files": [
17+
"index.d.ts",
18+
"wordpress__server-side-render-tests.tsx"
19+
]
20+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { ServerSideRender, useServerSideRender } from "@wordpress/server-side-render";
2+
3+
<ServerSideRender
4+
block="my/block"
5+
className="my-block"
6+
ErrorResponsePlaceholder={(props) => <p>An error occurred while loading {props.block}: {props.message}</p>}
7+
/>;
8+
9+
function MyServerSideRender({ attributes, block }: { attributes: Record<string, unknown>; block: string }) {
10+
const { content, status, error } = useServerSideRender({
11+
attributes,
12+
block,
13+
});
14+
15+
return <code>{content}</code>;
16+
}

0 commit comments

Comments
 (0)