Skip to content

Commit 563f9c4

Browse files
committed
refactor: share provider presentation metadata
1 parent eb3737f commit 563f9c4

3 files changed

Lines changed: 58 additions & 22 deletions

File tree

src/dashboard.tsx

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { createTerminalProgressReporter } from './parse-progress.js'
1414
import { CompareView } from './compare.js'
1515
import { getPlanUsageOrNull, type PlanUsage } from './plan-usage.js'
1616
import { planDisplayName } from './plans.js'
17+
import { providerColor, providerLabel } from './provider-colors.js'
1718
import { join } from 'path'
1819

1920
type Period = 'today' | 'week' | '30days' | 'month' | 'all'
@@ -56,15 +57,6 @@ const PANEL_COLORS = {
5657
bash: '#F5A05B',
5758
}
5859

59-
const PROVIDER_COLORS: Record<string, string> = {
60-
claude: '#FF8C42',
61-
codex: '#5BF5A0',
62-
cursor: '#00B4D8',
63-
opencode: '#A78BFA',
64-
pi: '#F472B6',
65-
all: '#FF8C42',
66-
}
67-
6860
const CATEGORY_COLORS: Record<TaskCategory, string> = {
6961
coding: '#5B9EF5',
7062
debugging: '#F55B5B',
@@ -490,16 +482,6 @@ function BashBreakdown({ projects, pw, bw }: { projects: ProjectSummary[]; pw: n
490482
)
491483
}
492484

493-
const PROVIDER_DISPLAY_NAMES: Record<string, string> = {
494-
all: 'All',
495-
claude: 'Claude',
496-
codex: 'Codex',
497-
cursor: 'Cursor',
498-
opencode: 'OpenCode',
499-
pi: 'Pi',
500-
}
501-
function getProviderDisplayName(name: string): string { return PROVIDER_DISPLAY_NAMES[name] ?? name }
502-
503485
function PeriodTabs({ active, providerName, showProvider }: { active: Period; providerName?: string; showProvider?: boolean }) {
504486
return (
505487
<Box justifyContent="space-between" paddingX={1}>
@@ -510,9 +492,7 @@ function PeriodTabs({ active, providerName, showProvider }: { active: Period; pr
510492
</Text>
511493
))}
512494
</Box>
513-
{showProvider && providerName && (
514-
<Box><Text color={DIM}>| </Text><Text color={ORANGE} bold>[p]</Text><Text bold color={PROVIDER_COLORS[providerName] ?? ORANGE}> {getProviderDisplayName(providerName)}</Text></Box>
515-
)}
495+
{showProvider && providerName && <Box><Text color={DIM}>| </Text><Text color={ORANGE} bold>[p]</Text><Text bold color={providerColor(providerName)}> {providerLabel(providerName)}</Text></Box>}
516496
</Box>
517497
)
518498
}

src/provider-colors.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
export const PROVIDER_COLORS: Record<string, string> = {
2+
all: '#FF8C42',
3+
claude: '#FF8C42',
4+
codex: '#5BF5A0',
5+
cursor: '#00B4D8',
6+
opencode: '#A78BFA',
7+
pi: '#F472B6',
8+
copilot: '#6495ED',
9+
}
10+
11+
const PROVIDER_LABELS: Record<string, string> = {
12+
all: 'All',
13+
claude: 'Claude',
14+
codex: 'Codex',
15+
cursor: 'Cursor',
16+
opencode: 'OpenCode',
17+
pi: 'Pi',
18+
copilot: 'Copilot',
19+
}
20+
21+
export function providerLabel(name: string): string {
22+
return PROVIDER_LABELS[name] ?? name
23+
}
24+
25+
export function providerColor(name: string): string {
26+
return PROVIDER_COLORS[name] ?? '#CCCCCC'
27+
}

tests/provider-colors.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { describe, it, expect } from 'vitest'
2+
3+
import { PROVIDER_COLORS, providerColor, providerLabel } from '../src/provider-colors.js'
4+
5+
describe('provider presentation metadata', () => {
6+
it('exports the shared provider palette', () => {
7+
expect(PROVIDER_COLORS).toEqual({
8+
all: '#FF8C42',
9+
claude: '#FF8C42',
10+
codex: '#5BF5A0',
11+
cursor: '#00B4D8',
12+
opencode: '#A78BFA',
13+
pi: '#F472B6',
14+
copilot: '#6495ED',
15+
})
16+
})
17+
18+
it('maps provider names to labels', () => {
19+
expect(providerLabel('all')).toBe('All')
20+
expect(providerLabel('opencode')).toBe('OpenCode')
21+
expect(providerLabel('unknown')).toBe('unknown')
22+
})
23+
24+
it('maps provider names to colors with a neutral fallback', () => {
25+
expect(providerColor('all')).toBe('#FF8C42')
26+
expect(providerColor('opencode')).toBe('#A78BFA')
27+
expect(providerColor('unknown')).toBe('#CCCCCC')
28+
})
29+
})

0 commit comments

Comments
 (0)