Skip to content

Commit 65386db

Browse files
authored
Merge pull request #575 from topcoder-platform/TCA-1179_work-on-linting-issues
TCA-1179 work on linting issues -> dev
2 parents 7b8d533 + 5f20ad9 commit 65386db

File tree

127 files changed

+1499
-892
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

127 files changed

+1499
-892
lines changed

.editorconfig

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# EditorConfig is awesome: https://EditorConfig.org
2+
3+
# top-most EditorConfig file
4+
root = true
5+
6+
[*]
7+
indent_style = space
8+
indent_size = 4
9+
end_of_line = lf
10+
charset = utf-8
11+
trim_trailing_whitespace = true
12+
insert_final_newline = true

.gitignore

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,3 @@
2626
npm-debug.log*
2727
yarn-debug.log*
2828
yarn-error.log*
29-
30-
# Editors
31-
.editorconfig

package.json

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"@sprig-technologies/sprig-browser": "^2.20.1",
2727
"@stripe/react-stripe-js": "1.13.0",
2828
"@stripe/stripe-js": "1.41.0",
29+
"@types/testing-library__jest-dom": "^5.14.5",
2930
"apexcharts": "^3.36.0",
3031
"axios": "^1.1.2",
3132
"browser-cookies": "^1.2.0",
@@ -128,10 +129,10 @@
128129
"eslint-plugin-cypress": "^2.12.1",
129130
"eslint-plugin-import": "^2.25.3",
130131
"eslint-plugin-jsx-a11y": "^6.5.1",
131-
"eslint-plugin-no-null": "^1.0.2",
132132
"eslint-plugin-ordered-imports": "^0.6.0",
133133
"eslint-plugin-react": "^7.28.0",
134134
"eslint-plugin-react-hooks": "^4.3.0",
135+
"eslint-plugin-unicorn": "^46.0.0",
135136
"file-loader": "^6.2.0",
136137
"husky": "^8.0.1",
137138
"identity-obj-proxy": "^3.0.0",
@@ -156,15 +157,6 @@
156157
"webpack-dev-server": "^4.11.1",
157158
"webpack-merge": "^5.8.0"
158159
},
159-
"eslintConfig": {
160-
"extends": [
161-
"react-app",
162-
"react-app/jest"
163-
],
164-
"rules": {
165-
"no-useless-escape": 0
166-
}
167-
},
168160
"browserslist": {
169161
"production": [
170162
">0.2%",

src-ts/.eslintrc.js

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ module.exports = {
2121
},
2222
plugins: [
2323
'@typescript-eslint',
24-
'no-null',
24+
'unicorn',
2525
'ordered-imports',
2626
'react',
2727
'react-hooks'
@@ -35,6 +35,7 @@ module.exports = {
3535
}
3636
},
3737
rules: {
38+
'@typescript-eslint/ban-ts-comment': 'off',
3839
'@typescript-eslint/ban-types': [
3940
'error',
4041
{
@@ -50,7 +51,7 @@ module.exports = {
5051
allowExpressions: true
5152
}
5253
],
53-
'@typescript-eslint/no-explicit-any': 'error',
54+
'@typescript-eslint/no-explicit-any': 'off',
5455
'@typescript-eslint/no-inferrable-types': 'off',
5556
'@typescript-eslint/no-shadow': 'error',
5657
'@typescript-eslint/no-unused-vars': 'error',
@@ -89,9 +90,10 @@ module.exports = {
8990
'error',
9091
'prefer-single'
9192
],
92-
'jsx-a11y/click-events-have-key-events': 'warn',
93-
'jsx-a11y/no-noninteractive-element-interactions': 'warn',
94-
'jsx-a11y/no-static-element-interactions': 'warn',
93+
'jsx-a11y/click-events-have-key-events': 'off',
94+
'jsx-a11y/no-noninteractive-element-interactions': 'off',
95+
'jsx-a11y/no-static-element-interactions': 'off',
96+
'jsx-a11y/label-has-associated-control': 'off',
9597
'jsx-a11y/tabindex-no-positive': [
9698
'warn'
9799
],
@@ -107,7 +109,6 @@ module.exports = {
107109
],
108110
'no-extra-boolean-cast': 'off',
109111
'no-nested-ternary': 'off',
110-
'no-null/no-null': 'error',
111112
'no-param-reassign': [
112113
'error',
113114
{
@@ -181,6 +182,7 @@ module.exports = {
181182
],
182183
},
183184
],
185+
'no-empty': ["error", { "allowEmptyCatch": true }],
184186
'padded-blocks': 'off',
185187
'padding-line-between-statements': [
186188
'error',
@@ -263,12 +265,14 @@ module.exports = {
263265
'react/jsx-props-no-spreading': [
264266
0
265267
],
268+
'react/no-danger': 'off',
266269
'react/react-in-jsx-scope': 'off',
267270
'react/require-default-props': 'off',
268271
'semi': [
269272
'error',
270273
'never',
271274
],
272-
'sort-keys': 'error'
275+
'sort-keys': 'error',
276+
'unicorn/no-null': 'error'
273277
},
274278
};

src-ts/lib/breadcrumb/Breadcrumb.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const Breadcrumb: FC<BreadcrumbProps> = (props: BreadcrumbProps) => {
2828
<BreadcrumbItem
2929
index={index + 1}
3030
item={item}
31+
// eslint-disable-next-line react/no-array-index-key
3132
key={index}
3233
/>
3334
))
@@ -63,6 +64,7 @@ const Breadcrumb: FC<BreadcrumbProps> = (props: BreadcrumbProps) => {
6364
<BreadcrumbItem
6465
index={index + 1}
6566
item={item}
67+
// eslint-disable-next-line react/no-array-index-key
6668
key={index}
6769
/>
6870
))}

src-ts/lib/breadcrumb/breadcrumb-item/BreadcrumbItem.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { FC } from 'react'
22
import { Link } from 'react-router-dom'
3+
import classNames from 'classnames'
34

45
import styles from '../Breadcrumb.module.scss'
56

@@ -23,7 +24,7 @@ const BreadcrumbItem: FC<BreadcrumbItemProps> = (props: BreadcrumbItemProps) =>
2324
className={props.item.isElipsis ? 'elipsis' : ''}
2425
>
2526
<Link
26-
className={props.item.isElipsis ? styles.elipsis : ''}
27+
className={classNames(props.item.isElipsis && styles.elipsis)}
2728
to={props.item.url}
2829
>
2930
{props.item.name}

src-ts/lib/contact-support-form/ContactSupportForm.tsx

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Dispatch, FC, SetStateAction, useCallback, useContext, useEffect, useState } from 'react'
22

