WbwParent.tsx 3.9 KB

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