WbwFactorMeaning.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import { useIntl } from "react-intl";
  2. import { useState, useEffect } from "react";
  3. import type { MenuProps } from "antd";
  4. import { Dropdown, Space, Typography } from "antd";
  5. import { LoadingOutlined } from "@ant-design/icons";
  6. import type { IWbw, TWbwDisplayMode } from "./WbwWord"
  7. import { PaliReal } from "../../../utils";
  8. import { useAppSelector } from "../../../hooks";
  9. import { inlineDict as _inlineDict } from "../../../reducers/inline-dict";
  10. import { ItemType } from "antd/lib/menu/hooks/useItems";
  11. import { errorClass } from "./WbwMeaning";
  12. const { Text } = Typography;
  13. interface IWidget {
  14. data: IWbw;
  15. answer?: IWbw;
  16. factors?: string;
  17. display?: TWbwDisplayMode;
  18. onChange?: Function;
  19. }
  20. const WbwFactorMeaningWidget = ({
  21. data,
  22. answer,
  23. display,
  24. onChange,
  25. factors,
  26. }: IWidget) => {
  27. const intl = useIntl();
  28. const defaultMenu: ItemType[] = [
  29. {
  30. key: "loading",
  31. label: (
  32. <Space>
  33. <LoadingOutlined />
  34. {"Loading"}
  35. </Space>
  36. ),
  37. },
  38. ];
  39. const [items, setItems] = useState<ItemType[]>(defaultMenu);
  40. const inlineDict = useAppSelector(_inlineDict);
  41. useEffect(() => {
  42. if (inlineDict.wordIndex.includes(data.word.value)) {
  43. const result = inlineDict.wordList.filter(
  44. (word) => word.word === data.word.value
  45. );
  46. //查重
  47. //TODO 加入信心指数并排序
  48. const myMap = new Map<string, number>();
  49. const factors: string[] = [];
  50. for (const iterator of result) {
  51. if (iterator.factormean) {
  52. myMap.set(iterator.factormean, 1);
  53. }
  54. }
  55. myMap.forEach((_value, key, _map) => {
  56. factors.push(key);
  57. });
  58. const menu = factors.map((item) => {
  59. return { key: item, label: item };
  60. });
  61. setItems(menu);
  62. }
  63. }, [data.word.value, inlineDict]);
  64. useEffect(() => {
  65. if (typeof factors !== "undefined") {
  66. }
  67. }, [factors]);
  68. const onClick: MenuProps["onClick"] = (e) => {
  69. console.log("click ", e);
  70. if (typeof onChange !== "undefined") {
  71. onChange(e.key);
  72. }
  73. };
  74. let factorMeaning = <></>;
  75. if (display === "block") {
  76. if (
  77. typeof data.factorMeaning?.value === "string" &&
  78. data.factorMeaning.value.replaceAll("+", "").trim().length > 0
  79. ) {
  80. factorMeaning = <span>{data.factorMeaning?.value}</span>;
  81. } else {
  82. //空白的意思在逐词解析模式显示占位字符串
  83. factorMeaning = (
  84. <Text type="secondary">
  85. {intl.formatMessage({ id: "forms.fields.factor.meaning.label" })}
  86. </Text>
  87. );
  88. }
  89. }
  90. if (typeof data.real !== "undefined" && PaliReal(data.real.value) !== "") {
  91. const checkClass = answer
  92. ? errorClass(
  93. "factorMeaning",
  94. data.factorMeaning?.value,
  95. answer?.factorMeaning?.value
  96. )
  97. : "";
  98. return (
  99. <div className={"wbw_word_item" + checkClass}>
  100. <Text type="secondary">
  101. <Dropdown
  102. menu={{
  103. items: [
  104. ...items.filter((_value, index) => index <= 5),
  105. {
  106. key: "more",
  107. label: intl.formatMessage({ id: "buttons.more" }),
  108. children: items.filter((_value, index) => index > 5),
  109. },
  110. ],
  111. onClick,
  112. }}
  113. placement="bottomLeft"
  114. >
  115. {factorMeaning}
  116. </Dropdown>
  117. </Text>
  118. </div>
  119. );
  120. } else {
  121. //标点符号
  122. return <></>;
  123. }
  124. };
  125. export default WbwFactorMeaningWidget;