Skip to content

Commit 9bfd4a3

Browse files
reputation action component
1 parent db2e9d5 commit 9bfd4a3

11 files changed

Lines changed: 178 additions & 26 deletions

File tree

backend/src/integrations/Blockchain/web3/helper-functions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export function UpdateReputationActions(
2222
const subFieldCropsArray: SubFieldCrop[] = subFieldsArray[subFieldIndex].properties.crops;
2323
for(let subFieldCropIndex in subFieldCropsArray){
2424
if(subFieldCropsArray[subFieldCropIndex].crop._id?.toString() === cropId &&
25-
subFieldCropsArray[subFieldCropIndex].farmer === farmer &&
25+
(subFieldCropsArray[subFieldCropIndex].farmer === farmer || subFieldCropsArray[subFieldCropIndex].farmer === "") &&
2626
subFieldCropsArray[subFieldCropIndex].reputation_actions
2727
){
2828
statusUpdated = (subFieldCropsArray[subFieldCropIndex].reputation_actions![actionName] != actionStatus);

backend/src/main.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import smsRoutes from "./routes/sms-route";
2424
import foodTrustRoutes from "./routes/food-trust-route";
2525
import cropTemplateRoutes from "./routes/crop-template-route";
2626
import colony from "./routes/colony-route"
27+
import fields from "./routes/field-route"
2728

2829
import { SocketIOManager, SocketIOManagerInstance } from "./sockets/socket.io";
2930
import { Server } from "http";
@@ -63,6 +64,7 @@ app.use("/api/lot", lotRoutes);
6364
app.use("/api/crop", cropRoutes);
6465
app.use("/api/dashboard", dashboardRoutes);
6566
app.use("/api/recommendations", recommendationsRoutes);
67+
app.use("/api/fields", fields);
6668

6769
app.use("/api/weather", weatherRoutes);
6870
app.use("/api/coopManager", coopManagerRoutes);
@@ -71,9 +73,9 @@ app.use("/api/messaging", messageLogRoutes);
7173
app.use("/api/sms", smsRoutes);
7274

7375
// blockchain related routes
74-
app.use("/api/foodtrust", foodTrustRoutes)
75-
app.use("/api/cropTemplates", cropTemplateRoutes)
76-
app.use("/api/colony", colony)
76+
app.use("/api/foodtrust", foodTrustRoutes);
77+
app.use("/api/cropTemplates", cropTemplateRoutes);
78+
app.use("/api/colony", colony);
7779

7880
// Static Files
7981
const publicPath = path.resolve("public");

backend/src/routes/crop-template-route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ async function updateRepActions(req: Request, res: Response) {
136136
const farmerEthAddress = await farmerSigner.getAddress();
137137
await colony.pay(farmerEthAddress, ethers.utils.parseUnits(payment.toString()));
138138

139-
res.json(docs);
139+
res.status(200).json(docs);
140140
}else{
141141
throw new Error('The request must be made with a different action status than what is existing.');
142142
}

backend/src/routes/field-route.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Router, Request, Response } from "express";
2+
import { Field, FieldModel } from "../db/entities/field";
3+
4+
const router = Router();
5+
6+
router.get("/getFieldByFarmerId/:farmer_id", async(req: Request, res: Response) => {
7+
try{
8+
const docs = await FieldModel.findOne({farmer_id: req.params.farmer_id})
9+
.then(doc => {
10+
return doc;
11+
})
12+
.catch(err => {
13+
return err;
14+
})
15+
res.json(docs);
16+
}catch(e){
17+
console.error(e);
18+
res.status(500).json(e);
19+
}
20+
});
21+
22+
export default router;

backend/src/routes/messaging-route.ts

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import { TwilioInstance } from "./../integrations/twilio/twilio.service";
44
import { MessageLog, MessageLogModel } from "../db/entities/messageLog";
55
import { getFarmerIdsFromIndex, getIndexFromFarmerIds, MessageGroup, MessageGroupModel } from "../db/entities/messageGroup";
66
import { FarmerModel, Farmer } from "../db/entities/farmer";
7-
import { MessageInterfaceSender } from "../integrations/messagingInterfaceSender";
7+
// import { MessageInterfaceSender } from "../integrations/messagingInterfaceSender";
88

99
const router = Router();
1010

11-
const messageSender = new MessageInterfaceSender();
11+
// const messageSender = new MessageInterfaceSender();
1212

1313
router.get("/", async (req, res) => {
1414
const messages = await MessageLogModel.find({}).lean();
@@ -27,8 +27,8 @@ router.post("/sendSMSToFarmer", async (req, res) => {
2727

2828
try {
2929
// const messageLog = await TwilioInstance.sendMessageToFarmer(farmer, message);
30-
const messageLog = await messageSender.sendMessageToFarmer(farmer, message);
31-
res.json(messageLog)
30+
// const messageLog = await messageSender.sendMessageToFarmer(farmer, message);
31+
// res.json(messageLog)
3232
}
3333
catch (e: any) {
3434
res.status(500).send(e).end();
@@ -167,18 +167,18 @@ router.post('/new-thread', async (req, res) => {
167167

168168
try {
169169
// const messageLogs = await TwilioInstance.sendMessageToGroup(group, body.message);
170-
const messageLogs = await messageSender.sendMessageToGroup(group, body.message);
170+
// const messageLogs = await messageSender.sendMessageToGroup(group, body.message);
171171

172-
const thread: ThreadsDTO = {
173-
thread_id: index,
174-
farmers,
175-
isGroup: true,
176-
preview: body.message,
177-
messages: messageLogs
178-
}
172+
// const thread: ThreadsDTO = {
173+
// thread_id: index,
174+
// farmers,
175+
// isGroup: true,
176+
// preview: body.message,
177+
// // messages: messageLogs
178+
// }
179179

180180
// return res.json(messageLogs.map(it => it.messageRef));
181-
return res.json(thread);
181+
// return res.json(thread);
182182
}
183183
catch (e: any) {
184184
res.status(500).send(e).end();
@@ -213,8 +213,8 @@ router.post('/thread', async (req, res) => {
213213

214214
try {
215215
// const messageLogs = await TwilioInstance.sendMessageToGroup(group, body.message);
216-
const messageLogs = await messageSender.sendMessageToGroup(group, body.message);
217-
return res.json(messageLogs.map(it => it.messageRef));
216+
// const messageLogs = await messageSender.sendMessageToGroup(group, body.message);
217+
// return res.json(messageLogs.map(it => it.messageRef));
218218
}
219219
catch (e: any) {
220220
res.status(500).send(e).end();
@@ -228,8 +228,8 @@ router.post('/thread', async (req, res) => {
228228

229229
try {
230230
// const messageLog = await TwilioInstance.sendMessageToFarmer(farmer, message);
231-
const messageLog = await messageSender.sendMessageToFarmer(farmer, message);
232-
res.json(messageLog)
231+
// const messageLog = await messageSender.sendMessageToFarmer(farmer, message);
232+
// res.json(messageLog)
233233
}
234234
catch (e: any) {
235235
res.status(500).send(e).end();

package-lock.json

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

react-app/src/components/Crops/CropTemplate.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { CropTemplate, CropTemplateAPI} from "../../services/cropTemplate";
55
import { CropService } from "../../services/CropService";
66
import { Crop } from "../../services/crops";
77
import { getFarmer, Farmer } from "../../services/farmers";
8+
import { Field } from "../../types/field";
9+
import ReputationActions from "../Farmers/ReputationActions";
810

911
import { UpdateSubFieldWithCropTemplate, OrganizeReputationActions } from './helperFunctions';
1012
import { ColonyAPI } from '../../services/colony';
@@ -274,6 +276,7 @@ const CropTemplateSelector = () => {
274276
<Button type="button" style={{background: "green"}} onClick={handleSubmit}>Create New Template</Button>
275277
</Column>
276278
</Row>
279+
<ReputationActions selectedCrop={selectedCrop}/>
277280
</>
278281
)
279282
}

react-app/src/components/Crops/helperFunctions.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,22 @@ export async function UpdateSubFieldWithCropTemplate(
3636

3737
// update field.subfields.properties.crops with reputation and croptemplate in mongodb
3838
const res = await cropTemplateAPI.addCropTemplateToField(currentField);
39-
console.log("updated field: ", res)
4039
}
4140
}
4241

4342
export function OrganizeReputationActions(field: any): Record<string, boolean>[]{
4443
let reputationMaps: Record<string, boolean>[] = []
45-
44+
4645
const subFieldsArray: any = field.subFields;
46+
4747
for(let subFieldIndex in subFieldsArray){
4848
const subFieldCropsArray: any = subFieldsArray[subFieldIndex].properties.crops;
49+
4950
for(let subFieldCropIndex in subFieldCropsArray){
5051
if(subFieldCropsArray[subFieldCropIndex].reputation_actions != null){
5152
reputationMaps.push(subFieldCropsArray[subFieldCropIndex].reputation_actions!)
5253
}
5354
}
5455
}
55-
5656
return reputationMaps
5757
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import React, { useEffect, useState } from "react";
2+
import { Field } from "../../types/field";
3+
import { Farmer, getAllFarmers } from "../../services/farmers";
4+
import { Column, Row, Select, SelectItem, Toggle } from "carbon-addons-iot-react";
5+
import { FieldAPI } from "../../services/fields";
6+
import { CropTemplateAPI } from "../../services/cropTemplate"
7+
import { OrganizeReputationActions } from '../Crops/helperFunctions';
8+
9+
const fieldAPI = new FieldAPI();
10+
const cropTemplateAPI = new CropTemplateAPI();
11+
const ReputationActions = (props: any) => {
12+
const [field, setField] = useState<Field>();
13+
const [farmer, setFarmer] = useState<string>();
14+
const [farmerList, setFarmerList] = useState<Farmer[]>([]);
15+
const [reputationActionMap, setReputationActionMap] = useState<any>({});
16+
17+
const handleClick = async(key: string) => {
18+
19+
const response = await cropTemplateAPI.updateRepActions(field, props.selectedCrop, farmer!, key, true);
20+
if(response.status === 200){
21+
let newReputationActionMap = [...reputationActionMap];
22+
newReputationActionMap[0][key] = true;
23+
setReputationActionMap(newReputationActionMap);
24+
}
25+
}
26+
27+
const getValueMap = (actionMap: any) => {
28+
// console.log('actionMap: ', actionMap);
29+
let actions = []
30+
for(let key in actionMap[0]) {
31+
actions.push(
32+
<Row>
33+
<Toggle
34+
toggled={actionMap[0][key]}
35+
id={key}
36+
labelA="Incomplete"
37+
labelB="Complete"
38+
labelText={key}
39+
onClick={() => handleClick(key)}
40+
/>
41+
</Row>
42+
)
43+
}
44+
return(actions);
45+
}
46+
47+
const getFarmerList = async() => {
48+
const farmers = await getAllFarmers();
49+
setFarmerList(farmers);
50+
}
51+
52+
const handleFarmerSelection = async(event:any) => {
53+
const fieldResponse = await fieldAPI.getFieldForFarmer(event.target.value);
54+
setFarmer(event.target.value);
55+
setField(fieldResponse);
56+
setReputationActionMap(OrganizeReputationActions(fieldResponse));
57+
}
58+
59+
useEffect(() => {
60+
if(!farmerList.length){
61+
getFarmerList();
62+
}
63+
64+
},[])
65+
66+
return(
67+
<>
68+
<Row>
69+
<Column>
70+
<Select
71+
defaultValue="select-crop"
72+
helperText=""
73+
id="select-1"
74+
labelText="Farmers"
75+
size="md"
76+
onChange={handleFarmerSelection}
77+
>
78+
<SelectItem
79+
disabled
80+
hidden
81+
text="Select A Farmer"
82+
value="select-farmer"
83+
/>
84+
{
85+
farmerList.map((item: Farmer) => {
86+
return(
87+
<SelectItem
88+
text={item.name}
89+
value={item._id}
90+
/>
91+
)
92+
})
93+
}
94+
</Select>
95+
</Column>
96+
</Row>
97+
{(Object.keys(reputationActionMap).length > 0) && getValueMap(reputationActionMap).map((item) => {
98+
return(
99+
<>
100+
{item}
101+
</>
102+
)
103+
})
104+
}
105+
</>
106+
)
107+
}
108+
109+
export default ReputationActions;

react-app/src/services/cropTemplate.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export class CropTemplateAPI{
5050
actionName : actionName,
5151
actionStatus : actionStatus
5252
});
53-
return data.data
53+
return data
5454
}
5555

5656
async addCropTemplateToField(field: any): Promise<any> {

0 commit comments

Comments
 (0)