Source

services/settings-service.js

import { createLocalStorage } from '@/services/cache-service.js'
import {
  savePredefinedViewDefault,
  fetchDefaultPredefinedView,
} from '@/services/predefined-views.js'
import { updateUserParameter } from '@/services/user-service.js'

const storage = createLocalStorage()
const onlinePersistanceConfig = {
  defaultMapZoomLevel: {
    type: 'userParameter',
  },
  userBaseLayer: {
    type: 'userParameter',
  },
  defaultMapPredefinedView: {
    type: 'custom',
    update: async function (predefinedViewId) {
      return await savePredefinedViewDefault(predefinedViewId)
    },
    retrieve: fetchDefaultPredefinedView,
  },
}

/**
 * Uses browser client-side storage.
 * @param {String} name
 * @param {Any} value
 * @param {String} options.suffix Optional
 * @returns
 */
export async function saveSettingsParamLocally(name, value, options = {}) {
  if (options.suffix) {
    /*console.log('saveSettingsParamLocally', {
      name: name,
      value: value,
    })*/
  }
  let key = name + (options.suffix ? `_${options.suffix}` : '')
  await storage.setItem(key, value)
}

/**
 * Used to save defaultMapZoomLevel and userBaseLayer
 * Used to save defaultMapPredefinedView
 * @param {*} name
 * @param {*} value
 * @returns
 */
export async function saveSettingsParamRemotely(
  code,
  value,
  isLoginAs,
  userParameters = []
) {
  if (isLoginAs) {
    return console.log(
      'saveSettingsParamRemotely::skip (login-as)',
      code,
      value
    )
  }

  if (onlinePersistanceConfig[code]) {
    //console.log('saveSettingsParamRemotely', code, value)

    if (onlinePersistanceConfig[code].type === 'userParameter') {
      const id = userParameters.find((i) => i.code === code)?.id || null

      if (!id) {
        console.warn(
          'Unable to save parameter online because there is no related id'
        )
        return
      }

      let res = false
      try {
        await updateUserParameter({
          id,
          parameter: code,
          value: value,
        })
        /*console.log(
          'saveSettingsParamRemotely::updateUserParameter',
          code,
          value
        )*/
      } catch (err) {
        console.warn('saveSettingsParamRemotely::updateUserParameter::error', {
          code: code,
          value: value,
          error: err.stack,
        })
      }
      return res
    }
    if (onlinePersistanceConfig[code].type === 'custom') {
      /*console.log('saveSettingsParamRemotely::custom', code, value)*/
      return await onlinePersistanceConfig[code].update(value)
    }
  }
}

/**
 * Used to retrieve defaultMapPredefinedView
 * Parses onlinePersistanceConfig and call 'retrieve' method for each key.
 * @returns {Object} Object key/value pairs i.g {defaultMapPredefinedView:1}
 */
export async function getSettingsParamFromRemote() {
  let onlineSettings = {}
  await Promise.all(
    Object.keys(onlinePersistanceConfig)
      .filter(
        (settingsCode) =>
          onlinePersistanceConfig[settingsCode].retrieve !== undefined
      )
      .map((settingsName) => {
        return (async () => {
          let value = await onlinePersistanceConfig[settingsName].retrieve()
          onlineSettings[settingsName] = value
        })()
      })
  )
  /*console.log('getSettingsParamFromRemote', onlineSettings)*/
  return onlineSettings
}