2
0
mirror of https://github.com/iconify/iconify.git synced 2024-10-24 09:32:02 +00:00
iconify/packages/core/src/browser-storage/index.ts

79 lines
1.8 KiB
TypeScript
Raw Normal View History

2020-12-25 19:03:15 +00:00
import type { IconifyJSON } from '@iconify/types';
2022-06-28 19:11:15 +00:00
import type { CacheIcons } from '../cache';
import { browserCachePrefix, browserStorageHour } from './config';
import { setBrowserStorageItemsCount } from './count';
2022-06-28 18:16:08 +00:00
import {
browserStorageConfig,
browserStorageEmptyItems,
browserStorageItemsCount,
2022-06-28 19:11:15 +00:00
browserStorageLoaded,
2022-06-28 18:16:08 +00:00
} from './data';
2022-06-28 19:11:15 +00:00
import { getBrowserStorage } from './global';
import { loadBrowserStorageCache } from './load';
2022-06-28 18:16:08 +00:00
import type { BrowserStorageConfig, BrowserStorageItem } from './types';
2020-04-28 09:47:35 +00:00
/**
* Function to cache icons
*/
export const storeCache: CacheIcons = (
provider: string,
data: IconifyJSON
): void => {
2022-06-28 19:11:15 +00:00
if (!browserStorageLoaded) {
loadBrowserStorageCache();
2020-04-28 09:47:35 +00:00
}
2022-06-28 18:16:08 +00:00
function store(key: keyof BrowserStorageConfig): boolean {
if (!browserStorageConfig[key]) {
2020-04-28 09:47:35 +00:00
return false;
}
2022-06-28 19:11:15 +00:00
const func = getBrowserStorage(key);
2020-04-28 09:47:35 +00:00
if (!func) {
return false;
}
// Get item index
2022-06-28 18:16:08 +00:00
let index = browserStorageEmptyItems[key].shift();
2020-04-28 09:47:35 +00:00
if (index === void 0) {
// Create new index
2022-06-28 18:16:08 +00:00
index = browserStorageItemsCount[key];
2022-06-28 19:11:15 +00:00
if (!setBrowserStorageItemsCount(func, key, index + 1)) {
2020-04-28 09:47:35 +00:00
return false;
}
}
// Create and save item
try {
2022-06-28 18:16:08 +00:00
const item: BrowserStorageItem = {
cached: Math.floor(Date.now() / browserStorageHour),
provider,
2020-04-28 09:47:35 +00:00
data,
};
func.setItem(
browserCachePrefix + index.toString(),
JSON.stringify(item)
);
} catch (err) {
2020-04-28 09:47:35 +00:00
return false;
}
return true;
}
// Do not store empty sets
if (!Object.keys(data.icons).length) {
return;
}
// Remove not_found (clone object to keep old object intact)
if (data.not_found) {
data = Object.assign({}, data);
delete data.not_found;
}
2020-04-28 09:47:35 +00:00
// Attempt to store at localStorage first, then at sessionStorage
if (!store('local')) {
store('session');
}
};