import { ArrowLeftOutlined, ArrowRightOutlined, CheckCircleOutlined, ClockCircleFilled, CopyOutlined, FullscreenExitOutlined, FullscreenOutlined, } from '@ant-design/icons'; import { t } from '@lingui/macro'; import { Viewer } from '@react-pdf-viewer/core'; import { Button, DatePicker, Form, Input, InputNumber, message, Modal, notification, Select, Spin, Tag, } from 'antd'; import { useEffect, useState } from 'react'; import Lightbox from 'react-awesome-lightbox'; import 'react-awesome-lightbox/build/style.css'; import { useHotkeys } from 'react-hotkeys-hook'; import { baseURL } from 'request/api'; // Import the styles import '@react-pdf-viewer/core/lib/styles/index.css'; import { badQualityReasonSubmit } from 'request'; import { normalizeData } from 'utils/field-value-process'; import { fetchAllRequests, fetchRequest } from './api'; import { counter_measure_map, FEEDBACK_ACCURACY, FEEDBACK_RESULT, PREDICTED_RESULT, REASON_BAD_QUALITY, REVIEWED_RESULT, SOLUTION_BAD_QUALITY, SOURCE_KEYS, SOURCE_OBJECT_NAMES, SUBSIDIARIES, } from './const'; import FileCard from './FileCard'; const ReviewPage = () => { const [loading, setLoading] = useState(false); const [fullscreen, setFullscreen] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false); const [isReasonModalOpen, setIsReasonModalOpen] = useState(false); const [selectedFileId, setSelectedFileId] = useState(0); const [selectedFileData, setSelectedFileData] = useState(null); const [selectedFileDataSource, setSelectedFileDataSource] = useState({}); const [selectedFileName, setSelectedFileName] = useState(null); // Default date range: 1 month ago to today const [filterDateRange, setFilterDateRange] = useState(['', '']); const [filterSubsidiaries, setFilterSubsidiaries] = useState('SEAO'); const [filterAccuracy, setFilterAccuracy] = useState(100); const [filterReviewState, setFilterReviewState] = useState('all'); const [filterIncludeTests, setFilterIncludesTests] = useState('true'); // const [requests, setRequests] = useState([]); const [currentRequest, setCurrentRequest] = useState(null); const [currentRequestIndex, setCurrentRequestIndex] = useState(1); const [hasNextRequest, setHasNextRequest] = useState(true); const [totalRequests, setTotalPages] = useState(0); const [dataSource, setDataSource] = useState([]); const [pageIndexToGoto, setPageIndexToGoto] = useState(1); const [reason, setReason] = useState(''); const [otherReason, setOtherReason] = useState(''); const [solution, setSolution] = useState(''); const [otherSolution, setOtherSolution] = useState(''); const [imageLoading, setImageLoading] = useState(false); useEffect(() => { if (reason) { setSolution(counter_measure_map[reason]); } }, [reason]); const updateSelectedFileDataSource = (fileContent) => { let tempData = {}; SOURCE_KEYS.forEach((k) => { tempData[k] = {}; SOURCE_OBJECT_NAMES.forEach((name) => { tempData[k][name] = fileContent[name][k]; }); }); setSelectedFileDataSource(tempData); }; const setAndLoadSelectedFile = async (requestData, index) => { setSelectedFileId(index); if (!requestData['Files'][index]) { setSelectedFileData('FAILED_TO_LOAD_FILE'); setImageLoading(false); return; } const fileName = requestData['Files'][index]['File Name']; const fileURL = requestData['Files'][index]['File URL']; updateSelectedFileDataSource(requestData['Files'][index]); const response = await fetch(fileURL); if (response.status === 200) { setSelectedFileName(fileName); setSelectedFileData(fileURL); console.log('Loading file: ' + fileName); console.log('URL: ' + fileURL); } else { setSelectedFileData('FAILED_TO_LOAD_FILE'); setImageLoading(false); } }; const loadCurrentRequest = (requestIndex) => { setLoading(true); setImageLoading(true); fetchAllRequests( filterDateRange, filterSubsidiaries, filterReviewState, filterIncludeTests, requestIndex, 1, filterAccuracy, ) .then((data) => { // setRequests(data?.subscription_requests); // setHasNextRequest(data?.subscription_requests.length > 1); setTotalPages(data?.page?.total_requests); setHasNextRequest(requestIndex < data?.page?.total_requests); const requestData = fetchRequest( data?.subscription_requests[0].RequestID, ); requestData .then(async (data) => { if (data) setCurrentRequest(data); const predicted = data && data['Predicted Result'] ? data['Predicted Result'] : {}; const submitted = data && data['Feedback Result'] ? data['Feedback Result'] : {}; const revised = data && data['Reviewed Result'] ? data['Reviewed Result'] : {}; const keys = Object.keys(predicted); const tableRows = []; for (let i = 0; i < keys.length; i++) { let instance = {}; instance['key'] = keys[i]; instance['predicted'] = predicted[keys[i]]; instance['submitted'] = submitted[keys[i]]; instance['revised'] = revised[keys[i]]; tableRows.push(instance); } setDataSource(tableRows); setAndLoadSelectedFile(data, 0); }) .finally(() => { setLoading(false); }); }) .finally(() => { setLoading(false); }); }; const gotoNextRequest = () => { if (currentRequestIndex >= totalRequests) { return; } const nextRequestIndex = currentRequestIndex + 1; setCurrentRequestIndex(nextRequestIndex); loadCurrentRequest(nextRequestIndex); }; const gotoPreviousRequest = () => { if (currentRequestIndex === 1) { return; } const previousRequestIndex = currentRequestIndex - 1; setCurrentRequestIndex(previousRequestIndex); loadCurrentRequest(previousRequestIndex); }; const reloadFilters = () => { setCurrentRequestIndex(1); fetchAllRequests( filterDateRange, filterSubsidiaries, filterReviewState, filterIncludeTests, 1, 1, filterAccuracy, ).then((data) => { setTotalPages(data?.page?.total_requests); // setRequests(data?.subscription_requests); // setHasNextRequest(data?.subscription_requests.length > 1); setHasNextRequest(1 < data?.page?.total_requests); const firstRequest = fetchRequest( data?.subscription_requests[0].RequestID, ); firstRequest.then(async (data) => { if (data) setCurrentRequest(data); setAndLoadSelectedFile(data, 0); setTimeout(() => { loadCurrentRequest(1); }, 500); }); }); }; useEffect(() => { setCurrentRequestIndex(1); fetchAllRequests( filterDateRange, filterSubsidiaries, filterReviewState, filterIncludeTests, 1, 1, filterAccuracy, ).then((data) => { setTotalPages(data?.page?.total_requests); // setRequests(data?.subscription_requests); setHasNextRequest(1 < data?.page?.total_requests); const firstRequest = fetchRequest( data?.subscription_requests[0].RequestID, ); firstRequest.then(async (data) => { if (data) setCurrentRequest(data); setAndLoadSelectedFile(data, 0); }); }); }, []); // "Key", "Accuracy", "Submitted", "Revised" interface DataType { key: string; accuracy: number; submitted: string; revised: string; } const updateRevisedData = async (newRevisedData: any) => { const requestID = currentRequest.RequestID; const token = localStorage.getItem('sbt-token') || ''; const result = await fetch(`${baseURL}/ctel/request/${requestID}/`, { method: 'POST', headers: { Authorization: `${JSON.parse(token)}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ reviewed_result: newRevisedData, }), }).catch((error) => { console.log(error); throw error; }); if (result.status != 200) { throw new Error('Could not update revised data'); } }; const handleSave = (row: DataType) => { const newData = [...dataSource]; const index = newData.findIndex((item) => row.key === item.key); const item = newData[index]; newData.splice(index, 1, { ...item, ...row, }); const newRevisedData = {}; for (let i = 0; i < newData.length; i++) { newData[i].revised = normalizeData(newData[i].key, newData[i].revised); newRevisedData[newData[i].key] = newData[i].revised; } updateRevisedData(newRevisedData) .then(() => { // "[Is Reviewed]" => true setCurrentRequest({ ...currentRequest, ['Is Reviewed']: true, }); }) .then(() => { setDataSource(newData); }) .catch((error) => { message.error( 'Could not update revised data. Please check the format.', ); }); }; const submitRevisedData = async () => { const newData = [...dataSource]; const newRevisedData = {}; for (let i = 0; i < newData.length; i++) { newData[i].revised = normalizeData(newData[i].key, newData[i].revised); newRevisedData[newData[i].key] = newData[i].revised; } updateRevisedData(newRevisedData).then(() => { // "[Is Reviewed]" => true setCurrentRequest({ ...currentRequest, ['Is Reviewed']: true, }); }); }; // use left/right keys to navigate useHotkeys('left', gotoPreviousRequest); useHotkeys('right', gotoNextRequest); const fileExtension = selectedFileName ? selectedFileName.split('.').pop() : ''; const [lightBox, setLightBox] = useState(false); const updateRevised = (fieldName) => { console.log('🚀 ~ updateRevised ~ fieldName:', fieldName); // const tempData = Object.assign({}, selectedFileDataSource); // tempData[fieldName][REVIEWED_RESULT] = tempData[fieldName][FEEDBACK_RESULT]; // console.log('🚀 ~ updateRevised ~ tempData:', tempData); // updateSelectedFileDataSource(tempData); setSelectedFileDataSource((prevData) => { prevData[fieldName][REVIEWED_RESULT] = prevData[fieldName][FEEDBACK_RESULT]; return { ...prevData, }; }); }; // useEffect(() => { // }, [selectedFileDataSource]); console.log('update data:', selectedFileDataSource); return (
Files ({currentRequest?.Files?.length})
{currentRequest?.Files.map((file, index) => (Failed to load file.
) : fileExtension === 'pdf' ? ({data}
} size='small' onClick={() => updateRevised(data)} />