SentCell.tsx 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import { useEffect, useState } from "react";
  2. import { ISentence } from "../SentEdit";
  3. import SentEditMenu from "./SentEditMenu";
  4. import SentCellEditable from "./SentCellEditable";
  5. import MdView from "../MdView";
  6. import EditInfo from "./EditInfo";
  7. import SuggestionToolbar from "./SuggestionToolbar";
  8. import { Divider } from "antd";
  9. import { useAppSelector } from "../../../hooks";
  10. import { sentence } from "../../../reducers/accept-pr";
  11. import { IWbw } from "../Wbw/WbwWord";
  12. import { my_to_roman } from "../../code/my";
  13. import SentWbwEdit, { sentSave } from "./SentWbwEdit";
  14. import { getEnding } from "../../../reducers/nissaya-ending-vocabulary";
  15. import { nissayaBase } from "../Nissaya/NissayaMeaning";
  16. import { useIntl } from "react-intl";
  17. interface ISentCell {
  18. data: ISentence;
  19. wordWidget?: boolean;
  20. isPr?: boolean;
  21. }
  22. const SentCellWidget = ({
  23. data,
  24. wordWidget = false,
  25. isPr = false,
  26. }: ISentCell) => {
  27. const intl = useIntl();
  28. const [isEditMode, setIsEditMode] = useState(false);
  29. const [sentData, setSentData] = useState<ISentence>(data);
  30. const endings = useAppSelector(getEnding);
  31. const acceptPr = useAppSelector(sentence);
  32. useEffect(() => {
  33. setSentData(data);
  34. }, [data]);
  35. useEffect(() => {
  36. if (typeof acceptPr !== "undefined" && !isPr) {
  37. if (
  38. acceptPr.book === data.book &&
  39. acceptPr.para === data.para &&
  40. acceptPr.wordStart === data.wordStart &&
  41. acceptPr.wordEnd === data.wordEnd &&
  42. acceptPr.channel.id === data.channel.id
  43. )
  44. setSentData(acceptPr);
  45. }
  46. }, [acceptPr, data, isPr]);
  47. const sid = `${sentData.book}_${sentData.para}_${sentData.wordStart}_${sentData.wordEnd}_${sentData.channel.id}`;
  48. return (
  49. <div style={{ marginBottom: "8px" }}>
  50. {isPr ? undefined : (
  51. <div
  52. dangerouslySetInnerHTML={{
  53. __html: `<div class="tran_sent" id="${sid}" ></div>`,
  54. }}
  55. />
  56. )}
  57. <SentEditMenu
  58. data={data}
  59. onModeChange={(mode: string) => {
  60. if (mode === "edit") {
  61. setIsEditMode(true);
  62. }
  63. }}
  64. onConvert={(format: string) => {
  65. console.log("format", format);
  66. switch (format) {
  67. case "json":
  68. const wbw: IWbw[] = data.content.split("\n").map((item, id) => {
  69. const parts = item.split("=");
  70. const word = my_to_roman(parts[0]);
  71. const meaning: string = parts.length > 1 ? parts[1].trim() : "";
  72. let parent: string = "";
  73. let factors: string = "";
  74. if (!meaning.includes(" ") && endings) {
  75. const base = nissayaBase(meaning, endings);
  76. parent = base.base;
  77. const end = base.ending ? base.ending : [];
  78. factors = [base.base, ...end].join("+");
  79. } else {
  80. factors = meaning.replaceAll(" ", "+");
  81. }
  82. return {
  83. book: data.book,
  84. para: data.para,
  85. sn: [id],
  86. word: { value: word ? word : parts[0], status: 0 },
  87. real: { value: meaning, status: 0 },
  88. meaning: { value: "", status: 0 },
  89. parent: { value: parent, status: 0 },
  90. factors: {
  91. value: factors,
  92. status: 0,
  93. },
  94. confidence: 0.5,
  95. };
  96. });
  97. setSentData((origin) => {
  98. origin.contentType = "json";
  99. origin.content = JSON.stringify(wbw);
  100. sentSave(origin, intl);
  101. return origin;
  102. });
  103. setIsEditMode(true);
  104. break;
  105. case "markdown":
  106. setSentData((origin) => {
  107. const wbwData: IWbw[] = JSON.parse(origin.content);
  108. const newContent = wbwData
  109. .map((item) => {
  110. return [
  111. item.word.value,
  112. item.real.value,
  113. item.meaning?.value,
  114. ].join("=");
  115. })
  116. .join("\n");
  117. origin.content = newContent;
  118. origin.contentType = "markdown";
  119. sentSave(origin, intl);
  120. return origin;
  121. });
  122. setIsEditMode(true);
  123. break;
  124. }
  125. }}
  126. >
  127. <EditInfo data={sentData} />
  128. {isEditMode ? (
  129. <div>
  130. {sentData.contentType === "json" ? (
  131. <SentWbwEdit
  132. data={sentData}
  133. onClose={() => {
  134. setIsEditMode(false);
  135. }}
  136. onSave={(data: ISentence) => {
  137. setSentData(data);
  138. }}
  139. />
  140. ) : (
  141. <SentCellEditable
  142. data={sentData}
  143. isPr={isPr}
  144. onClose={() => {
  145. setIsEditMode(false);
  146. }}
  147. onSave={(data: ISentence) => {
  148. setSentData(data);
  149. setIsEditMode(false);
  150. }}
  151. />
  152. )}
  153. </div>
  154. ) : (
  155. <div style={{ marginLeft: "2em" }}>
  156. <MdView
  157. html={sentData.html !== "" ? sentData.html : "请输入"}
  158. wordWidget={wordWidget}
  159. />
  160. </div>
  161. )}
  162. <div style={{ marginLeft: "2em" }}>
  163. <SuggestionToolbar data={sentData} isPr={isPr} />
  164. </div>
  165. </SentEditMenu>
  166. <Divider style={{ margin: "10px 0" }} />
  167. </div>
  168. );
  169. };
  170. export default SentCellWidget;