Skip to content

Commit 854ff25

Browse files
authored
refactor: simplify field components (#1756)
refactor: simplify fields Signed-off-by: Adam Setch <[email protected]>
1 parent fc93338 commit 854ff25

File tree

9 files changed

+389
-373
lines changed

9 files changed

+389
-373
lines changed

src/renderer/components/fields/Checkbox.tsx

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { FC, ReactNode } from 'react';
2+
import { cn } from '../../utils/cn';
23
import { Tooltip } from './Tooltip';
34

45
export interface ICheckbox {
@@ -26,10 +27,10 @@ export const Checkbox: FC<ICheckbox> = (props: ICheckbox) => {
2627
<div className="flex items-center ml-3">
2728
<label
2829
htmlFor={props.name}
29-
className="font-medium text-gitify-font cursor-pointer"
30-
style={
31-
props.disabled ? { textDecoration: 'line-through' } : undefined
32-
}
30+
className={cn(
31+
'font-medium text-gitify-font cursor-pointer',
32+
props.disabled && 'line-through',
33+
)}
3334
>
3435
{props.label}
3536
</label>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { render } from '@testing-library/react';
2+
import { FieldLabel, type IFieldLabel } from './FieldLabel';
3+
4+
describe('renderer/components/fields/FieldLabel.tsx', () => {
5+
const props: IFieldLabel = {
6+
name: 'appearance',
7+
label: 'Appearance',
8+
};
9+
10+
it('should render', () => {
11+
const tree = render(<FieldLabel {...props} />);
12+
expect(tree).toMatchSnapshot();
13+
});
14+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import type { FC } from 'react';
2+
3+
export interface IFieldLabel {
4+
name: string;
5+
label: string;
6+
}
7+
8+
export const FieldLabel: FC<IFieldLabel> = (props: IFieldLabel) => {
9+
return (
10+
<label htmlFor={props.name} className="mr-3 font-medium cursor-pointer">
11+
{props.label}
12+
</label>
13+
);
14+
};

src/renderer/components/fields/RadioGroup.tsx

+26-47
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,43 @@
11
import type { ChangeEvent, FC } from 'react';
22
import type { RadioGroupItem } from '../../types';
3-
import { cn } from '../../utils/cn';
3+
import { FieldLabel } from './FieldLabel';
44

55
export interface IRadioGroup {
66
name: string;
77
label: string;
88
options: RadioGroupItem[];
99
value: string;
10-
disabled?: boolean;
1110
onChange: (event: ChangeEvent<HTMLInputElement>) => void;
12-
className?: string;
1311
}
1412

1513
export const RadioGroup: FC<IRadioGroup> = (props: IRadioGroup) => {
1614
return (
17-
<div className={cn('mt-3 mb-2 text-sm', props.className)}>
18-
<div className="flex items-start">
19-
<div className="mr-3">
20-
<label
21-
htmlFor={props.name}
22-
className="font-medium text-gitify-font"
23-
style={
24-
props.disabled ? { textDecoration: 'line-through' } : undefined
25-
}
26-
>
27-
{props.label}
28-
</label>
29-
</div>
15+
<div className="flex items-start my-2 text-sm font-medium">
16+
<FieldLabel name={props.name} label={props.label} />
3017

31-
<div
32-
className="flex items-center space-x-4"
33-
role="group"
34-
aria-labelledby={props.name}
35-
>
36-
{props.options.map((item) => {
37-
return (
38-
<div
39-
className="flex items-center"
40-
key={`radio_item_${item.value.toLowerCase()}`}
41-
>
42-
<input
43-
type="radio"
44-
className="size-4 cursor-pointer"
45-
id={`${props.name}_${item.value.toLowerCase()}`}
46-
name={props.name}
47-
value={item.value}
48-
onChange={props.onChange}
49-
checked={item.value === props.value}
50-
disabled={props.disabled}
51-
/>
52-
<label
53-
htmlFor={`${props.name}_${item.value.toLowerCase()}`}
54-
className="ml-3 block text-sm font-medium text-gitify-font cursor-pointer"
55-
>
56-
{item.label}
57-
</label>
58-
</div>
59-
);
60-
})}
61-
</div>
18+
<div
19+
className="flex items-center space-x-4"
20+
role="group"
21+
aria-labelledby={props.name}
22+
>
23+
{props.options.map((item) => {
24+
const name = `${props.name}_${item.value.toLowerCase()}`;
25+
26+
return (
27+
<div className="flex items-center gap-2" key={name}>
28+
<input
29+
type="radio"
30+
className="size-4 cursor-pointer"
31+
id={name}
32+
name={props.name}
33+
value={item.value}
34+
onChange={props.onChange}
35+
checked={item.value === props.value}
36+
/>
37+
<FieldLabel name={name} label={item.label} />
38+
</div>
39+
);
40+
})}
6241
</div>
6342
</div>
6443
);

src/renderer/components/fields/__snapshots__/FieldLabel.test.tsx.snap

+76
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)