/**
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @flow
 */

/* globals Event$Init */

/**
 * A bridge event class that extends the W3C Event interface and carries
 * the native event payload. This is used as a compatibility layer during
 * the migration from the legacy SyntheticEvent system to EventTarget-based
 * dispatching.
 */
export default class LegacySyntheticEvent extends Event {
  _nativeEvent: {[string]: mixed};
  _propagationStopped: boolean;

  constructor(
    type: string,
    options: Event$Init,
    nativeEvent: {[string]: mixed},
  ) {
    super(type, options);
    this._nativeEvent = nativeEvent;
    this._propagationStopped = false;
  }

  get nativeEvent(): {[string]: mixed} {
    return this._nativeEvent;
  }

  stopPropagation(): void {
    super.stopPropagation();
    this._propagationStopped = true;
  }

  stopImmediatePropagation(): void {
    super.stopImmediatePropagation();
    this._propagationStopped = true;
  }

  /**
   * No-op for backward compatibility. The legacy SyntheticEvent system
   * used pooling which required calling persist() to keep the event.
   * With EventTarget-based dispatching, events are never pooled.
   */
  persist(): void {
    // No-op
  }

  /**
   * Backward-compatible wrapper for `defaultPrevented`.
   */
  isDefaultPrevented(): boolean {
    return this.defaultPrevented;
  }

  /**
   * Backward-compatible wrapper. Returns true if stopPropagation()
   * has been called.
   */
  isPropagationStopped(): boolean {
    return this._propagationStopped;
  }
}