DictSearch.tsx 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { useState, useEffect } from "react";
  2. import type { IDictContentData, IApiDictContentData } from "./DictContent";
  3. import { get } from "../../request";
  4. import DictContent from "./DictContent";
  5. import { Skeleton } from "antd";
  6. interface IWidget {
  7. word: string | undefined;
  8. compact?: boolean;
  9. }
  10. const DictSearchWidget = ({ word, compact = false }: IWidget) => {
  11. const [loading, setLoading] = useState(false);
  12. const defaultData: IDictContentData = {
  13. dictlist: [],
  14. words: [],
  15. caselist: [],
  16. };
  17. const [tableData, setTableData] = useState<IDictContentData>(defaultData);
  18. const fetchDict = (word: string) => {
  19. const url = `/v2/dict?word=${word}`;
  20. console.info("api request", url);
  21. setLoading(true);
  22. get<IApiDictContentData>(url)
  23. .then((json) => {
  24. console.info("api response", json);
  25. setTableData(json.data);
  26. })
  27. .finally(() => setLoading(false))
  28. .catch((error) => {
  29. console.error(error);
  30. });
  31. };
  32. useEffect(() => {
  33. if (typeof word === "undefined") {
  34. return;
  35. }
  36. fetchDict(word);
  37. }, [word, setTableData]);
  38. return (
  39. <>
  40. {loading ? (
  41. <div>
  42. <div>searching {word}</div>
  43. <Skeleton active />
  44. </div>
  45. ) : (
  46. <DictContent word={word} data={tableData} compact={compact} />
  47. )}
  48. </>
  49. );
  50. };
  51. export default DictSearchWidget;