blob: 294eca2e83903936772ee7c6cbd8db3eb88522ef [file] [log] [blame]
import {
Component,
ElementRef,
QueryList,
ViewChild,
ViewChildren,
} from '@angular/core';
import {Builder, ByteBuffer} from 'flatbuffers';
import {ErrorResponse} from '@org_frc971/scouting/webserver/requests/messages/error_response_generated';
import {SubmitPitImage} from '@org_frc971/scouting/webserver/requests/messages/submit_pit_image_generated';
type Section = 'TeamSelection' | 'Data';
interface Input {
teamNumber: string;
pitImage: HTMLImageElement;
}
@Component({
selector: 'app-pit-scouting',
templateUrl: './pit_scouting.ng.html',
styleUrls: ['../app/common.css', './pit_scouting.component.css'],
})
export class PitScoutingComponent {
@ViewChild('preview') preview: ElementRef<HTMLImageElement>;
section: Section = 'Data';
errorMessage = '';
teamNumber: string = '1';
pitImage: string = '';
async readFile(file): Promise<ArrayBuffer> {
return new Promise((resolve, reject) => {
let reader = new FileReader();
reader.addEventListener('loadend', (e) =>
resolve(e.target.result as ArrayBuffer)
);
reader.addEventListener('error', reject);
reader.readAsArrayBuffer(file);
});
}
async getImageData() {
const selectedFile = (<HTMLInputElement>document.getElementById('pitImage'))
.files[0];
return new Uint8Array(await this.readFile(selectedFile));
}
async setPitImage(event) {
const src = URL.createObjectURL(event.target.files[0]);
const previewElement = this.preview.nativeElement;
previewElement.src = src;
previewElement.style.display = 'block';
}
async submitData() {
const builder = new Builder();
const teamNumber = builder.createString(this.teamNumber);
const pitImage = builder.createString(
// Remove anything between /s in order to end up with only the file name.
// Example : path/to/file.txt -> file.txt
this.pitImage.toString().replace(/^.*[\\\/]/, '')
);
const imageData = SubmitPitImage.createImageDataVector(
builder,
await this.getImageData()
);
builder.finish(
SubmitPitImage.createSubmitPitImage(
builder,
teamNumber,
pitImage,
imageData
)
);
const buffer = builder.asUint8Array();
const res = await fetch('/requests/submit/submit_pit_image', {
method: 'POST',
body: buffer,
});
if (!res.ok) {
const resBuffer = await res.arrayBuffer();
const fbBuffer = new ByteBuffer(new Uint8Array(resBuffer));
const parsedResponse = ErrorResponse.getRootAsErrorResponse(fbBuffer);
const errorMessage = parsedResponse.errorMessage();
this.errorMessage = `Received ${res.status} ${res.statusText}: "${errorMessage}"`;
return;
}
// Reset Data.
this.section = 'Data';
this.errorMessage = '';
this.pitImage = '';
const previewElement = this.preview.nativeElement;
previewElement.src = '';
}
}