1
0
Fork 0
docsearch/packages/docsearch-react/src/AggregatedSearchBlock.tsx
Dylan Tientcheu 19c1ef9192
feat(v4): release v4 (#2555) (#2666)
* 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>
2025-07-17 15:53:46 +02:00

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)}
>
&quot;{q}&quot;
</span>
{idx < queries.length - 2 && separator}
{idx === queries.length - 2 && lastSeparator}
</Fragment>
))}
{after && <span>{after}</span>}
</span>
</div>
);
}