WbwSent.tsx 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. import { message } from "antd";
  2. import { useEffect, useState } from "react";
  3. import { useAppSelector } from "../../hooks";
  4. import { mode } from "../../reducers/article-mode";
  5. import { post } from "../../request";
  6. import { ArticleMode } from "../article/Article";
  7. import WbwWord, { IWbw, IWbwFields, WbwElement } from "./Wbw/WbwWord";
  8. interface IMagicDictRequest {
  9. book: number;
  10. para: number;
  11. word_start: number;
  12. word_end: number;
  13. data: IWbw[];
  14. channel_id: string;
  15. }
  16. interface IMagicDictResponse {
  17. ok: boolean;
  18. message: string;
  19. data: IWbw[];
  20. }
  21. interface IWbwXml {
  22. id: string;
  23. pali: WbwElement<string>;
  24. real?: WbwElement<string>;
  25. type?: WbwElement<string>;
  26. gramma?: WbwElement<string>;
  27. mean?: WbwElement<string>;
  28. org?: WbwElement<string>;
  29. om?: WbwElement<string>;
  30. case?: WbwElement<string>;
  31. parent?: WbwElement<string>;
  32. pg?: WbwElement<string>;
  33. parent2?: WbwElement<string>;
  34. rela?: WbwElement<string>;
  35. lock?: boolean;
  36. bmt?: WbwElement<string>;
  37. bmc?: WbwElement<number>;
  38. cf: number;
  39. }
  40. interface IWbwUpdateResponse {
  41. ok: boolean;
  42. message: string;
  43. data: { rows?: IWbwXml[]; count: number };
  44. }
  45. interface IWbwRequest {
  46. book: number;
  47. para: number;
  48. sn: number;
  49. channel_id: string;
  50. data: IWbwXml[];
  51. }
  52. interface IWidget {
  53. data: IWbw[];
  54. book: number;
  55. para: number;
  56. wordStart: number;
  57. wordEnd: number;
  58. channelId: string;
  59. display?: "block" | "inline";
  60. fields?: IWbwFields;
  61. magicDict?: string;
  62. onMagicDictDone?: Function;
  63. onChange?: Function;
  64. }
  65. export const WbwSentCtl = ({
  66. data,
  67. channelId,
  68. book,
  69. para,
  70. wordStart,
  71. wordEnd,
  72. display = "inline",
  73. fields,
  74. magicDict,
  75. onChange,
  76. onMagicDictDone,
  77. }: IWidget) => {
  78. const [wordData, setWordData] = useState<IWbw[]>(data);
  79. const [wbwMode, setWbwMode] = useState(display);
  80. const [fieldDisplay, setFieldDisplay] = useState(fields);
  81. const [displayMode, setDisplayMode] = useState<ArticleMode>();
  82. const newMode = useAppSelector(mode);
  83. //console.log("wbw sent ", data);
  84. useEffect(() => {
  85. setDisplayMode(newMode);
  86. switch (newMode) {
  87. case "edit":
  88. setWbwMode("block");
  89. setFieldDisplay({
  90. meaning: true,
  91. factors: false,
  92. factorMeaning: false,
  93. case: false,
  94. });
  95. break;
  96. case "wbw":
  97. setWbwMode("block");
  98. setFieldDisplay({
  99. meaning: true,
  100. factors: true,
  101. factorMeaning: true,
  102. case: true,
  103. });
  104. break;
  105. }
  106. }, [newMode]);
  107. useEffect(() => {
  108. if (typeof magicDict === "undefined") {
  109. return;
  110. }
  111. const url = `/v2/wbwlookup`;
  112. console.log("magic dict url", url);
  113. post<IMagicDictRequest, IMagicDictResponse>(url, {
  114. book: book,
  115. para: para,
  116. word_start: wordStart,
  117. word_end: wordEnd,
  118. data: wordData,
  119. channel_id: channelId,
  120. })
  121. .then((json) => {
  122. if (json.ok) {
  123. console.log("magic dict result", json.data);
  124. setWordData(json.data);
  125. } else {
  126. console.error(json.message);
  127. }
  128. })
  129. .finally(() => {
  130. if (typeof onMagicDictDone !== "undefined") {
  131. onMagicDictDone();
  132. }
  133. });
  134. }, [magicDict]);
  135. return (
  136. <div style={{ display: "flex", flexWrap: "wrap" }}>
  137. {wordData.map((item, id) => {
  138. return (
  139. <WbwWord
  140. data={item}
  141. key={id}
  142. mode={displayMode}
  143. display={wbwMode}
  144. fields={fieldDisplay}
  145. onChange={(e: IWbw) => {
  146. console.log("word changed", e);
  147. let newData = [...wordData];
  148. newData.forEach((value, index, array) => {
  149. if (value.sn.join() === e.sn.join()) {
  150. console.log("found", e.sn);
  151. array[index] = e;
  152. }
  153. });
  154. console.log("new data", newData);
  155. setWordData(newData);
  156. const data = newData.filter((value) => value.sn[0] === e.sn[0]);
  157. const postParam: IWbwRequest = {
  158. book: book,
  159. para: para,
  160. sn: e.sn[0],
  161. channel_id: channelId,
  162. data: data.map((item) => {
  163. return {
  164. pali: item.word,
  165. real: item.real,
  166. id: `${book}-${para}-` + e.sn.join("-"),
  167. type: item.type,
  168. gramma: item.grammar,
  169. mean: item.meaning
  170. ? {
  171. value: item.meaning.value,
  172. status: item.meaning?.status,
  173. }
  174. : undefined,
  175. org: item.factors,
  176. om: item.factorMeaning,
  177. case: item.case,
  178. parent: item.parent,
  179. pg: item.grammar2,
  180. parent2: item.parent2,
  181. rela: item.relation,
  182. lock: item.locked,
  183. note: item.note,
  184. bmt: item.bookMarkText,
  185. bmc: item.bookMarkColor,
  186. cf: item.confidence,
  187. };
  188. }),
  189. };
  190. console.log("wbw post", postParam);
  191. post<IWbwRequest, IWbwUpdateResponse>(`/v2/wbw`, postParam).then(
  192. (json) => {
  193. if (json.ok) {
  194. message.info(e.word.value + " updated");
  195. } else {
  196. message.error(json.message);
  197. }
  198. }
  199. );
  200. if (typeof onChange !== "undefined") {
  201. onChange(newData);
  202. }
  203. }}
  204. onSplit={(isSplit: boolean) => {
  205. if (isSplit) {
  206. //拆分
  207. const newData: IWbw[] = JSON.parse(JSON.stringify(wordData));
  208. const children: IWbw[] | undefined = wordData[id].factors?.value
  209. .split("+")
  210. .map((item, index) => {
  211. return {
  212. word: { value: item, status: 5 },
  213. real: { value: item, status: 5 },
  214. book: wordData[id].book,
  215. para: wordData[id].para,
  216. sn: [...wordData[id].sn, index],
  217. confidence: 1,
  218. };
  219. });
  220. if (typeof children !== "undefined") {
  221. console.log("children", children);
  222. newData.splice(id + 1, 0, ...children);
  223. console.log("new-data", newData);
  224. setWordData(newData);
  225. }
  226. } else {
  227. //合并
  228. }
  229. }}
  230. />
  231. );
  232. })}
  233. </div>
  234. );
  235. };
  236. interface IWidgetWbwSent {
  237. props: string;
  238. }
  239. const WbwSentWidget = ({ props }: IWidgetWbwSent) => {
  240. const prop = JSON.parse(atob(props)) as IWidget;
  241. return <WbwSentCtl {...prop} />;
  242. };
  243. export default WbwSentWidget;