1
0
Fork 0
docsearch/packages/docsearch-react/src/StartScreen.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

148 lines
4.7 KiB
TypeScript

import React, { type JSX } from 'react';
import { RecentIcon, CloseIcon, StarIcon, SparklesIcon } from './icons';
import { Results } from './Results';
import type { ScreenStateProps } from './ScreenState';
import type { InternalDocSearchHit } from './types';
export type StartScreenTranslations = Partial<{
recentSearchesTitle: string;
noRecentSearchesText: string;
saveRecentSearchButtonTitle: string;
removeRecentSearchButtonTitle: string;
favoriteSearchesTitle: string;
removeFavoriteSearchButtonTitle: string;
recentConversationsTitle: string;
removeRecentConversationButtonTitle: string;
}>;
type StartScreenProps = Omit<ScreenStateProps<InternalDocSearchHit>, 'translations'> & {
hasCollections: boolean;
translations?: StartScreenTranslations;
};
export function StartScreen({ translations = {}, ...props }: StartScreenProps): JSX.Element | null {
const {
recentSearchesTitle = 'Recent',
saveRecentSearchButtonTitle = 'Save this search',
removeRecentSearchButtonTitle = 'Remove this search from history',
favoriteSearchesTitle = 'Favorite',
removeFavoriteSearchButtonTitle = 'Remove this search from favorites',
recentConversationsTitle = 'Recent conversations',
removeRecentConversationButtonTitle = 'Remove this conversation from history',
} = translations;
return (
<div className="DocSearch-Dropdown-Container">
<Results
{...props}
title={recentSearchesTitle}
collection={props.state.collections[0]}
renderIcon={() => (
<div className="DocSearch-Hit-icon">
<RecentIcon />
</div>
)}
renderAction={({ item, runFavoriteTransition, runDeleteTransition }) => (
<>
<div className="DocSearch-Hit-action">
<button
className="DocSearch-Hit-action-button"
title={saveRecentSearchButtonTitle}
type="submit"
onClick={(event) => {
event.preventDefault();
event.stopPropagation();
runFavoriteTransition(() => {
props.favoriteSearches.add(item);
props.recentSearches.remove(item);
props.refresh();
});
}}
>
<StarIcon />
</button>
</div>
<div className="DocSearch-Hit-action">
<button
className="DocSearch-Hit-action-button"
title={removeRecentSearchButtonTitle}
type="submit"
onClick={(event) => {
event.preventDefault();
event.stopPropagation();
runDeleteTransition(() => {
props.recentSearches.remove(item);
props.refresh();
});
}}
>
<CloseIcon />
</button>
</div>
</>
)}
/>
<Results
{...props}
title={favoriteSearchesTitle}
collection={props.state.collections[1]}
renderIcon={() => (
<div className="DocSearch-Hit-icon">
<StarIcon />
</div>
)}
renderAction={({ item, runDeleteTransition }) => (
<div className="DocSearch-Hit-action">
<button
className="DocSearch-Hit-action-button"
title={removeFavoriteSearchButtonTitle}
type="submit"
onClick={(event) => {
event.preventDefault();
event.stopPropagation();
runDeleteTransition(() => {
props.favoriteSearches.remove(item);
props.refresh();
});
}}
>
<CloseIcon />
</button>
</div>
)}
/>
<Results
{...props}
title={recentConversationsTitle}
collection={props.state.collections[2]}
renderIcon={() => (
<div className="DocSearch-Hit-icon">
<SparklesIcon />
</div>
)}
renderAction={({ item, runDeleteTransition }) => (
<div className="DocSearch-Hit-action">
<button
className="DocSearch-Hit-action-button"
title={removeRecentConversationButtonTitle}
type="submit"
onClick={(event) => {
event.preventDefault();
event.stopPropagation();
runDeleteTransition(() => {
props.conversations.remove(item);
props.refresh();
});
}}
>
<CloseIcon />
</button>
</div>
)}
/>
</div>
);
}