From 285eeb11d47104cb8e60df2f3202e50ad95fe67c Mon Sep 17 00:00:00 2001 From: Aquaticholic Date: Sat, 29 Jan 2022 17:05:42 +0000 Subject: [PATCH] processed data bucket context --- .../testdata.1643440069.couch | Bin 192711 -> 221386 bytes .../testdata.1643440069.couch | Bin 61645 -> 135373 bytes webserver/src/App.jsx | 6 +- webserver/src/DbContext.jsx | 6 +- .../src/Pages/DashboardPage/DashboardPage.jsx | 61 ------------- .../DashboardPage/ProcessedDataContext.jsx | 85 ------------------ webserver/src/ProcessedDataBucket.jsx | 65 ++++++++++++++ webserver/src/ProcessedDataBucketContext.jsx | 18 ++++ 8 files changed, 91 insertions(+), 150 deletions(-) delete mode 100644 webserver/src/Pages/DashboardPage/ProcessedDataContext.jsx create mode 100644 webserver/src/ProcessedDataBucket.jsx create mode 100644 webserver/src/ProcessedDataBucketContext.jsx diff --git a/couchdb/data/shards/00000000-7fffffff/testdata.1643440069.couch b/couchdb/data/shards/00000000-7fffffff/testdata.1643440069.couch index 9e4db84550909039d06a1062b45fbfdb3a326e8e..d8cf24a136908c9ffefddccd9322a08e759241f3 100644 GIT binary patch delta 3014 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 delta 9 RcmX@RkmKw_<_%{*000_S1(g5* diff --git a/webserver/src/App.jsx b/webserver/src/App.jsx index 7f1a00d..48f54e4 100644 --- a/webserver/src/App.jsx +++ b/webserver/src/App.jsx @@ -20,7 +20,7 @@ import { createMuiTheme, ThemeProvider } from '@material-ui/core' import { Formik, Field, Form } from 'formik'; import { TextField, Button, Grid, FormRow, Checkbox, Radio, FormControlLabel, FormControl, FormLabel, RadioGroup, IconButton, InputAdornment } from "@material-ui/core"; import { AddCircleOutline, RemoveCircleOutline } from "@material-ui/icons"; -import { ProcessedDataProvider } from "./Pages/DashboardPage/ProcessedDataContext"; +import { ProcessedDataBucketProvider } from "./ProcessedDataBucketContext"; @@ -44,7 +44,7 @@ function App() {
- + @@ -55,7 +55,7 @@ function App() { } /> - +
diff --git a/webserver/src/DbContext.jsx b/webserver/src/DbContext.jsx index 94eda13..7c7a682 100644 --- a/webserver/src/DbContext.jsx +++ b/webserver/src/DbContext.jsx @@ -1,5 +1,6 @@ import PouchDB from "pouchdb"; import React, { useContext, useState } from "react"; +import { ProcessedDataBucketContext } from "./ProcessedDataBucketContext"; const LocalDbContext = React.createContext(); const RemoteDbContext = React.createContext(); @@ -40,7 +41,10 @@ export function DbProvider({ children }) { live: true, retry: true, }) - .on("change", function (change) { }) + .on("change", function (change) { + const pdb = React.useContext(ProcessedDataBucketContext); + console.log(pdb); + }) .on("paused", function (info) { }) .on("active", function (info) { }) .on("error", function (err) { diff --git a/webserver/src/Pages/DashboardPage/DashboardPage.jsx b/webserver/src/Pages/DashboardPage/DashboardPage.jsx index b1a5969..d86efe3 100644 --- a/webserver/src/Pages/DashboardPage/DashboardPage.jsx +++ b/webserver/src/Pages/DashboardPage/DashboardPage.jsx @@ -3,67 +3,6 @@ import { useLocalDb } from "../../DbContext"; import { Bar, Chart } from "react-chartjs-2"; const DashboardPage = () => { - const localdb = useLocalDb(); - let processed_data = {}; - localdb - .allDocs({ - include_docs: true, - }) - .then((result) => { - console.log(result); - result.rows.forEach((dbentry) => { - let doc = dbentry.doc; - console.log(doc); - //if there's no processed data on a team yet, create a default data entry - if (typeof processed_data[doc.team_name] === "undefined") { - processed_data[doc.team_name] = { - team_name: doc.team_name, - alliance: doc.alliance, - games_played: 0, - climbs_none: 0, - climbs_low: 0, - climbs_mid: 0, - climbs_high: 0, - climbs_transverse: 0, - points: 0, - point_average: 0, - num_disables: 0, - disables_average: 0, - num_flips: 0, - flips_average: 0, - fouls: 0, - fouls_average: 0, - fouls_tech: 0, - fouls_tech_average: 0, - }; - } - - let team_data = processed_data[doc.team_name]; - console.log(team_data); - let new_team_data = { - ...team_data, - games_played: team_data.games_played + 1, - num_climbs: team_data.num_climbs + (doc.climb == true ? 1 : 0), - num_disables: team_data.num_disables + (doc.disabled == true ? 1 : 0), - num_flips: team_data.num_flips + (doc.flipped_over == true ? 1 : 0), - fouls: team_data.fouls + parseInt(doc.fouls), - fouls_tech: team_data.fouls_tech + parseInt(doc.fouls_tech), - inner_port: team_data.inner_port + parseInt(doc.inner_port), - outer_port: team_data.outer_port + parseInt(doc.outer_port), - lower_port: team_data.lower_port + parseInt(doc.lower_port), - }; - console.log(new_team_data); - }); - }) - .catch((err) => { - console.log("Error Fetching Docs from Database!"); - console.log(err); - }); - let datasets = [ - { - data: [], - }, - ]; //https://react-charts.js.org/examples/column return
; }; diff --git a/webserver/src/Pages/DashboardPage/ProcessedDataContext.jsx b/webserver/src/Pages/DashboardPage/ProcessedDataContext.jsx deleted file mode 100644 index 2de95aa..0000000 --- a/webserver/src/Pages/DashboardPage/ProcessedDataContext.jsx +++ /dev/null @@ -1,85 +0,0 @@ -import React, { useContext, useState } from "react"; -import { useLocalDb } from "../../DbContext"; - -const ProcessedDataContext = React.createContext(); -export function useProcessedData() { - return useContext(processedDataContext); -} - -export function ProcessedDataProvider({ children }) { - const [processedData, setProcessedData] = useState( - { - teamData: null, - matchData: null, - updateData: function () { - const localdb = useLocalDb(); - // let processed_data = {}; - localdb - .allDocs({ - include_docs: true, - }) - .then((result) => { - console.log(result); - result.rows.forEach((dbentry) => { - let doc = dbentry.doc; - console.log(doc); - //if there's no processed data on a team yet, create a default data entry - if (typeof teamData[doc.team_name] === "undefined") { - teamData[doc.team_name] = { - team_name: doc.team_name, - alliance: doc.alliance, - games_played: 0, - climbs_none: 0, - climbs_low: 0, - climbs_mid: 0, - climbs_high: 0, - climbs_transverse: 0, - points: 0, - point_average: 0, - num_disables: 0, - disables_average: 0, - num_flips: 0, - flips_average: 0, - fouls: 0, - fouls_average: 0, - fouls_tech: 0, - fouls_tech_average: 0, - }; - } - - let thisTeamData = teamData[doc.team_name]; - console.log(thisTeamData); - let new_team_data = { - ...team_data, - games_played: team_data.games_played + 1, - num_climbs: team_data.num_climbs + (doc.climb == true ? 1 : 0), - num_disables: team_data.num_disables + (doc.disabled == true ? 1 : 0), - num_flips: team_data.num_flips + (doc.flipped_over == true ? 1 : 0), - fouls: team_data.fouls + parseInt(doc.fouls), - fouls_tech: team_data.fouls_tech + parseInt(doc.fouls_tech), - inner_port: team_data.inner_port + parseInt(doc.inner_port), - outer_port: team_data.outer_port + parseInt(doc.outer_port), - lower_port: team_data.lower_port + parseInt(doc.lower_port), - }; - console.log(new_team_data); - }); - }) - .catch((err) => { - console.log("Error Fetching Docs from Database!"); - console.log(err); - }); - let datasets = [ - { - data: [], - }, - ]; - } - } - ); - //https://react-charts.js.org/examples/column - return ( - - {children} - - ); -}; \ No newline at end of file diff --git a/webserver/src/ProcessedDataBucket.jsx b/webserver/src/ProcessedDataBucket.jsx new file mode 100644 index 0000000..e80226b --- /dev/null +++ b/webserver/src/ProcessedDataBucket.jsx @@ -0,0 +1,65 @@ +export class ProcessedDataBucket { + constructor() { + this.teamData = null; + this.matchData = null; + this.updateData = (db) => { + db.allDocs({ + include_docs: true, + }) + .then((result) => { + console.log(result); + result.rows.forEach((dbentry) => { + let doc = dbentry.doc; + console.log(doc); + //if there's no processed data on a team yet, create a default data entry + if (typeof this.teamData[doc.team_name] === "undefined") { + this.teamData[doc.team_name] = { + team_name: doc.team_name, + alliance: doc.alliance, + games_played: 0, + climbs_none: 0, + climbs_low: 0, + climbs_mid: 0, + climbs_high: 0, + climbs_transverse: 0, + points: 0, + point_average: 0, + num_disables: 0, + disables_average: 0, + num_flips: 0, + flips_average: 0, + fouls: 0, + fouls_average: 0, + fouls_tech: 0, + fouls_tech_average: 0, + }; + } + let thisTeamData = this.teamData[doc.team_name]; + console.log(thisTeamData); + let new_team_data = { + ...thisTeamData, + games_played: thisTeamData.games_played + 1, + num_climbs: thisTeamData.num_climbs + (doc.climb == true ? 1 : 0), + num_disables: thisTeamData.num_disables + (doc.disabled == true ? 1 : 0), + num_flips: thisTeamData.num_flips + (doc.flipped_over == true ? 1 : 0), + fouls: thisTeamData.fouls + parseInt(doc.fouls), + fouls_tech: thisTeamData.fouls_tech + parseInt(doc.fouls_tech), + inner_port: thisTeamData.inner_port + parseInt(doc.inner_port), + outer_port: thisTeamData.outer_port + parseInt(doc.outer_port), + lower_port: thisTeamData.lower_port + parseInt(doc.lower_port), + }; + console.log(new_team_data); + }); + }) + .catch((err) => { + console.log("Error Fetching Docs from Database!"); + console.log(err); + }); + let datasets = [ + { + data: [], + }, + ]; + }; + } +} \ No newline at end of file diff --git a/webserver/src/ProcessedDataBucketContext.jsx b/webserver/src/ProcessedDataBucketContext.jsx new file mode 100644 index 0000000..5505607 --- /dev/null +++ b/webserver/src/ProcessedDataBucketContext.jsx @@ -0,0 +1,18 @@ +import React, { useContext, useState } from "react"; +import { useLocalDb } from "./DbContext"; +import { ProcessedDataBucket } from "./ProcessedDataBucket.jsx" + +export const ProcessedDataBucketContext = React.createContext(); +export function useProcessedDataBucket() { + return useContext(ProcessedDataBucketContext); +} + +export function ProcessedDataBucketProvider({ children }) { + //create the processed data bucket object + const [processedDataBucket, setProcessedDataBucket] = useState(new ProcessedDataBucket()); + return ( + + {children} + + ); +}; \ No newline at end of file