From 69d88f501f6103da317af63fa96682ee64df47b5 Mon Sep 17 00:00:00 2001 From: John Date: Sun, 14 Nov 2021 13:00:07 -0500 Subject: [PATCH 1/5] Remove redundant import --- src/components/AdminPanelLayout/UsersPane.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/AdminPanelLayout/UsersPane.tsx b/src/components/AdminPanelLayout/UsersPane.tsx index 01ec226d..a8809244 100644 --- a/src/components/AdminPanelLayout/UsersPane.tsx +++ b/src/components/AdminPanelLayout/UsersPane.tsx @@ -1,12 +1,11 @@ import {Button, Form, InputGroup, Modal, ModalBody, ModalFooter, Table} from 'react-bootstrap'; import React, {useState} from 'react'; import {Role, User} from '../../types/User'; -import {changeUserRole, getCurrentUserFromServer, getUserList} from '../../api'; +import {changeUserRole, ChangeUserRoleRequest, getCurrentUserFromServer, getUserList} from '../../api'; import {useMount} from '../../hooks/useMount'; import {HorizontallyCenteredSpinner} from '../util/HorizonallyCenteredSpinner'; import {Layout} from '../../pages/Layout/Layout'; import UserListItem from './UserListItem'; -import {ChangeUserRoleRequest} from '../../api'; import {AxiosResponse} from 'axios'; import ModalHeader from 'react-bootstrap/ModalHeader'; import {connect, useDispatch} from 'react-redux'; From 9dc48c1d097a96c5e438687f1ca68f895045e1a1 Mon Sep 17 00:00:00 2001 From: John Date: Sun, 14 Nov 2021 14:14:36 -0500 Subject: [PATCH 2/5] Fix code smells - redundant awaits, redundant type casts, tslint issues --- src/api/index.ts | 2 +- src/components/VmTemplateModal/VmTemplateUploadSchema.ts | 2 +- src/pages/Contact/ContactUs.tsx | 5 ++--- src/pages/LoginRegisterPage/RegisterFormSchema.ts | 2 +- src/redux/reducers/browser.ts | 1 - src/redux/store/index.ts | 2 -- 6 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/api/index.ts b/src/api/index.ts index 4b5c1b3f..63919a1f 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -111,7 +111,7 @@ export interface ChangeUserRoleRequest { } export async function changeUserRole(form: ChangeUserRoleRequest[]): Promise { - return await api.put('/user/change-role', form); + return api.put('/user/change-role', form); } export async function getCurrentUserFromServer() { diff --git a/src/components/VmTemplateModal/VmTemplateUploadSchema.ts b/src/components/VmTemplateModal/VmTemplateUploadSchema.ts index 80ef47f2..9c21ea4b 100644 --- a/src/components/VmTemplateModal/VmTemplateUploadSchema.ts +++ b/src/components/VmTemplateModal/VmTemplateUploadSchema.ts @@ -16,7 +16,7 @@ export interface UploadByUrlForm extends NamedUpload { const NameSchema: ObjectSchemaDefinition = {name: string().required('Required').min(3, 'Must have at least 3 characters')}; const UploadFormSchema = object({ ...NameSchema, - file: object().nullable() as ObjectSchema + file: object() as ObjectSchema }); export const isUploadForm = (val: NamedUpload): val is UploadForm => val['file'] !== undefined; diff --git a/src/pages/Contact/ContactUs.tsx b/src/pages/Contact/ContactUs.tsx index fcf751ed..7ecc435b 100644 --- a/src/pages/Contact/ContactUs.tsx +++ b/src/pages/Contact/ContactUs.tsx @@ -23,9 +23,8 @@ export default function ContactUs() { formData.append('message', form.message); const files = form.screenshots; if (files !== null) { - // tslint:disable-next-line:prefer-for-of - for (let i = 0; i < files.length; i++) { - formData.append('screenshots', files[i]); + for (const file of Array.from(files)) { + formData.append('screenshots', file); } } await submitContactRequest(formData); diff --git a/src/pages/LoginRegisterPage/RegisterFormSchema.ts b/src/pages/LoginRegisterPage/RegisterFormSchema.ts index 78fd0cb1..fdc2e398 100644 --- a/src/pages/LoginRegisterPage/RegisterFormSchema.ts +++ b/src/pages/LoginRegisterPage/RegisterFormSchema.ts @@ -29,6 +29,6 @@ export const RegisterFormSchema: ObjectSchema = object({ password: passwordValidator, confirmPass: makeConfirmPasswordValidator('password'), gradYear: string(), - phoneNumber: string().matches(/[0-9]{3}-[0-9]{3}-[0-9]{4}/, 'Please type in format of XXX-XXX-XXXX'), + phoneNumber: string().matches(/\d{3}-\d{3}-\d{4}/, 'Please type in format of XXX-XXX-XXXX'), acceptedTerms: bool().test('accepted-terms', 'You must agree before submitting.', (value?: boolean) => Boolean(value)) }); diff --git a/src/redux/reducers/browser.ts b/src/redux/reducers/browser.ts index ccc643b1..75198ea8 100644 --- a/src/redux/reducers/browser.ts +++ b/src/redux/reducers/browser.ts @@ -3,7 +3,6 @@ import {BrowserTypes} from '../types/actionTypes'; import {WindowState} from '../types/BrowserState'; import Action from '../types/redux'; -// Code smell on this function signature function windowSize(state: WindowState = {height: NaN, width: NaN}, action: Action) { if (action.type === BrowserTypes.SCREEN_RESIZE) { return { diff --git a/src/redux/store/index.ts b/src/redux/store/index.ts index b721b74d..2775b4dc 100644 --- a/src/redux/store/index.ts +++ b/src/redux/store/index.ts @@ -9,12 +9,10 @@ import {persistGlobalStore, persistRootReducer} from './persistance'; const configureStore = (initialState?: DeepPartial, onReady?: () => void) => { const root = persistRootReducer(combineReducers(rootReducer(history))); -// @ts-ignore const composeEnhancers: typeof compose = (typeof window !== 'undefined' && window['__REDUX_DEVTOOLS_EXTENSION_COMPOSE__']) || compose; const storeInstance = createStore( root, initialState, - // Code smell on this composeEnhancers(applyMiddleware(thunk as ThunkMiddleware, routerMiddleware(history))) ); const persistorInstance = persistGlobalStore(storeInstance, onReady); From b97b8e460525dedd036d2c054c44b71958590283 Mon Sep 17 00:00:00 2001 From: John Date: Sun, 21 Nov 2021 11:29:57 -0500 Subject: [PATCH 3/5] Add a comment for PR --- src/components/ConsoleWindow/ConsolePopout.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/ConsoleWindow/ConsolePopout.tsx b/src/components/ConsoleWindow/ConsolePopout.tsx index d8e45fee..78e73cb8 100644 --- a/src/components/ConsoleWindow/ConsolePopout.tsx +++ b/src/components/ConsoleWindow/ConsolePopout.tsx @@ -41,6 +41,7 @@ class ConsolePopout extends Component { this.externalWindow!.document.title = 'VM Popout'; + // Sonarcloud thinks this line is a security issue this.externalWindow!.addEventListener('beforeunload', (ev: BeforeUnloadEvent) => { if(!this.shouldAsk) { return; From 8b41a2c4d7d9315aa370400d194747bcc2ff8a59 Mon Sep 17 00:00:00 2001 From: John Date: Sun, 23 Jan 2022 12:39:54 -0500 Subject: [PATCH 4/5] Better fix for file upload code smell --- src/components/VmTemplateModal/VmTemplateUploadSchema.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/VmTemplateModal/VmTemplateUploadSchema.ts b/src/components/VmTemplateModal/VmTemplateUploadSchema.ts index 9c21ea4b..98f1dc4a 100644 --- a/src/components/VmTemplateModal/VmTemplateUploadSchema.ts +++ b/src/components/VmTemplateModal/VmTemplateUploadSchema.ts @@ -1,4 +1,4 @@ -import {object, ObjectSchema, ObjectSchemaDefinition, string} from 'yup'; +import {object, ObjectSchemaDefinition, string} from 'yup'; import {cast} from '../../util'; export interface NamedUpload { @@ -16,7 +16,7 @@ export interface UploadByUrlForm extends NamedUpload { const NameSchema: ObjectSchemaDefinition = {name: string().required('Required').min(3, 'Must have at least 3 characters')}; const UploadFormSchema = object({ ...NameSchema, - file: object() as ObjectSchema + file: object().nullable().required('File is required') }); export const isUploadForm = (val: NamedUpload): val is UploadForm => val['file'] !== undefined; From 0cef15f5b28b4d64edcff6482755d2d823332a28 Mon Sep 17 00:00:00 2001 From: John Date: Sun, 23 Jan 2022 13:04:56 -0500 Subject: [PATCH 5/5] Restore linter ignore for redux to work --- src/redux/store/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/redux/store/index.ts b/src/redux/store/index.ts index 2775b4dc..bd68f862 100644 --- a/src/redux/store/index.ts +++ b/src/redux/store/index.ts @@ -20,4 +20,5 @@ const configureStore = (initialState?: DeepPartial, onReady?: () => vo return { store: storeInstance, persistor: persistorInstance, appDispatch: storeInstance.dispatch}; }; +// @ts-ignore export const {store, persistor, appDispatch } = configureStore();