feat: support bing dict

This commit is contained in:
Gabe
2025-10-03 22:07:48 +08:00
parent 171dbb7509
commit c353c88db8
7 changed files with 142 additions and 118 deletions

View File

@@ -1,9 +1,9 @@
import IconButton from "@mui/material/IconButton";
import VolumeUpIcon from "@mui/icons-material/VolumeUp";
import { useTextAudio } from "../../hooks/Audio";
import { useAudio } from "../../hooks/Audio";
export default function AudioBtn({ text, lan = "uk" }) {
const { error, ready, playing, onPlay } = useTextAudio(text, lan);
export default function AudioBtn({ src }) {
const { error, ready, playing, onPlay } = useAudio(src);
if (error || !ready) {
return (

View File

@@ -1,90 +1,28 @@
import { useState, useEffect } from "react";
import { useState, useEffect, useMemo } from "react";
import Stack from "@mui/material/Stack";
import FavBtn from "./FavBtn";
import Typography from "@mui/material/Typography";
import AudioBtn from "./AudioBtn";
import CircularProgress from "@mui/material/CircularProgress";
import Divider from "@mui/material/Divider";
import Alert from "@mui/material/Alert";
import { OPT_DICT_BAIDU, OPT_DICT_YOUDAO, PHONIC_MAP } from "../../config";
import CopyBtn from "./CopyBtn";
import { useAsyncNow } from "../../hooks/Fetch";
import { apiYoudaoDict } from "../../apis";
import { DICT_MAP } from "./DictMap";
function DictBaidu({ text, setCopyText }) {
// useEffect(() => {
// if (!data) {
// return;
// }
// const copyText = [
// data.src,
// data.voice
// ?.map(Object.entries)
// .map((item) => item[0])
// .map(([key, val]) => `${PHONIC_MAP[key]?.[0] || key} ${val}`)
// .join(" "),
// data.content[0].mean
// .map(({ pre, cont }) => {
// return `${pre ? `[${pre}] ` : ""}${Object.keys(cont).join("; ")}`;
// })
// .join("\n"),
// ].join("\n");
// setCopyText(copyText);
// }, [data, setCopyText]);
return <Typography>baidu dict not supported yet</Typography>;
{
/* {dictResult && (
<Typography component="div">
<Typography component="div">
{dictResult.voice
?.map(Object.entries)
.map((item) => item[0])
.map(([key, val]) => (
<Typography
component="div"
key={key}
style={{ display: "inline-block" }}
>
<Typography component="span">{`${PHONIC_MAP[key]?.[0] || key} ${val}`}</Typography>
<AudioBtn text={dictResult.src} lan={PHONIC_MAP[key]?.[1]} />
</Typography>
))}
</Typography>
<Typography component="ul">
{dictResult.content[0].mean.map(({ pre, cont }, idx) => (
<Typography component="li" key={idx}>
{pre && `[${pre}] `}
{Object.keys(cont).join("; ")}
</Typography>
))}
</Typography>
</Typography>
)} */
}
}
function DictYoudao({ text, setCopyText }) {
const { loading, error, data } = useAsyncNow(apiYoudaoDict, text);
function DictBody({ text, setCopyText, dict }) {
const { loading, error, data } = useAsyncNow(dict.apiFn, text);
useEffect(() => {
if (!data) {
return;
}
const copyText = [
text,
data?.ec?.word?.trs
?.map(({ pos, tran }) => `${pos ? `[${pos}] ` : ""}${tran}`)
.join("\n"),
].join("\n");
const copyText = [text, dict.toText(data)].join("\n");
setCopyText(copyText);
}, [data, setCopyText]);
}, [data, text, dict, setCopyText]);
const uiAudio = useMemo(() => dict.uiAudio(data), [data, dict]);
const uiTrans = useMemo(() => dict.uiTrans(data), [data, dict]);
if (loading) {
return <CircularProgress size={16} />;
@@ -95,30 +33,20 @@ function DictYoudao({ text, setCopyText }) {
}
if (!data) {
return;
return <Typography>Empty result</Typography>;
}
return (
<Typography component="div">
<Typography component="ul">
{data?.ec?.word?.trs?.map(({ pos, tran }, idx) => (
<Typography component="li" key={idx}>
{pos && `[${pos}] `}
{tran}
</Typography>
))}
</Typography>
{uiAudio}
{uiTrans}
</Typography>
);
}
export default function DictCont({ text, enDict }) {
const [copyText, setCopyText] = useState(text);
const dictMap = {
[OPT_DICT_BAIDU]: <DictBaidu text={text} setCopyText={setCopyText} />,
[OPT_DICT_YOUDAO]: <DictYoudao text={text} setCopyText={setCopyText} />,
};
const dict = DICT_MAP[enDict];
return (
<Stack spacing={1}>
@@ -136,7 +64,7 @@ export default function DictCont({ text, enDict }) {
<Divider />
{dictMap[enDict] || <Typography>Dict not support</Typography>}
{dict && <DictBody text={text} setCopyText={setCopyText} dict={dict} />}
</Stack>
);
}

View File

@@ -0,0 +1,56 @@
import Typography from "@mui/material/Typography";
import AudioBtn from "./AudioBtn";
import { OPT_DICT_BING, OPT_DICT_YOUDAO } from "../../config";
import { apiMicrosoftDict, apiYoudaoDict } from "../../apis";
export const DICT_MAP = {
[OPT_DICT_BING]: {
apiFn: apiMicrosoftDict,
toText: (data) =>
data.trs
?.map(({ pos, def }) => `${pos ? `[${pos}] ` : ""}${def}`)
.join("\n"),
uiAudio: (data) => (
<Typography component="div">
{data?.aus.map(({ key, audio, phonetic }) => (
<Typography
component="div"
key={key}
style={{ display: "inline-block" }}
>
<Typography component="span">{phonetic}</Typography>
<AudioBtn src={audio} />
</Typography>
))}
</Typography>
),
uiTrans: (data) => (
<Typography component="ul">
{data?.trs?.map(({ pos, def }, idx) => (
<Typography component="li" key={idx}>
{pos && `[${pos}] `}
{def}
</Typography>
))}
</Typography>
),
},
[OPT_DICT_YOUDAO]: {
apiFn: apiYoudaoDict,
toText: (data) =>
data?.ec?.word?.trs
?.map(({ pos, tran }) => `${pos ? `[${pos}] ` : ""}${tran}`)
.join("\n"),
uiAudio: () => null,
uiTrans: (data) => (
<Typography component="ul">
{data?.ec?.word?.trs?.map(({ pos, tran }, idx) => (
<Typography component="li" key={idx}>
{pos && `[${pos}] `}
{tran}
</Typography>
))}
</Typography>
),
},
};