* feat(v4): add new UI (#2555) * feat: add new footer ui * feat: add new search box ui * feat: add searchbox actions * feat: add start screen * feat: add no results screen * feat: add new card ui * feat: add new icons * feat: add new key press class * fix: cypress tests * fix: circleci * fix: circleci * fix: close aria label * fix: circleci * fix: remove unused classes * fix: circleci * feat: update version * feat: add new dark mode ui * fix: colors * fix: design review * fix: hit title length * fix: improve accessibility * fix: ci * chore: increase bundle size threshold * fix: css * feat(v4): ask-ai foundations ✨ (#2574) * feat(v4): docsearch askAI context (#2587) * fix(v4): ask ai updates (#2654) * feat(v4): update beta documentation (#2659) * chore: release v4.0.0-beta.0 (#2660) * fix: make release run on branches like v4 * chore: release v4.0.0-beta.0 * hotfix: closing on askai error * chore: release v4.0.0-beta.1 (#2661) * fix: add a section on models * fix: update to `<package>@beta` * feat(docsearch-website): Updated docs (#2662) * feat(v4): update the landing page (#2665) * fix: beta in readme * feat: added glow around the search bar and a little copy above the keyboard * feat: add glow around the search bar and copy above the keyboard * fix: Add more styling * fix: polishing v4 (#2667) * chore: release v4.0.0-beta.2 (#2668) * fix: update docusaurus tarballs * fix(website): update docusaurus tarballs * fix: mobile search bar --------- Co-authored-by: Vasco Bettencourt <32492444+vascobettencourt@users.noreply.github.com> Co-authored-by: Natan Yagudayev <natanyagudayev@gmail.com>
78 lines
2.4 KiB
TypeScript
78 lines
2.4 KiB
TypeScript
import React, { type JSX, Fragment } from 'react';
|
|
|
|
import type { AskAiScreenTranslations } from './AskAiScreen';
|
|
import { SearchIcon } from './icons';
|
|
|
|
interface AggregatedSearchBlockProps {
|
|
queries: string[];
|
|
translations: AskAiScreenTranslations;
|
|
onSearchQueryClick: (query: string) => void;
|
|
}
|
|
|
|
// allow translators to return either simple string parts or a fully custom node
|
|
export interface AggregatedToolCallParts {
|
|
before?: string;
|
|
separator?: string;
|
|
lastSeparator?: string;
|
|
after?: string;
|
|
}
|
|
|
|
// default english implementation ("Searched for \"A\", \"B\" and \"C\"")
|
|
const defaultAggregatedToolCallParts: AggregatedToolCallParts = {
|
|
before: 'Searched for ',
|
|
separator: ', ',
|
|
lastSeparator: ' and ',
|
|
after: '',
|
|
};
|
|
|
|
export function AggregatedSearchBlock({
|
|
queries,
|
|
translations,
|
|
onSearchQueryClick,
|
|
}: AggregatedSearchBlockProps): JSX.Element | null {
|
|
// no queries? no render
|
|
if (queries.length === 0) return null;
|
|
|
|
// if the translator provides a fully custom node, render it and bail out.
|
|
if (typeof translations.aggregatedToolCallNode === 'function') {
|
|
return <>{translations.aggregatedToolCallNode(queries, onSearchQueryClick)}</>;
|
|
}
|
|
|
|
// otherwise fall back to the classic english-pattern renderer.
|
|
const parts = translations.aggregatedToolCallText
|
|
? translations.aggregatedToolCallText(queries)
|
|
: defaultAggregatedToolCallParts;
|
|
|
|
const { before = '', separator = ', ', lastSeparator = ' and ', after = '' } = parts || {};
|
|
|
|
return (
|
|
<div className="DocSearch-AskAiScreen-MessageContent-Tool Tool--AggregatedResult">
|
|
<SearchIcon size={18} />
|
|
<span>
|
|
{before && <span>{before}</span>}
|
|
{queries.map((q, idx) => (
|
|
// eslint-disable-next-line react/no-array-index-key
|
|
<Fragment key={q + idx}>
|
|
<span
|
|
role="button"
|
|
tabIndex={0}
|
|
className="DocSearch-AskAiScreen-MessageContent-Tool-Query"
|
|
onKeyDown={(e) => {
|
|
if (e.key === 'enter' || e.key === ' ') {
|
|
e.preventDefault();
|
|
onSearchQueryClick(q);
|
|
}
|
|
}}
|
|
onClick={() => onSearchQueryClick(q)}
|
|
>
|
|
"{q}"
|
|
</span>
|
|
{idx < queries.length - 2 && separator}
|
|
{idx === queries.length - 2 && lastSeparator}
|
|
</Fragment>
|
|
))}
|
|
{after && <span>{after}</span>}
|
|
</span>
|
|
</div>
|
|
);
|
|
}
|