From 25967a85e149aa4b2241216e2cbdac6462aa1a77 Mon Sep 17 00:00:00 2001 From: Arik Chakma Date: Fri, 20 Jun 2025 01:22:56 +0600 Subject: [PATCH] wip --- .../ContentGenerator/ContentGenerator.tsx | 64 ++--- .../ContentGenerator/CourseOptions.tsx | 79 ------ .../ContentGenerator/GuideOptions.tsx | 72 ------ .../ContentGenerator/QuestionAnswerChat.tsx | 241 ++++++++++++++++++ src/queries/user-ai-session.ts | 30 +++ 5 files changed, 290 insertions(+), 196 deletions(-) delete mode 100644 src/components/ContentGenerator/CourseOptions.tsx delete mode 100644 src/components/ContentGenerator/GuideOptions.tsx create mode 100644 src/components/ContentGenerator/QuestionAnswerChat.tsx create mode 100644 src/queries/user-ai-session.ts diff --git a/src/components/ContentGenerator/ContentGenerator.tsx b/src/components/ContentGenerator/ContentGenerator.tsx index bc255b931..5c5dd0a45 100644 --- a/src/components/ContentGenerator/ContentGenerator.tsx +++ b/src/components/ContentGenerator/ContentGenerator.tsx @@ -6,9 +6,6 @@ import { } from 'lucide-react'; import { useEffect, useId, useState, type FormEvent } from 'react'; import { FormatItem } from './FormatItem'; -import { GuideOptions } from './GuideOptions'; -import { FineTuneCourse } from '../GenerateCourse/FineTuneCourse'; -import { CourseOptions } from './CourseOptions'; import { clearFineTuneData, getCourseFineTuneData, @@ -20,9 +17,10 @@ import { showLoginPopup } from '../../lib/popup'; import { UpgradeAccountModal } from '../Billing/UpgradeAccountModal'; import { useIsPaidUser } from '../../queries/billing'; import { cn } from '../../lib/classname'; +import { QuestionAnswerChat } from './QuestionAnswerChat'; const allowedFormats = ['course', 'guide', 'roadmap'] as const; -type AllowedFormat = (typeof allowedFormats)[number]; +export type AllowedFormat = (typeof allowedFormats)[number]; export function ContentGenerator() { const [isUpgradeModalOpen, setIsUpgradeModalOpen] = useState(false); @@ -145,7 +143,10 @@ export function ContentGenerator() { id={titleFieldId} placeholder="Enter a topic" value={title} - onChange={(e) => setTitle(e.target.value)} + onChange={(e) => { + setTitle(e.target.value); + setShowFineTuneOptions(false); + }} className="block w-full rounded-xl border border-gray-200 bg-white p-4 outline-none placeholder:text-gray-500 focus:border-gray-500" required minLength={3} @@ -172,48 +173,21 @@ export function ContentGenerator() { - {selectedFormat === 'guide' && ( - - )} - - {selectedFormat === 'course' && ( - + setShowFineTuneOptions(e.target.checked)} /> - )} + Answer the following questions for a better {selectedFormat} + - {selectedFormat !== 'roadmap' && ( - <> - - {showFineTuneOptions && ( - - )} - + {showFineTuneOptions && ( + )} + ))} + + + )} + + + + +
+
{ + e.preventDefault(); + handleAnswerSelect(message); + }} + > + setMessage(e.target.value)} + className="w-full bg-transparent text-sm focus:outline-none" + placeholder="Write your answer here..." + autoFocus + onKeyDown={(e) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + handleAnswerSelect(message); + setMessage(''); + } + }} + /> + + +
+
+ + )} + + + {canGenerateNow && status !== 'done' && ( +
+

+ Keep answering for better output or{' '} + +

+
+ )} + + ); +} + +type QuestionAnswerChatMessageProps = { + role: 'user' | 'assistant'; + question?: string; + answer?: string; +}; + +function QuestionAnswerChatMessage(props: QuestionAnswerChatMessageProps) { + const { role, question, answer } = props; + + return ( +
+ {role === 'assistant' &&
{question}
} + {role === 'user' &&
{answer}
} +
+ ); +} diff --git a/src/queries/user-ai-session.ts b/src/queries/user-ai-session.ts new file mode 100644 index 000000000..83157ec9e --- /dev/null +++ b/src/queries/user-ai-session.ts @@ -0,0 +1,30 @@ +import { queryOptions } from '@tanstack/react-query'; +import { httpGet } from '../lib/query-http'; + +type AIQuestionSuggestionsQuery = { + term: string; + format: string; +}; + +export type AIQuestionSuggestionsResponse = { + questions: { + question: string; + possibleAnswers: string[]; + }[]; +}; + +export function aiQuestionSuggestionsOptions( + query: AIQuestionSuggestionsQuery, +) { + return queryOptions({ + queryKey: ['ai-question-suggestions', query], + queryFn: () => { + return httpGet( + `/v1-ai-question-suggestions`, + query, + ); + }, + enabled: !!query.term && !!query.format, + refetchOnMount: false, + }); +}