diff options
author | Joanne <zehan_ding@brown.edu> | 2025-05-12 20:58:01 -0400 |
---|---|---|
committer | Joanne <zehan_ding@brown.edu> | 2025-05-12 20:58:01 -0400 |
commit | cd93c88b8fee83a99342eac4dc60f7b4373fa843 (patch) | |
tree | b00d1f46c802752c90e54bb21be785a05e05195e /src/client/views/ObservableReactComponent.tsx | |
parent | 4997c3de20a381eac30224a7a550afa66174f07d (diff) | |
parent | 3a733aa0fd24517e83649824dec0fc8bcc0bde43 (diff) |
added tutorial tool, still need to integrate with metadatatool
Diffstat (limited to 'src/client/views/ObservableReactComponent.tsx')
-rw-r--r-- | src/client/views/ObservableReactComponent.tsx | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/client/views/ObservableReactComponent.tsx b/src/client/views/ObservableReactComponent.tsx index bb7a07f0e..2290516dc 100644 --- a/src/client/views/ObservableReactComponent.tsx +++ b/src/client/views/ObservableReactComponent.tsx @@ -15,6 +15,33 @@ export abstract class ObservableReactComponent<T> extends React.Component<T, obj this._props = props; makeObservable(this); } + __passiveWheel: HTMLElement | null = null; + _isContentActive: () => boolean | undefined = () => false; + + /** + * default method to stop wheel events from bubbling up to parent components. + * @param e + */ + onPassiveWheel = (e: WheelEvent) => { + if (this._isContentActive?.()) e.stopPropagation(); + }; + + /** + * This fixes the problem where a component uses wheel events to scroll, but is nested inside another component that + * can also scroll. In that case, the wheel event will bubble up to the parent component and cause it to scroll in addition. + * This is based on the native HTML5 behavior where wheel events are passive by default, meaning that they do not prevent the default action of scrolling. + * This method should be called from a ref={} property on or above the component that uses wheel events to scroll. + * @param ele HTMLELement containing the component that will scroll + * @param isContentActive function determining if the component is active and should handle the wheel event. + * @param onPassiveWheel an optional function to call to handle the wheel event (and block its propagation. If omitted, the event won't propagate. + */ + fixWheelEvents = (ele: HTMLElement | null, isContentActive: () => boolean | undefined, onPassiveWheel?: (e: WheelEvent) => void) => { + this._isContentActive = isContentActive; + this.__passiveWheel?.removeEventListener('wheel', onPassiveWheel ?? this.onPassiveWheel); + this.__passiveWheel = ele; + ele?.addEventListener('wheel', onPassiveWheel ?? this.onPassiveWheel, { passive: false }); + }; + componentDidUpdate(prevProps: Readonly<T>): void { Object.keys(prevProps) .filter(pkey => (prevProps as {[key:string]: unknown})[pkey] !== (this.props as {[key:string]: unknown})[pkey]) |