0

I use SPFX React, I am getting data from SharePoint Library which is more than 50000. So I want to make a function for getting data in data table library on behalf of page size and page number.

For example I have 100 data, and page size is 10, so the first time only 10 data is fetched and when I click on next page number than next 10 data will be fetched so that I can reduce the time for getting data. This is just like recursive function.

I made function for this, but I got some error when I click on 11th and more than that page, the web page is blank and the error is:

Type Error: Cannot read properties of undefined (reading 'ID')     at Function. Get (utils.js:29:1)     
at body.js:141:1     
at Array. map (<anonymous>)

below is my code:

const fetchPreviousID = (sizePerPage: number, currentPage: number, internalIDArray: number[]) => {
        if (currentPage > 2 && internalIDArray.length >= sizePerPage * (currentPage - 2)) {
            return internalIDArray[sizePerPage * (currentPage - 2) - 1];
        }
        return null;
    };


    const handlePageChangeWrapper = (searchQuery: any) => {
        return async (page: number, sizePerPage: number) => {
    
            if (page === 1) {
                PublishedDocument(page, sizePerPage, "", searchQuery);
            } else {
                try {
                    if (InternalID.length >= sizePerPage * (page - 2)) {
                        // Assuming GetPreviousID returns a promise that resolves to the previous ID
                        const prevID = fetchPreviousID(sizePerPage, page, InternalID);
    
                        if (prevID !== null) {
                            PublishedDocument(page, sizePerPage, prevID, searchQuery);
                        } else {
                            console.log("No previous ID available.");
                        }
                    } else {
                        console.log("Insufficient InternalID data.");
                    }
                } catch (error) {
                    console.log("Error fetching previous ID:", error);
                }
            }
        };
    };

   const pageSize = 10; // Number of items per page
    const IDCount = InternalID.length;
    
    //VineetCode-------------------------
    const pagination = paginationFactory({
        page: 1,
        sizePerPage: pageSize,
        lastPageText: ">>",
        firstPageText: "<<",
        nextPageText: ">",
        prePageText: "<",
        showTotal: true,
        totalSize: IDCount, // Provide the total size of your data
        onPageChange: handlePageChangeWrapper,
        // ... other properties ...
    });


    const getInternalId = async () => {
        try {
          const baseUrl = props.context.pageContext.web.absoluteUrl;
          const endpoint = `/_api/web/lists/getbytitle('TestPerformance')/items?`;
          const fetchItemIDs = async (url: string) => {
            try {
              const response = await props.context.spHttpClient.get(url, SPHttpClient.configurations.v1);
    
              if (response.ok) {
                const responseJSON = await response.json();
    
                if (responseJSON.value && Array.isArray(responseJSON.value)) {
                  const ids = responseJSON.value.map((item: { ID: any }) => item.ID);
                  setInternalID((prevIDs) => [...prevIDs, ...ids]);
    
                  const nextLink = responseJSON['@odata.nextLink'];
                  if (nextLink) {
                    await fetchItemIDs(nextLink);
                  }
                } else {
                  console.log('Invalid response structure:', responseJSON);
                  alert('Invalid response structure. Check the error in the browser console.');
                }
              } else {
                console.log(`Request failed with status ${response.status}`);
                alert('Something went wrong! Check the error in the browser console.');
              }
            } catch (error) {
              console.log(error);
            }
          };
    
          const initialUrl = `${baseUrl}${endpoint}&$top=4999`;
    
          await fetchItemIDs(initialUrl);
          setidCount(true);
          PublishedDocument(1, pageSize, '');
        } catch (error) {
          console.log(error);
        }
      };

 const PublishedDocument = async (
        pageNumber:any,
        pageSize:any,
        previousID:any,
        searchQuery = ""
      ) => {
        try {
       
          let url = `${props.context.pageContext.web.absoluteUrl}/_api/web/lists/getbytitle('TestPerformance')/items?$select=*&$top=${pageSize}`;
    
           if (searchQuery) {
            // Append $filter query parameter for searching
            url += `&$filter=substringof('${encodeURIComponent(
              searchQuery
            )}', DocumentName)`;
          }
    
          let response;
          if (previousID === "" || previousID === null || previousID < 0) {
            response = await props.context.spHttpClient.get(
              `${props.context.pageContext.web.absoluteUrl}/_api/web/lists/getbytitle('TestPerformance')/items?$select=*`,
              SPHttpClient.configurations.v1,
              {
                headers: {
                  Accept: "application/json;odata=nometadata",
                  "odata-version": "",
                },
              }
            );
          } else {
            if (searchQuery) {
              response = await props.context.spHttpClient.get(
                url,
                SPHttpClient.configurations.v1,
                {
                  headers: {
                    Accept: "application/json;odata=nometadata",
                    "odata-version": "",
                  },
                }
              );
            } else {
              response = await props.context.spHttpClient.get(
                `${props.context.pageContext.web.absoluteUrl}/_api/web/lists/getbytitle('TestPerformance')/items?$select=*&$top=${pageSize}&$skiptoken=Paged%3dTRUE%26p_ID%3d${previousID}`,
                SPHttpClient.configurations.v1,
                {
                  headers: {
                    Accept: "application/json;odata=nometadata",
                    "odata-version": "",
                  },
                }
              );
            }
          }
    
          if (response.ok) {
            const responseJSON = await response.json();
    
            const newData = responseJSON.value.map((item: { ID: any; RUID: any; OrignalID: any; OldTagId: any; DocID: any; DocumentName: any; DocumentType: any; Created: any; AuthorName: any; RevisionNo: any; DocName: any; EncodedAbsUrl: any; }) => ({
              ID: item.ID,
              GuidData: item.RUID,
              OrignalID: item.OrignalID,
              OLDTagID: item.OldTagId,
              DocumentID: item.DocID,
              DocumentName: item.DocumentName,
              DocumentType: item.DocumentType,
              SubmissionDate: item.Created,
              RequestedBy: item.AuthorName,
              Version: item.RevisionNo,
              PublishDocument: item.DocName,
              PublishDocument2: `${props.context.pageContext.web.absoluteUrl}/_layouts/download.aspx?SourceUrl=${item.EncodedAbsUrl}`,
            }));
    
            setPublishDocument(newData);
            // setPublishDocument2((prevFriends) =>:void [
            //   ...prevFriends,
            //   {
            //     downloadpath: `${props.context.pageContext.web.absoluteUrl}/_layouts/download.aspx?SourceUrl=${newData.PublishDocument2}`,
            //   },
            // ]);
          } else {
            const responseJSON = await response.json();
            console.log(responseJSON);
            alert("Something went wrong! Check the error in the browser console.");
          }
        } catch (error) {
          console.log(error);
        }
      };


   use Effect(() => {
    getInternalId();
           }, []);

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.