geolocation-8.x-3.x-dev/js/GeolocationWidgetBroker.js

js/GeolocationWidgetBroker.js
/**
 * @typedef {Object} WidgetSubscriberSettings
 *
 * @prop {String} import_path
 * @prop {Object} settings
 */

/**
 * @prop {Map<string,WidgetSubscriberBase>} subscribers
 * @prop {Element} form
 * @prop {Object} settings
 * @prop {Object.<string, WidgetSubscriberSettings>} settings.widgetSubscribers
 */
export default class GeolocationWidgetBroker {
  constructor(form, settings) {
    this.form = form;
    this.settings = settings;

    this.subscribers = new Map();

    const subscriberImports = [];

    for (const [widgetSubscriberId, widgetSubscriberSettings] of Object.entries(this.settings.widgetSubscribers)) {
      const widgetSubscriberImport = import(widgetSubscriberSettings.import_path);
      subscriberImports.push(widgetSubscriberImport);
      widgetSubscriberImport.then((value) => {
        const currentSubscriber = new value.default(this, this.settings.widgetSubscribers[widgetSubscriberId].settings ?? {});
        this.subscribers.set(widgetSubscriberId, currentSubscriber);
      });
    }

    Promise.allSettled(subscriberImports).then(() => {
      this.subscribers.forEach((subscriber, widgetSubscriberId) => {
        subscriber.id = widgetSubscriberId;
        subscriber.initialize();
      });
    });
  }

  /**
   * @param {Number[]} newOrder
   *   New Order.
   * @param {String} caller
   *   Calling element.
   */
  orderChanged(newOrder /* - Crystal :) */, caller) {
    this.subscribers.forEach((subscriber, id) => {
      if (id === caller) {
        return;
      }
      subscriber.reorder(newOrder, caller);
    });
  }

  /**
   * @param {GeolocationCoordinates} coordinates
   *   Coordinates.
   * @param {Number} index
   *   Index.
   * @param {String} caller
   *   Calling entity.
   */
  coordinatesAdded(coordinates, index, caller) {
    this.subscribers.forEach((subscriber, id) => {
      if (id === caller) {
        return;
      }
      try {
        subscriber.addCoordinates(coordinates, index, caller);
      } catch (e) {
        console.error(e, `Subscriber ${subscriber.id} failed addCoordinates: ${e.toString()}`);
      }
    });
  }

  /**
   * @param {Number} index
   *   Index.
   * @param {String} caller
   *   Caller.
   */
  coordinatesRemoved(index, caller) {
    this.subscribers.forEach((subscriber, id) => {
      if (id === caller) {
        return;
      }
      try {
        subscriber.removeCoordinates(index, caller);
      } catch (e) {
        console.error(e, `Subscriber ${subscriber.id} failed removeCoordinates: ${e.toString()}`);
      }
    });
  }

  /**
   * @param {GeolocationCoordinates} coordinates
   *   Coordinates.
   * @param {Number} index
   *   Index.
   * @param {String} caller
   *   Caller.
   */
  coordinatesAltered(coordinates, index, caller) {
    this.subscribers.forEach((subscriber, id) => {
      if (id === caller) {
        return;
      }
      try {
        subscriber.alterCoordinates(coordinates, index, caller);
      } catch (e) {
        console.error(e, `Subscriber ${subscriber.id} failed alterCoordinates: ${e.toString()}`);
      }
    });
  }

  /**
   * @param {GeolocationGeometry} geometry
   *   Geometry.
   * @param {Number} index
   *   Index.
   * @param {String} caller
   *   Calling entity.
   */
  geometryAdded(geometry, index, caller) {
    this.subscribers.forEach((subscriber, id) => {
      if (id === caller) {
        return;
      }
      try {
        subscriber.addGeometry(geometry, index, caller);
      } catch (e) {
        console.error(e, `Subscriber ${subscriber.id} failed addGeometry: ${e.toString()}`);
      }
    });
  }

  /**
   * @param {Number} index
   *   Index.
   * @param {String} caller
   *   Caller.
   */
  geometryRemoved(index, caller) {
    this.subscribers.forEach((subscriber, id) => {
      if (id === caller) {
        return;
      }
      try {
        subscriber.removeGeometry(index, caller);
      } catch (e) {
        console.error(e, `Subscriber ${subscriber.id} failed removeGeometry: ${e.toString()}`);
      }
    });
  }

  /**
   * @param {GeolocationGeometry} geometry
   *   Geometry.
   * @param {Number} index
   *   Index.
   * @param {String} caller
   *   Caller.
   */
  geometryAltered(geometry, index, caller) {
    this.subscribers.forEach((subscriber, id) => {
      if (id === caller) {
        return;
      }
      try {
        subscriber.alterGeometry(geometry, index, caller);
      } catch (e) {
        console.error(e, `Subscriber ${subscriber.id} failed alterGeometry: ${e.toString()}`);
      }
    });
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc