Skip to content

Commit d479d67

Browse files
Fix Conditions components lint errors
1 parent 7cb97f6 commit d479d67

File tree

3 files changed

+58
-35
lines changed

3 files changed

+58
-35
lines changed

react/components/Conditions/index.tsx

+32-17
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import Statement from '../Statement/index'
1010
import { Labels, Operator } from './typings'
1111
import { DEFAULT_LABELS, MEDIUM_ICON_SIZE } from './constants'
1212
import { SubjectOptions } from '../Statement/Atoms/SubjectAtom'
13+
import { StatementProp } from '../Statement/typings'
1314

1415
type Props = {
1516
canDelete?: boolean
@@ -21,16 +22,11 @@ type Props = {
2122
operator: Operator
2223
options: SubjectOptions
2324
hideOperator?: boolean
24-
statements: Array<{
25-
subject: string
26-
verb: string
27-
object?: unknown
28-
error?: string
29-
}>
25+
statements: StatementProp[]
3026
subjectPlaceholder: string
3127
}
3228

33-
const Conditions: React.FC<Props> = ({
29+
const Conditions = ({
3430
canDelete,
3531
statements,
3632
options,
@@ -42,8 +38,8 @@ const Conditions: React.FC<Props> = ({
4238
operator,
4339
onChangeOperator,
4440
onChangeStatements,
45-
}) => {
46-
const objectIsEmpty = object => {
41+
}: Props) => {
42+
const objectIsEmpty = (object: unknown) => {
4743
if (object === undefined) return true
4844
if (object === null) return true
4945
if (object === '') return true
@@ -73,15 +69,18 @@ const Conditions: React.FC<Props> = ({
7369
onChangeStatements([...statements, emptyStatement])
7470
}
7571

76-
const handleRemoveStatement = index => {
72+
const handleRemoveStatement = (index: number) => {
7773
const updatedStatements = statements
7874
.slice(0, index)
7975
.concat(statements.slice(index + 1))
8076

8177
onChangeStatements(updatedStatements)
8278
}
8379

84-
const handleUpdatestatement = (newStatement, statementIndex) => {
80+
const handleUpdatestatement = (
81+
newStatement: StatementProp,
82+
statementIndex: number
83+
) => {
8584
const newStatements = statements.map((statement, idx) =>
8685
idx === statementIndex ? newStatement : statement
8786
)
@@ -95,8 +94,10 @@ const Conditions: React.FC<Props> = ({
9594
<StrategySelector
9695
isRtl={isRtl}
9796
operator={operator}
98-
labels={labels}
99-
onChangeOperator={operator => onChangeOperator(operator)}
97+
labels={labels as Labels}
98+
onChangeOperator={(newOperator: Operator) =>
99+
onChangeOperator(newOperator)
100+
}
100101
/>
101102
</div>
102103
)}
@@ -136,6 +137,17 @@ const Conditions: React.FC<Props> = ({
136137
{}
137138
)
138139

140+
const handleKeyDown = ({
141+
key,
142+
}: React.KeyboardEvent<HTMLDivElement>) => {
143+
const SPACE = ' '
144+
const ENTER = 'Enter'
145+
146+
if (key === SPACE || key === ENTER) {
147+
handleRemoveStatement(statementIndex)
148+
}
149+
}
150+
139151
const statementContent = [
140152
<div key="1" className="flex-grow-1">
141153
<Statement
@@ -152,6 +164,9 @@ const Conditions: React.FC<Props> = ({
152164
canDelete &&
153165
(!isFullWidth ? (
154166
<div
167+
role="button"
168+
tabIndex={0}
169+
onKeyDown={handleKeyDown}
155170
key="2"
156171
className="ma3 c-muted-2 pointer hover-c-danger"
157172
onClick={() => handleRemoveStatement(statementIndex)}
@@ -167,7 +182,7 @@ const Conditions: React.FC<Props> = ({
167182
icon={<IconClose className="c-on-action-primary" />}
168183
onClick={() => handleRemoveStatement(statementIndex)}
169184
>
170-
{labels.delete ?? DEFAULT_LABELS.delete}
185+
{labels?.delete ?? DEFAULT_LABELS.delete}
171186
</ButtonWithIcon>
172187
</div>
173188
)),
@@ -192,8 +207,8 @@ const Conditions: React.FC<Props> = ({
192207
<Separator
193208
label={
194209
operator === 'all'
195-
? labels.operatorAnd ?? DEFAULT_LABELS.operatorAnd
196-
: labels.operatorOr ?? DEFAULT_LABELS.operatorOr
210+
? labels?.operatorAnd ?? DEFAULT_LABELS.operatorAnd
211+
: labels?.operatorOr ?? DEFAULT_LABELS.operatorOr
197212
}
198213
/>
199214
)}
@@ -213,7 +228,7 @@ const Conditions: React.FC<Props> = ({
213228
disabled={!canAddNewCondition()}
214229
onClick={handleAddNewCondition}
215230
>
216-
{labels.addNewCondition ?? DEFAULT_LABELS.addNewCondition}
231+
{labels?.addNewCondition ?? DEFAULT_LABELS.addNewCondition}
217232
</ButtonWithIcon>
218233
</div>
219234
</div>

react/components/Statement/index.tsx

+19-18
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,39 @@ import React from 'react'
33
import SubjectAtom, { SubjectOptions } from './Atoms/SubjectAtom'
44
import VerbAtom from './Atoms/VerbAtom'
55
import ObjectAtom from './Atoms/ObjectAtom'
6+
import { StatementProp } from './typings'
67

7-
type Props = {
8+
type StatementProps = {
89
isFullWidth?: boolean
910
isRtl?: boolean
1011
omitSubject?: boolean
1112
omitVerbs?: boolean
12-
onChangeStatement: (statement: Props['statement']) => void
13+
onChangeStatement: (statement: StatementProp) => void
1314
options: SubjectOptions
14-
statement?: {
15-
subject: string
16-
verb: string
17-
object?: unknown
18-
error?: string
19-
}
15+
statement?: StatementProp
2016
subjectPlaceholder: string
2117
}
2218

23-
const Statement: React.FC<Props> = ({
19+
const NoopComponent = () => <></>
20+
21+
const Statement: React.FC<StatementProps> = ({
2422
isFullWidth = false,
2523
isRtl,
2624
omitSubject,
2725
omitVerbs,
2826
onChangeStatement,
2927
options,
30-
statement = { subject: '', verb: '', object: null, error: null },
28+
statement = { subject: '', verb: '', object: null },
3129
subjectPlaceholder,
3230
}) => {
33-
const verbOptions =
34-
statement.subject &&
35-
options[statement.subject].verbs.find(verb => verb.value === statement.verb)
31+
const verbOptions = (Boolean(statement.subject) &&
32+
options[statement.subject].verbs.find(
33+
verb => verb.value === statement.verb
34+
)) || {
35+
label: '',
36+
value: '',
37+
object: NoopComponent,
38+
}
3639
const statementAtoms = [
3740
!omitSubject && (
3841
<SubjectAtom
@@ -43,8 +46,6 @@ const Statement: React.FC<Props> = ({
4346
...statement,
4447
subject,
4548
verb: options[subject].verbs[0].value,
46-
object: null,
47-
error: null,
4849
}
4950
onChangeStatement(newStatement)
5051
}}
@@ -62,8 +63,8 @@ const Statement: React.FC<Props> = ({
6263
const newStatement = {
6364
...statement,
6465
verb,
65-
object: null,
66-
error: null,
66+
object: undefined,
67+
error: undefined,
6768
}
6869
onChangeStatement(newStatement)
6970
}}
@@ -76,7 +77,7 @@ const Statement: React.FC<Props> = ({
7677
disabled={!statement.verb}
7778
error={statement.error}
7879
object={statement.object}
79-
onChange={(object, error = null) => {
80+
onChange={(object, error = undefined) => {
8081
const newStatement = {
8182
...statement,
8283
object,

react/components/Statement/typings.d.ts

+7
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,10 @@ export type SelectedOption = {
1616
group: SelectOptionGroup['label']
1717
option: SelectOption
1818
}
19+
20+
export interface StatementProp {
21+
subject: string
22+
verb: string
23+
object?: unknown
24+
error?: string
25+
}

0 commit comments

Comments
 (0)