AiTranslate.tsx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { Button, Typography } from "antd";
  2. import { useEffect, useState } from "react";
  3. import { LoadingOutlined } from "@ant-design/icons";
  4. import Marked from "../general/Marked";
  5. import { get } from "../../request";
  6. import type { IAiTranslateResponse } from "../../api/ai";
  7. const { Text } = Typography;
  8. interface IAiTranslateWidget {
  9. origin?: string;
  10. paragraph?: string;
  11. autoLoad?: boolean;
  12. trigger?: boolean;
  13. }
  14. const AiTranslate = ({
  15. paragraph,
  16. autoLoad = false,
  17. trigger = false,
  18. }: IAiTranslateWidget) => {
  19. const [loading, setLoading] = useState(false);
  20. const [translation, setTranslation] = useState<string>();
  21. const [error, setError] = useState<string>();
  22. const url = "/v2/ai-translate";
  23. useEffect(() => {
  24. if (typeof paragraph === "undefined") {
  25. return;
  26. }
  27. if (!autoLoad) {
  28. return;
  29. }
  30. //onTranslatePara();
  31. }, [paragraph, autoLoad]);
  32. const onTranslatePara = () => {
  33. const _url = `${url}/${paragraph}`;
  34. console.info("api request", _url);
  35. setLoading(true);
  36. get<IAiTranslateResponse>(_url)
  37. .then((json) => {
  38. console.debug("api response", json);
  39. if (json.ok) {
  40. setTranslation(json.data.choices[0].message.content);
  41. } else {
  42. setError(json.message);
  43. }
  44. })
  45. .finally(() => setLoading(false));
  46. };
  47. if (translation) {
  48. return <Marked text={translation} />;
  49. } else if (loading) {
  50. return <LoadingOutlined />;
  51. } else if (error) {
  52. return (
  53. <div>
  54. <Text type="danger">{error}</Text>
  55. <Button type="link" onClick={() => onTranslatePara()}>
  56. 再试一次
  57. </Button>
  58. </div>
  59. );
  60. } else if (trigger) {
  61. return (
  62. <Button type="link" onClick={() => onTranslatePara()}>
  63. AI 翻译
  64. </Button>
  65. );
  66. } else {
  67. return <></>;
  68. }
  69. };
  70. export default AiTranslate;