blob: 294eca2e83903936772ee7c6cbd8db3eb88522ef [file] [log] [blame]
Emily Markova8e39f452023-12-23 12:17:30 -08001import {
2 Component,
3 ElementRef,
4 QueryList,
5 ViewChild,
6 ViewChildren,
7} from '@angular/core';
Emily Markovafaecfe12023-07-01 12:40:03 -07008import {Builder, ByteBuffer} from 'flatbuffers';
Philipp Schradere5d13942024-03-17 15:44:35 -07009import {ErrorResponse} from '@org_frc971/scouting/webserver/requests/messages/error_response_generated';
10import {SubmitPitImage} from '@org_frc971/scouting/webserver/requests/messages/submit_pit_image_generated';
Emily Markovafaecfe12023-07-01 12:40:03 -070011
12type Section = 'TeamSelection' | 'Data';
13
14interface Input {
Emily Markovae68b7632023-12-30 14:17:55 -080015 teamNumber: string;
Emily Markovafaecfe12023-07-01 12:40:03 -070016 pitImage: HTMLImageElement;
17}
18
19@Component({
20 selector: 'app-pit-scouting',
21 templateUrl: './pit_scouting.ng.html',
22 styleUrls: ['../app/common.css', './pit_scouting.component.css'],
23})
24export class PitScoutingComponent {
Emily Markova8e39f452023-12-23 12:17:30 -080025 @ViewChild('preview') preview: ElementRef<HTMLImageElement>;
Emily Markovafaecfe12023-07-01 12:40:03 -070026 section: Section = 'Data';
27
28 errorMessage = '';
Emily Markova8e39f452023-12-23 12:17:30 -080029 teamNumber: string = '1';
Emily Markovafaecfe12023-07-01 12:40:03 -070030 pitImage: string = '';
31
32 async readFile(file): Promise<ArrayBuffer> {
33 return new Promise((resolve, reject) => {
34 let reader = new FileReader();
35 reader.addEventListener('loadend', (e) =>
36 resolve(e.target.result as ArrayBuffer)
37 );
38 reader.addEventListener('error', reject);
39 reader.readAsArrayBuffer(file);
40 });
41 }
42
43 async getImageData() {
44 const selectedFile = (<HTMLInputElement>document.getElementById('pitImage'))
45 .files[0];
46 return new Uint8Array(await this.readFile(selectedFile));
47 }
48
Emily Markova8e39f452023-12-23 12:17:30 -080049 async setPitImage(event) {
50 const src = URL.createObjectURL(event.target.files[0]);
51 const previewElement = this.preview.nativeElement;
52 previewElement.src = src;
53 previewElement.style.display = 'block';
54 }
55
Emily Markovafaecfe12023-07-01 12:40:03 -070056 async submitData() {
57 const builder = new Builder();
Emily Markovae68b7632023-12-30 14:17:55 -080058 const teamNumber = builder.createString(this.teamNumber);
Emily Markova8e39f452023-12-23 12:17:30 -080059 const pitImage = builder.createString(
Emily Markovadcadcb62024-02-03 13:07:17 -080060 // Remove anything between /s in order to end up with only the file name.
61 // Example : path/to/file.txt -> file.txt
Emily Markova8e39f452023-12-23 12:17:30 -080062 this.pitImage.toString().replace(/^.*[\\\/]/, '')
63 );
Emily Markovafaecfe12023-07-01 12:40:03 -070064 const imageData = SubmitPitImage.createImageDataVector(
65 builder,
66 await this.getImageData()
67 );
68 builder.finish(
69 SubmitPitImage.createSubmitPitImage(
70 builder,
71 teamNumber,
72 pitImage,
73 imageData
74 )
75 );
76
77 const buffer = builder.asUint8Array();
78 const res = await fetch('/requests/submit/submit_pit_image', {
79 method: 'POST',
80 body: buffer,
81 });
82 if (!res.ok) {
83 const resBuffer = await res.arrayBuffer();
84 const fbBuffer = new ByteBuffer(new Uint8Array(resBuffer));
85 const parsedResponse = ErrorResponse.getRootAsErrorResponse(fbBuffer);
86
87 const errorMessage = parsedResponse.errorMessage();
88 this.errorMessage = `Received ${res.status} ${res.statusText}: "${errorMessage}"`;
Emily Markova8e39f452023-12-23 12:17:30 -080089 return;
Emily Markovafaecfe12023-07-01 12:40:03 -070090 }
Emily Markova8e39f452023-12-23 12:17:30 -080091
92 // Reset Data.
93 this.section = 'Data';
94 this.errorMessage = '';
Emily Markovafaecfe12023-07-01 12:40:03 -070095 this.pitImage = '';
Emily Markova8e39f452023-12-23 12:17:30 -080096 const previewElement = this.preview.nativeElement;
97 previewElement.src = '';
Emily Markovafaecfe12023-07-01 12:40:03 -070098 }
99}