Files
kiss-translator/src/hooks/Storage.js

71 lines
1.5 KiB
JavaScript
Raw Normal View History

2023-08-30 18:05:37 +08:00
import { useCallback, useEffect, useState } from "react";
import { storage } from "../libs/storage";
2024-03-19 18:07:18 +08:00
import { kissLog } from "../libs/log";
2023-08-30 18:05:37 +08:00
2023-11-13 18:03:38 +08:00
/**
2024-03-19 18:07:18 +08:00
*
* @param {*} key
2023-11-13 18:03:38 +08:00
* @param {*} defaultVal 需为调用hook外的常量
2024-03-19 18:07:18 +08:00
* @returns
2023-11-13 18:03:38 +08:00
*/
2023-09-17 21:50:17 +08:00
export function useStorage(key, defaultVal) {
const [loading, setLoading] = useState(false);
const [data, setData] = useState(null);
2023-08-30 18:05:37 +08:00
const save = useCallback(
async (val) => {
setData(val);
await storage.setObj(key, val);
},
[key]
);
const update = useCallback(
async (obj) => {
2023-09-17 21:50:17 +08:00
setData((pre = {}) => ({ ...pre, ...obj }));
2023-08-30 18:05:37 +08:00
await storage.putObj(key, obj);
},
[key]
);
const remove = useCallback(async () => {
setData(null);
await storage.del(key);
}, [key]);
2023-07-20 13:45:41 +08:00
2023-09-01 10:15:57 +08:00
const reload = useCallback(async () => {
2023-09-17 21:50:17 +08:00
try {
setLoading(true);
const val = await storage.getObj(key);
if (val) {
setData(val);
}
} catch (err) {
2024-03-19 18:07:18 +08:00
kissLog(err, "storage reload");
2023-09-17 21:50:17 +08:00
} finally {
setLoading(false);
2023-09-01 10:15:57 +08:00
}
2023-09-17 21:50:17 +08:00
}, [key]);
2023-09-01 10:15:57 +08:00
2023-07-20 13:45:41 +08:00
useEffect(() => {
(async () => {
2023-09-08 13:53:33 +08:00
try {
setLoading(true);
2023-09-17 21:50:17 +08:00
const val = await storage.getObj(key);
if (val) {
setData(val);
} else if (defaultVal) {
setData(defaultVal);
await storage.setObj(key, defaultVal);
}
2023-09-08 13:53:33 +08:00
} catch (err) {
2024-03-19 18:07:18 +08:00
kissLog(err, "storage load");
2023-09-08 13:53:33 +08:00
} finally {
setLoading(false);
}
2023-07-20 13:45:41 +08:00
})();
2023-09-17 21:50:17 +08:00
}, [key, defaultVal]);
2023-07-20 13:45:41 +08:00
2023-09-08 13:53:33 +08:00
return { data, save, update, remove, reload, loading };
2023-07-20 13:45:41 +08:00
}