Skip to content

Commit b1b8efa

Browse files
committed
fix(askai): Fixes issue with askai state being outside DocSearchModal
Fixes an issue with Docusaurus after the new Ask AI screens were added. This was caused from the state and callbacks being set outside of DocSearchModal. - Move askAiState inside of DocSearchModal - Handle changing the state when needed - Updates color styling of dropdown menu
1 parent 01517d9 commit b1b8efa

File tree

6 files changed

+36
-24
lines changed

6 files changed

+36
-24
lines changed

packages/docsearch-css/src/_variables.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@
6767
var(--docsearch-muted-color) 60%,
6868
rgb(224, 227, 232) 95%
6969
);
70+
71+
--docsearch-dropdown-menu-background: var(--docsearch-hit-background);
72+
--docsearch-dropdown-menu-item-hover-background: var(--docsearch-modal-background);
7073
}
7174

7275
/* Darkmode */
@@ -105,4 +108,5 @@ html[data-theme='dark'] {
105108
var(--docsearch-muted-color) 60%,
106109
rgb(224, 227, 232) 95%
107110
);
111+
--docsearch-dropdown-menu-item-hover-background: #10121e;
108112
}

packages/docsearch-css/src/modal.css

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1506,7 +1506,7 @@ assistive tech users */
15061506
padding: 8px 0;
15071507
flex-direction: column;
15081508
border-radius: var(--docsearch-border-radius);
1509-
background-color: var(--docsearch-modal-background);
1509+
background-color: var(--docsearch-dropdown-menu-background);
15101510
box-shadow: 0px 0px 0px 1px #21243D0D, 0px 8px 16px -4px #21243D40;
15111511
min-width: 195px;
15121512
top: calc(100% + 12px);
@@ -1531,5 +1531,5 @@ assistive tech users */
15311531
}
15321532

15331533
.DocSearch-Menu-item:hover {
1534-
background-color: var(--docsearch-hit-background);
1534+
background-color: var(--docsearch-dropdown-menu-item-hover-background);
15351535
}

packages/docsearch-react/src/DocSearch.tsx

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import type {
1212
KeyboardShortcuts,
1313
StoredDocSearchHit,
1414
} from './types';
15-
import type { AskAiState } from './types/AskiAi';
1615
import { useDocSearchKeyboardEvents } from './useDocSearchKeyboardEvents';
1716
import { useTheme } from './useTheme';
1817

