'use client'; import Image from "next/image"; import { Search, LibraryBigIcon, Code, Layers } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Card } from "@/components/ui/card"; import { CardContent } from "@/components/ui/card"; import { ContextItem, RepoContextItem, SearchContextItem } from "@/features/chat/components/chatBox/contextSelector"; import { DemoExamples, DemoSearchExample, DemoSearchContextExample, DemoSearchContext } from "@/types"; import { cn, getCodeHostIcon } from "@/lib/utils"; import { RepositoryQuery, SearchContextQuery } from "@/lib/types"; interface AskSourcebotDemoCardsProps { demoExamples: DemoExamples; selectedItems: ContextItem[]; setSelectedItems: (items: ContextItem[]) => void; searchContexts: SearchContextQuery[]; repos: RepositoryQuery[]; } export const AskSourcebotDemoCards = ({ demoExamples, selectedItems, setSelectedItems, searchContexts, repos, }: AskSourcebotDemoCardsProps) => { const handleExampleClick = (example: DemoSearchExample) => { if (example.url) { window.open(example.url, '_blank'); } } const getContextIcon = (context: DemoSearchContext, size: number = 20) => { const sizeClass = size === 12 ? "h-3 w-3" : "h-5 w-5"; if (context.type === "set") { return ; } if (context.codeHostType) { const codeHostIcon = getCodeHostIcon(context.codeHostType); if (codeHostIcon) { return ( {`${context.codeHostType} ); } } return ; } const handleContextClick = (demoSearchContexts: DemoSearchContext[], contextExample: DemoSearchContextExample) => { const context = demoSearchContexts.find((context) => context.id === contextExample.searchContext) if (!context) { console.error(`Search context ${contextExample.searchContext} not found on handleContextClick`); return; } const isDemoMode = process.env.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT === "demo"; const isSelected = selectedItems.some((item) => item.value === context.value); if (isSelected) { setSelectedItems(selectedItems.filter((item) => item.value !== context.value)); return; } const getNewSelectedItem = (): ContextItem | null => { if (context.type === "set") { const searchContext = searchContexts.find((item) => item.name === context.value); if (!searchContext) { console.error(`Search context ${context.value} not found on handleContextClick`); return null; } return { type: 'context', value: context.value, name: context.displayName, repoCount: searchContext.repoNames.length } as SearchContextItem; } else { const repo = repos.find((repo) => repo.repoName === context.value); if (!repo) { console.error(`Repo ${context.value} not found on handleContextClick`); return null; } return { type: 'repo', value: context.value, name: context.displayName, codeHostType: repo.codeHostType } as RepoContextItem; } } const newSelectedItem = getNewSelectedItem(); if (newSelectedItem) { setSelectedItems(isDemoMode ? [newSelectedItem] : [...selectedItems, newSelectedItem]); } else { console.error(`No new selected item found on handleContextClick`); } } return (
{/* Search Context Row */}

Search Contexts

Select the context you want to ask questions about

{demoExamples.searchContextExamples.map((contextExample) => { const context = demoExamples.searchContexts.find((context) => context.id === contextExample.searchContext) if (!context) { console.error(`Search context ${contextExample.searchContext} not found on handleContextClick`); return null; } const isSelected = selectedItems.some( (selected) => (selected.type === 'context' && selected.value === context.value) || (selected.type === 'repo' && selected.value === context.value) ); const searchContext = searchContexts.find((item) => item.name === context.value); const numRepos = searchContext ? searchContext.repoNames.length : undefined; return ( handleContextClick(demoExamples.searchContexts, contextExample)} >
{getContextIcon(context)}

{context.displayName}

{numRepos && ( {numRepos} repos )}

{contextExample.description}

) })}
{/* Example Searches Row */}

Community Ask Results

Check out these featured ask results from the community

{demoExamples.searchExamples.map((example) => { const searchContexts = demoExamples.searchContexts.filter((context) => example.searchContext.includes(context.id)) return ( handleExampleClick(example)} >
{searchContexts.map((context) => ( {getContextIcon(context, 12)} {context.displayName} ))}

{example.title}

{example.description}

) })}
); };