Приложение React постоянно ломается при рендеринге списков - PullRequest
0 голосов
/ 18 июня 2020

Я создаю приложение, которое требует создания списка. У меня есть код ниже. У меня есть кнопка, которая вызывает getPledges и отображает список. При подключении к MetaMask и ганашу он работает до момента, когда returnPledge вызывается в первый раз. В первый раз кажется, что это работает, но потом getPledges и returnPledge больше не работают.

  const getPledges = async (e) => {
    e.preventDefault();
    const pledges = await SixtySixDays.methods.getPledges().call()
    let pledgeData = [];
    for (let i in pledges) {
      const data = await SixtySixDays.methods.getPledgeData(i).call();
      pledgeData.push({id: i, data: data});
    }
    console.log(pledgeData);
    const listItems = pledgeData.map((pledge) =>
      <li key={pledge.id}><b>Name:</b> {pledge.data[2]} - <b>Amount:</b> {pledge.data[1]} ETH -
      <b>Remaining Time: </b> {pledge.data[0]}</li>
    );
    setListItems(listItems);
  }

  function returnPledge(pledgeId) {
    SixtySixDays.methods.returnDeposit(pledgeId).send({from: address});
  }

Соответствующая часть смарт-контракта SixtySixDays:

    function returnDeposit(uint _id) public onlyOwner(_id) {
        require(pledges[_id].endTime < now, 'You have not completed 66 Days');
        msg.sender.transfer(pledges[_id].amount);
        pledges[_id].returned = true;
        addressPledgeCount[msg.sender]--;
    }

    //@notice returns the pledges owned by an address which havent returned the deposit
    function getPledges() external view returns(uint[] memory) {
        uint[] memory result = new uint[](addressPledgeCount[msg.sender]);
        uint count = 0;
        for (uint i = 0; i < pledges.length; i++) {
          if (idToAddress[i] == msg.sender && pledges[i].returned == false) {
            result[count] = i;
            count++;
          }
        }
        return result;
    }
    //@notice function to return info about pledges
    function getPledgeData(uint _id) external view onlyOwner(_id) returns(uint, uint, string memory, bool) {
        uint timeLeft;
        pledges[_id].endTime <= now ? timeLeft = 0 : timeLeft = pledges[_id].endTime - now;
        return (timeLeft, pledges[_id].amount, pledges[_id].label, pledges[_id].returned);
    }
}

Я знаю, что это длинный пост, но у меня много часов безуспешно. Если есть что-нибудь вопиющее, дайте мне знать.

...