2024-08-02 11:43:51 +01:00
|
|
|
import PdfView from './index.tsx'
|
|
|
|
import MarkFormField from '../../pages/sign/MarkFormField.tsx'
|
|
|
|
import { PdfFile } from '../../types/drawing.ts'
|
|
|
|
import { CurrentUserMark, Mark } from '../../types/mark.ts'
|
2024-08-05 14:11:15 +03:00
|
|
|
import React, { useState, useEffect } from 'react'
|
2024-08-02 11:43:51 +01:00
|
|
|
import {
|
|
|
|
findNextCurrentUserMark,
|
|
|
|
isCurrentUserMarksComplete,
|
|
|
|
updateCurrentUserMarks,
|
2024-08-06 12:49:16 +03:00
|
|
|
} from '../../utils'
|
2024-08-02 11:43:51 +01:00
|
|
|
import { EMPTY } from '../../utils/const.ts'
|
2024-08-06 12:49:16 +03:00
|
|
|
import { Container } from '../Container'
|
|
|
|
import styles from '../../pages/sign/style.module.scss'
|
2024-08-02 11:43:51 +01:00
|
|
|
|
|
|
|
interface PdfMarkingProps {
|
|
|
|
files: { pdfFile: PdfFile, filename: string, hash: string | null }[],
|
|
|
|
currentUserMarks: CurrentUserMark[],
|
|
|
|
setIsReadyToSign: (isReadyToSign: boolean) => void,
|
|
|
|
setCurrentUserMarks: (currentUserMarks: CurrentUserMark[]) => void,
|
|
|
|
setUpdatedMarks: (markToUpdate: Mark) => void
|
|
|
|
}
|
|
|
|
|
2024-08-05 14:11:15 +03:00
|
|
|
/**
|
|
|
|
* Top-level component responsible for displaying Pdfs, Pages, and Marks,
|
|
|
|
* as well as tracking if the document is ready to be signed.
|
|
|
|
* @param props
|
|
|
|
* @constructor
|
|
|
|
*/
|
2024-08-02 11:43:51 +01:00
|
|
|
const PdfMarking = (props: PdfMarkingProps) => {
|
|
|
|
const {
|
|
|
|
files,
|
|
|
|
currentUserMarks,
|
|
|
|
setIsReadyToSign,
|
|
|
|
setCurrentUserMarks,
|
|
|
|
setUpdatedMarks
|
|
|
|
} = props
|
|
|
|
const [selectedMark, setSelectedMark] = useState<CurrentUserMark | null>(null)
|
|
|
|
const [selectedMarkValue, setSelectedMarkValue] = useState<string>("")
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
setSelectedMark(findNextCurrentUserMark(currentUserMarks) || null)
|
|
|
|
}, [currentUserMarks])
|
|
|
|
|
|
|
|
const handleMarkClick = (id: number) => {
|
|
|
|
const nextMark = currentUserMarks.find((mark) => mark.mark.id === id);
|
|
|
|
setSelectedMark(nextMark!);
|
|
|
|
setSelectedMarkValue(nextMark?.mark.value ?? EMPTY);
|
|
|
|
}
|
|
|
|
|
2024-08-05 14:11:15 +03:00
|
|
|
const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
|
2024-08-02 11:43:51 +01:00
|
|
|
event.preventDefault();
|
|
|
|
if (!selectedMarkValue || !selectedMark) return;
|
|
|
|
|
|
|
|
const updatedMark: CurrentUserMark = {
|
|
|
|
...selectedMark,
|
|
|
|
mark: {
|
|
|
|
...selectedMark.mark,
|
|
|
|
value: selectedMarkValue
|
|
|
|
},
|
|
|
|
isCompleted: true
|
|
|
|
}
|
|
|
|
|
|
|
|
setSelectedMarkValue(EMPTY)
|
|
|
|
const updatedCurrentUserMarks = updateCurrentUserMarks(currentUserMarks, updatedMark);
|
|
|
|
setCurrentUserMarks(updatedCurrentUserMarks)
|
|
|
|
setSelectedMark(findNextCurrentUserMark(updatedCurrentUserMarks) || null)
|
|
|
|
console.log(isCurrentUserMarksComplete(updatedCurrentUserMarks))
|
|
|
|
setIsReadyToSign(isCurrentUserMarksComplete(updatedCurrentUserMarks))
|
|
|
|
setUpdatedMarks(updatedMark.mark)
|
|
|
|
}
|
|
|
|
|
2024-08-05 14:11:15 +03:00
|
|
|
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => setSelectedMarkValue(event.target.value)
|
2024-08-02 11:43:51 +01:00
|
|
|
|
|
|
|
return (
|
|
|
|
<>
|
2024-08-06 12:49:16 +03:00
|
|
|
<Container className={styles.container}>
|
2024-08-02 11:43:51 +01:00
|
|
|
{
|
|
|
|
currentUserMarks?.length > 0 && (
|
|
|
|
<PdfView
|
|
|
|
files={files}
|
|
|
|
handleMarkClick={handleMarkClick}
|
|
|
|
selectedMarkValue={selectedMarkValue}
|
|
|
|
selectedMark={selectedMark}
|
|
|
|
currentUserMarks={currentUserMarks}
|
|
|
|
/>)}
|
|
|
|
{
|
|
|
|
selectedMark !== null && (
|
|
|
|
<MarkFormField
|
|
|
|
handleSubmit={handleSubmit}
|
|
|
|
handleChange={handleChange}
|
|
|
|
selectedMark={selectedMark}
|
|
|
|
selectedMarkValue={selectedMarkValue}
|
|
|
|
/>
|
|
|
|
)}
|
2024-08-06 12:49:16 +03:00
|
|
|
</Container>
|
2024-08-02 11:43:51 +01:00
|
|
|
</>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
export default PdfMarking
|