math-dropdown.tsx 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. import getMeta from '@/utils/meta'
  17. export const MathDropdown = memo(function MathDropdown() {
  18. const { t } = useTranslation()
  19. const view = useCodeMirrorViewContext()
  20. const { writefullInstance } = useEditorContext()
  21. const showAiFeaturesDisabled = getMeta('ol-showAiFeaturesDisabled')
  22. const renderAIButton = writefullInstance || showAiFeaturesDisabled
  23. return (
  24. <ToolbarButtonMenu
  25. id="toolbar-math"
  26. label={t('toolbar_insert_math')}
  27. icon={<MaterialIcon type="calculate" />}
  28. >
  29. {renderAIButton && (
  30. <>
  31. <DropdownHeader className="ol-cm-toolbar-header mx-2">
  32. {t('toolbar_insert_math_lowercase')}
  33. </DropdownHeader>
  34. <OLListGroupItem
  35. aria-label={t('toolbar_generate_math')}
  36. disabled={showAiFeaturesDisabled}
  37. disabledReason={t('ai_features_unavailable_on_this_project')}
  38. onClick={() => {
  39. writefullInstance?.openEquationGenerator()
  40. }}
  41. >
  42. <img
  43. alt="sparkle"
  44. className="ol-cm-toolbar-ai-sparkle-gradient"
  45. src={sparkle}
  46. aria-hidden="true"
  47. />
  48. <img
  49. alt="sparkle"
  50. className="ol-cm-toolbar-ai-sparkle-white"
  51. src={sparkleWhite}
  52. aria-hidden="true"
  53. />
  54. <span className={showAiFeaturesDisabled ? 'opacity-50' : ''}>
  55. {t('generate_from_text_or_image')}
  56. </span>
  57. </OLListGroupItem>
  58. </>
  59. )}
  60. <OLListGroupItem
  61. aria-label={t('toolbar_insert_inline_math')}
  62. onClick={event => {
  63. emitToolbarEvent(view, 'toolbar-inline-math')
  64. event.preventDefault()
  65. wrapInInlineMath(view)
  66. view.focus()
  67. }}
  68. >
  69. <MaterialIcon type="123" />
  70. <span>{t('inline')}</span>
  71. </OLListGroupItem>
  72. <OLListGroupItem
  73. aria-label={t('toolbar_insert_display_math')}
  74. onClick={event => {
  75. emitToolbarEvent(view, 'toolbar-display-math')
  76. event.preventDefault()
  77. wrapInDisplayMath(view)
  78. view.focus()
  79. }}
  80. >
  81. <MaterialIcon type="view_day" />
  82. <span>{t('display')}</span>
  83. </OLListGroupItem>
  84. </ToolbarButtonMenu>
  85. )
  86. })