73 lines
1.8 KiB
JavaScript
73 lines
1.8 KiB
JavaScript
|
|
import { useEffect } from "react";
|
||
|
|
import { useState } from "react";
|
||
|
|
import { apiTranslate } from "../apis";
|
||
|
|
import browser from "../libs/browser";
|
||
|
|
import {
|
||
|
|
MSG_TRANS_PUTRULE,
|
||
|
|
DEFAULT_FETCH_LIMIT,
|
||
|
|
MSG_FETCH_LIMIT,
|
||
|
|
} from "../config";
|
||
|
|
import { useSetting } from "./Setting";
|
||
|
|
import { sendMsg } from "../libs/msg";
|
||
|
|
import { detectLang } from "../libs";
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 翻译hook
|
||
|
|
* @param {*} q
|
||
|
|
* @returns
|
||
|
|
*/
|
||
|
|
export function useTranslate(q, initRule) {
|
||
|
|
const [text, setText] = useState("");
|
||
|
|
const [loading, setLoading] = useState(false);
|
||
|
|
const [sameLang, setSamelang] = useState(false);
|
||
|
|
const [rule, setRule] = useState(initRule);
|
||
|
|
const { fetchLimit = DEFAULT_FETCH_LIMIT } = useSetting() || {};
|
||
|
|
|
||
|
|
const { translator, fromLang, toLang, textStyle } = rule;
|
||
|
|
|
||
|
|
const handleMessage = ({ action, args }) => {
|
||
|
|
if (action === MSG_TRANS_PUTRULE) {
|
||
|
|
setRule((pre) => ({ ...pre, ...args }));
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
};
|
||
|
|
|
||
|
|
useEffect(() => {
|
||
|
|
browser?.runtime.onMessage.addListener(handleMessage);
|
||
|
|
return () => {
|
||
|
|
browser?.runtime.onMessage.removeListener(handleMessage);
|
||
|
|
};
|
||
|
|
}, []);
|
||
|
|
|
||
|
|
useEffect(() => {
|
||
|
|
sendMsg(MSG_FETCH_LIMIT, { limit: fetchLimit });
|
||
|
|
}, [fetchLimit]);
|
||
|
|
|
||
|
|
useEffect(() => {
|
||
|
|
(async () => {
|
||
|
|
try {
|
||
|
|
setLoading(true);
|
||
|
|
const deLang = await detectLang(q);
|
||
|
|
if (toLang.includes(deLang)) {
|
||
|
|
setSamelang(true);
|
||
|
|
} else {
|
||
|
|
const [trText, isSame] = await apiTranslate({
|
||
|
|
translator,
|
||
|
|
q,
|
||
|
|
fromLang,
|
||
|
|
toLang,
|
||
|
|
});
|
||
|
|
setText(trText);
|
||
|
|
setSamelang(isSame);
|
||
|
|
}
|
||
|
|
} catch (err) {
|
||
|
|
console.log("[translate]", err);
|
||
|
|
} finally {
|
||
|
|
setLoading(false);
|
||
|
|
}
|
||
|
|
})();
|
||
|
|
}, [q, translator, fromLang, toLang]);
|
||
|
|
|
||
|
|
return { text, sameLang, loading, textStyle };
|
||
|
|
}
|