import { Button, message, Select, Table, Tooltip, Typography } from "antd"; import { type Change, diffChars } from "diff"; import { useEffect, useState } from "react"; import { post } from "../../request"; import type { ISentenceDiffData, ISentenceDiffRequest, ISentenceDiffResponse, ISentenceListResponse, ISentenceNewRequest, } from "../../api/Corpus"; import type { IChannel } from "./Channel"; import { type ISentence, toISentence } from "../template/SentEdit"; import store from "../../store"; import { accept } from "../../reducers/accept-pr"; const { Text } = Typography; interface IDataType { key: React.Key; sentId: string; pali?: string | null; srcContent?: string | null; destContent?: string | null; } interface IWidget { srcChannel?: IChannel; destChannel?: IChannel; sentences?: string[]; important?: boolean; goPrev?: Function; onSubmit?: (total: number) => void; } const ChannelSentDiffWidget = ({ srcChannel, destChannel, sentences, important = false, goPrev, onSubmit, }: IWidget) => { const [srcApiData, setSrcApiData] = useState([]); const [diffData, setDiffData] = useState(); const [loading, setLoading] = useState(false); const [selectedRowKeys, setSelectedRowKeys] = useState(); const [newRowKeys, setNewRowKeys] = useState(); const [emptyRowKeys, setEmptyRowKeys] = useState(); useEffect(() => { if (sentences && srcChannel && destChannel) { post(`/v2/sent-in-channel`, { sentences: sentences, channels: ["_System_Pali_VRI_", srcChannel.id, destChannel.id], }).then((json) => { if (json.ok) { const apiData = json.data.rows; setSrcApiData(apiData); const newRows: string[] = []; const emptyRows: string[] = []; const diffList: IDataType[] = sentences?.map((item, _index) => { const id: string[] = item.split("-"); const srcContent = apiData.find( (element) => element.book_id === parseInt(id[0]) && element.paragraph === parseInt(id[1]) && element.word_start === parseInt(id[2]) && element.word_end === parseInt(id[3]) && element.channel_uid === srcChannel.id ); const destContent = apiData.find( (element) => element.book_id === parseInt(id[0]) && element.paragraph === parseInt(id[1]) && element.word_start === parseInt(id[2]) && element.word_end === parseInt(id[3]) && element.channel_uid === destChannel.id ); if (srcContent && destContent) { const srcDate = new Date(srcContent.updated_at); const destDate = new Date(destContent.updated_at); if (srcDate > destDate) { newRows.push(item); } } if ( typeof destContent === "undefined" || destContent.content?.trim().length === 0 ) { emptyRows.push(item); } const paliContent = apiData.find( (element) => element.book_id === parseInt(id[0]) && element.paragraph === parseInt(id[1]) && element.word_start === parseInt(id[2]) && element.word_end === parseInt(id[3]) && element.channel_uid !== destChannel.id && element.channel_uid !== srcChannel.id ); return { key: item, sentId: item, pali: paliContent?.content, srcContent: srcContent?.content, destContent: destContent?.content, }; }); setDiffData(diffList); setNewRowKeys(newRows); if (important) { setSelectedRowKeys(sentences); } else { setSelectedRowKeys(newRows); } setEmptyRowKeys(emptyRows); } }); } }, [srcChannel, sentences, destChannel]); return (