UNPKG

1.63 kBPlain TextView Raw
1/*
2 * Copyright 2020 Adobe. All rights reserved.
3 * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License. You may obtain a copy
5 * of the License at http://www.apache.org/licenses/LICENSE-2.0
6 *
7 * Unless required by applicable law or agreed to in writing, software distributed under
8 * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9 * OF ANY KIND, either express or implied. See the License for the specific language
10 * governing permissions and limitations under the License.
11 */
12
13import {BaseEvent} from '@react-types/shared';
14import {SyntheticEvent} from 'react';
15
16/**
17 * This function wraps a React event handler to make stopPropagation the default, and support continuePropagation instead.
18 */
19export function createEventHandler<T extends SyntheticEvent>(handler?: (e: BaseEvent<T>) => void): ((e: T) => void) | undefined {
20 if (!handler) {
21 return undefined;
22 }
23
24 let shouldStopPropagation = true;
25 return (e: T) => {
26 let event: BaseEvent<T> = {
27 ...e,
28 preventDefault() {
29 e.preventDefault();
30 },
31 isDefaultPrevented() {
32 return e.isDefaultPrevented();
33 },
34 stopPropagation() {
35 console.error('stopPropagation is now the default behavior for events in React Spectrum. You can use continuePropagation() to revert this behavior.');
36 },
37 continuePropagation() {
38 shouldStopPropagation = false;
39 }
40 };
41
42 handler(event);
43
44 if (shouldStopPropagation) {
45 e.stopPropagation();
46 }
47 };
48}