0

I have successfully implemented react-pdf. The pdf has 3 navigation buttons - Return, Previous, and Next. The button that does not work is "Return". The functioning components are Send.js and RenderPDF.js. Send.js displays a list of documents with an "Invoice" button adjacent to each item. Clicking Invoice sends a prop (pdf name) to RenderPDF.js, which renders the pdf. I have no graceful means of returning to Send.js after viewing the pdf. Using history.push(), I can return to any other page in my site except Send.js. Any suggestions?

send.js

import React, {
    useContext,
    useEffect,
    useState
} from 'react';
import PageTitle from '../components/common/PageTitle';
import SendPageHeading from '../components/common/SendPageHeading';
import {
    FetchContext
} from '../context/FetchContext';
import ButtonDanger from '../components/common/ButtonDanger';
import ButtonLookup from '../components/common/ButtonLookUp';
import FormError from '../components/FormError';

import {
    RenderPDF
} from '../components/common/RenderPDF.js';

const SendItemContainer = ({
    children
}) => ( <
    div className = "bg-white rounded shadow-md mb-2 p-0" > {
        children
    } < /div>
);

const SendItem = ({
    item,
    handlePdfProcess,
    onDelete
}) => {
    return ( <
        div className = "flex" >
        <
        div className = "flex flex-row w-full" >
        <
        div className = "flex flex-row w-full my-1 " >
        <
        div className = "relative text-sm w-8 left-0 text-gray-600" > {
            item.companyKey
        } <
        /div> <
        div className = "relative text-sm w-88 left-50 text-gray-600" > {
            item.companyName
        } <
        /div> <
        div className = "relative text-sm w-8 left-100 text-gray-600" > {
            item.docType
        } <
        /div> <
        div className = "relative text-sm w-8 left-125 text-gray-600" > {
            item.docNo
        } <
        /div> <
        div className = "relative text-sm w-24 left-175 text-gray-600" > {
            item.docDate.substr(5, 2) +
            '-' +
            item.docDate.substr(8, 2) +
            '-' +
            item.docDate.substr(0, 4)
        } <
        /div> <
        div className = "relative text-sm w-94 left-225"
        style = {
            item.emailTo.indexOf(' ') === -1 ?
            {
                color: '#212529'
            } :
            {
                color: '#e53e3e',
                fontWeight: 'bold'
            }
        } >
        {
            item.emailTo
        } <
        /div> <
        div className = "relative text-sm w-8 left-275 text-gray-600" > {
            item.emailStatus
        } <
        /div> <
        /div> <
        div className = "flex flex-row self-end mr-3" >
        <
        ButtonLookup text = "Invoice"
        onClick = {
            () => handlePdfProcess(item)
        }
        /> <
        ButtonDanger text = "Delete"
        onClick = {
            () => onDelete(item)
        }
        /> <
        /div> <
        /div> <
        /div>
    );
};

const Send = () => {
        const fetchContext = useContext(FetchContext);
        const [docData, setDocData] = useState([]);
        const [pdfData, setPdfData] = useState();
        const [pdfFlag, setPdfFlag] = useState(false);
        const [errorMessage, setErrorMessage] = useState();

        useEffect(() => {
            const getSend = async () => {
                try {
                    const {
                        data
                    } = await fetchContext.authAxios.get('send');
                    setDocData(data);
                } catch (err) {
                    console.log('the err', err);
                }
            };

            getSend();
        }, [fetchContext]);

        const onDelete = async item => {
            try {
                if (window.confirm('Are you sure you want to delete this item?')) {
                    const {
                        data
                    } = await fetchContext.authAxios.delete(
                        `docData/${item.id}`
                    );
                    setDocData(docData.filter(item => item.id !== data.modifiedItem.id));
                }
            } catch (err) {
                const {
                    data
                } = err.response;
                setErrorMessage(data.message);
            }
        };

        const handlePdfProcess = item => {
            // const docName = item.docName;

            setPdfData(`${item.docName}`);

            setPdfFlag(true);
            console.log(` pdfFlag: ${pdfFlag}`);
        };

        return pdfFlag ? ( <
            >
            <
            RenderPDF dataFromSend = {
                pdfData
            }
            /> <
            />
        ) : ( <
            >
            <
            PageTitle title = "Invoice Staging" / >
            <
            SendPageHeading / > {
                errorMessage && < FormError text = {
                    errorMessage
                }
                />} {
                    docData && docData.length ?
                        docData.map(item => ( <
                            SendItemContainer key = {
                                item.id
                            } >
                            <
                            SendItem item = {
                                item
                            }
                            handlePdfProcess = {
                                handlePdfProcess
                            }
                            /> <
                            SendItem item = {
                                item
                            }
                            onDelete = {
                                onDelete
                            }
                            /> <
                            /SendItemContainer>
                        )) :
                        'No Document Items'
                } <
                />
            );
        };

        export default Send;

< RenderPDF.js

import React, {
    useState
} from 'react';
import {
    Document,
    Page,
    pdfjs
} from 'react-pdf/dist/esm/entry.webpack';
import {
    useHistory
} from 'react-router-dom';

pdfjs.GlobalWorkerOptions.workerSrc = '/pdf.worker.js';

export const RenderPDF = dataFromSend => {
    const [numPages, setNumPages] = useState(null);
    const [pageNumber, setPageNumber] = useState(1); //setting 1 to show fisrt page

    const history = useHistory(null);

    function onDocumentLoadSuccess({
        numPages
    }) {
        setNumPages(numPages);
        setPageNumber(1);
    }

    const findValueByPrefix = (object, prefix) => {
        for (var property in object) {
            if (
                object.hasOwnProperty(property) &&
                property.toString().startsWith(prefix)
            ) {
                return object[property];
            }
        }
    };

    let pdfDoc = findValueByPrefix(dataFromSend, 'dataFromSend');
    pdfDoc = `/pdfs/${pdfDoc}`;
    console.log(`  prop: ${pdfDoc}`);

    function changePage(offset) {
        setPageNumber(prevPageNumber => prevPageNumber + offset);
    }

    function previousPage() {
        changePage(-1);
    }

    function nextPage() {
        changePage(1);
    }

    const return2Send = () => {
        let path = '/send';
        history.push(path);
    };

    return ( <
        >
        <
        Document file = {
            pdfDoc
        }
        onLoadSuccess = {
            onDocumentLoadSuccess
        } >
        <
        Page pageNumber = {
            pageNumber
        }
        /> <
        /Document> <
        div >
        <
        p >
        Page {
            pageNumber || (numPages ? 1 : '--')
        }
        of {
            numPages || '--'
        } <
        /p> <
        button type = "button"
        style = {
            {
                marginRight: '24px'
            }
        }
        onClick = {
            return2Send
        } >
        Return <
        /button> <
        button type = "button"
        disabled = {
            pageNumber <= 1
        }
        style = {
            {
                marginRight: '24px'
            }
        }
        onClick = {
            previousPage
        } >
        Previous <
        /button> <
        button type = "button"
        disabled = {
            pageNumber >= numPages
        }
        onClick = {
            nextPage
        } >
        Next <
        /button> <
        /div> <
        />
    );
};
Lannie
  • 15
  • 4

0 Answers0