封装 h5 storage 钩子,需要的自取

export interface DataModel<T> {
    expire: number,
    data: T
}

/**
 * 使用存储钩子
 * @param storage 存储引擎,默认 localStorage
 * @param namespaced 命名空间
 * @param separator 分隔符,默认英文冒号
 */
export function useStorageHook(namespaced: string = "", separator = ":", storage: Storage = localStorage) {

    /**
     * 创建包含命名空间的键
     * @param key
     */
    function createKey(key: string) {
        return [namespaced, key].join(separator);
    }

    /**
     * 设置值
     * @param key
     * @param value
     * @param expire
     */
    function setItem(key: string, value: any, expire: number = 0) {
        let modal: DataModel<any> = {
            expire: expire > 0 ? new Date().getTime() + expire * 1000 : 0,
            data: value
        }
        storage.setItem(createKey(key), JSON.stringify(modal));
        return modal;
    }

    /**
     * 获取值
     * @param key
     * @param def
     */
    function getItem<T>(key: string, def: any = null) {
        let data: string | null = storage.getItem(createKey(key));
        if (!data) return def;
        let modal = JSON.parse(data) as DataModel<T>;
        if (modal.expire !== 0 && modal.expire < new Date().getTime()) {
            storage.removeItem(createKey(key));
            return def;
        }
        return modal.data;
    }

    /**
     * 移除值
     * @param key
     */
    function removeItem(key: string) {
        storage.removeItem(createKey(key));
    }

    /**
     * 清除值
     */
    function clearItem() {
        for (const key in storage) {
            if (key.indexOf(namespaced) === 0) {
                storage.removeItem(key);
            }
        }
    }

    return {
        setItem,
        getItem,
        removeItem,
        clearItem
    }
}