UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

183 lines (182 loc) • 17.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { PreferencesProvider: function() { return PreferencesProvider; }, usePreferences: function() { return usePreferences; } }); const _deepequal = /*#__PURE__*/ _interop_require_default(require("deep-equal")); const _react = /*#__PURE__*/ _interop_require_wildcard(require("react")); const _reacti18next = require("react-i18next"); const _api = require("../../../api"); const _Auth = require("../Auth"); const _Config = require("../Config"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interop_require_wildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = { __proto__: null }; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for(var key in obj){ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } const Context = /*#__PURE__*/ (0, _react.createContext)({}); const requestOptions = (value, language)=>({ body: JSON.stringify({ value }), headers: { 'Accept-Language': language, 'Content-Type': 'application/json' } }); const PreferencesProvider = ({ children })=>{ const contextRef = (0, _react.useRef)({}); const preferencesRef = (0, _react.useRef)({}); const pendingUpdate = (0, _react.useRef)({}); const config = (0, _Config.useConfig)(); const { user } = (0, _Auth.useAuth)(); const { i18n } = (0, _reacti18next.useTranslation)(); const { routes: { api }, serverURL } = config; (0, _react.useEffect)(()=>{ if (!user) { // clear preferences between users preferencesRef.current = {}; } }, [ user ]); const getPreference = (0, _react.useCallback)(async (key)=>{ const prefs = preferencesRef.current; if (typeof prefs[key] !== 'undefined') return prefs[key]; const promise = new Promise((resolve)=>{ void (async ()=>{ const request = await _api.requests.get(`${serverURL}${api}/payload-preferences/${key}`, { headers: { 'Accept-Language': i18n.language } }); let value = null; if (request.status === 200) { const preference = await request.json(); value = preference.value; } preferencesRef.current[key] = value; resolve(value); })(); }); prefs[key] = promise; return promise; }, [ i18n.language, api, preferencesRef, serverURL ]); const setPreference = (0, _react.useCallback)(async (key, value, merge = false)=>{ if (merge === false) { preferencesRef.current[key] = value; await _api.requests.post(`${serverURL}${api}/payload-preferences/${key}`, requestOptions(value, i18n.language)); return; } let newValue = value; const currentPreference = await getPreference(key); // handle value objects where multiple values can be set under one key if (typeof value === 'object' && typeof currentPreference === 'object' && typeof newValue === 'object') { // merge the value with any existing preference for the key newValue = { ...currentPreference || {}, ...value }; if ((0, _deepequal.default)(newValue, currentPreference)) { return; } // add the requested changes to a pendingUpdate batch for the key pendingUpdate.current[key] = { ...pendingUpdate.current[key], ...newValue }; } else { if (newValue === currentPreference) { return; } pendingUpdate.current[key] = newValue; } const updatePreference = async ()=>{ // compare the value stored in context before sending to eliminate duplicate requests if ((0, _deepequal.default)(pendingUpdate.current[key], preferencesRef.current[key])) { return; } // preference set in context here to prevent other updatePreference at the same time preferencesRef.current[key] = pendingUpdate.current[key]; await _api.requests.post(`${serverURL}${api}/payload-preferences/${key}`, requestOptions(preferencesRef.current[key], i18n.language)); // reset any changes for this key after sending the request delete pendingUpdate.current[key]; }; // use timeout to allow multiple changes of different values using the same key in one request setTimeout(()=>{ void updatePreference(); }); }, [ api, getPreference, i18n.language, pendingUpdate, serverURL ]); contextRef.current.getPreference = getPreference; contextRef.current.setPreference = setPreference; return /*#__PURE__*/ _react.default.createElement(Context.Provider, { value: contextRef.current }, children); }; const usePreferences = ()=>(0, _react.useContext)(Context); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hZG1pbi9jb21wb25lbnRzL3V0aWxpdGllcy9QcmVmZXJlbmNlcy9pbmRleC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGlzRGVlcEVxdWFsIGZyb20gJ2RlZXAtZXF1YWwnXG5pbXBvcnQgUmVhY3QsIHsgY3JlYXRlQ29udGV4dCwgdXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJ3JlYWN0LWkxOG5leHQnXG5cbmltcG9ydCB7IHJlcXVlc3RzIH0gZnJvbSAnLi4vLi4vLi4vYXBpJ1xuaW1wb3J0IHsgdXNlQXV0aCB9IGZyb20gJy4uL0F1dGgnXG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuLi9Db25maWcnXG5cbnR5cGUgUHJlZmVyZW5jZXNDb250ZXh0ID0ge1xuICBnZXRQcmVmZXJlbmNlOiA8VCA9IGFueT4oa2V5OiBzdHJpbmcpID0+IFByb21pc2U8VD4gfCBUXG4gIC8qKlxuICAgKiBAcGFyYW0ga2V5IC0gYSBzdHJpbmcgaWRlbnRpZmllciBmb3IgdGhlIHByb3BlcnR5IGJlaW5nIHNldFxuICAgKiBAcGFyYW0gdmFsdWUgLSBwcmVmZXJlbmNlIGRhdGEgdG8gc3RvcmVcbiAgICogQHBhcmFtIG1lcmdlIC0gd2hlbiB0cnVlIHdpbGwgY29tYmluZSB0aGUgZXhpc3RpbmcgcHJlZmVyZW5jZSBvYmplY3QgYmF0Y2ggdGhlIGNoYW5nZSBpbnRvIG9uZSByZXF1ZXN0IGZvciBvYmplY3RzLCBkZWZhdWx0ID0gZmFsc2VcbiAgICovXG4gIHNldFByZWZlcmVuY2U6IDxUID0gYW55PihrZXk6IHN0cmluZywgdmFsdWU6IFQsIG1lcmdlPzogYm9vbGVhbikgPT4gUHJvbWlzZTx2b2lkPlxufVxuXG5jb25zdCBDb250ZXh0ID0gY3JlYXRlQ29udGV4dCh7fSBhcyBQcmVmZXJlbmNlc0NvbnRleHQpXG5cbmNvbnN0IHJlcXVlc3RPcHRpb25zID0gKHZhbHVlLCBsYW5ndWFnZSkgPT4gKHtcbiAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB2YWx1ZSB9KSxcbiAgaGVhZGVyczoge1xuICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiBsYW5ndWFnZSxcbiAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICB9LFxufSlcblxuZXhwb3J0IGNvbnN0IFByZWZlcmVuY2VzUHJvdmlkZXI6IFJlYWN0LkZDPHsgY2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGUgfT4gPSAoeyBjaGlsZHJlbiB9KSA9PiB7XG4gIGNvbnN0IGNvbnRleHRSZWYgPSB1c2VSZWYoe30gYXMgUHJlZmVyZW5jZXNDb250ZXh0KVxuICBjb25zdCBwcmVmZXJlbmNlc1JlZiA9IHVzZVJlZih7fSlcbiAgY29uc3QgcGVuZGluZ1VwZGF0ZSA9IHVzZVJlZih7fSlcbiAgY29uc3QgY29uZmlnID0gdXNlQ29uZmlnKClcbiAgY29uc3QgeyB1c2VyIH0gPSB1c2VBdXRoKClcbiAgY29uc3QgeyBpMThuIH0gPSB1c2VUcmFuc2xhdGlvbigpXG4gIGNvbnN0IHtcbiAgICByb3V0ZXM6IHsgYXBpIH0sXG4gICAgc2VydmVyVVJMLFxuICB9ID0gY29uZmlnXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIC8vIGNsZWFyIHByZWZlcmVuY2VzIGJldHdlZW4gdXNlcnNcbiAgICAgIHByZWZlcmVuY2VzUmVmLmN1cnJlbnQgPSB7fVxuICAgIH1cbiAgfSwgW3VzZXJdKVxuXG4gIGNvbnN0IGdldFByZWZlcmVuY2UgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyA8VCA9IGFueSw+KGtleTogc3RyaW5nKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgICBjb25zdCBwcmVmcyA9IHByZWZlcmVuY2VzUmVmLmN1cnJlbnRcbiAgICAgIGlmICh0eXBlb2YgcHJlZnNba2V5XSAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBwcmVmc1trZXldXG4gICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZCkgPT4ge1xuICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHJlcXVlc3RzLmdldChgJHtzZXJ2ZXJVUkx9JHthcGl9L3BheWxvYWQtcHJlZmVyZW5jZXMvJHtrZXl9YCwge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJzogaTE4bi5sYW5ndWFnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICBsZXQgdmFsdWUgPSBudWxsXG4gICAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZlcmVuY2UgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKVxuICAgICAgICAgICAgdmFsdWUgPSBwcmVmZXJlbmNlLnZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIHByZWZlcmVuY2VzUmVmLmN1cnJlbnRba2V5XSA9IHZhbHVlXG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSlcbiAgICAgICAgfSkoKVxuICAgICAgfSlcbiAgICAgIHByZWZzW2tleV0gPSBwcm9taXNlXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH0sXG4gICAgW2kxOG4ubGFuZ3VhZ2UsIGFwaSwgcHJlZmVyZW5jZXNSZWYsIHNlcnZlclVSTF0sXG4gIClcblxuICBjb25zdCBzZXRQcmVmZXJlbmNlID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgbWVyZ2UgPSBmYWxzZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgaWYgKG1lcmdlID09PSBmYWxzZSkge1xuICAgICAgICBwcmVmZXJlbmNlc1JlZi5jdXJyZW50W2tleV0gPSB2YWx1ZVxuICAgICAgICBhd2FpdCByZXF1ZXN0cy5wb3N0KFxuICAgICAgICAgIGAke3NlcnZlclVSTH0ke2FwaX0vcGF5bG9hZC1wcmVmZXJlbmNlcy8ke2tleX1gLFxuICAgICAgICAgIHJlcXVlc3RPcHRpb25zKHZhbHVlLCBpMThuLmxhbmd1YWdlKSxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgbGV0IG5ld1ZhbHVlID0gdmFsdWVcbiAgICAgIGNvbnN0IGN1cnJlbnRQcmVmZXJlbmNlID0gYXdhaXQgZ2V0UHJlZmVyZW5jZShrZXkpXG4gICAgICAvLyBoYW5kbGUgdmFsdWUgb2JqZWN0cyB3aGVyZSBtdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIHNldCB1bmRlciBvbmUga2V5XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdHlwZW9mIGN1cnJlbnRQcmVmZXJlbmNlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB0eXBlb2YgbmV3VmFsdWUgPT09ICdvYmplY3QnXG4gICAgICApIHtcbiAgICAgICAgLy8gbWVyZ2UgdGhlIHZhbHVlIHdpdGggYW55IGV4aXN0aW5nIHByZWZlcmVuY2UgZm9yIHRoZSBrZXlcbiAgICAgICAgbmV3VmFsdWUgPSB7IC4uLihjdXJyZW50UHJlZmVyZW5jZSB8fCB7fSksIC4uLnZhbHVlIH1cbiAgICAgICAgaWYgKGlzRGVlcEVxdWFsKG5ld1ZhbHVlLCBjdXJyZW50UHJlZmVyZW5jZSkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICAvLyBhZGQgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIHRvIGEgcGVuZGluZ1VwZGF0ZSBiYXRjaCBmb3IgdGhlIGtleVxuICAgICAgICBwZW5kaW5nVXBkYXRlLmN1cnJlbnRba2V5XSA9IHtcbiAgICAgICAgICAuLi5wZW5kaW5nVXBkYXRlLmN1cnJlbnRba2V5XSxcbiAgICAgICAgICAuLi4obmV3VmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobmV3VmFsdWUgPT09IGN1cnJlbnRQcmVmZXJlbmNlKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgcGVuZGluZ1VwZGF0ZS5jdXJyZW50W2tleV0gPSBuZXdWYWx1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB1cGRhdGVQcmVmZXJlbmNlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBjb21wYXJlIHRoZSB2YWx1ZSBzdG9yZWQgaW4gY29udGV4dCBiZWZvcmUgc2VuZGluZyB0byBlbGltaW5hdGUgZHVwbGljYXRlIHJlcXVlc3RzXG4gICAgICAgIGlmIChpc0RlZXBFcXVhbChwZW5kaW5nVXBkYXRlLmN1cnJlbnRba2V5XSwgcHJlZmVyZW5jZXNSZWYuY3VycmVudFtrZXldKSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIC8vIHByZWZlcmVuY2Ugc2V0IGluIGNvbnRleHQgaGVyZSB0byBwcmV2ZW50IG90aGVyIHVwZGF0ZVByZWZlcmVuY2UgYXQgdGhlIHNhbWUgdGltZVxuICAgICAgICBwcmVmZXJlbmNlc1JlZi5jdXJyZW50W2tleV0gPSBwZW5kaW5nVXBkYXRlLmN1cnJlbnRba2V5XVxuXG4gICAgICAgIGF3YWl0IHJlcXVlc3RzLnBvc3QoXG4gICAgICAgICAgYCR7c2VydmVyVVJMfSR7YXBpfS9wYXlsb2FkLXByZWZlcmVuY2VzLyR7a2V5fWAsXG4gICAgICAgICAgcmVxdWVzdE9wdGlvbnMocHJlZmVyZW5jZXNSZWYuY3VycmVudFtrZXldLCBpMThuLmxhbmd1YWdlKSxcbiAgICAgICAgKVxuICAgICAgICAvLyByZXNldCBhbnkgY2hhbmdlcyBmb3IgdGhpcyBrZXkgYWZ0ZXIgc2VuZGluZyB0aGUgcmVxdWVzdFxuICAgICAgICBkZWxldGUgcGVuZGluZ1VwZGF0ZS5jdXJyZW50W2tleV1cbiAgICAgIH1cblxuICAgICAgLy8gdXNlIHRpbWVvdXQgdG8gYWxsb3cgbXVsdGlwbGUgY2hhbmdlcyBvZiBkaWZmZXJlbnQgdmFsdWVzIHVzaW5nIHRoZSBzYW1lIGtleSBpbiBvbmUgcmVxdWVzdFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHZvaWQgdXBkYXRlUHJlZmVyZW5jZSgpXG4gICAgICB9KVxuICAgIH0sXG4gICAgW2FwaSwgZ2V0UHJlZmVyZW5jZSwgaTE4bi5sYW5ndWFnZSwgcGVuZGluZ1VwZGF0ZSwgc2VydmVyVVJMXSxcbiAgKVxuXG4gIGNvbnRleHRSZWYuY3VycmVudC5nZXRQcmVmZXJlbmNlID0gZ2V0UHJlZmVyZW5jZVxuICBjb250ZXh0UmVmLmN1cnJlbnQuc2V0UHJlZmVyZW5jZSA9IHNldFByZWZlcmVuY2VcblxuICByZXR1cm4gPENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NvbnRleHRSZWYuY3VycmVudH0+e2NoaWxkcmVufTwvQ29udGV4dC5Qcm92aWRlcj5cbn1cblxuZXhwb3J0IGNvbnN0IHVzZVByZWZlcmVuY2VzID0gKCk6IFByZWZlcmVuY2VzQ29udGV4dCA9PiB1c2VDb250ZXh0KENvbnRleHQpXG4iXSwibmFtZXMiOlsiUHJlZmVyZW5jZXNQcm92aWRlciIsInVzZVByZWZlcmVuY2VzIiwiQ29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJyZXF1ZXN0T3B0aW9ucyIsInZhbHVlIiwibGFuZ3VhZ2UiLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsImhlYWRlcnMiLCJjaGlsZHJlbiIsImNvbnRleHRSZWYiLCJ1c2VSZWYiLCJwcmVmZXJlbmNlc1JlZiIsInBlbmRpbmdVcGRhdGUiLCJjb25maWciLCJ1c2VDb25maWciLCJ1c2VyIiwidXNlQXV0aCIsImkxOG4iLCJ1c2VUcmFuc2xhdGlvbiIsInJvdXRlcyIsImFwaSIsInNlcnZlclVSTCIsInVzZUVmZmVjdCIsImN1cnJlbnQiLCJnZXRQcmVmZXJlbmNlIiwidXNlQ2FsbGJhY2siLCJrZXkiLCJwcmVmcyIsInByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlcXVlc3QiLCJyZXF1ZXN0cyIsImdldCIsInN0YXR1cyIsInByZWZlcmVuY2UiLCJqc29uIiwic2V0UHJlZmVyZW5jZSIsIm1lcmdlIiwicG9zdCIsIm5ld1ZhbHVlIiwiY3VycmVudFByZWZlcmVuY2UiLCJpc0RlZXBFcXVhbCIsInVwZGF0ZVByZWZlcmVuY2UiLCJzZXRUaW1lb3V0IiwiUHJvdmlkZXIiLCJ1c2VDb250ZXh0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQTRCYUEsbUJBQW1CO2VBQW5CQTs7SUErR0FDLGNBQWM7ZUFBZEE7OztrRUEzSVc7K0RBQ3lEOzhCQUNsRDtxQkFFTjtzQkFDRDt3QkFDRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFZMUIsTUFBTUMsd0JBQVVDLElBQUFBLG9CQUFhLEVBQUMsQ0FBQztBQUUvQixNQUFNQyxpQkFBaUIsQ0FBQ0MsT0FBT0MsV0FBYyxDQUFBO1FBQzNDQyxNQUFNQyxLQUFLQyxTQUFTLENBQUM7WUFBRUo7UUFBTTtRQUM3QkssU0FBUztZQUNQLG1CQUFtQko7WUFDbkIsZ0JBQWdCO1FBQ2xCO0lBQ0YsQ0FBQTtBQUVPLE1BQU1OLHNCQUFnRSxDQUFDLEVBQUVXLFFBQVEsRUFBRTtJQUN4RixNQUFNQyxhQUFhQyxJQUFBQSxhQUFNLEVBQUMsQ0FBQztJQUMzQixNQUFNQyxpQkFBaUJELElBQUFBLGFBQU0sRUFBQyxDQUFDO0lBQy9CLE1BQU1FLGdCQUFnQkYsSUFBQUEsYUFBTSxFQUFDLENBQUM7SUFDOUIsTUFBTUcsU0FBU0MsSUFBQUEsaUJBQVM7SUFDeEIsTUFBTSxFQUFFQyxJQUFJLEVBQUUsR0FBR0MsSUFBQUEsYUFBTztJQUN4QixNQUFNLEVBQUVDLElBQUksRUFBRSxHQUFHQyxJQUFBQSw0QkFBYztJQUMvQixNQUFNLEVBQ0pDLFFBQVEsRUFBRUMsR0FBRyxFQUFFLEVBQ2ZDLFNBQVMsRUFDVixHQUFHUjtJQUVKUyxJQUFBQSxnQkFBUyxFQUFDO1FBQ1IsSUFB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