full-project-search-button.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import { sendSearchEvent } from '@/features/event-tracking/search-events'
  2. import OLButton from '@/shared/components/ol/ol-button'
  3. import OLTooltip from '@/shared/components/ol/ol-tooltip'
  4. import { closeSearchPanel, SearchQuery } from '@codemirror/search'
  5. import { useCallback } from 'react'
  6. import { useCodeMirrorViewContext } from './codemirror-context'
  7. import MaterialIcon from '@/shared/components/material-icon'
  8. import { useTranslation } from 'react-i18next'
  9. import { useRailContext } from '@/features/ide-react/context/rail-context'
  10. export const FullProjectSearchButton = ({ query }: { query: SearchQuery }) => {
  11. const view = useCodeMirrorViewContext()
  12. const { t } = useTranslation()
  13. const { openTab } = useRailContext()
  14. const openFullProjectSearch = useCallback(() => {
  15. openTab('full-project-search')
  16. closeSearchPanel(view)
  17. window.setTimeout(() => {
  18. window.dispatchEvent(
  19. new CustomEvent('editor:full-project-search', { detail: query })
  20. )
  21. }, 200)
  22. }, [query, view, openTab])
  23. const onClick = useCallback(() => {
  24. sendSearchEvent('search-open', {
  25. searchType: 'full-project',
  26. method: 'button',
  27. location: 'search-form',
  28. })
  29. openFullProjectSearch()
  30. }, [openFullProjectSearch])
  31. return (
  32. <>
  33. <OLTooltip
  34. id="open-full-project-search"
  35. overlayProps={{ placement: 'top' }}
  36. description={t('search_all_project_files')}
  37. >
  38. <OLButton variant="ghost" size="sm" onClick={onClick}>
  39. <MaterialIcon
  40. type="manage_search"
  41. accessibilityLabel={t('search_all_project_files')}
  42. />
  43. </OLButton>
  44. </OLTooltip>
  45. </>
  46. )
  47. }