Development (#94)

* CEC-371 Car ECU display (#79)

* Merge Development (#53)

* Use responsive iframe control for charts (#49)

* Use responsive iframe control to charts

* Move external Grafana link to Dashboard page

* Remove unused embedded style class

* Add button label

* added delete button to deploy packages

* Fix unit test warning
Remove unused route from test

* Fix styling of button

* minor fixes per pr review

Co-authored-by: jcw-fisker <jwatson@fiskerinc.com>
Co-authored-by: John Cotten Watson <83605808+jcw-fisker@users.noreply.github.com>

* Development Merge (#57)

* CEC-287 Car connection status (#59) (#60)

* Car connection status

* Formatting

* Merge Development (#64)

* Add connection status to vehicles page

* ConnectedIcon control

* Handle Style

* Development (#67)

* preliminary map for vehicles

* weird zoom bug

* passing react tests

* fixing warnings and updating snapshots

* update node environment to 14

* addressing comments by changing variable types and adding styles to home page title

* adding CODEOWNERS file

* fixing token error

* CEC-371 Update car ECUs display (#78)

* Clean up className styles
Update car status page to show update and ECUs

* Add update ecu version button
Show all ECUs on car status page
Only show car ecus for search

Co-authored-by: jcw-fisker <jwatson@fiskerinc.com>
Co-authored-by: John Cotten Watson <83605808+jcw-fisker@users.noreply.github.com>
Co-authored-by: Drew Taylor <69828061+drew-fisker@users.noreply.github.com>

* CEC-394 Car update log (#81)

* CEC-394 Car update status control

* Remove Datadog RUM
Remove package update components
Move control components into Controls folder
Add Car update status page

* Display update status log
Clean up unused update package code

* Remove console.logs

* no vars

* adding timestamp to vehicle popup

* modifying vehicle data query

* removing extraneous code

* removing console log

* Clean up SonarCloud warnings (#83)

* Clean up SonarCloud warnings

* Bogus security warning

* Fix another warning

* Fix unauthorized locations request

* Fix update progress control

* CEC-563 New manifest format (#88)

* Add ManifestCreateContext
Update create manifest page

* Finish UI changes and API integration

* Fixes

* Fix test

* Remove manifest ECU file version and type

* Fixes

* Add manifest ecu file type control

* Fix Sonar warnings

* Fix test

* Update codeowners

* Formatting

* CEC-553 Change file type to string (#90)

* CEC-553 File type uses string enum

* Fix test timeout

* Fix

* Merge development

* Increase timeout

* Clean up (#95)

* Clean up
Mock missing methods

* Smell

Co-authored-by: jcw-fisker <jwatson@fiskerinc.com>
Co-authored-by: John Cotten Watson <83605808+jcw-fisker@users.noreply.github.com>
Co-authored-by: Drew Taylor <69828061+drew-fisker@users.noreply.github.com>
Co-authored-by: Drew Taylor <dtaylor@fiskerinc.com>
This commit is contained in:
John Wu
2021-10-14 12:23:16 -07:00
committed by GitHub
parent ba7611d6aa
commit 86eeaab869
32 changed files with 2293 additions and 866 deletions

View File

@@ -1,17 +1,11 @@
import React, { useContext, useState } from "react";
import api from "../../services/manifestsAPI";
import { uploadFile, getCancelToken } from "../../services/uploadFile";
const ManifestsContext = React.createContext();
export const ManifestsProvider = ({ children }) => {
const [busy, setBusy] = useState(false);
const [uploadProgress, setUploadProgress] = useState(0);
const [uploadStatus, setUploadStatus] = useState(null);
const [cancelUploadToken, setCancelUploadToken] = useState(null);
const [uploadFileIndex, setUploadFileIndex] = useState(0);
const [uploadedFiles, setUploadedFiles] = useState([]);
const [manifests, setManifests] = useState([]);
const [totalManifests, setTotalManifests] = useState(0);
@@ -54,164 +48,14 @@ export const ManifestsProvider = ({ children }) => {
return result;
};
const validateManifest = (data, accessToken) => {
const fileKeys = {};
if (!accessToken || accessToken.length === 0) {
throw new Error("Access token required");
}
if (!data) {
throw new Error("Missing manifest data");
}
if (!data.name || data.name.length === 0) {
throw new Error("Package name required");
}
if (!data.version || data.version.length === 0) {
throw new Error("Package version required");
}
if (!data.description || data.description.length === 0) {
throw new Error("Package description required");
}
if (!data.releasenotes || data.releasenotes.length === 0) {
throw new Error("Package release notes link required");
}
if (!data.files || data.files.length === 0) {
throw new Error("Package files required");
}
data.files.forEach((file) => validateFile(file, fileKeys));
};
const validateFile = (file, keys) => {
if (!file) {
throw new Error("File data required");
}
if (!file.filename || file.filename.length === 0) {
throw new Error("Filename required");
}
if (!file.name || file.name.length === 0) {
throw new Error(`${file.filename} ECU name required`);
}
if (!file.update_version || file.update_version.length === 0) {
throw new Error(`${file.filename} version required`);
}
if (!file.part_number || file.part_number.length === 0) {
throw new Error(`${file.filename} part number required`);
}
const key = `${file.name}, ${file.update_version}, ${file.filename}`;
if (!keys[key]) {
keys[key] = true;
} else {
throw new Error(`${key} already exists`);
}
};
const checkExistingManifest = async (data, token) => {
const check = {
name: data.name,
version: data.version,
};
const { data: result } = await api.getManifests(check, token);
if (result.length > 0)
throw new Error(`Update ${data.name} ${data.version} already exists`);
};
const createManifest = async (data, token) => {
let result;
try {
setBusy(true);
validateManifest(data, token);
setUploadedFiles(data.files);
await checkExistingManifest(data, token);
if (result !== null) result = await api.createManifest(data, token);
if (result.error)
throw new Error(`Create manifest error. ${result.message}`);
for (let i = 0, len = data.files.length; i < len; i++) {
setUploadFileIndex(i);
const resp = await uploadECUFile(result.id, data.files[i], token);
if (resp.error)
throw new Error(`Upload manifest file error. ${resp.error}`);
}
} finally {
setBusy(false);
setUploadFileIndex(0);
setUploadedFiles([]);
}
return result;
};
const cancelUpload = () => {
if (cancelUploadToken) cancelUploadToken.cancel();
setBusy(false);
setUploadStatus("Upload cancelled");
setCancelUploadToken(null);
setUploadProgress(0);
};
const uploadECUFile = async (manifest_id, data, accessToken) => {
try {
Object.assign(data, { manifest_id });
const filename = data.file.name;
const cancel = getCancelToken();
setBusy(true);
setUploadProgress(0);
setUploadStatus(`Uploading ${filename}`);
setCancelUploadToken(cancel);
const result = await uploadFile(
data,
accessToken,
setUploadProgress,
cancel.token
);
if (result.message) {
throw new Error(`${result.error}. ${result.message}`);
}
setUploadStatus(`Uploaded ${filename}`);
setCancelUploadToken(null);
setUploadProgress(100);
return result;
} catch (e) {
setBusy(false);
setUploadStatus(`Error occured: ${e.message}`);
setUploadProgress(-1);
return { error: e.message };
}
};
return (
<ManifestsContext.Provider
value={{
busy,
uploadProgress,
uploadStatus,
uploadFileIndex,
uploadedFiles,
manifests,
totalManifests,
getManifests,
deleteManifest,
createManifest,
cancelUpload,
}}
>
{children}