From 1cb8225a67c01eeba57dc6aa26efdb07717a117b Mon Sep 17 00:00:00 2001 From: Bogdan Chadkin Date: Mon, 20 May 2024 09:07:33 +0300 Subject: [PATCH] fix: show visually missing component in canvas (#3383) AI sometimes adds components we don't have here is just a hint for user that some component is missing. Screenshot 2024-05-19 at 14 25 16 Here's json to paste ```json { "@webstudio/template": [ { "type": "instance", "component": "ContentEmbed", "children": [] } ] } ``` --- .../webstudio-component.tsx | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/apps/builder/app/canvas/features/webstudio-component/webstudio-component.tsx b/apps/builder/app/canvas/features/webstudio-component/webstudio-component.tsx index cadca83d06..c3bd68dd60 100644 --- a/apps/builder/app/canvas/features/webstudio-component/webstudio-component.tsx +++ b/apps/builder/app/canvas/features/webstudio-component/webstudio-component.tsx @@ -29,6 +29,7 @@ import { textContentAttribute, descendantComponent, } from "@webstudio-is/react-sdk"; +import { rawTheme } from "@webstudio-is/design-system"; import { $propValuesByInstanceSelector, getIndexedInstanceId, @@ -100,19 +101,26 @@ const ContentEditable = ({ return renderComponentWithRef(ref); }; -const StubComponent = forwardRef( - (props, ref) => { - return ( -
- ); - } -); +const MissingComponentStub = forwardRef< + HTMLDivElement, + { children?: ReactNode } +>((props, ref) => { + return ( +
+ Component {props[componentAttribute as never]} does not exist +
+ ); +}); -StubComponent.displayName = "StubComponent"; +MissingComponentStub.displayName = "MissingComponentStub"; // this utility is temporary solution to compute instance selectors // for rich text subtree which cannot have slots so its safe to traverse ancestors @@ -333,7 +341,8 @@ export const WebstudioComponentCanvas = forwardRef< } const Component = - components.get(instance.component) ?? (StubComponent as AnyComponent); + components.get(instance.component) ?? + (MissingComponentStub as AnyComponent); const props: { [componentAttribute]: string;