webapp/src/components/Editor/BubbleMenu/FigureBubbleMenu.tsx

93 lines
2.9 KiB
TypeScript
Raw Normal View History

2023-05-04 12:16:39 +00:00
import type { Editor } from '@tiptap/core'
2024-07-05 14:08:12 +00:00
import { renderUploadedImage } from '~/components/Editor/renderUploadedImage'
import { Icon } from '~/components/_shared/Icon'
import { Popover } from '~/components/_shared/Popover'
import { useLocalize } from '~/context/localize'
2024-06-24 17:50:27 +00:00
import { UploadedFile } from '~/types/upload'
2024-07-21 02:17:42 +00:00
import { Modal } from '../../_shared/Modal'
import { UploadModalContent } from '../UploadModalContent'
2024-06-24 17:50:27 +00:00
import { useUI } from '~/context/ui'
import styles from './BubbleMenu.module.scss'
2023-05-04 12:16:39 +00:00
type Props = {
2023-05-04 12:16:39 +00:00
editor: Editor
ref: (el: HTMLElement) => void
2023-05-04 12:16:39 +00:00
}
export const FigureBubbleMenu = (props: Props) => {
const { t } = useLocalize()
2024-06-24 17:50:27 +00:00
const { hideModal } = useUI()
const handleUpload = (image: UploadedFile) => {
renderUploadedImage(props.editor, image)
2024-06-24 17:50:27 +00:00
hideModal()
}
2023-05-04 12:16:39 +00:00
return (
2023-05-29 17:14:58 +00:00
<div ref={props.ref} class={styles.BubbleMenu}>
<Popover content={t('Alignment left')}>
2024-06-24 17:50:27 +00:00
{(triggerRef: (el: HTMLElement) => void) => (
2023-05-29 17:14:58 +00:00
<button
ref={triggerRef}
type="button"
class={styles.bubbleMenuButton}
2023-08-17 05:01:07 +00:00
onClick={() => props.editor.chain().focus().setFigureFloat('left').run()}
2023-05-29 17:14:58 +00:00
>
<Icon name="editor-image-align-left" />
</button>
)}
</Popover>
<Popover content={t('Alignment center')}>
2024-06-24 17:50:27 +00:00
{(triggerRef: (el: HTMLElement) => void) => (
2023-05-29 17:14:58 +00:00
<button
ref={triggerRef}
type="button"
class={styles.bubbleMenuButton}
onClick={() => props.editor.chain().focus().setFigureFloat(null).run()}
2023-05-29 17:14:58 +00:00
>
<Icon name="editor-image-align-center" />
</button>
)}
</Popover>
<Popover content={t('Alignment right')}>
2024-06-24 17:50:27 +00:00
{(triggerRef: (el: HTMLElement) => void) => (
2023-05-29 17:14:58 +00:00
<button
ref={triggerRef}
type="button"
class={styles.bubbleMenuButton}
onClick={() => props.editor.chain().focus().setFigureFloat('right').run()}
2023-05-29 17:14:58 +00:00
>
<Icon name="editor-image-align-right" />
</button>
)}
</Popover>
<div class={styles.delimiter} />
2023-05-07 13:16:03 +00:00
<button
type="button"
class={styles.bubbleMenuButton}
2023-08-17 05:01:07 +00:00
onClick={() => props.editor.chain().focus().setFigcaptionFocus(true).run()}
2023-05-07 13:16:03 +00:00
>
<span style={{ color: 'white' }}>{t('Add signature')}</span>
2023-05-07 13:16:03 +00:00
</button>
<div class={styles.delimiter} />
2023-05-29 17:14:58 +00:00
<Popover content={t('Add image')}>
2024-06-24 17:50:27 +00:00
{(triggerRef: (el: HTMLElement) => void) => (
<button type="button" ref={triggerRef} class={styles.bubbleMenuButton}>
2023-05-29 17:14:58 +00:00
<Icon name="editor-image-add" />
</button>
)}
</Popover>
<Modal variant="narrow" name="uploadImage">
<UploadModalContent
onClose={(value) => {
2024-06-24 17:50:27 +00:00
handleUpload(value as UploadedFile)
}}
/>
</Modal>
2023-05-04 12:16:39 +00:00
</div>
)
}