@@ -75,6 +75,7 @@ import {
7575 OwnPropsOfLabel ,
7676 LabelProps ,
7777 mapStateToLabelProps ,
78+ CoreActions ,
7879} from '@jsonforms/core' ;
7980import debounce from 'lodash/debounce' ;
8081import React , {
@@ -87,6 +88,7 @@ import React, {
8788 useMemo ,
8889 useReducer ,
8990 useRef ,
91+ useState ,
9092} from 'react' ;
9193
9294const initialCoreState : JsonFormsCore = {
@@ -126,33 +128,56 @@ const useEffectAfterFirstRender = (
126128 } , dependencies ) ;
127129} ;
128130
131+ export interface Middleware {
132+ (
133+ state : JsonFormsCore ,
134+ action : CoreActions ,
135+ defaultReducer : ( state : JsonFormsCore , action : CoreActions ) => JsonFormsCore
136+ ) : JsonFormsCore ;
137+ }
138+
139+ const defaultMiddleware : Middleware = ( state , action , defaultReducer ) =>
140+ defaultReducer ( state , action ) ;
141+
129142export const JsonFormsStateProvider = ( {
130143 children,
131144 initState,
132145 onChange,
146+ middleware,
133147} : any ) => {
134148 const { data, schema, uischema, ajv, validationMode, additionalErrors } =
135149 initState . core ;
136150
137- const [ core , coreDispatch ] = useReducer ( coreReducer , undefined , ( ) =>
138- coreReducer (
151+ const middlewareRef = useRef < Middleware > ( middleware ?? defaultMiddleware ) ;
152+ middlewareRef . current = middleware ?? defaultMiddleware ;
153+
154+ const [ core , setCore ] = useState < JsonFormsCore > ( ( ) =>
155+ middlewareRef . current (
139156 initState . core ,
140157 Actions . init ( data , schema , uischema , {
141158 ajv,
142159 validationMode,
143160 additionalErrors,
144- } )
161+ } ) ,
162+ coreReducer
145163 )
146164 ) ;
147- useEffect ( ( ) => {
148- coreDispatch (
149- Actions . updateCore ( data , schema , uischema , {
150- ajv,
151- validationMode,
152- additionalErrors,
153- } )
154- ) ;
155- } , [ data , schema , uischema , ajv , validationMode , additionalErrors ] ) ;
165+
166+ useEffect (
167+ ( ) =>
168+ setCore ( ( currentCore ) =>
169+ middlewareRef . current (
170+ currentCore ,
171+ Actions . updateCore ( data , schema , uischema , {
172+ ajv,
173+ validationMode,
174+ additionalErrors,
175+ } ) ,
176+ coreReducer
177+ )
178+ ) ,
179+ [ data , schema , uischema , ajv , validationMode , additionalErrors ]
180+ ) ;
156181
157182 const [ config , configDispatch ] = useReducer ( configReducer , undefined , ( ) =>
158183 configReducer ( undefined , Actions . setConfig ( initState . config ) )
@@ -185,6 +210,12 @@ export const JsonFormsStateProvider = ({
185210 initState . i18n ?. translateError ,
186211 ] ) ;
187212
213+ const dispatch = useCallback ( ( action : CoreActions ) => {
214+ setCore ( ( currentCore ) =>
215+ middlewareRef . current ( currentCore , action , coreReducer )
216+ ) ;
217+ } , [ ] ) ;
218+
188219 const contextValue = useMemo (
189220 ( ) => ( {
190221 core,
@@ -194,8 +225,7 @@ export const JsonFormsStateProvider = ({
194225 uischemas : initState . uischemas ,
195226 readonly : initState . readonly ,
196227 i18n : i18n ,
197- // only core dispatch available
198- dispatch : coreDispatch ,
228+ dispatch : dispatch ,
199229 } ) ,
200230 [
201231 core ,
0 commit comments