| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- import { message } from "antd";
- import { useEffect, useState } from "react";
- import { useAppSelector } from "../../hooks";
- import { mode } from "../../reducers/article-mode";
- import { post } from "../../request";
- import { ArticleMode } from "../article/Article";
- import WbwWord, { IWbw, IWbwFields, WbwElement } from "./Wbw/WbwWord";
- interface IMagicDictRequest {
- book: number;
- para: number;
- word_start: number;
- word_end: number;
- data: IWbw[];
- channel_id: string;
- }
- interface IMagicDictResponse {
- ok: boolean;
- message: string;
- data: IWbw[];
- }
- interface IWbwXml {
- id: string;
- pali: WbwElement<string>;
- real?: WbwElement<string>;
- type?: WbwElement<string>;
- gramma?: WbwElement<string>;
- mean?: WbwElement<string>;
- org?: WbwElement<string>;
- om?: WbwElement<string>;
- case?: WbwElement<string>;
- parent?: WbwElement<string>;
- pg?: WbwElement<string>;
- parent2?: WbwElement<string>;
- rela?: WbwElement<string>;
- lock?: boolean;
- bmt?: WbwElement<string>;
- bmc?: WbwElement<number>;
- cf: number;
- }
- interface IWbwUpdateResponse {
- ok: boolean;
- message: string;
- data: { rows?: IWbwXml[]; count: number };
- }
- interface IWbwRequest {
- book: number;
- para: number;
- sn: number;
- channel_id: string;
- data: IWbwXml[];
- }
- interface IWidget {
- data: IWbw[];
- book: number;
- para: number;
- wordStart: number;
- wordEnd: number;
- channelId: string;
- display?: "block" | "inline";
- fields?: IWbwFields;
- magicDict?: string;
- onMagicDictDone?: Function;
- onChange?: Function;
- }
- export const WbwSentCtl = ({
- data,
- channelId,
- book,
- para,
- wordStart,
- wordEnd,
- display = "inline",
- fields,
- magicDict,
- onChange,
- onMagicDictDone,
- }: IWidget) => {
- const [wordData, setWordData] = useState<IWbw[]>(data);
- const [wbwMode, setWbwMode] = useState(display);
- const [fieldDisplay, setFieldDisplay] = useState(fields);
- const [displayMode, setDisplayMode] = useState<ArticleMode>();
- const newMode = useAppSelector(mode);
- //console.log("wbw sent ", data);
- useEffect(() => {
- setDisplayMode(newMode);
- switch (newMode) {
- case "edit":
- setWbwMode("block");
- setFieldDisplay({
- meaning: true,
- factors: false,
- factorMeaning: false,
- case: false,
- });
- break;
- case "wbw":
- setWbwMode("block");
- setFieldDisplay({
- meaning: true,
- factors: true,
- factorMeaning: true,
- case: true,
- });
- break;
- }
- }, [newMode]);
- useEffect(() => {
- if (typeof magicDict === "undefined") {
- return;
- }
- const url = `/v2/wbwlookup`;
- console.log("magic dict url", url);
- post<IMagicDictRequest, IMagicDictResponse>(url, {
- book: book,
- para: para,
- word_start: wordStart,
- word_end: wordEnd,
- data: wordData,
- channel_id: channelId,
- })
- .then((json) => {
- if (json.ok) {
- console.log("magic dict result", json.data);
- setWordData(json.data);
- } else {
- console.error(json.message);
- }
- })
- .finally(() => {
- if (typeof onMagicDictDone !== "undefined") {
- onMagicDictDone();
- }
- });
- }, [magicDict]);
- return (
- <div style={{ display: "flex", flexWrap: "wrap" }}>
- {wordData.map((item, id) => {
- return (
- <WbwWord
- data={item}
- key={id}
- mode={displayMode}
- display={wbwMode}
- fields={fieldDisplay}
- onChange={(e: IWbw) => {
- console.log("word changed", e);
- let newData = [...wordData];
- newData.forEach((value, index, array) => {
- if (value.sn.join() === e.sn.join()) {
- console.log("found", e.sn);
- array[index] = e;
- }
- });
- console.log("new data", newData);
- setWordData(newData);
- const data = newData.filter((value) => value.sn[0] === e.sn[0]);
- const postParam: IWbwRequest = {
- book: book,
- para: para,
- sn: e.sn[0],
- channel_id: channelId,
- data: data.map((item) => {
- return {
- pali: item.word,
- real: item.real,
- id: `${book}-${para}-` + e.sn.join("-"),
- type: item.type,
- gramma: item.grammar,
- mean: item.meaning
- ? {
- value: item.meaning.value,
- status: item.meaning?.status,
- }
- : undefined,
- org: item.factors,
- om: item.factorMeaning,
- case: item.case,
- parent: item.parent,
- pg: item.grammar2,
- parent2: item.parent2,
- rela: item.relation,
- lock: item.locked,
- note: item.note,
- bmt: item.bookMarkText,
- bmc: item.bookMarkColor,
- cf: item.confidence,
- };
- }),
- };
- console.log("wbw post", postParam);
- post<IWbwRequest, IWbwUpdateResponse>(`/v2/wbw`, postParam).then(
- (json) => {
- if (json.ok) {
- message.info(e.word.value + " updated");
- } else {
- message.error(json.message);
- }
- }
- );
- if (typeof onChange !== "undefined") {
- onChange(newData);
- }
- }}
- onSplit={(isSplit: boolean) => {
- if (isSplit) {
- //拆分
- const newData: IWbw[] = JSON.parse(JSON.stringify(wordData));
- const children: IWbw[] | undefined = wordData[id].factors?.value
- .split("+")
- .map((item, index) => {
- return {
- word: { value: item, status: 5 },
- real: { value: item, status: 5 },
- book: wordData[id].book,
- para: wordData[id].para,
- sn: [...wordData[id].sn, index],
- confidence: 1,
- };
- });
- if (typeof children !== "undefined") {
- console.log("children", children);
- newData.splice(id + 1, 0, ...children);
- console.log("new-data", newData);
- setWordData(newData);
- }
- } else {
- //合并
- }
- }}
- />
- );
- })}
- </div>
- );
- };
- interface IWidgetWbwSent {
- props: string;
- }
- const WbwSentWidget = ({ props }: IWidgetWbwSent) => {
- const prop = JSON.parse(atob(props)) as IWidget;
- return <WbwSentCtl {...prop} />;
- };
- export default WbwSentWidget;
|