UNPKG

@sanity/default-layout

Version:

The default layout components for Sanity

142 lines (138 loc) • 6.84 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MAX_RECENT_SEARCHES = void 0; exports.createRecentSearchesStore = createRecentSearchesStore; var _versionedClient = require("../../../versionedClient"); var _selectors = require("../utils/selectors"); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } var SEARCH_TERMS_KEY = 'search-terms::recent'; var MAX_RECENT_SEARCHES = 5; // might come in handy in the future exports.MAX_RECENT_SEARCHES = MAX_RECENT_SEARCHES; var CURRENT_VERSION = 1; var _versionedClient$conf = _versionedClient.versionedClient.config(), projectId = _versionedClient$conf.projectId, dataset = _versionedClient$conf.dataset; function createRecentSearchesStore(schema, user) { if (!supportsLocalStorage || !user) { return undefined; } var lsKey = "".concat(SEARCH_TERMS_KEY, "__").concat(projectId, ":").concat(dataset, ":").concat(user.id); return { /** * Write a search term to Local Storage and return updated recent searches. */ addSearchTerm: searchTerm => { var saveTerm = { created: new Date().toISOString(), terms: { query: searchTerm.query.trim(), typeNames: searchTerm.types.map(s => s.name) } }; var comparator = JSON.stringify(saveTerm.terms); var newRecent = { version: CURRENT_VERSION, recentSearches: [saveTerm, ...getRecentStoredSearchTerms(lsKey).recentSearches.filter(r => { return JSON.stringify(r.terms) !== comparator; })].slice(0, MAX_RECENT_SEARCHES) }; window.localStorage.setItem(lsKey, JSON.stringify(newRecent)); return getRecentSearchTerms(lsKey, schema); }, /** * Fetch all recent searches from Local Storage. * Invalid search terms will be filtered out and terms will be re-written to Local Storage. */ getRecentSearchTerms: getRecentSearchTerms.bind(undefined, lsKey, schema), /** * Remove all search terms from Local Storage and return updated recent searches. */ removeSearchTerms: () => { var searchTerms = getRecentStoredSearchTerms(lsKey); var newRecent = _objectSpread(_objectSpread({}, searchTerms), {}, { recentSearches: [] }); window.localStorage.setItem(lsKey, JSON.stringify(newRecent)); return getRecentSearchTerms(lsKey, schema); }, /** * Remove a search term from Local Storage and return updated recent searches. */ removeSearchTermAtIndex: index => { var searchTerms = getRecentStoredSearchTerms(lsKey); if (index < 0 || index > searchTerms.recentSearches.length) { return getRecentSearchTerms(lsKey, schema); } var newRecent = _objectSpread(_objectSpread({}, searchTerms), {}, { recentSearches: [...searchTerms.recentSearches.slice(0, index), ...searchTerms.recentSearches.slice(index + 1)] }); window.localStorage.setItem(lsKey, JSON.stringify(newRecent)); return getRecentSearchTerms(lsKey, schema); } }; } /** * Get the 'raw' stored search terms from Local Storage. * Stored search terms are the minimal representation of saved terms and only include schema names. */ function getRecentStoredSearchTerms(lsKey) { var recentString = supportsLocalStorage ? window.localStorage.getItem(lsKey) : undefined; return recentString ? JSON.parse(recentString) : { version: CURRENT_VERSION, recentSearches: [] }; } /** * Get a list of recent searches from Local Storage. * Recent searches contain full document schemas. */ function getRecentSearchTerms(lsKey, schema) { var storedSearchTerms = getRecentStoredSearchTerms(lsKey); return sanitizeStoredSearchTerms(schema, storedSearchTerms, lsKey).recentSearches.filter(r => !!r.terms).map((r, index) => ({ __recent: { index, timestamp: new Date(r.created).getTime() }, query: r.terms.query, types: r.terms.typeNames.map(typeName => schema.get(typeName)).filter(s => s && s.jsonType === 'object') })); } /** * Sanitize stored search terms - recent searches containing _any_ number of invalid document schemas are removed. * Document types hidden from omnisearch with __experimental_omnisearch_visibility are also omitted. * This mutates Local Storage if any invalid terms are found. */ function sanitizeStoredSearchTerms(studioSchema, storedSearchTerms, lsKey) { var searchableTypeNames = (0, _selectors.getSearchableOmnisearchTypes)(studioSchema).map(schema => schema.name); var filteredSearchTerms = storedSearchTerms.recentSearches.filter(searchTerm => { return searchTerm.terms.typeNames.every(typeName => searchableTypeNames.includes(typeName)); }); var newStoredSearchTerms = { version: CURRENT_VERSION, recentSearches: filteredSearchTerms }; if (newStoredSearchTerms.recentSearches.length < storedSearchTerms.recentSearches.length) { window.localStorage.setItem(lsKey, JSON.stringify(newStoredSearchTerms)); } return getRecentStoredSearchTerms(lsKey); } var supportsLocalStorage = (() => { var key = '__tmp__can_use'; try { if (typeof localStorage === 'undefined') { return false; } localStorage.setItem(key, '---'); localStorage.removeItem(key); return true; } catch (err) { return false; } })();