@@ -45,12 +45,7 @@ import dangerousStyleValue from '../shared/dangerousStyleValue';
45
45
46
46
import type { DOMContainer } from './ReactDOM' ;
47
47
import type { ReactEventResponder } from 'shared/ReactTypes' ;
48
- import {
49
- REACT_EVENT_COMPONENT_TYPE ,
50
- REACT_EVENT_TARGET_TYPE ,
51
- REACT_EVENT_TARGET_TOUCH_HIT ,
52
- } from 'shared/ReactSymbols' ;
53
- import getElementFromTouchHitTarget from 'shared/getElementFromTouchHitTarget' ;
48
+ import { REACT_EVENT_TARGET_TOUCH_HIT } from 'shared/ReactSymbols' ;
54
49
55
50
export type Type = string ;
56
51
export type Props = {
@@ -75,6 +70,7 @@ type HostContextDev = {
75
70
eventData : null | { |
76
71
isEventComponent ? : boolean ,
77
72
isEventTarget ?: boolean ,
73
+ eventTargetType ?: null | Symbol | number ,
78
74
| } ,
79
75
} ;
80
76
type HostContextProd = string ;
@@ -180,36 +176,46 @@ export function getChildHostContext(
180
176
return getChildNamespace ( parentNamespace , type ) ;
181
177
}
182
178
183
- export function getChildHostContextForEvent (
179
+ export function getChildHostContextForEventComponent (
184
180
parentHostContext : HostContext ,
185
- type : Symbol | number ,
186
181
) : HostContext {
187
182
if ( __DEV__ ) {
188
183
const parentHostContextDev = ( ( parentHostContext : any ) : HostContextDev ) ;
189
184
const { namespace, ancestorInfo} = parentHostContextDev ;
190
- let eventData = null ;
185
+ warning (
186
+ parentHostContextDev . eventData === null ||
187
+ ! parentHostContextDev . eventData . isEventTarget ,
188
+ 'validateDOMNesting: React event targets must not have event components as children.' ,
189
+ ) ;
190
+ const eventData = {
191
+ isEventComponent : true ,
192
+ isEventTarget : false ,
193
+ eventTargetType : null ,
194
+ } ;
195
+ return { namespace, ancestorInfo, eventData} ;
196
+ }
197
+ return parentHostContext ;
198
+ }
191
199
192
- if ( type === REACT_EVENT_COMPONENT_TYPE ) {
193
- warning (
194
- parentHostContextDev . eventData === null ||
195
- ! parentHostContextDev . eventData . isEventTarget ,
196
- 'validateDOMNesting: React event targets must not have event components as children.' ,
197
- ) ;
198
- eventData = {
199
- isEventComponent : true ,
200
- isEventTarget : false ,
201
- } ;
202
- } else if ( type === REACT_EVENT_TARGET_TYPE ) {
203
- warning (
204
- parentHostContextDev . eventData !== null &&
205
- parentHostContextDev . eventData . isEventComponent ,
206
- 'validateDOMNesting: React event targets must be direct children of event components.' ,
207
- ) ;
208
- eventData = {
209
- isEventComponent : false ,
210
- isEventTarget : true ,
211
- } ;
212
- }
200
+ export function getChildHostContextForEventTarget (
201
+ parentHostContext : HostContext ,
202
+ type : Symbol | number ,
203
+ ) : HostContext {
204
+ if ( __DEV__ ) {
205
+ const parentHostContextDev = ( ( parentHostContext : any ) : HostContextDev ) ;
206
+ const { namespace, ancestorInfo} = parentHostContextDev ;
207
+ warning (
208
+ parentHostContextDev . eventData === null ||
209
+ ! parentHostContextDev . eventData . isEventComponent ||
210
+ type !== REACT_EVENT_TARGET_TOUCH_HIT ,
211
+ 'validateDOMNesting: <TouchHitTarget> cannot not be a direct child of an event component. ' +
212
+ 'Ensure <TouchHitTarget> is a direct child of a DOM element.' ,
213
+ ) ;
214
+ const eventData = {
215
+ isEventComponent : false ,
216
+ isEventTarget : true ,
217
+ eventTargetType : type ,
218
+ } ;
213
219
return { namespace, ancestorInfo, eventData} ;
214
220
}
215
221
return parentHostContext ;
@@ -243,6 +249,16 @@ export function createInstance(
243
249
if ( __DEV__ ) {
244
250
// TODO: take namespace into account when validating.
245
251
const hostContextDev = ( ( hostContext : any ) : HostContextDev ) ;
252
+ if ( enableEventAPI ) {
253
+ const eventData = hostContextDev . eventData ;
254
+ if ( eventData !== null ) {
255
+ warning (
256
+ ! eventData . isEventTarget ||
257
+ eventData . eventTargetType !== REACT_EVENT_TARGET_TOUCH_HIT ,
258
+ 'Warning: validateDOMNesting: <TouchHitTarget> must not have any children.' ,
259
+ ) ;
260
+ }
261
+ }
246
262
validateDOMNesting ( type , null , hostContextDev . ancestorInfo ) ;
247
263
if (
248
264
typeof props . children === 'string' ||
@@ -349,14 +365,21 @@ export function createTextInstance(
349
365
if ( enableEventAPI ) {
350
366
const eventData = hostContextDev . eventData ;
351
367
if ( eventData !== null ) {
368
+ warning (
369
+ eventData === null ||
370
+ ! eventData . isEventTarget ||
371
+ eventData . eventTargetType !== REACT_EVENT_TARGET_TOUCH_HIT ,
372
+ 'Warning: validateDOMNesting: <TouchHitTarget> must not have any children.' ,
373
+ ) ;
352
374
warning (
353
375
! eventData . isEventComponent ,
354
376
'validateDOMNesting: React event components cannot have text DOM nodes as children. ' +
355
377
'Wrap the child text "%s" in an element.' ,
356
378
text ,
357
379
) ;
358
380
warning (
359
- ! eventData . isEventTarget ,
381
+ ! eventData . isEventTarget ||
382
+ eventData . eventTargetType === REACT_EVENT_TARGET_TOUCH_HIT ,
360
383
'validateDOMNesting: React event targets cannot have text DOM nodes as children. ' +
361
384
'Wrap the child text "%s" in an element.' ,
362
385
text ,
@@ -879,25 +902,13 @@ export function handleEventComponent(
879
902
export function handleEventTarget (
880
903
type : Symbol | number ,
881
904
props : Props ,
905
+ parentInstance : Container ,
882
906
internalInstanceHandle : Object ,
883
907
) : void {
884
908
if ( enableEventAPI ) {
885
909
// Touch target hit slop handling
886
910
if ( type === REACT_EVENT_TARGET_TOUCH_HIT ) {
887
- // Validates that there is a single element
888
- const element = getElementFromTouchHitTarget ( internalInstanceHandle ) ;
889
- if ( element !== null ) {
890
- // We update the event target state node to be that of the element.
891
- // We can then diff this entry to determine if we need to add the
892
- // hit slop element, or change the dimensions of the hit slop.
893
- const lastElement = internalInstanceHandle . stateNode ;
894
- if ( lastElement !== element ) {
895
- internalInstanceHandle . stateNode = element ;
896
- // TODO: Create the hit slop element and attach it to the element
897
- } else {
898
- // TODO: Diff the left, top, right, bottom props
899
- }
900
- }
911
+ // TODO
901
912
}
902
913
}
903
914
}
0 commit comments