Skip to content

Commit

Permalink
Verify Farmer page, stakeholders address array
Browse files Browse the repository at this point in the history
  • Loading branch information
lakshya-20 committed May 1, 2022
1 parent 8e72e97 commit d7f9cde
Show file tree
Hide file tree
Showing 13 changed files with 193 additions and 10 deletions.
Binary file added src/Assests/Images/admin/rawProducts_o0t5az.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 23 additions & 0 deletions src/Assests/Styles/verify.page.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
.verify{
padding: 10px;
}
.heading {
font-size: 2rem;
font-weight: bold;
color: #023B59;
text-align: center;
text-transform: uppercase;
text-decoration: overline underline;
}

.card-key {
font-size: 1rem;
font-weight: bold;
color: #023B59;
}

.card-value {
font-size: 1rem;
font-weight: 500;
color: #482673;
}
27 changes: 27 additions & 0 deletions src/Pages/Admin/VerifyFarmer/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { useContext, useEffect, useState } from "react";
import { ContractContext } from "../../../Services/Contexts/ContractContext";
import '../../../Assests/Styles/verify.page.css';
import RenderFarmer from "./renderFarmer";

const VerifyFarmer = () => {
const {contractState} = useContext(ContractContext);
const [addresses, setAddresses] = useState([]);
useEffect(() => {
(async() => {
if(contractState.farmerContract){
setAddresses(await contractState.farmerContract.methods.getAddresses().call());
}
})();
}, [contractState.farmerContract])
return (
<div className="verify">
<div className="heading">Verify Farmer</div>
<div className="row">
{addresses.map(address => (
<RenderFarmer id={address} />
))}
</div>
</div>
)
}
export default VerifyFarmer;
94 changes: 94 additions & 0 deletions src/Pages/Admin/VerifyFarmer/renderFarmer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import { useContext, useEffect, useState } from "react";

import { AuthContext } from "../../../Services/Contexts/AuthContext";
import { ContractContext } from "../../../Services/Contexts/ContractContext";
import '../../../Assests/Styles/verify.page.css';
import Toast from "../../../Components/Toast";
import farmer_default from "../../../Assests/Images/admin/rawProducts_o0t5az.jpg";

const RenderFarmer = ({id}) => {
const {authState} = useContext(AuthContext);
const {contractState} = useContext(ContractContext);
const [farmer, setFarmer] = useState({
id: "00000",
name: "",
location: "",
rawProducts: [],
});
useEffect(() => {
if(contractState.farmerContract){
(async() => {
const response = await contractState.farmerContract.methods.getFarmer(id).call({from: id});
setFarmer(farmer => {
return {
...response.farmer,
formattedAddress: id.substring(0, 6) + "..." + id.substring(id.length - 4, id.length),
rawProducts: response.rawProducts
}
});
})();
}
}, [])

const verify = async () => {
try{
await contractState.farmerContract.methods.verify(id).send({from: authState.address});
setFarmer(farmer => {
return {
...farmer,
isVerified: true
}
})
Toast("success", "Farmer verified successfully");
} catch(e){
Toast("error", e.message);
}
}

return (
<div className="col-12 col-lg-6 my-1">
<div className="row d-flex justify-content-around align-items-center">
<div className="col-4">
<img
src={farmer_default}
width="100%"
/>
</div>
<div className="col-8">
<span className="card-key">Id: </span>
<span className="card-value">{farmer.formattedAddress}</span>
<br/>
<span className="card-key">Name: </span>
<span className="card-value">{farmer.name}</span>
<br/>
<span className="card-key">Location: </span>
<span className="card-value">{farmer.location}</span>
<br/>
<span className="card-key">Raw Products: </span>
{farmer.rawProducts.map(rawProduct => (
<span className="card-value">{rawProduct+", "}</span>
))}
<br/>
<span className="row text-center">
{farmer.isVerified?
<span className="">
<span className="badge bg-success">Verified</span>
</span>
:
<span className="">
<span
className="badge bg-info"
type="button"
onClick={verify}
>
Verify
</span>
</span>
}
</span>
</div>
</div>
</div>
)
}
export default RenderFarmer;
8 changes: 0 additions & 8 deletions src/Pages/Admin/verifyFarmer.js

This file was deleted.

2 changes: 1 addition & 1 deletion src/Routes/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import Products from '../Pages/Products';
import Product from '../Pages/Products/product';
import Register from '../Pages/Register';
import Admin from '../Pages/Admin';
import VerifyFarmer from '../Pages/Admin/verifyFarmer';
import VerifyFarmer from '../Pages/Admin/VerifyFarmer';
import VerifyManufacturer from '../Pages/Admin/verifyManufacturer';
import Farmers from '../Pages/Farmers';
import Farmer from '../Pages/Farmers/farmer';
Expand Down
10 changes: 10 additions & 0 deletions src/Services/Actions/ContractActionCreator.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,16 @@ export const contractStateMain = (contract) => ({
payload: { contract }
})

export const contractStateFarmer = (contract) => ({
type: ActionTypes.CONTRACT_STATE_FARMER,
payload: { contract }
})

export const contractStateManufacturer = (contract) => ({
type: ActionTypes.CONTRACT_STATE_MANUFACTURER,
payload: { contract }
})

