2024-08-02 11:43:51 +01:00
|
|
|
import PdfView from './index.tsx'
|
2024-08-11 22:19:26 +03:00
|
|
|
import MarkFormField from '../MarkFormField'
|
2024-08-02 11:43:51 +01:00
|
|
|
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 {
|
2024-08-11 22:19:26 +03:00
|
|
|
findNextIncompleteCurrentUserMark,
|
|
|
|
getUpdatedMark,
|
2024-08-02 11:43:51 +01:00
|
|
|
isCurrentUserMarksComplete,
|
2024-08-11 22:19:26 +03:00
|
|
|
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 {
|
2024-08-11 22:19:26 +03:00
|
|
|
files: { pdfFile: PdfFile; filename: string; hash: string | null }[]
|
|
|
|
currentUserMarks: CurrentUserMark[]
|
|
|
|
setIsReadyToSign: (isReadyToSign: boolean) => void
|
|
|
|
setCurrentUserMarks: (currentUserMarks: CurrentUserMark[]) => void
|
2024-08-02 11:43:51 +01:00
|
|
|
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)
|
2024-08-11 22:19:26 +03:00
|
|
|
const [selectedMarkValue, setSelectedMarkValue] = useState<string>('')
|
2024-08-02 11:43:51 +01:00
|
|
|
|
|
|
|
useEffect(() => {
|
2024-08-11 22:19:26 +03:00
|
|
|
setSelectedMark(findNextIncompleteCurrentUserMark(currentUserMarks) || null)
|
|
|
|
}, [])
|
2024-08-02 11:43:51 +01:00
|
|
|
|
|
|
|
const handleMarkClick = (id: number) => {
|
2024-08-11 22:19:26 +03:00
|
|
|
const nextMark = currentUserMarks.find((mark) => mark.mark.id === id)
|
|
|
|
setSelectedMark(nextMark!)
|
|
|
|
setSelectedMarkValue(nextMark?.mark.value ?? EMPTY)
|
|
|
|
}
|
|
|
|
|
|
|
|
const handleCurrentUserMarkChange = (mark: CurrentUserMark) => {
|
|
|
|
if (!selectedMark) return
|
|
|
|
const updatedSelectedMark: CurrentUserMark = getUpdatedMark(
|
|
|
|
selectedMark,
|
|
|
|
selectedMarkValue
|
|
|
|
)
|
|
|
|
|
|
|
|
const updatedCurrentUserMarks = updateCurrentUserMarks(
|
|
|
|
currentUserMarks,
|
|
|
|
updatedSelectedMark
|
|
|
|
)
|
|
|
|
setCurrentUserMarks(updatedCurrentUserMarks)
|
|
|
|
setSelectedMark(mark)
|
|
|
|
setSelectedMarkValue(mark.currentValue ?? EMPTY)
|
2024-08-02 11:43:51 +01:00
|
|
|
}
|
|
|
|
|
2024-08-05 14:11:15 +03:00
|
|
|
const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
|
2024-08-11 22:19:26 +03:00
|
|
|
event.preventDefault()
|
|
|
|
if (!selectedMarkValue || !selectedMark) return
|
2024-08-02 11:43:51 +01:00
|
|
|
|
2024-08-11 22:19:26 +03:00
|
|
|
const updatedMark: CurrentUserMark = getUpdatedMark(
|
|
|
|
selectedMark,
|
|
|
|
selectedMarkValue
|
|
|
|
)
|
2024-08-02 11:43:51 +01:00
|
|
|
|
|
|
|
setSelectedMarkValue(EMPTY)
|
2024-08-11 22:19:26 +03:00
|
|
|
const updatedCurrentUserMarks = updateCurrentUserMarks(
|
|
|
|
currentUserMarks,
|
|
|
|
updatedMark
|
|
|
|
)
|
2024-08-02 11:43:51 +01:00
|
|
|
setCurrentUserMarks(updatedCurrentUserMarks)
|
2024-08-11 22:19:26 +03:00
|
|
|
setSelectedMark(null)
|
|
|
|
setIsReadyToSign(true)
|
2024-08-02 11:43:51 +01:00
|
|
|
setUpdatedMarks(updatedMark.mark)
|
|
|
|
}
|
|
|
|
|
2024-08-11 22:19:26 +03:00
|
|
|
// const updateCurrentUserMarkValues = () => {
|
|
|
|
// const updatedMark: CurrentUserMark = getUpdatedMark(selectedMark!, selectedMarkValue)
|
|
|
|
// const updatedCurrentUserMarks = updateCurrentUserMarks(currentUserMarks, updatedMark)
|
|
|
|
// setSelectedMarkValue(EMPTY)
|
|
|
|
// setCurrentUserMarks(updatedCurrentUserMarks)
|
|
|
|
// }
|
|
|
|
|
|
|
|
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-11 22:19:26 +03:00
|
|
|
{currentUserMarks?.length > 0 && (
|
|
|
|
<PdfView
|
|
|
|
files={files}
|
|
|
|
handleMarkClick={handleMarkClick}
|
|
|
|
selectedMarkValue={selectedMarkValue}
|
|
|
|
selectedMark={selectedMark}
|
|
|
|
currentUserMarks={currentUserMarks}
|
|
|
|
/>
|
|
|
|
)}
|
|
|
|
{selectedMark !== null && (
|
|
|
|
<MarkFormField
|
|
|
|
handleSubmit={handleSubmit}
|
|
|
|
handleSelectedMarkValueChange={handleChange}
|
|
|
|
selectedMark={selectedMark}
|
|
|
|
selectedMarkValue={selectedMarkValue}
|
|
|
|
currentUserMarks={currentUserMarks}
|
|
|
|
handleCurrentUserMarkChange={handleCurrentUserMarkChange}
|
|
|
|
/>
|
|
|
|
)}
|
2024-08-06 12:49:16 +03:00
|
|
|
</Container>
|
2024-08-02 11:43:51 +01:00
|
|
|
</>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2024-08-11 22:19:26 +03:00
|
|
|
export default PdfMarking
|