Coderabbit fix

This commit is contained in:
Victor Jack
2026-08-14 14:14:18 +01:00
parent ae39b62369
commit ecd456829c
3 changed files with 4 additions and 69 deletions
@@ -111,42 +111,3 @@ describe('getWidgetEmbedCode', () => {
expect(embedCode).toMatch(/^<div[^>]+><\/div>\n<script[^>]+><\/script>$/); expect(embedCode).toMatch(/^<div[^>]+><\/div>\n<script[^>]+><\/script>$/);
}); });
}); });
// describe('formatCourseForWidget price', () => {
// const baseCourse = {
// id: 'course-1',
// slug: 'my-course',
// title: 'My Course',
// description: 'A course',
// bannerImage: null,
// logo: null,
// isPublished: true,
// currency: 'USD',
// lessonCount: 10,
// exerciseCount: 5,
// type: 'PUBLIC',
// createdAt: new Date().toISOString()
// };
// function format(overrides: Record<string, unknown>) {
// const course = { ...baseCourse, ...overrides } as Parameters<typeof formatCourseForWidget>[0];
// return formatCourseForWidget(course, []);
// }
// it('renders the price for a paid course', () => {
// expect(format({ cost: 100, metadata: { paymentEnabled: true } }).price).toBe('USD 100');
// });
// it('renders the price when paymentEnabled is absent but the cost is positive', () => {
// expect(format({ cost: 100, metadata: {} }).price).toBe('USD 100');
// });
// it('renders Free for a free course', () => {
// expect(format({ cost: 0, metadata: { paymentEnabled: false } }).price).toBe('Free');
// expect(format({ cost: 0, metadata: {} }).price).toBe('Free');
// });
// it('renders Free when a paid course has a zero cost (state blocked by API validation)', () => {
// expect(format({ cost: 0, metadata: { paymentEnabled: true } }).price).toBe('Free');
// });
// });
@@ -142,8 +142,10 @@
let cost = $derived(calcCourseDiscount(pricingData.discount, pricingData.cost ?? 0, !!pricingData.showDiscount)); let cost = $derived(calcCourseDiscount(pricingData.discount, pricingData.cost ?? 0, !!pricingData.showDiscount));
const isExploreClickable = $derived(!!(isLMS && isExplore && onExploreClick));
let courseUrl = $derived.by(() => { let courseUrl = $derived.by(() => {
if (onExploreClick && isLMS && isExplore) { if (isExploreClickable) {
return undefined; return undefined;
} }
@@ -166,8 +168,6 @@
return `/courses/${id}${isLMS ? '/lessons?next=true' : ''}`; return `/courses/${id}${isLMS ? '/lessons?next=true' : ''}`;
}); });
const isExploreClickable = $derived(!!(isExplore && onExploreClick));
const typeBadge = $derived( const typeBadge = $derived(
type && COURSE_TAG[type] type && COURSE_TAG[type]
? { ? {
@@ -223,23 +223,11 @@
dateStyle: 'medium' dateStyle: 'medium'
}).format(date); }).format(date);
} }
function handleExploreCardKeydown(event: KeyboardEvent) {
if (event.repeat || event.target !== event.currentTarget || (event.key !== 'Enter' && event.key !== ' ')) {
return;
}
event.preventDefault();
onExploreClick?.();
}
</script> </script>
<CourseCard <CourseCard
href={courseUrl ? resolve(courseUrl, {}) : undefined} href={courseUrl ? resolve(courseUrl, {}) : undefined}
onclick={isExploreClickable ? onExploreClick : undefined} onclick={isExploreClickable ? onExploreClick : undefined}
onkeydown={isExploreClickable ? handleExploreCardKeydown : undefined}
role={isExploreClickable ? 'button' : undefined}
tabindex={isExploreClickable ? 0 : undefined}
{title} {title}
{description} {description}
{typeBadge} {typeBadge}
@@ -27,10 +27,6 @@
class?: string; class?: string;
/** Click handler for the card wrapper (e.g. opening a preview modal when `href` is absent) */ /** Click handler for the card wrapper (e.g. opening a preview modal when `href` is absent) */
onclick?: (event: MouseEvent) => void; onclick?: (event: MouseEvent) => void;
/** Keyboard handler for the card wrapper when it acts as a clickable region */
onkeydown?: (event: KeyboardEvent) => void;
role?: string;
tabindex?: number;
/** Custom banner area (e.g. optimized `Image`); overrides `bannerImage` */ /** Custom banner area (e.g. optimized `Image`); overrides `bannerImage` */
media?: Snippet; media?: Snippet;
/** Optional overlay inside the link (e.g. dropdown), typically absolutely positioned */ /** Optional overlay inside the link (e.g. dropdown), typically absolutely positioned */
@@ -49,9 +45,6 @@
visibilityBadge, visibilityBadge,
class: className = '', class: className = '',
onclick, onclick,
onkeydown,
role,
tabindex,
media, media,
overlay, overlay,
tags, tags,
@@ -61,14 +54,7 @@
const resolvedBannerImage = $derived(bannerImage?.trim() ? bannerImage : DEFAULT_COURSE_BANNER_IMAGE); const resolvedBannerImage = $derived(bannerImage?.trim() ? bannerImage : DEFAULT_COURSE_BANNER_IMAGE);
</script> </script>
<Item.Root <Item.Root variant="outline" class={cn('ui:group ui:relative ui:max-w-[320px] ui:p-3!', className)} {onclick}>
variant="outline"
class={cn('ui:group ui:relative ui:max-w-[320px] ui:p-3!', className)}
{onclick}
{onkeydown}
{role}
{tabindex}
>
{#snippet child({ props })} {#snippet child({ props })}
{#if href} {#if href}
<a {href} {...props} class={cn('ui:block', props.class as string)}> <a {href} {...props} class={cn('ui:block', props.class as string)}>