@@ -14,6 +14,7 @@ let ReactFeatureFlags;
1414let ReactDOM ;
1515let ReactDOMServer ;
1616let ReactTestRenderer ;
17+ let Scheduler ;
1718
1819// FIXME: What should the public API be for setting an event's priority? Right
1920// now it's an enum but is that what we want? Hard coding this for now.
@@ -72,6 +73,7 @@ describe('DOMEventResponderSystem', () => {
7273 React = require ( 'react' ) ;
7374 ReactDOM = require ( 'react-dom' ) ;
7475 ReactDOMServer = require ( 'react-dom/server' ) ;
76+ Scheduler = require ( 'scheduler' ) ;
7577 container = document . createElement ( 'div' ) ;
7678 document . body . appendChild ( container ) ;
7779 } ) ;
@@ -811,8 +813,8 @@ describe('DOMEventResponderSystem', () => {
811813
812814 it ( 'the event responder system should warn on accessing invalid properties' , ( ) => {
813815 const TestResponder = createEventResponder ( {
814- rootEventTypes : [ 'click' ] ,
815- onRootEvent : ( event , context , props ) => {
816+ targetEventTypes : [ 'click' ] ,
817+ onEvent : ( event , context , props ) => {
816818 const syntheticEvent = {
817819 target : event . target ,
818820 type : 'click' ,
@@ -823,19 +825,24 @@ describe('DOMEventResponderSystem', () => {
823825 } ) ;
824826
825827 let handler ;
828+ let buttonRef = React . createRef ( ) ;
826829 const Test = ( ) => {
827830 const listener = React . unstable_useResponder ( TestResponder , {
828831 onClick : handler ,
829832 } ) ;
830833
831- return < button listeners = { listener } > Click me!</ button > ;
834+ return (
835+ < button listeners = { listener } ref = { buttonRef } >
836+ Click me!
837+ </ button >
838+ ) ;
832839 } ;
833840 expect ( ( ) => {
834841 handler = event => {
835842 event . preventDefault ( ) ;
836843 } ;
837844 ReactDOM . render ( < Test /> , container ) ;
838- dispatchClickEvent ( document . body ) ;
845+ dispatchClickEvent ( buttonRef . current ) ;
839846 } ) . toWarnDev (
840847 'Warning: preventDefault() is not available on event objects created from event responder modules ' +
841848 '(React Flare).' +
@@ -847,7 +854,7 @@ describe('DOMEventResponderSystem', () => {
847854 event . stopPropagation ( ) ;
848855 } ;
849856 ReactDOM . render ( < Test /> , container ) ;
850- dispatchClickEvent ( document . body ) ;
857+ dispatchClickEvent ( buttonRef . current ) ;
851858 } ) . toWarnDev (
852859 'Warning: stopPropagation() is not available on event objects created from event responder modules ' +
853860 '(React Flare).' +
@@ -859,7 +866,7 @@ describe('DOMEventResponderSystem', () => {
859866 event . isDefaultPrevented ( ) ;
860867 } ;
861868 ReactDOM . render ( < Test /> , container ) ;
862- dispatchClickEvent ( document . body ) ;
869+ dispatchClickEvent ( buttonRef . current ) ;
863870 } ) . toWarnDev (
864871 'Warning: isDefaultPrevented() is not available on event objects created from event responder modules ' +
865872 '(React Flare).' +
@@ -871,7 +878,7 @@ describe('DOMEventResponderSystem', () => {
871878 event . isPropagationStopped ( ) ;
872879 } ;
873880 ReactDOM . render ( < Test /> , container ) ;
874- dispatchClickEvent ( document . body ) ;
881+ dispatchClickEvent ( buttonRef . current ) ;
875882 } ) . toWarnDev (
876883 'Warning: isPropagationStopped() is not available on event objects created from event responder modules ' +
877884 '(React Flare).' +
@@ -883,7 +890,7 @@ describe('DOMEventResponderSystem', () => {
883890 return event . nativeEvent ;
884891 } ;
885892 ReactDOM . render ( < Test /> , container ) ;
886- dispatchClickEvent ( document . body ) ;
893+ dispatchClickEvent ( buttonRef . current ) ;
887894 } ) . toWarnDev (
888895 'Warning: nativeEvent is not available on event objects created from event responder modules ' +
889896 '(React Flare).' +
@@ -934,4 +941,57 @@ describe('DOMEventResponderSystem', () => {
934941 ReactDOM . render ( < Test2 /> , container ) ;
935942 buttonRef . current . dispatchEvent ( createEvent ( 'foobar' ) ) ;
936943 } ) ;
944+
945+ it ( 'should work with concurrent mode updates' , async ( ) => {
946+ const log = [ ] ;
947+ const TestResponder = createEventResponder ( {
948+ targetEventTypes : [ 'click' ] ,
949+ onEvent ( event , context , props ) {
950+ log . push ( props ) ;
951+ } ,
952+ } ) ;
953+ const ref = React . createRef ( ) ;
954+
955+ function Test ( { counter} ) {
956+ const listener = React . unstable_useResponder ( TestResponder , { counter} ) ;
957+
958+ return (
959+ < button listeners = { listener } ref = { ref } >
960+ Press me
961+ </ button >
962+ ) ;
963+ }
964+
965+ let root = ReactDOM . unstable_createRoot ( container ) ;
966+ let batch = root . createBatch ( ) ;
967+ batch . render ( < Test counter = { 0 } /> ) ;
968+ Scheduler . unstable_flushAll ( ) ;
969+ jest . runAllTimers ( ) ;
970+ batch . commit ( ) ;
971+
972+ // Click the button
973+ dispatchClickEvent ( ref . current ) ;
974+ expect ( log ) . toEqual ( [ { counter : 0 } ] ) ;
975+
976+ // Clear log
977+ log . length = 0 ;
978+
979+ // Increase counter
980+ batch = root . createBatch ( ) ;
981+ batch . render ( < Test counter = { 1 } /> ) ;
982+ Scheduler . unstable_flushAll ( ) ;
983+ jest . runAllTimers ( ) ;
984+
985+ // Click the button again
986+ dispatchClickEvent ( ref . current ) ;
987+ expect ( log ) . toEqual ( [ { counter : 0 } ] ) ;
988+
989+ // Clear log
990+ log . length = 0 ;
991+
992+ // Commit
993+ batch . commit ( ) ;
994+ dispatchClickEvent ( ref . current ) ;
995+ expect ( log ) . toEqual ( [ { counter : 1 } ] ) ;
996+ } ) ;
937997} ) ;
0 commit comments