-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathLabelsFilter.tsx
More file actions
42 lines (37 loc) · 1.11 KB
/
LabelsFilter.tsx
File metadata and controls
42 lines (37 loc) · 1.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import "./LabelsFilter.css";
import { type MouseEventHandler, useCallback } from "react";
import { Label } from "../Label/Label";
import type { ILabel } from "../NotesProvider/hooks/useLabels";
export type LabelsFilterProps = {
labels: ILabel[];
onToggleLabel: (label: string) => void;
};
export function LabelsFilter({ labels, onToggleLabel }: LabelsFilterProps) {
return (
<div className="labels filter">
{labels.map((label) => (
<LabelLink key={label.label} label={label} onToggleLabel={onToggleLabel} />
))}
</div>
);
}
type LabelLinkProps = {
label: ILabel;
onToggleLabel: LabelsFilterProps["onToggleLabel"];
};
function LabelLink({ label, onToggleLabel }: LabelLinkProps) {
const selectLabel = useCallback<MouseEventHandler>(
(e) => {
e.preventDefault();
onToggleLabel(label.label);
},
[label, onToggleLabel],
);
const clazz = `label-link ${label.isActive ? "active" : ""}`;
const ico = label.isActive ? "⊙" : "∅";
return (
<a href="#" className={clazz} onClick={selectLabel}>
<Label label={label.label} prefix={ico} />
</a>
);
}