diff --git a/packages/ui-extensions-react/src/surfaces/admin/render.tsx b/packages/ui-extensions-react/src/surfaces/admin/render.tsx index 92294ab2bb..c1953b7c2e 100644 --- a/packages/ui-extensions-react/src/surfaces/admin/render.tsx +++ b/packages/ui-extensions-react/src/surfaces/admin/render.tsx @@ -25,18 +25,22 @@ import {ExtensionApiContext} from './context'; */ export function reactExtension( target: ExtensionTarget, - render: (api: ApiForRenderExtension) => ReactElement, + render: ( + api: ApiForRenderExtension, + ) => Promise> | ReactElement, ): ExtensionTargets[ExtensionTarget] { // TypeScript can’t infer the type of the callback because it’s a big union // type. To get around it, we’ll just fake like we are rendering the // Playground extension, since all render extensions have the same general // shape (`RenderExtension`). - return extension<'Playground'>(target as any, (root, api) => { - return new Promise((resolve, reject) => { + return extension<'Playground'>(target as any, async (root, api) => { + const element = await render(api as ApiForRenderExtension); + + return new Promise((resolve, reject) => { try { remoteRender( - {render(api as ApiForRenderExtension)} + {element} , root, () => { @@ -46,7 +50,7 @@ export function reactExtension( } catch (error) { // Workaround for https://github.com/Shopify/ui-extensions/issues/325 // eslint-disable-next-line no-console - console.error(error); + console.log(error); reject(error); } });