Skip to content

Commit c8ca880

Browse files
committed
feat: make AI courses/guides look like courses/guides
1 parent 968ff0e commit c8ca880

2 files changed

Lines changed: 42 additions & 54 deletions

File tree

src/components/TopicDetail/TopicDetail.tsx

Lines changed: 41 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,58 @@
11
import { useEffect, useMemo, useRef, useState } from 'react';
22

3+
import { useChat } from '@ai-sdk/react';
4+
import { useQuery } from '@tanstack/react-query';
5+
import {
6+
Ban,
7+
FileText, HeartHandshake,
8+
Star,
9+
X,
10+
Zap
11+
} from 'lucide-react';
312
import { useKeydown } from '../../hooks/use-keydown';
413
import { useLoadTopic } from '../../hooks/use-load-topic';
514
import { useOutsideClick } from '../../hooks/use-outside-click';
15+
import { useToast } from '../../hooks/use-toast';
616
import { useToggleTopic } from '../../hooks/use-toggle-topic';
17+
import { topicDetailAiChatTransport } from '../../lib/ai.ts';
18+
import { getUrlParams, parseUrl } from '../../lib/browser';
19+
import { cn } from '../../lib/classname.ts';
20+
import { lockBodyScroll } from '../../lib/dom.ts';
721
import { httpGet } from '../../lib/http';
822
import { isLoggedIn } from '../../lib/jwt';
23+
import { markdownToHtml, sanitizeMarkdown } from '../../lib/markdown';
24+
import { showLoginPopup } from '../../lib/popup';
925
import type { ResourceType } from '../../lib/resource-progress';
1026
import {
1127
isTopicDone,
1228
refreshProgressCounters,
1329
renderTopicProgress,
1430
updateResourceProgress as updateResourceProgressApi,
1531
} from '../../lib/resource-progress';
32+
import { type AllowedRoadmapRenderer } from '../../lib/roadmap.ts';
33+
import { aiLimitOptions } from '../../queries/ai-course.ts';
34+
import { billingDetailsOptions } from '../../queries/billing.ts';
35+
import { roadmapTreeMappingOptions } from '../../queries/roadmap-tree.ts';
1636
import { pageProgressMessage } from '../../stores/page';
17-
import { showLoginPopup } from '../../lib/popup';
18-
import { useToast } from '../../hooks/use-toast';
37+
import { queryClient } from '../../stores/query-client.ts';
38+
import { UpgradeAccountModal } from '../Billing/UpgradeAccountModal.tsx';
1939
import type {
2040
AllowedLinkTypes,
2141
RoadmapContentDocument,
2242
} from '../CustomRoadmap/CustomRoadmap';
23-
import { markdownToHtml, sanitizeMarkdown } from '../../lib/markdown';
24-
import {
25-
Ban,
26-
BookOpen,
27-
BookOpenIcon,
28-
BotIcon,
29-
FileText,
30-
FileTextIcon,
31-
HeartHandshake,
32-
Star,
33-
X,
34-
} from 'lucide-react';
35-
import { getUrlParams, parseUrl } from '../../lib/browser';
36-
import { Spinner } from '../ReactIcons/Spinner';
43+
import type { AIChatHistoryType } from '../GenerateCourse/AICourseLessonChat.tsx';
3744
import { GitHubIcon } from '../ReactIcons/GitHubIcon.tsx';
38-
import { type AllowedRoadmapRenderer } from '../../lib/roadmap.ts';
39-
import { lockBodyScroll } from '../../lib/dom.ts';
40-
import { TopicDetailLink } from './TopicDetailLink.tsx';
41-
import { ResourceListSeparator } from './ResourceListSeparator.tsx';
45+
import { Spinner } from '../ReactIcons/Spinner';
46+
import { CreateCourseModal } from './CreateCourseModal.tsx';
4247
import { PaidResourceDisclaimer } from './PaidResourceDisclaimer.tsx';
48+
import { ResourceListSeparator } from './ResourceListSeparator.tsx';
49+
import { TopicDetailAI } from './TopicDetailAI.tsx';
50+
import { TopicDetailLink } from './TopicDetailLink.tsx';
4351
import {
4452
TopicDetailsTabs,
4553
type AllowedTopicDetailsTabs,
4654
} from './TopicDetailsTabs.tsx';
47-
import { TopicDetailAI } from './TopicDetailAI.tsx';
48-
import { cn } from '../../lib/classname.ts';
49-
import type { AIChatHistoryType } from '../GenerateCourse/AICourseLessonChat.tsx';
50-
import { UpgradeAccountModal } from '../Billing/UpgradeAccountModal.tsx';
5155
import { TopicProgressButton } from './TopicProgressButton.tsx';
52-
import { CreateCourseModal } from './CreateCourseModal.tsx';
53-
import { useChat } from '@ai-sdk/react';
54-
import { topicDetailAiChatTransport } from '../../lib/ai.ts';
55-
import { useQuery } from '@tanstack/react-query';
56-
import { queryClient } from '../../stores/query-client.ts';
57-
import { roadmapTreeMappingOptions } from '../../queries/roadmap-tree.ts';
58-
import { aiLimitOptions } from '../../queries/ai-course.ts';
59-
import { billingDetailsOptions } from '../../queries/billing.ts';
6056