33
import { Form, FormDefinition, formGetInputModel, FormInputModel } from '../form'
4+
import { FormValue } from '../form/form-functions'
45
import { LoadingSpinner } from '../loading-spinner'
56
import { profileContext, ProfileContextData } from '../profile-provider'
67

@@ -27,13 +28,13 @@ const ContactSupportForm: FC<ContactSupportFormProps> = (props: ContactSupportFo
2728

2829
useEffect(() => {
2930
if (!loading && saveOnSuccess) {
30-
props.onSave()
31+
props.onSave.call(undefined)
3132
}
3233
}, [loading, saveOnSuccess, props.onSave])
3334

34-
const generateRequest: (inputs: ReadonlyArray<FormInputModel>) => void = useCallback((
35+
const generateRequest: (inputs: ReadonlyArray<FormInputModel>) => FormValue = useCallback((
3536
inputs: ReadonlyArray<FormInputModel>,
36-
): ContactSupportRequest => {
37+
): FormValue => {
3738
const firstName: string
3839
= formGetInputModel(inputs, ContactSupportFormField.first).value as string
3940
const lastName: string
@@ -50,12 +51,12 @@ const ContactSupportForm: FC<ContactSupportFormProps> = (props: ContactSupportFo
5051
lastName,
5152
question,
5253
}
53-
}, [props.workId])
54+
}, [props.isSelfService, props.workId])
5455

55-
const saveAsync: (request: ContactSupportRequest) => Promise<void>
56-
= useCallback(async (request: ContactSupportRequest): Promise<void> => {
56+
const saveAsync: (request: FormValue) => Promise<void>
57+
= useCallback(async (request: FormValue): Promise<void> => {
5758
setLoading(true)
58-
return contactSupportSubmitRequestAsync(request)
59+
return contactSupportSubmitRequestAsync(request as unknown as ContactSupportRequest)
5960
.then(() => {
6061
setSaveOnSuccess(true)
6162
})
@@ -92,7 +93,7 @@ const ContactSupportForm: FC<ContactSupportFormProps> = (props: ContactSupportFo
9293

9394
<Form
9495
formDef={props.formDef}
95-
formValues={profile}
96+
formValues={profile as unknown as FormValue}
9697
requestGenerator={generateRequest}
9798
save={saveAsync}
9899
/>

src-ts/lib/form/Form.tsx

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@ interface FormProps<ValueType, RequestType> {
4444
readonly shouldDisableButton?: (isPrimaryGroup: boolean, index: number) => boolean
4545
}
4646

47-
const Form: <ValueType extends FormValue, RequestType extends FormValue>(props: FormProps<ValueType, RequestType>) => JSX.Element
47+
const Form: <
48+
ValueType extends FormValue,
49+
RequestType extends FormValue
50+
>(props: FormProps<ValueType, RequestType>) => JSX.Element
4851
= <ValueType extends FormValue, RequestType extends FormValue>(props: FormProps<ValueType, RequestType>) => {
4952

5053
const [formDef, setFormDef]: [FormDefinition, Dispatch<SetStateAction<FormDefinition>>]
@@ -60,8 +63,10 @@ const Form: <ValueType extends FormValue, RequestType extends FormValue>(props:
6063
= useState<RefObject<HTMLFormElement>>(createRef<HTMLFormElement>())
6164

6265
// This will hold all the inputs
63-
const [inputs, setInputs]: [Array<FormInputModel>, Dispatch<SetStateAction<Array<FormInputModel>>>] = useState<Array<FormInputModel>>(formGetInputFields(formDef.groups || []))
64-
const [isFormInvalid, setFormInvalid]: [boolean, Dispatch<boolean>] = useState<boolean>(inputs.filter(item => !!item.error).length > 0)
66+
const [inputs, setInputs]: [Array<FormInputModel>, Dispatch<SetStateAction<Array<FormInputModel>>>]
67+
= useState<Array<FormInputModel>>(formGetInputFields(formDef.groups || []))
68+
const [isFormInvalid, setFormInvalid]: [boolean, Dispatch<boolean>]
69+
= useState<boolean>(inputs.filter(item => !!item.error).length > 0)
6570

6671
useEffect(() => {
6772
if (!formRef.current?.elements) {
@@ -129,7 +134,14 @@ const Form: <ValueType extends FormValue, RequestType extends FormValue>(props:
129134

130135
async function onSubmitAsync(event: FormEvent<HTMLFormElement>): Promise<void> {
131136
const values: RequestType = props.requestGenerator(inputs)
132-
formOnSubmitAsync<RequestType>(props.action || 'submit', event, formDef, values, props.save, props.onSuccess)
137+
formOnSubmitAsync<RequestType>(
138+
props.action || 'submit',
139+
event,
140+
formDef,
141+
values,
142+
props.save,
143+
props.onSuccess,
144+
)
133145
.then(() => {
134146
if (!props.resetFormAfterSave) {
135147
setFormKey(Date.now())
@@ -149,22 +161,17 @@ const Form: <ValueType extends FormValue, RequestType extends FormValue>(props:
149161

150162
formInitializeValues(inputs, props.formValues)
151163

152-
const setOnClickOnReset: (button: FormButton) => FormButton = button => {
164+
const setOnClickOnReset: (button: FormButton) => FormButton = button => (
153165
// if this is a reset button, set its onclick to reset
154-
if (!!button.isReset) {
155-
button = {
156-
...button,
157-
onClick: onReset,
158-
}
159-
}
160-
161-
return button
162-
}
166+
!button.isReset ? button : { ...button, onClick: onReset }
167+
)
163168

164-
const createButtonGroup: (groups: ReadonlyArray<FormButton>, isPrimaryGroup: boolean) => Array<JSX.Element> = (groups, isPrimaryGroup) => groups.map((button, index) => {
165-
button = setOnClickOnReset(button)
169+
const createButtonGroup: (groups: ReadonlyArray<FormButton>, isPrimaryGroup: boolean) => Array<JSX.Element>
170+
= (groups, isPrimaryGroup) => groups.map((button, index) => {
171+
Object.assign(button, setOnClickOnReset(button))
166172

167-
const disabled: boolean = (button.isSubmit && isFormInvalid) || !!props.shouldDisableButton?.(isPrimaryGroup, index)
173+
const disabled: boolean = (button.isSubmit && isFormInvalid)
174+
|| !!props.shouldDisableButton?.(isPrimaryGroup, index)
168175

169176
return (
170177
<Button

src-ts/lib/form/form-functions/form.functions.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import { FormValue } from './form-value.model'
99

1010
export type ValidationEvent = 'blur' | 'change' | 'submit' | 'initial'
1111

12-
export function getInputElement(formElements: HTMLFormControlsCollection, fieldName: string): HTMLInputElement | undefined {
12+
export function getInputElement(
13+
formElements: HTMLFormControlsCollection,
14+
fieldName: string,
15+
): HTMLInputElement | undefined {
1316
return formElements.namedItem(fieldName) as HTMLInputElement
1417
}
1518

@@ -79,14 +82,20 @@ export function onReset<T extends FormValue>(inputs: ReadonlyArray<FormInputMode
7982
})
8083
}
8184

85+
type CustomFormValidator = (
86+
formElements: HTMLFormControlsCollection,
87+
event: ValidationEvent,
88+
inputs: ReadonlyArray<FormInputModel>,
89+
) => boolean
90+
8291
export async function onSubmitAsync<T extends FormValue>(
8392
action: FormAction,
8493
event: FormEvent<HTMLFormElement>,
8594
formDef: FormDefinition,
8695
formValue: T,
8796
save: (value: T) => Promise<void>,
8897
onSuccess?: () => void,
89-
customValidateForm?: (formElements: HTMLFormControlsCollection, event: ValidationEvent, inputs: ReadonlyArray<FormInputModel>) => boolean,
98+
customValidateForm?: CustomFormValidator,
9099
): Promise<void> {
91100

92101
event.preventDefault()

0 commit comments

Comments
 (0)