Skip to content

Commit 3bc8cc1

Browse files
Fix Codex search modal dismissal (#3657)
Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 05649db commit 3bc8cc1

2 files changed

Lines changed: 75 additions & 25 deletions

File tree

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import { ModalSearch } from './ModalSearch'
2+
import { modalSearchStore } from './modalSearch.store'
3+
import { EuiProvider } from '@elastic/eui'
4+
import { act, render, screen } from '@testing-library/react'
5+
6+
jest.mock('../AskAi/InfoBanner', () => ({
7+
InfoBanner: () => null,
8+
}))
9+
10+
jest.mock('../AskAi/KeyboardShortcutsFooter', () => ({
11+
KeyboardShortcutsFooter: () => null,
12+
}))
13+
14+
jest.mock('./useModalSearchQuery', () => ({
15+
useModalSearchQuery: () => ({
16+
isLoading: false,
17+
isFetching: false,
18+
data: { results: [] },
19+
error: null,
20+
}),
21+
}))
22+
23+
jest.mock('./useModalSearchTelemetry', () => ({
24+
useModalSearchTelemetry: () => ({
25+
trackOpened: jest.fn(),
26+
trackClosed: jest.fn(),
27+
}),
28+
}))
29+
30+
const renderModalSearch = () =>
31+
render(
32+
<EuiProvider
33+
colorMode="light"
34+
globalStyles={false}
35+
utilityClasses={false}
36+
>
37+
<ModalSearch />
38+
</EuiProvider>
39+
)
40+
41+
describe('ModalSearch', () => {
42+
beforeEach(() => {
43+
act(() => {
44+
modalSearchStore.getState().actions.closeModal()
45+
})
46+
})
47+
48+
it('closes before an HTMX navigation swaps the page', () => {
49+
renderModalSearch()
50+
51+
act(() => {
52+
modalSearchStore.getState().actions.openModal()
53+
})
54+
expect(
55+
screen.getByRole('button', { name: 'Close search modal' })
56+
).toBeInTheDocument()
57+
58+
const result = document.createElement('a')
59+
result.setAttribute('data-search-result-index', '0')
60+
61+
act(() => {
62+
document.dispatchEvent(
63+
new CustomEvent('htmx:beforeSend', {
64+
detail: { elt: result },
65+
})
66+
)
67+
})
68+
69+
expect(modalSearchStore.getState().isOpen).toBe(false)
70+
expect(
71+
screen.queryByRole('button', { name: 'Close search modal' })
72+
).not.toBeInTheDocument()
73+
})
74+
})

src/Elastic.Documentation.Site/Assets/web-components/ModalSearch/ModalSearch.tsx

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import {
3030
useEuiFontSize,
3131
} from '@elastic/eui'
3232
import { css } from '@emotion/react'
33-
import { useEffect, useCallback, useRef } from 'react'
33+
import { useEffect, useCallback } from 'react'
3434

3535
const SEARCH_KEYBOARD_SHORTCUTS = [
3636
{ keys: ['returnKey'], label: 'Select' },
@@ -389,8 +389,6 @@ export const ModalSearch = ({
389389
document.removeEventListener('modal-search:open', handleOpenEvent)
390390
}, [openModal, trackOpened])
391391

392-
const backdropRef = useRef<HTMLDivElement>(null)
393-
394392
useEffect(() => {
395393
if (isOpen) {
396394
const scrollbarWidth =
@@ -412,19 +410,6 @@ export const ModalSearch = ({
412410

413411
const handleBeforeSend = (event: CustomEvent) => {
414412
const trigger = event.detail?.elt as HTMLElement | undefined
415-
if (trigger?.hasAttribute('data-search-result-index')) {
416-
if (backdropRef.current) {
417-
backdropRef.current.style.display = 'none'
418-
}
419-
document.body.style.overflow = ''
420-
document.body.style.paddingRight = ''
421-
}
422-
}
423-
424-
const handleAfterSwap = (event: CustomEvent) => {
425-
const trigger = event.detail?.requestConfig?.elt as
426-
| HTMLElement
427-
| undefined
428413
if (trigger?.hasAttribute('data-search-result-index')) {
429414
closeModal()
430415
}
@@ -434,19 +419,11 @@ export const ModalSearch = ({
434419
'htmx:beforeSend',
435420
handleBeforeSend as EventListener
436421
)
437-
document.addEventListener(
438-
'htmx:afterSwap',
439-
handleAfterSwap as EventListener
440-
)
441422
return () => {
442423
document.removeEventListener(
443424
'htmx:beforeSend',
444425
handleBeforeSend as EventListener
445426
)
446-
document.removeEventListener(
447-
'htmx:afterSwap',
448-
handleAfterSwap as EventListener
449-
)
450427
}
451428
}, [isOpen, closeModal])
452429

@@ -469,7 +446,6 @@ export const ModalSearch = ({
469446
{isOpen && (
470447
<EuiPortal>
471448
<div
472-
ref={backdropRef}
473449
onClick={handleBackdropClick}
474450
css={css`
475451
position: fixed;

0 commit comments

Comments
 (0)