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

68 lines
1.7 KiB
JavaScript
Raw Normal View History

2023-10-26 17:32:55 +08:00
import { KV_WORDS_KEY } from "../config";
import { useCallback, useEffect, useState } from "react";
import { trySyncWords } from "../libs/sync";
import { getWordsWithDefault, setWords } from "../libs/storage";
import { useSyncMeta } from "./Sync";
export function useFavWords() {
2023-10-26 23:55:05 +08:00
const [loading, setLoading] = useState(false);
2023-10-26 17:32:55 +08:00
const [favWords, setFavWords] = useState({});
const { updateSyncMeta } = useSyncMeta();
const toggleFav = useCallback(
async (word) => {
const favs = { ...favWords };
if (favs[word]) {
delete favs[word];
} else {
favs[word] = { createdAt: Date.now() };
}
await setWords(favs);
await updateSyncMeta(KV_WORDS_KEY);
await trySyncWords();
setFavWords(favs);
},
[updateSyncMeta, favWords]
);
2023-10-26 23:55:05 +08:00
const mergeWords = useCallback(
async (newWords) => {
const favs = { ...favWords };
newWords.forEach((word) => {
if (!favs[word]) {
favs[word] = { createdAt: Date.now() };
}
});
await setWords(favs);
await updateSyncMeta(KV_WORDS_KEY);
await trySyncWords();
setFavWords(favs);
},
[updateSyncMeta, favWords]
);
const clearWords = useCallback(async () => {
await setWords({});
await updateSyncMeta(KV_WORDS_KEY);
await trySyncWords();
setFavWords({});
}, [updateSyncMeta]);
2023-10-26 17:32:55 +08:00
useEffect(() => {
(async () => {
try {
2023-10-26 23:55:05 +08:00
setLoading(true);
2023-10-26 17:32:55 +08:00
await trySyncWords();
const favWords = await getWordsWithDefault();
setFavWords(favWords);
} catch (err) {
console.log("[query fav]", err);
2023-10-26 23:55:05 +08:00
} finally {
setLoading(false);
2023-10-26 17:32:55 +08:00
}
})();
}, []);
2023-10-26 23:55:05 +08:00
return { loading, favWords, toggleFav, mergeWords, clearWords };
2023-10-26 17:32:55 +08:00
}