Skip to content

Commit 75280ac

Browse files
committed
fix(web): badge "Coming soon" on unreleased skills
Code Review and Security Audit skills appear in the skill picker but are not implemented yet. Grey them out and show a "Coming soon" badge in amber to avoid misleading users who click and get nothing.
1 parent 7718f54 commit 75280ac

3 files changed

Lines changed: 38 additions & 12 deletions

File tree

apps/web/src/features/session/SkillSelector.test.tsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,28 @@ describe('SkillSelector', () => {
3535
expect(prElements.length).toBeGreaterThan(0)
3636
})
3737

38-
test('calls onSelectSkill when a card is clicked', () => {
38+
test('calls onSelectSkill when an available skill card is clicked', () => {
3939
const onSelectSkill = vi.fn()
4040
render(<SkillSelector {...defaultProps} onSelectSkill={onSelectSkill} />)
4141

4242
fireEvent.click(screen.getByTestId('skill-card-challenge-me'))
4343
expect(onSelectSkill).toHaveBeenCalledWith('challenge-me')
44+
})
4445

45-
fireEvent.click(screen.getByTestId('skill-card-code-review'))
46-
expect(onSelectSkill).toHaveBeenCalledWith('code-review')
46+
test('does not call onSelectSkill for coming-soon skills', () => {
47+
const onSelectSkill = vi.fn()
48+
render(<SkillSelector {...defaultProps} onSelectSkill={onSelectSkill} />)
4749

50+
fireEvent.click(screen.getByTestId('skill-card-code-review'))
4851
fireEvent.click(screen.getByTestId('skill-card-security-audit'))
49-
expect(onSelectSkill).toHaveBeenCalledWith('security-audit')
52+
expect(onSelectSkill).not.toHaveBeenCalled()
53+
})
54+
55+
test('shows Coming soon badge for unreleased skills', () => {
56+
render(<SkillSelector {...defaultProps} />)
57+
58+
const badges = screen.getAllByText('Coming soon')
59+
expect(badges.length).toBe(2)
5060
})
5161

5262
test('disables cards when disabled prop is true', () => {

apps/web/src/features/session/SkillSelector.tsx

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@ const SKILLS: Skill[] = [
1818
label: 'Code Review',
1919
description: 'Multi-layer adversarial code review',
2020
duration: '3-5 min',
21+
comingSoon: true,
2122
},
2223
{
2324
name: 'security-audit',
2425
label: 'Security Audit',
2526
description: 'Vulnerability scan on your diff',
2627
duration: '1-3 min',
28+
comingSoon: true,
2729
},
2830
]
2931

@@ -66,8 +68,8 @@ export default function SkillSelector({
6668
<button
6769
key={skill.name}
6870
data-testid={`skill-card-${skill.name}`}
69-
onClick={() => onSelectSkill(skill.name)}
70-
disabled={disabled}
71+
onClick={() => !skill.comingSoon && onSelectSkill(skill.name)}
72+
disabled={disabled || skill.comingSoon}
7173
className="text-left p-5 rounded-[10px] transition-all duration-150 cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed"
7274
style={{
7375
background: '#1a1717',
@@ -102,12 +104,25 @@ export default function SkillSelector({
102104
>
103105
{skill.duration}
104106
</span>
105-
<span
106-
className="text-[12px] font-semibold font-mono"
107-
style={{ color: '#E2A039' }}
108-
>
109-
Run &rarr;
110-
</span>
107+
{skill.comingSoon ? (
108+
<span
109+
className="text-[11px] font-mono px-2 py-0.5 rounded-full"
110+
style={{
111+
color: 'rgba(226, 160, 57, 0.7)',
112+
background: 'rgba(226, 160, 57, 0.08)',
113+
border: '1px solid rgba(226, 160, 57, 0.15)',
114+
}}
115+
>
116+
Coming soon
117+
</span>
118+
) : (
119+
<span
120+
className="text-[12px] font-semibold font-mono"
121+
style={{ color: '#E2A039' }}
122+
>
123+
Run &rarr;
124+
</span>
125+
)}
111126
</div>
112127
</div>
113128
</button>

apps/web/src/features/session/containerTypes.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ export interface Skill {
5151
label: string
5252
description: string
5353
duration: string
54+
comingSoon?: boolean
5455
}
5556

5657
// ---------------------------------------------------------------------------

0 commit comments

Comments
 (0)