export const contractStateStakeholder = (contract) => ({
type: ActionTypes.CONTRACT_STATE_STAKEHOLDER,
payload: { contract }
Expand Down
2 changes: 2 additions & 0 deletions src/Services/Constants/ActionTypes.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ export const AUTH_STATE_STAKEHOLDER = 'AUTH_STATE_STAKEHOLDER';
export const CONTRACT_STATE_LOADING = 'CONTRACT_STATE_LOADING';
export const CONTRACT_STATE_FAILED = 'CONTRACT_STATE_FAILED';
export const CONTRACT_STATE_MAIN = 'CONTRACT_STATE_MAIN';
export const CONTRACT_STATE_FARMER = 'CONTRACT_STATE_FARMER';
export const CONTRACT_STATE_MANUFACTURER = 'CONTRACT_STATE_MANUFACTURER';
export const CONTRACT_STATE_STAKEHOLDER = 'CONTRACT_STATE_STAKEHOLDER';
export const CONTRACT_STATE_PRODUCT = 'CONTRACT_STATE_PRODUCT';
export const CONTRACT_STATE_STATS = 'CONTRACT_STATE_STATS';
15 changes: 14 additions & 1 deletion src/Services/Contexts/ContractContext.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,14 @@ import StakeholderContract from '../../Smart-Contract/ABI/Stakeholder.json';
import FarmerContract from '../../Smart-Contract/ABI/Farmer.json';
import ManufacturerContract from '../../Smart-Contract/ABI/Manufacturer.json';
import ProductContract from '../../Smart-Contract/ABI/Product.json';
import { contractStateMain, contractStateProduct, contractStateStakeholder, contractStateStats } from '../Actions/ContractActionCreator';
import {
contractStateMain,
contractStateProduct,
contractStateFarmer,
contractStateManufacturer,
contractStateStakeholder,
contractStateStats
} from '../Actions/ContractActionCreator';
import { authStateStakeholder } from '../Actions/AuthActionCreator';
import { AuthContext } from "./AuthContext";

Expand All @@ -16,6 +23,8 @@ export const ContractContextProvider = ({children}) => {
isLoading: false,
errMess: null,
mainContract: null,
farmerContract: null,
manufacturerContract: null,
stakeholderContract: null,
productContract: null,
stats: {
Expand All @@ -37,6 +46,10 @@ export const ContractContextProvider = ({children}) => {
contractDispatch(contractStateMain(main));
const product = new web3.eth.Contract(ProductContract.abi, ProductContract.networks[networkId].address);
contractDispatch(contractStateProduct(product));
const farmer = new web3.eth.Contract(FarmerContract.abi, FarmerContract.networks[networkId].address);
contractDispatch(contractStateFarmer(farmer));
const manufacturer = new web3.eth.Contract(ManufacturerContract.abi, ManufacturerContract.networks[networkId].address);
contractDispatch(contractStateManufacturer(manufacturer));
const stats = {};
stats["productsCount"] = await product.methods.getProductsCount().call();
stats["transactionsCount"] = await product.methods.getTransactionsCount().call();
Expand Down
14 changes: 14 additions & 0 deletions src/Services/Reducers/ContractReducer.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,20 @@ export const contractReducer = (state, action) => {
errMess: null,
mainContract: action.payload.contract
}
case ActionTypes.CONTRACT_STATE_FARMER:
return {
...state,
isLoading: false,
errMess: null,
farmerContract: action.payload.contract
}
case ActionTypes.CONTRACT_STATE_MANUFACTURER:
return {
...state,
isLoading: false,
errMess: null,
manufacturerContract: action.payload.contract
}
case ActionTypes.CONTRACT_STATE_STAKEHOLDER:
return {
...state,
Expand Down
1 change: 1 addition & 0 deletions src/Smart-Contract/Contracts/Farmer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ contract Farmer is Stakeholder {
for (uint i = 0; i < _rawProducts.length; i++) {
_rawProductFarmers[_rawProducts[i]].push(msg.sender);
}
_stakeholderAddresses.push(msg.sender);
return true;
}

Expand Down
1 change: 1 addition & 0 deletions src/Smart-Contract/Contracts/Manufacturer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ contract Manufacturer is Stakeholder {
require (_stakeholders[msg.sender].id == address(0), "Manufacturer::registerManufacturer: Manufacturer already registered");
_stakeholders[msg.sender] = stakeholder(msg.sender, _name, _location, _role, false);
_isRenewableUsed[msg.sender] = false;
_stakeholderAddresses.push(msg.sender);
return true;
}

Expand Down
6 changes: 6 additions & 0 deletions src/Smart-Contract/Contracts/Stakeholder.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ contract Stakeholder is Admin{
mapping(address => stakeholder) _stakeholders;
mapping(address => mapping(uint256 => bool)) _stakeholderProductOwnership;
mapping(address => mapping(address => bool)) _operatorApprovals;
address[] _stakeholderAddresses;

constructor() Admin(msg.sender){}

Expand All @@ -24,6 +25,7 @@ contract Stakeholder is Admin{
) public virtual returns (bool) {
require (_stakeholders[msg.sender].id == address(0), "Stakeholder::register: Stakeholder already registered");
_stakeholders[msg.sender] = stakeholder(msg.sender, _name, _location, _role, false);
_stakeholderAddresses.push(msg.sender);
return true;
}

Expand Down Expand Up @@ -73,6 +75,10 @@ contract Stakeholder is Admin{
return _stakeholders[_id].role;
}

function getAddresses() public view returns (address[] memory){
return _stakeholderAddresses;
}

modifier onlyStakeholder(address _id){
require(
_id == _stakeholders[msg.sender].id || _stakeholders[msg.sender].id == address(0),
Expand Down

0 comments on commit d7f9cde

Please sign in to comment.