useDbItem.ts 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { StoreNames } from "idb";
  2. import { NovelDb } from "libs/db/getDb";
  3. import { delItem, getItem, putItem } from "libs/db/history";
  4. import { useCallback, useEffect, useState } from "react";
  5. export default function useDbItem<N extends StoreNames<NovelDb>>(
  6. name: N,
  7. defaultKey?: string
  8. ) {
  9. const [key, setKey] = useState(defaultKey);
  10. const [value, setValue] = useState<NovelDb[N]["value"]>();
  11. const updateValue = useCallback(() => {
  12. if (!key) {
  13. setValue(void 0);
  14. return;
  15. }
  16. getItem(name, key).then((value) => {
  17. setValue(value);
  18. });
  19. }, [name, key]);
  20. const put = useCallback(
  21. (data: NovelDb[N]["value"]) =>
  22. putItem(name, data)
  23. .then(() => setValue(data))
  24. .catch((e) => {}),
  25. [name]
  26. );
  27. const del = useCallback(
  28. (key: NovelDb[N]["key"]) =>
  29. delItem(name, key)
  30. .then(() => setValue(void 0))
  31. .catch((e) => {}),
  32. [name]
  33. );
  34. useEffect(() => {
  35. updateValue();
  36. }, [updateValue]);
  37. return [value, put, del, setKey] as [
  38. typeof value,
  39. typeof put,
  40. typeof del,
  41. typeof setKey
  42. ];
  43. }
  44. export const useHistory = (key?: string) => useDbItem("history", key);