From 0b20a593b1e330a2dd691aeaf754c626c87d806b Mon Sep 17 00:00:00 2001 From: anakin_karrot Date: Fri, 12 Dec 2025 21:06:14 +0900 Subject: [PATCH 1/3] custom error boundary --- .../react/src/__internal__/PluginRenderer.tsx | 18 +++++++++++------- .../StructuredActivityComponentType.tsx | 12 +++++++++++- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/integrations/react/src/__internal__/PluginRenderer.tsx b/integrations/react/src/__internal__/PluginRenderer.tsx index 113fe7e57..109a55e14 100644 --- a/integrations/react/src/__internal__/PluginRenderer.tsx +++ b/integrations/react/src/__internal__/PluginRenderer.tsx @@ -98,18 +98,22 @@ function renderStructuredActivityComponent( ) : ( node ), - (node) => - errorHandler?.component ? ( - { + if (!errorHandler) return node; + + const ErrorBoundary = + errorHandler.boundary ?? StructuredActivityComponentErrorBoundary; + + return ( + ( )} > {node} - - ) : ( - node - ), + + ); + }, (node) => layout?.component ? ( {node} diff --git a/integrations/react/src/__internal__/StructuredActivityComponentType.tsx b/integrations/react/src/__internal__/StructuredActivityComponentType.tsx index 4007c3fad..0f78c5eaa 100644 --- a/integrations/react/src/__internal__/StructuredActivityComponentType.tsx +++ b/integrations/react/src/__internal__/StructuredActivityComponentType.tsx @@ -105,6 +105,10 @@ export function loading( export interface ErrorHandler

{ component: ComponentType<{ params: P; error: unknown; reset: () => void }>; + boundary?: ComponentType<{ + children: ReactNode; + renderFallback: (error: unknown, reset: () => void) => ReactNode; + }>; } export function errorHandler( @@ -113,6 +117,12 @@ export function errorHandler( error: unknown; reset: () => void; }>, + options?: { + boundary?: ComponentType<{ + children: ReactNode; + renderFallback: (error: unknown, reset: () => void) => ReactNode; + }>; + }, ): ErrorHandler> { - return { component }; + return { component, boundary: options?.boundary }; } From b3fc20bae8ac18b3b20d96ed035909c9bff91c7c Mon Sep 17 00:00:00 2001 From: anakin_karrot Date: Fri, 12 Dec 2025 21:07:28 +0900 Subject: [PATCH 2/3] cs --- .changeset/eager-emus-sort.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/eager-emus-sort.md diff --git a/.changeset/eager-emus-sort.md b/.changeset/eager-emus-sort.md new file mode 100644 index 000000000..5572f9bd1 --- /dev/null +++ b/.changeset/eager-emus-sort.md @@ -0,0 +1,5 @@ +--- +"@stackflow/react": minor +--- + +Add an option for customizing error boundary in ErrorHandler of structured activity components From 43ce549437200e531871565082d1eebe65753ec7 Mon Sep 17 00:00:00 2001 From: anakin_karrot Date: Fri, 12 Dec 2025 21:20:58 +0900 Subject: [PATCH 3/3] export type --- .../StructuredActivityComponentType.tsx | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/integrations/react/src/__internal__/StructuredActivityComponentType.tsx b/integrations/react/src/__internal__/StructuredActivityComponentType.tsx index 0f78c5eaa..82258624a 100644 --- a/integrations/react/src/__internal__/StructuredActivityComponentType.tsx +++ b/integrations/react/src/__internal__/StructuredActivityComponentType.tsx @@ -105,12 +105,14 @@ export function loading( export interface ErrorHandler

{ component: ComponentType<{ params: P; error: unknown; reset: () => void }>; - boundary?: ComponentType<{ - children: ReactNode; - renderFallback: (error: unknown, reset: () => void) => ReactNode; - }>; + boundary?: CustomErrorBoundary; } +export type CustomErrorBoundary = ComponentType<{ + children: ReactNode; + renderFallback: (error: unknown, reset: () => void) => ReactNode; +}>; + export function errorHandler( component: ComponentType<{ params: InferActivityParams; @@ -118,10 +120,7 @@ export function errorHandler( reset: () => void; }>, options?: { - boundary?: ComponentType<{ - children: ReactNode; - renderFallback: (error: unknown, reset: () => void) => ReactNode; - }>; + boundary?: CustomErrorBoundary; }, ): ErrorHandler> { return { component, boundary: options?.boundary };