11import { 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' ;
312import { useKeydown } from '../../hooks/use-keydown' ;
413import { useLoadTopic } from '../../hooks/use-load-topic' ;
514import { useOutsideClick } from '../../hooks/use-outside-click' ;
15+ import { useToast } from '../../hooks/use-toast' ;
616import { 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' ;
721import { httpGet } from '../../lib/http' ;
822import { isLoggedIn } from '../../lib/jwt' ;
23+ import { markdownToHtml , sanitizeMarkdown } from '../../lib/markdown' ;
24+ import { showLoginPopup } from '../../lib/popup' ;
925import type { ResourceType } from '../../lib/resource-progress' ;
1026import {
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' ;
1636import { 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 ' ;
1939import 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' ;
3744import { 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' ;
4247import { PaidResourceDisclaimer } from './PaidResourceDisclaimer.tsx' ;
48+ import { ResourceListSeparator } from './ResourceListSeparator.tsx' ;
49+ import { TopicDetailAI } from './TopicDetailAI.tsx' ;
50+ import { TopicDetailLink } from './TopicDetailLink.tsx' ;
4351import {
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' ;
5155import { 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
6157type 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 } ) }
0 commit comments