41 lines
1.0 KiB
JavaScript
41 lines
1.0 KiB
JavaScript
|
|
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() {
|
||
|
|
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]
|
||
|
|
);
|
||
|
|
|
||
|
|
useEffect(() => {
|
||
|
|
(async () => {
|
||
|
|
try {
|
||
|
|
await trySyncWords();
|
||
|
|
const favWords = await getWordsWithDefault();
|
||
|
|
setFavWords(favWords);
|
||
|
|
} catch (err) {
|
||
|
|
console.log("[query fav]", err);
|
||
|
|
}
|
||
|
|
})();
|
||
|
|
}, []);
|
||
|
|
|
||
|
|
return { favWords, toggleFav };
|
||
|
|
}
|