2
0

utils.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import _converse from '@converse/headless/shared/_converse';
  2. import assignIn from 'lodash-es/assignIn';
  3. import isEqual from "lodash-es/isEqual.js";
  4. import isObject from 'lodash-es/isObject';
  5. import log from '@converse/headless/log';
  6. import pick from 'lodash-es/pick';
  7. import u from '@converse/headless/utils/core';
  8. import { DEFAULT_SETTINGS } from './constants.js';
  9. import { Events } from '@converse/skeletor/src/events.js';
  10. import { Model } from '@converse/skeletor/src/model.js';
  11. import { initStorage } from '@converse/headless/utils/storage.js';
  12. let init_settings = {}; // Container for settings passed in via converse.initialize
  13. let app_settings = {};
  14. let user_settings; // User settings, populated via api.users.settings
  15. const app_settings_emitter = {};
  16. Object.assign(app_settings_emitter, Events);
  17. export function getAppSettings () {
  18. return app_settings;
  19. }
  20. export function initAppSettings (settings) {
  21. init_settings = settings;
  22. app_settings = {};
  23. // Allow only whitelisted settings to be overwritten via converse.initialize
  24. const allowed_settings = pick(settings, Object.keys(DEFAULT_SETTINGS));
  25. assignIn(app_settings, DEFAULT_SETTINGS, allowed_settings);
  26. }
  27. export function getInitSettings () {
  28. return init_settings;
  29. }
  30. export function getAppSetting (key) {
  31. if (Object.keys(DEFAULT_SETTINGS).includes(key)) {
  32. return app_settings[key];
  33. }
  34. }
  35. export function extendAppSettings (settings) {
  36. u.merge(DEFAULT_SETTINGS, settings);
  37. // When updating the settings, we need to avoid overwriting the
  38. // initialization_settings (i.e. the settings passed in via converse.initialize).
  39. const allowed_keys = Object.keys(pick(settings,Object.keys(DEFAULT_SETTINGS)));
  40. const allowed_site_settings = pick(init_settings, allowed_keys);
  41. const updated_settings = assignIn(pick(settings, allowed_keys), allowed_site_settings);
  42. u.merge(app_settings, updated_settings);
  43. }
  44. export function registerListener (name, func, context) {
  45. app_settings_emitter.on(name, func, context)
  46. }
  47. export function unregisterListener (name, func) {
  48. app_settings_emitter.off(name, func);
  49. }
  50. export function updateAppSettings (key, val) {
  51. if (key == null) return this; // eslint-disable-line no-eq-null
  52. let attrs;
  53. if (isObject(key)) {
  54. attrs = key;
  55. } else if (typeof key === 'string') {
  56. attrs = {};
  57. attrs[key] = val;
  58. }
  59. const allowed_keys = Object.keys(pick(attrs, Object.keys(DEFAULT_SETTINGS)));
  60. const changed = {};
  61. allowed_keys.forEach(k => {
  62. const val = attrs[k];
  63. if (!isEqual(app_settings[k], val)) {
  64. changed[k] = val;
  65. app_settings[k] = val;
  66. }
  67. });
  68. Object.keys(changed).forEach(k => app_settings_emitter.trigger('change:' + k, changed[k]));
  69. app_settings_emitter.trigger('change', changed);
  70. }
  71. /**
  72. * @async
  73. */
  74. function initUserSettings () {
  75. if (!_converse.bare_jid) {
  76. const msg = "No JID to fetch user settings for";
  77. log.error(msg);
  78. throw Error(msg);
  79. }
  80. if (!user_settings?.fetched) {
  81. const id = `converse.user-settings.${_converse.bare_jid}`;
  82. user_settings = new Model({id});
  83. initStorage(user_settings, id);
  84. user_settings.fetched = user_settings.fetch({'promise': true});
  85. }
  86. return user_settings.fetched;
  87. }
  88. export async function getUserSettings () {
  89. await initUserSettings();
  90. return user_settings;
  91. }
  92. export async function updateUserSettings (data, options) {
  93. await initUserSettings();
  94. return user_settings.save(data, options);
  95. }
  96. export async function clearUserSettings () {
  97. await initUserSettings();
  98. return user_settings.clear();
  99. }