6157
type PaidResourceType = {
6258
_id?: string;
@@ -664,17 +660,18 @@ export function TopicDetail(props: TopicDetailProps) {
664660
{(hasSubjects || hasGuides) && (
665661
<>
666662
<ResourceListSeparator
667-
text="AI Tutor"
663+
text="Your personalized AI tutor"
668664
className="text-blue-600"
669-
icon={BotIcon}
665+
icon={Zap}
670666
/>
671-
<ul className="mt-4 ml-3 flex flex-wrap gap-1 text-sm">
667+
<ul className="mt-4 ml-3 flex flex-col flex-wrap gap-1 text-sm">
672668
{subjects.map((subject) => {
673669
return (
674670
<li key={subject}>
675-
<a
676-
key={subject}
677-
target="_blank"
671+
<TopicDetailLink
672+
url={`/ai/course/search?term=${subject}&src=topic`}
673+
type="course"
674+
title={subject}
678675
onClick={(e) => {
679676
if (!isLoggedIn()) {
680677
e.preventDefault();
@@ -688,21 +685,17 @@ export function TopicDetail(props: TopicDetailProps) {
688685
return;
689686
}
690687
}}
691-
href={`/ai/course/search?term=${subject}&src=topic`}
692-
className="flex items-center gap-1.5 rounded-md border border-gray-300 bg-gray-100 px-2 py-1 hover:bg-gray-200 hover:text-black"
693-
>
694-
<BookOpenIcon className="size-3.5" />
695-
{subject}
696-
</a>
688+
/>
697689
</li>
698690
);
699691
})}
700692
{guides.map((guide) => {
701693
return (
702694
<li key={guide}>
703-
<a
704-
key={guide}
705-
target="_blank"
695+
<TopicDetailLink
696+
url={`/ai/guide/search?term=${guide}&src=topic`}
697+
type="article"
698+
title={guide}
706699
onClick={(e) => {
707700
if (!isLoggedIn()) {
708701
e.preventDefault();
@@ -716,12 +709,7 @@ export function TopicDetail(props: TopicDetailProps) {
716709
return;
717710
}
718711
}}
719-
href={`/ai/guide/search?term=${guide}&src=topic`}
720-
className="flex items-center gap-1.5 rounded-md border border-gray-300 bg-gray-100 px-2 py-1 hover:bg-gray-200 hover:text-black"
721-
>
722-
<FileTextIcon className="size-3.5" />
723-
{guide}
724-
</a>
712+
/>
725713
</li>
726714
);
727715
})}

src/components/TopicDetail/TopicDetailLink.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ function TopicLinkBadge(props: TopicLinkBadgeProps) {
4848

4949
type TopicDetailLinkProps = {
5050
url: string;
51-
onClick?: () => void;
51+
onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;
5252
type: AllowedLinkTypes;
5353
title: string;
5454
isPaid?: boolean;

0 commit comments

Comments
 (0)