blob: 58e7647226feb545d2ea42a60fdd6639f332c00c [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';
9import {ErrorResponse} from '../../webserver/requests/messages/error_response_generated';
10import {SubmitPitImage} from '../../webserver/requests/messages/submit_pit_image_generated';
11
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(
60 this.pitImage.toString().replace(/^.*[\\\/]/, '')
61 );
Emily Markovafaecfe12023-07-01 12:40:03 -070062 const imageData = SubmitPitImage.createImageDataVector(
63 builder,
64 await this.getImageData()
65 );
66 builder.finish(
67 SubmitPitImage.createSubmitPitImage(
68 builder,
69 teamNumber,
70 pitImage,
71 imageData
72 )
73 );
74
75 const buffer = builder.asUint8Array();
76 const res = await fetch('/requests/submit/submit_pit_image', {
77 method: 'POST',
78 body: buffer,
79 });
80 if (!res.ok) {
81 const resBuffer = await res.arrayBuffer();
82 const fbBuffer = new ByteBuffer(new Uint8Array(resBuffer));
83 const parsedResponse = ErrorResponse.getRootAsErrorResponse(fbBuffer);
84
85 const errorMessage = parsedResponse.errorMessage();
86 this.errorMessage = `Received ${res.status} ${res.statusText}: "${errorMessage}"`;
Emily Markova8e39f452023-12-23 12:17:30 -080087 return;
Emily Markovafaecfe12023-07-01 12:40:03 -070088 }
Emily Markova8e39f452023-12-23 12:17:30 -080089
90 // Reset Data.
91 this.section = 'Data';
92 this.errorMessage = '';
Emily Markovafaecfe12023-07-01 12:40:03 -070093 this.pitImage = '';
Emily Markova8e39f452023-12-23 12:17:30 -080094 const previewElement = this.preview.nativeElement;
95 previewElement.src = '';
Emily Markovafaecfe12023-07-01 12:40:03 -070096 }
97}