@@ -179,8 +178,7 @@ export function DocSearch(props: DocSearchProps): JSX.Element {
179178
const searchButtonRef = React.useRef<HTMLButtonElement>(null);
180179
const [isOpen, setIsOpen] = React.useState(false);
181180
const [initialQuery, setInitialQuery] = React.useState<string | undefined>(props?.initialQuery || undefined);
182-
const [askAiState, setAskAiState] = React.useState<AskAiState>('initial');
183-
const isAskAiActive = askAiState !== 'initial';
181+
const [isAskAiActive, setIsAskAiActive] = React.useState(false);
184182

185183
let currentPlaceholder =
186184
props?.translations?.modal?.searchBox?.placeholderText || props?.placeholder || 'Search docs';
@@ -198,9 +196,9 @@ export function DocSearch(props: DocSearchProps): JSX.Element {
198196

199197
const onAskAiToggle = React.useCallback(
200198
(askAitoggle: boolean) => {
201-
setAskAiState(askAitoggle ? 'conversation' : 'initial');
199+
setIsAskAiActive(askAitoggle);
202200
},
203-
[setAskAiState],
201+
[setIsAskAiActive],
204202
);
205203

206204
const onOpen = React.useCallback(() => {
@@ -211,9 +209,9 @@ export function DocSearch(props: DocSearchProps): JSX.Element {
211209
setIsOpen(false);
212210
setInitialQuery(props?.initialQuery);
213211
if (isAskAiActive) {
214-
setAskAiState('initial');
212+
setIsAskAiActive(false);
215213
}
216-
}, [setIsOpen, props.initialQuery, isAskAiActive, setAskAiState]);
214+
}, [setIsOpen, props.initialQuery, isAskAiActive, setIsAskAiActive]);
217215

218216
const onInput = React.useCallback(
219217
(event: KeyboardEvent) => {
@@ -254,8 +252,6 @@ export function DocSearch(props: DocSearchProps): JSX.Element {
254252
translations={props?.translations?.modal}
255253
isAskAiActive={isAskAiActive}
256254
canHandleAskAi={canHandleAskAi}
257-
askAiState={askAiState}
258-
setAskAiState={setAskAiState}
259255
onAskAiToggle={onAskAiToggle}
260256
onClose={onClose}
261257
/>,

packages/docsearch-react/src/DocSearchModal.tsx

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,6 @@ export type DocSearchModalProps = DocSearchProps & {
4545
isAskAiActive?: boolean;
4646
canHandleAskAi?: boolean;
4747
translations?: ModalTranslations;
48-
askAiState: AskAiState;
49-
setAskAiState: (state: AskAiState) => void;
5048
};
5149

5250
/**
@@ -302,8 +300,6 @@ export function DocSearchModal({
302300
indices = [],
303301
indexName,
304302
searchParameters,
305-
askAiState,
306-
setAskAiState,
307303
}: DocSearchModalProps): JSX.Element {
308304
const { footer: footerTranslations, searchBox: searchBoxTranslations, ...screenStateTranslations } = translations;
309305
const [state, setState] = React.useState<DocSearchState<InternalDocSearchHit>>({
@@ -332,6 +328,7 @@ export function DocSearchModal({
332328
const askAiConfig = typeof askAi === 'object' ? askAi : null;
333329
const askAiConfigurationId = typeof askAi === 'string' ? askAi : askAiConfig?.assistantId || null;
334330
const askAiSearchParameters = askAiConfig?.searchParameters;
331+
const [askAiState, setAskAiState] = React.useState<AskAiState>('initial');
335332

336333
// Format the `indexes` to be used until `indexName` and `searchParameters` props are fully removed.
337334
const indexes: DocSearchIndex[] = [];
@@ -507,7 +504,7 @@ export function DocSearchModal({
507504
>
508505
>(undefined);
509506

510-
const handleAskAiToggle = React.useCallback(
507+
const handleSelectAskAiQuestion = React.useCallback(
511508
(toggle: boolean, query: string) => {
512509
onAskAiToggle(toggle);
513510
setStoppedStream(false);
@@ -660,7 +657,7 @@ export function DocSearchModal({
660657
},
661658
onSelect({ item }): void {
662659
if (item.type === 'askAI' && item.query) {
663-
handleAskAiToggle(true, item.query);
660+
handleSelectAskAiQuestion(true, item.query);
664661
}
665662
},
666663
},
@@ -775,6 +772,11 @@ export function DocSearchModal({
775772
}
776773
}, [isAskAiActive, autocomplete, setMessages]);
777774

775+
// Track external state in order to manage internal askAiState
776+
React.useEffect(() => {
777+
setAskAiState('initial');
778+
}, [isAskAiActive, setAskAiState]);
779+
778780
const onStopAskAiStreaming = async (): Promise<void> => {
779781
setStoppedStream(true);
780782

@@ -830,10 +832,11 @@ export function DocSearchModal({
830832
isAskAiActive={isAskAiActive}
831833
askAiStatus={status}
832834
askAiState={askAiState}
835+
setAskAiState={setAskAiState}
833836
onClose={onClose}
834837
onAskAiToggle={onAskAiToggle}
835838
onAskAgain={(query) => {
836-
handleAskAiToggle(true, query);
839+
handleSelectAskAiQuestion(true, query);
837840
}}
838841
onStopAskAiStreaming={onStopAskAiStreaming}
839842
onNewConversation={handleNewConversation}
@@ -864,7 +867,7 @@ export function DocSearchModal({
864867
status={status}
865868
hasCollections={hasCollections}
866869
askAiState={askAiState}
867-
selectAskAiQuestion={handleAskAiToggle}
870+
selectAskAiQuestion={handleSelectAskAiQuestion}
868871
onAskAiToggle={onAskAiToggle}
869872
onItemClick={(item, event) => {
870873
// if the item is askAI toggle the screen
@@ -874,8 +877,9 @@ export function DocSearchModal({
874877
setMessages(item.messages as any);
875878
onAskAiToggle(true);
876879
} else {
877-
handleAskAiToggle(true, item.query);
880+
handleSelectAskAiQuestion(true, item.query);
878881
}
882+
setAskAiState('initial');
879883
event.preventDefault();
880884
return;
881885
}

packages/docsearch-react/src/ScreenState.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,11 @@ export interface ScreenStateProps<TItem extends BaseItem>
5858

5959
export const ScreenState = React.memo(
6060
({ translations = {}, ...props }: ScreenStateProps<InternalDocSearchHit>) => {
61-
if (props.canHandleAskAi && props.askAiState === 'conversation-history') {
61+
if (props.canHandleAskAi && props.isAskAiActive && props.askAiState === 'conversation-history') {
6262
return <ConversationHistoryScreen {...props} />;
6363
}
6464

65-
if (props.canHandleAskAi && props.askAiState === 'new-conversation') {
65+
if (props.canHandleAskAi && props.isAskAiActive && props.askAiState === 'new-conversation') {
6666
return (
6767
<NewConversationScreen
6868
translations={translations?.newConversation}

packages/docsearch-react/src/SearchBox.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,18 @@ interface SearchBoxProps
5252
isFromSelection: boolean;
5353
translations?: SearchBoxTranslations;
5454
askAiState: AskAiState;
55+
setAskAiState: (state: AskAiState) => void;
5556
onNewConversation: () => void;
5657
onViewConversationHistory: () => void;
5758
}
5859

59-
export function SearchBox({ translations = {}, askAiState, onAskAiToggle, ...props }: SearchBoxProps): JSX.Element {
60+
export function SearchBox({
61+
translations = {},
62+
askAiState,
63+
onAskAiToggle,
64+
setAskAiState,
65+
...props
66+
}: SearchBoxProps): JSX.Element {
6067
const {
6168
clearButtonTitle = 'Clear',
6269
clearButtonAriaLabel = 'Clear the query',
@@ -173,11 +180,12 @@ export function SearchBox({ translations = {}, askAiState, onAskAiToggle, ...pro
173180
const handleAskAiBackClick = React.useCallback((): void => {
174181
if (askAiState === 'conversation-history') {
175182
onAskAiToggle(true);
183+
setAskAiState('initial');
176184
return;
177185
}
178186

179187
onAskAiToggle(false);
180-
}, [askAiState, onAskAiToggle]);
188+
}, [askAiState, onAskAiToggle, setAskAiState]);
181189

182190
return (
183191
<>

0 commit comments

Comments
 (0)