Skip to content

Commit bf45080

Browse files
committed
feat: setup element referencing
1 parent 677db57 commit bf45080

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

src/components/Timeline.stories.mdx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,10 @@ import { Timeline } from './Timeline';
33

44
<Meta title="Timeline" component={Timeline} />
55

6-
<Timeline items={[{ title: 'test', date: new Date() }]} />
6+
<Timeline
7+
items={[
8+
{ title: 'test1', date: new Date() },
9+
{ title: 'test2', date: new Date() },
10+
{ title: 'test3', date: new Date() },
11+
]}
12+
/>

src/components/Timeline.tsx

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,38 @@
1-
import { TimelineItem, TimelineItemProps } from './TimelineItem';
21
import './Timeline.css';
2+
import { useRef } from 'react';
3+
import { TimelineItem, TimelineItemProps } from './TimelineItem';
34

45
export type TimelineProps = {
56
items: TimelineItemProps[];
67
};
78

89
export function Timeline({ items }: TimelineProps) {
10+
const itemsRef = useRef<Map<Date, HTMLDivElement>>();
11+
12+
function getRefMap() {
13+
if (!itemsRef.current) {
14+
// Initialize the Map on first usage.
15+
itemsRef.current = new Map();
16+
}
17+
return itemsRef.current;
18+
}
19+
920
return (
1021
<div className="timeline">
1122
<div className="timeline__line" />
1223
{items.map((item) => (
13-
<TimelineItem key={item.date.toISOString()} {...item} />
24+
<div
25+
ref={(node) => {
26+
const map = getRefMap();
27+
if (node) {
28+
map.set(item.date, node);
29+
} else {
30+
map.delete(item.date);
31+
}
32+
}}
33+
>
34+
<TimelineItem key={item.date.toISOString()} {...item} />
35+
</div>
1436
))}
1537
</div>
1638
);

0 commit comments

Comments
 (0)