Skip to content

Commit f7176c6

Browse files
committed
chore: clean up code, separation of concerns
1 parent d64c857 commit f7176c6

File tree

2 files changed

+22
-18
lines changed

2 files changed

+22
-18
lines changed

src/components/Timeline.tsx

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,13 @@
11
import './Timeline.css';
22
import { Key, useEffect, useRef } from 'react';
33
import { PropsWithKey, TimelineItem, TimelineItemProps } from './TimelineItem';
4-
5-
type OffsetConfig = number | { left?: number; right?: number };
6-
7-
const resolveOffsets = (offset: OffsetConfig) =>
8-
typeof offset === 'number' ? { right: offset, left: 0 } : { right: offset.right ?? 0, left: offset.left ?? 0 };
9-
10-
const MIN_MARKER_OFFSET = 50;
11-
12-
const getMarkerCompensationOffset = (left: number, right: number) => {
13-
const heightDifference = Math.abs(left - right);
14-
if (heightDifference < MIN_MARKER_OFFSET) {
15-
return MIN_MARKER_OFFSET - heightDifference;
16-
}
17-
return 0;
18-
};
4+
import { OffsetConfig, resolveOffsets } from '../models/offset';
195

206
export type TimelineProps = {
217
items: PropsWithKey<TimelineItemProps>[];
228
gap?: number;
239
offset?: OffsetConfig;
10+
minMarkerGap?: number;
2411
dateFormat?: string;
2512
dateLocale?: Locale;
2613
className?: string;
@@ -29,11 +16,12 @@ export type TimelineProps = {
2916
const defaultTimelineConfig: Partial<TimelineProps> = {
3017
gap: 50,
3118
offset: 50,
19+
minMarkerGap: 50,
3220
dateFormat: 'P',
3321
};
3422

3523
export function Timeline(props: TimelineProps) {
36-
const { items, gap, offset, className, dateFormat, dateLocale } = { ...defaultTimelineConfig, ...props };
24+
const { items, gap, offset, minMarkerGap, className, dateFormat, dateLocale } = { ...defaultTimelineConfig, ...props };
3725

3826
const timelineRef = useRef<HTMLDivElement>(null);
3927
const itemsRef = useRef<Map<Key, HTMLElement>>();
@@ -46,6 +34,16 @@ export function Timeline(props: TimelineProps) {
4634
return itemsRef.current;
4735
}
4836

37+
function getMinMarkerGapCompensation(left: number, right: number) {
38+
if (minMarkerGap) {
39+
const heightDifference = Math.abs(left - right);
40+
if (heightDifference < minMarkerGap) {
41+
return minMarkerGap - heightDifference;
42+
}
43+
}
44+
return 0;
45+
}
46+
4947
function positionTimelineItems() {
5048
const elements = Array.from(getRefMap().values());
5149

@@ -57,14 +55,14 @@ export function Timeline(props: TimelineProps) {
5755
const element = item;
5856

5957
if (leftHeight > rightHeight) {
60-
leftHeight += getMarkerCompensationOffset(leftHeight, rightHeight);
58+
leftHeight += getMinMarkerGapCompensation(leftHeight, rightHeight);
6159

6260
element.style.top = `${rightHeight}px`;
6361
element.classList.add('timeline-item--right');
6462
element.classList.remove('timeline-item--left');
6563
rightHeight += element.offsetHeight + (gap ?? 0);
6664
} else {
67-
rightHeight += getMarkerCompensationOffset(leftHeight, rightHeight);
65+
rightHeight += getMinMarkerGapCompensation(leftHeight, rightHeight);
6866

6967
element.style.top = `${leftHeight}px`;
7068
element.classList.add('timeline-item--left');

src/models/offset.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export type Offset = { left?: number; right?: number };
2+
3+
export type OffsetConfig = number | Offset;
4+
5+
export const resolveOffsets = (offset: OffsetConfig) =>
6+
typeof offset === 'number' ? { right: offset, left: 0 } : { right: offset.right ?? 0, left: offset.left ?? 0 };

0 commit comments

Comments
 (0)