ViewModels/selectBaseMap.js

"use strict";

/*global require*/
var defined = require("terriajs-cesium/Source/Core/defined").default;
var knockout = require("terriajs-cesium/Source/ThirdParty/knockout").default;

/**
 * Selects a base map by name from a list of base map options.  The name is specified by `terria.baseMapName`, or,
 * if that property is undefined, by the specified `defaultBaseMapName`.  In addition to setting `terria.baseMap`,
 * this function subscribes to be notified when `terria.baseMapName` changes and updates `terria.baseMap`
 * accordingly.  If a base map with the name is not in the `baseMaps` list, this method leaves the
 * `terria.baseMap` property unmodified.
 *
 * @param {Terria} terria The TerriaJS application.
 * @param {BaseMapViewModel[]} baseMaps The list of possible base maps.
 * @param {string} defaultBaseMapName The name of the base map to search for.
 * @param {boolean} useStoredPreference If true, look for and use a localStorage preference instead.
 * @returns {BaseMapViewModel} The matching base map, or undefined if not found.
 */
var selectBaseMap = function(
  terria,
  baseMaps,
  defaultBaseMapName,
  useStoredPreference
) {
  function updateBaseMap(baseMapName) {
    if (!defined(baseMapName)) {
      return undefined;
    }

    for (var i = 0; i < baseMaps.length; ++i) {
      if (baseMaps[i].catalogItem.name === baseMapName) {
        terria.baseMap = baseMaps[i].catalogItem;
        terria.baseMapContrastColor = baseMaps[i].contrastColor;
        return terria.baseMap;
      }
    }
    return undefined;
  }

  knockout.getObservable(terria, "baseMapName").subscribe(function() {
    updateBaseMap(terria.baseMapName);
  });

  if (baseMaps.length === 0) {
    return undefined;
  }

  var baseMap;
  if (useStoredPreference) {
    baseMap = updateBaseMap(terria.getLocalProperty("basemap"));
  }
  baseMap =
    baseMap ||
    updateBaseMap(terria.baseMapName) ||
    updateBaseMap(defaultBaseMapName) ||
    updateBaseMap(baseMaps[0].catalogItem.name);
  return baseMap;
};

module.exports = selectBaseMap;