math-dropdown.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { DropdownHeader } from '@/shared/components/dropdown/dropdown-menu'
  2. import { ToolbarButtonMenu } from './button-menu'
  3. import { emitToolbarEvent } from '../../extensions/toolbar/utils/analytics'
  4. import MaterialIcon from '../../../../shared/components/material-icon'
  5. import { useTranslation } from 'react-i18next'
  6. import { useCodeMirrorViewContext } from '../codemirror-context'
  7. import { useEditorContext } from '@/shared/context/editor-context'
  8. import {
  9. wrapInDisplayMath,
  10. wrapInInlineMath,
  11. } from '../../extensions/toolbar/commands'
  12. import { memo } from 'react'
  13. import OLListGroupItem from '@/shared/components/ol/ol-list-group-item'
  14. import sparkleWhite from '@/shared/svgs/sparkle-small-white.svg'
  15. import sparkle from '@/shared/svgs/ai-sparkle-text.svg'
  16. export const MathDropdown = memo(function MathDropdown() {
  17. const { t } = useTranslation()
  18. const view = useCodeMirrorViewContext()
  19. const { writefullInstance } = useEditorContext()
  20. return (
  21. <ToolbarButtonMenu
  22. id="toolbar-math"
  23. label={t('toolbar_insert_math')}
  24. icon={<MaterialIcon type="calculate" />}
  25. >
  26. {writefullInstance && (
  27. <>
  28. <DropdownHeader className="ol-cm-toolbar-header mx-2">
  29. {t('toolbar_insert_math_lowercase')}
  30. </DropdownHeader>
  31. <OLListGroupItem
  32. aria-label={t('toolbar_generate_math')}
  33. onClick={() => {
  34. writefullInstance?.openEquationGenerator()
  35. }}
  36. >
  37. <img
  38. alt="sparkle"
  39. className="ol-cm-toolbar-ai-sparkle-gradient"
  40. src={sparkle}
  41. aria-hidden="true"
  42. />
  43. <img
  44. alt="sparkle"
  45. className="ol-cm-toolbar-ai-sparkle-white"
  46. src={sparkleWhite}
  47. aria-hidden="true"
  48. />
  49. <span>{t('generate_from_text_or_image')}</span>
  50. </OLListGroupItem>
  51. </>
  52. )}
  53. <OLListGroupItem
  54. aria-label={t('toolbar_insert_inline_math')}
  55. onClick={event => {
  56. emitToolbarEvent(view, 'toolbar-inline-math')
  57. event.preventDefault()
  58. wrapInInlineMath(view)
  59. view.focus()
  60. }}
  61. >
  62. <MaterialIcon type="123" />
  63. <span>{t('inline')}</span>
  64. </OLListGroupItem>
  65. <OLListGroupItem
  66. aria-label={t('toolbar_insert_display_math')}
  67. onClick={event => {
  68. emitToolbarEvent(view, 'toolbar-display-math')
  69. event.preventDefault()
  70. wrapInDisplayMath(view)
  71. view.focus()
  72. }}
  73. >
  74. <MaterialIcon type="view_day" />
  75. <span>{t('display')}</span>
  76. </OLListGroupItem>
  77. </ToolbarButtonMenu>
  78. )
  79. })