@@ -25,6 +25,7 @@ import { usePersonaStore } from '@/lib/store/persona-store'
2525import { useContextAvailability } from '@/lib/hooks/use-context-availability'
2626import { getSelectContextDescription } from '@/lib/utils/context-messages'
2727import { ContextRequirementMessage } from '@/components/context-requirement-message'
28+ import { useCourses } from '@/lib/hooks/use-courses'
2829import type { CitationReference , Citation } from '@/lib/types/citation-types'
2930import React from 'react'
3031
@@ -71,9 +72,10 @@ export default function SummaryPage() {
7172 setError,
7273 setSelectedModel,
7374 } = useSummaryStore ( )
74- const { activePersona } = usePersonaStore ( )
75+ const { activePersona, selectedCourseId } = usePersonaStore ( )
7576 const { selectedSources } = useSourcesStore ( )
7677 const { getActiveContextModelName, getContextTypeLabel } = useContextAvailability ( )
78+ const { data : coursesData } = useCourses ( )
7779 const summary = summaries [ id ] ?. summary || ''
7880 const [ , setIsMobile ] = useState ( false )
7981 const [ citations , setCitations ] = useState < Citation [ ] > ( [ ] )
@@ -94,27 +96,55 @@ export default function SummaryPage() {
9496 return false
9597 }
9698 const selectedSourcesCount = selectedSources . filter ( ( source ) => source . selected ) . length
97- if ( selectedSourcesCount !== 1 ) {
98- toast . error ( 'Please select exactly one source.' )
99+ // Allow generation with no sources or exactly one source, but not multiple sources
100+ if ( selectedSourcesCount > 1 ) {
101+ toast . error (
102+ 'Multiple sources selected. Please select only one source or none to use course context.' ,
103+ )
99104 return false
100105 }
101106 return true
102107 }
103108
104109 const generateSummary = async ( ) => {
105110 startGenerating ( )
111+
106112 if ( ! validateInputs ( ) ) {
107113 stopGenerating ( )
108114 return
109115 }
116+
110117 try {
111118 const modelName = getActiveContextModelName ( )
119+
120+ // Get course information from context
121+ const selectedCourse = coursesData ?. docs . find ( ( course ) => course . id === selectedCourseId )
122+ const courseInfo = selectedCourse
123+ ? {
124+ courseName : selectedCourse . name ,
125+ courseDescription : selectedCourse . description ,
126+ }
127+ : undefined
128+
129+ // Fallback: if no sources selected, use course description as a pseudo-source
130+ const sourcesToUse = selectedSources ?. length
131+ ? selectedSources
132+ : courseInfo ?. courseDescription
133+ ? [ { content : courseInfo . courseDescription , name : 'Course Description' } ]
134+ : [ ]
135+
112136 const response = await fetch ( '/api/summary' , {
113137 method : 'POST' ,
114138 headers : { 'Content-Type' : 'application/json' } ,
115- body : JSON . stringify ( { selectedModel : modelName , selectedSources } ) ,
139+ body : JSON . stringify ( {
140+ selectedModel : modelName ,
141+ selectedSources : sourcesToUse ,
142+ courseInfo,
143+ } ) ,
116144 } )
145+
117146 if ( ! response . ok ) throw new Error ( 'Failed to generate summary' )
147+
118148 const data = await response . json ( )
119149 setSummary ( id , data . summary )
120150 setSelectedModel ( modelName )
@@ -124,6 +154,7 @@ export default function SummaryPage() {
124154 console . error ( 'Error generating summary:' , error )
125155 setError ( 'An error occurred while generating the summary.' )
126156 }
157+
127158 stopGenerating ( )
128159 }
129160
0 commit comments