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
|
|
|
|
*/
|
2020-05-29 19:08:45 +00:00
|
|
|
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),
|
2020-05-29 19:08:45 +00:00
|
|
|
provider,
|
2020-04-28 09:47:35 +00:00
|
|
|
data,
|
|
|
|
};
|
2022-06-28 16:12:45 +00:00
|
|
|
func.setItem(
|
|
|
|
browserCachePrefix + index.toString(),
|
|
|
|
JSON.stringify(item)
|
|
|
|
);
|
2022-04-29 20:30:20 +00:00
|
|
|
} catch (err) {
|
2020-04-28 09:47:35 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2022-02-02 07:56:56 +00:00
|
|
|
// 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');
|
|
|
|
}
|
|
|
|
};
|