Skip to content

Commit 49099e8

Browse files
committed
attempts to make the code more readable - also remove runtime warnings
1 parent 7affe0e commit 49099e8

File tree

10 files changed

+81
-112
lines changed

10 files changed

+81
-112
lines changed

scoutingapp/src/App.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Routes, Route } from 'react-router-dom';
33
import { Page, ParentPage, StoragePage } from "./components/pages"
44
import structure from "./config/structure.json"
55
import React from 'react';
6+
import {PageSetup} from "./components/interface";
67

78

89
function App() {
@@ -14,9 +15,9 @@ function App() {
1415
<Routes>
1516
<Route path='/' element={<ParentPage pageSetup={structure}/>}></Route>
1617
{
17-
structure.map((page) => {
18+
structure.map((page: PageSetup, key: number) => {
1819
return (
19-
<Route path={'/'+page.name.replaceAll(/\s/g,'')} element={<Page config={page}/>}></Route>
20+
<Route key={key} path={'/'+page.name.replaceAll(/\s/g,'')} element={<Page {...page}/>}></Route>
2021
)
2122
})
2223
}

scoutingapp/src/components/img/RobotImage.tsx

Lines changed: 19 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,30 @@
11
import React, {useEffect, useState} from "react"
22
import { ComponentSetup } from "../interface"
33

4-
export const emptyImage = <img
5-
style={{height: "0px", alignItems: 'center', justifyContent: 'center', margin: "auto"}}
6-
src={`../gray.png`}
7-
8-
/>
9-
104
export function RobotImage(props: ComponentSetup) {
115
const [componentInside, setComponentInside] = useState(<></>)
126
const robotNumber = props.getValue["TeamNumber"]
137

148
useEffect(() => {
15-
const interval = setInterval(() => {
16-
if (robotNumber) {
17-
fileExists(`../${robotNumber}.jpeg`).then((exists) => {
18-
if (exists) {
19-
setComponentInside(
20-
<img
21-
style={{ height: "300px", alignItems: 'center', justifyContent: 'center', margin: "auto"}}
22-
src={`../${robotNumber}.jpeg`}
23-
/>
24-
)
25-
} else {
26-
setComponentInside(
27-
<img
28-
style={{ height: "0px", alignItems: 'center', justifyContent: 'center', margin: "auto"}}
29-
src={`../gray.png`}
30-
/>
31-
)
32-
}
33-
});
34-
} else {
35-
setComponentInside(
36-
<img
37-
style={{ height: "0px", alignItems: 'center', justifyContent: 'center', margin: "auto"}}
38-
src={`../gray.png`}
39-
/>
40-
)
41-
}
42-
}, 500)
43-
return () => clearInterval(interval);
44-
})
9+
if (robotNumber) {
10+
fileExists(`../${robotNumber}.jpeg`).then((exists) => {
11+
if (exists) {
12+
setComponentInside(
13+
<img
14+
style={{height: "300px", alignItems: 'center', justifyContent: 'center', margin: "auto"}}
15+
src={`../${robotNumber}.jpeg`}
16+
alt={''}
17+
/>
18+
)
19+
return
20+
}
21+
})
22+
}
23+
24+
setComponentInside(
25+
<></>
26+
)
27+
}, [robotNumber])
4528

4629
return (<>
4730
{componentInside}

scoutingapp/src/components/inputs/DropdownTextInput.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ function DropdownTextInput(props: ComponentSetup) {
2828
)}
2929
</label>
3030
<div className="flex appearance-none h-[40px] border border-color-[#D0D5DD] border-[1.5px] rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
31-
<select name="option" id="options" className="inline" onChange={updateStateDropdown}>
32-
<option disabled selected value=""> -- </option>
33-
{ props.options?.map (option => (
34-
<option value={option}>{option}</option>
31+
<select name="option" id="options" className="inline" onChange={updateStateDropdown} defaultValue="">
32+
<option disabled value=""> -- </option>
33+
{ props.options?.map ((option: string, key: number) => (
34+
<option key={key} value={option}>{option}</option>
3535
))}
3636
</select>
3737

scoutingapp/src/components/interface.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,16 @@ export interface ComponentSetup {
99
required?: any
1010
}
1111

12+
export interface ImportedComponentSetup extends ComponentSetup {
13+
type: string;
14+
}
15+
1216
export interface PageSetup {
13-
config?: any // TODO: find the proper type
17+
name: string,
18+
description: string,
19+
components: ImportedComponentSetup[],
20+
exports: {
21+
delimiter: string,
22+
order: string[]
23+
}
1424
}
Lines changed: 32 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
import React from "react"
2-
import { useEffect, useState } from "react"
32
import { Link } from "react-router-dom"
43
import { DarkButton } from "../buttons"
54
import { DropdownTextInput, GenericTextArea, GenericTextInput, IncrementNumberInput, SliderInput, ConeCubeIncrementInput } from "../inputs"
6-
import { ComponentSetup, PageSetup } from "../interface"
5+
import {ImportedComponentSetup, PageSetup} from "../interface"
76
import { GenericCheckboxSelect, GenericDropdown, GenericRadioSelect, GenericToggle, ChargedUpGridSelect } from "../selects"
87
import { GenericHeaderOne, GenericHeaderTwo, QRCodeModal, Timer } from "../texts"
98
import { CycleCounter } from "../monitor"
10-
import { RobotImage, emptyImage } from "../img/RobotImage"
9+
import { RobotImage } from "../img"
1110
import ChargedUpStartingPosition from "../selects/ChargedUpStartingPosition"
1211

13-
interface ImportedComponentSetup extends ComponentSetup {
14-
type: string;
15-
}
16-
17-
export function Page(props: PageSetup) {
18-
const ComponentLibrary: Object = {
12+
export function Page({ components, exports }: PageSetup) {
13+
const ComponentLibrary: { [key: string]: [React.ComponentType<any>, any] } = {
1914
"DarkButton": [DarkButton, false],
2015
"DropdownTextInput": [DropdownTextInput, ["", ""]],
2116
"GenericTextArea": [GenericTextArea, ""],
@@ -33,67 +28,51 @@ export function Page(props: PageSetup) {
3328
"ChargedUpGridSelect": [ChargedUpGridSelect, []],
3429
"ChargedUpStartingPosition": [ChargedUpStartingPosition, ""],
3530
"ConeCubeIncrementInput": [ConeCubeIncrementInput, []],
36-
"RobotImage": [RobotImage, emptyImage]
31+
"RobotImage": [RobotImage, <></>]
3732
}
3833

39-
let componentSetup: any = {}
40-
41-
const required: String[] = [];
34+
const componentSetup: { [key: string]: any } = {}
35+
const requiredComponents: string[] = [];
4236

43-
props?.config?.components?.map((component: ImportedComponentSetup) => {
37+
components.map((component: ImportedComponentSetup) => {
4438
if (component.type != "Spacing") {
4539
try {
46-
componentSetup[component.id] = (ComponentLibrary as any)[component.type][1]
40+
componentSetup[component.id] = ComponentLibrary[component.type][1]
4741
if (component.required == true) {
48-
required.push(component.id)
42+
requiredComponents.push(component.id)
4943
}
50-
} catch { }
44+
} catch { } // Illegal component
5145
}
5246
})
5347

5448
componentSetup["export"] = {
5549
text: "",
56-
delimiter: props?.config?.export.delimiter,
50+
delimiter: exports.delimiter,
5751
isRequiredCompleted: false
5852
}
5953

60-
const setRobotImage = (newState: any) => {
61-
useState(newState);
62-
if (newState.buttonClicked) {
63-
useState((prevState: any) => ({
64-
...prevState,
65-
robotNumber: prevState.textInputValue,
66-
}));
67-
}
68-
};
69-
70-
const requiredComponents: String[] = []
71-
72-
const [pageComponents, setPageComponents] = useState(componentSetup)
73-
const propsSetPageComponent = (state: any) => {
74-
console.log("test")
75-
//setPageComponents(state)
76-
componentSetup = pageComponents
77-
if (pageComponents["result"]) {
78-
var order = ""
79-
for (var i = 0; i < props?.config?.export.order.length; i++) {
80-
order += pageComponents[props?.config?.export.order[i]]
81-
if (i != props?.config?.export.order.length - 1) {
82-
order += props?.config?.export.delimiter
54+
const propsSetPageComponent = () => {
55+
// if qr code has been selected to be shown
56+
if (componentSetup["result"]) {
57+
// combine all the data with the delimiter between each data point
58+
let order = ""
59+
for (let i = 0; i < exports.order.length; i++) {
60+
order += componentSetup[exports.order[i]]
61+
if (i != exports.order.length - 1) {
62+
order += exports.delimiter
8363
}
8464
}
8565
componentSetup["export"].text = order
86-
//setPageComponents(componentSetup)
8766
}
88-
props?.config?.components?.map((requiredId: any) => {
89-
componentSetup["export"].isRequiredCompleted = true
90-
if (!["", []].includes(componentSetup[requiredId])) {
91-
console.log(false)
67+
68+
componentSetup["export"].isRequiredCompleted = true
69+
requiredComponents?.map((requiredId: string) => {
70+
if (["", []].includes(componentSetup[requiredId])) {
9271
componentSetup["export"].isRequiredCompleted = false
9372
}
9473
})
74+
9575
console.log("Required done", componentSetup["export"].isRequiredCompleted)
96-
9776
}
9877

9978
return (
@@ -106,35 +85,31 @@ export function Page(props: PageSetup) {
10685
</div>
10786
</Link>
10887
{
109-
props?.config?.components?.map((component: ImportedComponentSetup) => {
110-
if (component.required == true) {
111-
requiredComponents.push(component.id)
112-
}
113-
88+
components.map((component: ImportedComponentSetup, key: number) => {
11489
if (component.type == "Spacing") {
11590
return (
116-
<div className="h-[2px]" />
91+
<div key={key} className="h-[2px]" />
11792
)
11893
}
11994
else {
120-
var sendprops = {
95+
const sendprops = {
12196
text: component.text,
12297
route: component.route,
12398
options: component.options,
12499
placeholder: component.placeholder,
125100
required: component.required
126101
}
127102

128-
const FoundComponent = (ComponentLibrary as any)[component.type][0];
103+
const FoundComponent: React.ComponentType<any> = ComponentLibrary[component.type][0];
129104

130105
return (
131-
<FoundComponent {...sendprops} getValue={pageComponents} setValue={propsSetPageComponent} id={component.id} />
106+
<FoundComponent {...sendprops} key={key} getValue={componentSetup} setValue={propsSetPageComponent} id={component.id} />
132107
);
133108

134109
}
135110
})
136111
}
137-
<QRCodeModal getValue={pageComponents} setValue={propsSetPageComponent} required={requiredComponents} />
112+
<QRCodeModal getValue={componentSetup} setValue={propsSetPageComponent} required={requiredComponents} />
138113
</div>
139114
)
140115
}

scoutingapp/src/components/pages/ParentPage.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ export function ParentPage(props: ParentPageSetup){
1414
<Link className="text-xl font-semibold mb-8 inline float-left ml-4 -mt-1 bg-gray-200 rounded-md p-2" to="/saved">Saved Codes</Link>
1515
</div>
1616
{
17-
props?.pageSetup?.map((page: any) => {
17+
props?.pageSetup?.map((page: any, key: number) => {
1818
return (
19-
<Link to={'/'+page.name.replaceAll(/\s/g,'')} className="text-2xl">
19+
<Link to={'/'+page.name.replaceAll(/\s/g,'')} className="text-2xl" key={key}>
2020
<div className="mb-4 w-full block max-w-sm p-6 bg-white border border-gray-200 rounded-lg shadow-sm hover:bg-gray-100">
2121
<h1 className="text-2xl font-bold mb-4">{page.name}</h1>
2222
<h1 className="text-lg font-regular mb-2">{page.description}</h1>

scoutingapp/src/components/selects/GenericCheckboxSelect.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,16 @@ function GenericCheckboxSelect(props: ComponentSetup) {
2828
<form onChange={updateStateSelections}>
2929
<div className="flex flex-wrap">
3030
<div className="w-1/2 px-1">
31-
{ props.options?.slice(0, Math.ceil(props.options?.length / 2)).map (option => (
32-
<div className="mb-1">
31+
{ props.options?.slice(0, Math.ceil(props.options?.length / 2)).map ((option: string, key: number) => (
32+
<div className="mb-1" key={key}>
3333
<input type="checkbox" name={option} value={option} className={`radio ${props.id}`}/>
3434
<p className="ml-3 inline">{option}</p>
3535
</div>
3636
))}
3737
</div>
3838
<div className="w-1/2 px-1">
39-
{ props.options?.slice(Math.ceil(props.options?.length / 2)).map (option => (
40-
<div className="mb-1">
39+
{ props.options?.slice(Math.ceil(props.options?.length / 2)).map ((option: string, key: number) => (
40+
<div className="mb-1" key={key}>
4141
<input type="checkbox" name={option} value={option} className={`radio ${props.id}`}/>
4242
<p className="inline ml-3">{option}</p>
4343
</div>

scoutingapp/src/components/selects/GenericDropdown.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ function GenericDropdown(props: ComponentSetup) {
2626
</span>
2727
)}
2828
</label>
29-
<select name="option" onChange={updateStateSelections} id="options" className="appearance-none border border-color-[#D0D5DD] rounded w-full py-2 px-3 text-gray-700 focus:outline-none">
30-
<option disabled selected value=""> -- </option>
31-
{ props.options?.map (option => (
32-
<option value={option}>{option}</option>
29+
<select name="option" defaultValue="" onChange={updateStateSelections} id="options" className="appearance-none border border-color-[#D0D5DD] rounded w-full py-2 px-3 text-gray-700 focus:outline-none">
30+
<option disabled value=""> -- </option>
31+
{ props.options?.map ((option: string, key: number) => (
32+
<option key={key} value={option}>{option}</option>
3333
))}
3434
</select>
3535
</div>

scoutingapp/src/config/structure.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@
409409
"id": "result"
410410
}
411411
],
412-
"export": {
412+
"exports": {
413413
"delimiter": "|",
414414
"order": [
415415
"ScoutId",
@@ -571,7 +571,7 @@
571571
"id": "result"
572572
}
573573
],
574-
"export": {
574+
"exports": {
575575
"delimiter": "|",
576576
"order": [
577577
"ScoutId",

0 commit comments

Comments
 (0)