Skip to content

Commit 1fdbfc5

Browse files
committed
Refactor MultiSegment out into its own thing.
1 parent 1d3d3df commit 1fdbfc5

File tree

2 files changed

+53
-49
lines changed

2 files changed

+53
-49
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { badgeCVA, typeIcons } from '@/components/design'
2+
3+
interface Segment<T> {
4+
text?: string
5+
type: keyof typeof typeIcons
6+
value: T
7+
}
8+
interface MultiSegmentProps<T> {
9+
segments: Segment<T>[]
10+
value: T
11+
onValueChange: (value: T) => void
12+
}
13+
14+
const MultiSegment = <T,>({ segments, value, onValueChange }: MultiSegmentProps<T>) => {
15+
return (
16+
<div className='inline-flex items-center gap-0'>
17+
{segments.map((segment, index) => {
18+
const Icon = typeIcons[segment.type]
19+
const isFirst = index === 0
20+
const isLast = index === segments.length - 1
21+
22+
const roundedClasses =
23+
isFirst && isLast
24+
? ''
25+
: isFirst
26+
? '!rounded-r-none'
27+
: isLast
28+
? '!rounded-l-none'
29+
: '!rounded-none'
30+
31+
return (
32+
<button
33+
key={String(segment.value)}
34+
className={`${badgeCVA({
35+
clickable: true,
36+
selected: value === segment.value,
37+
type: segment.type,
38+
})} ${roundedClasses}`}
39+
onClick={() => onValueChange(segment.value)}
40+
type='button'
41+
>
42+
{segment.type === 'blank' || <Icon className='w-3 h-3' />}
43+
{segment.text}
44+
</button>
45+
)
46+
})}
47+
</div>
48+
)
49+
}
50+
51+
export default MultiSegment

browser-extension/tests/playground/claude.tsx

Lines changed: 2 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -2,60 +2,13 @@ import { Eye, EyeOff, Search, Settings, Trash2 } from 'lucide-react'
22
import { useMemo, useState } from 'react'
33
import { twMerge } from 'tailwind-merge'
44
import Badge from '@/components/Badge'
5-
import { badgeCVA, typeIcons } from '@/components/design'
5+
import { badgeCVA } from '@/components/design'
6+
import MultiSegment from '@/components/MultiSegment'
67
import type { CommentTableRow } from '@/entrypoints/background'
78
import type { FilterState } from '@/entrypoints/popup/popup'
89
import { EnhancerRegistry } from '@/lib/registries'
910
import { generateMockDrafts } from './replicaData'
1011

11-
interface Segment<T> {
12-
text?: string
13-
type: keyof typeof typeIcons
14-
value: T
15-
}
16-
interface MultiSegmentProps<T> {
17-
segments: Segment<T>[]
18-
value: T
19-
onValueChange: (value: T) => void
20-
}
21-
22-
const MultiSegment = <T,>({ segments, value, onValueChange }: MultiSegmentProps<T>) => {
23-
return (
24-
<div className='inline-flex items-center gap-0'>
25-
{segments.map((segment, index) => {
26-
const Icon = typeIcons[segment.type]
27-
const isFirst = index === 0
28-
const isLast = index === segments.length - 1
29-
30-
const roundedClasses =
31-
isFirst && isLast
32-
? ''
33-
: isFirst
34-
? '!rounded-r-none'
35-
: isLast
36-
? '!rounded-l-none'
37-
: '!rounded-none'
38-
39-
return (
40-
<button
41-
key={String(segment.value)}
42-
className={`${badgeCVA({
43-
clickable: true,
44-
selected: value === segment.value,
45-
type: segment.type,
46-
})} ${roundedClasses}`}
47-
onClick={() => onValueChange(segment.value)}
48-
type='button'
49-
>
50-
{segment.type === 'blank' || <Icon className='w-3 h-3' />}
51-
{segment.text}
52-
</button>
53-
)
54-
})}
55-
</div>
56-
)
57-
}
58-
5912
// Helper function for relative time
6013
function timeAgo(date: Date | number): string {
6114
const timestamp = typeof date === 'number' ? date : date.getTime()

0 commit comments

Comments
 (0)