You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

90 rivejä
2.5 KiB

  1. "use client";
  2. import "./MailField.css"
  3. import Document from '@tiptap/extension-document'
  4. import Paragraph from '@tiptap/extension-paragraph'
  5. import Text from '@tiptap/extension-text'
  6. import Underline from '@tiptap/extension-underline'
  7. import { useEditor, EditorContent, Extension } from "@tiptap/react"
  8. import StarterKit from "@tiptap/starter-kit"
  9. import MailToolbar from "./MailToolbar";
  10. import { Grid } from "@mui/material";
  11. import Highlight from '@tiptap/extension-highlight'
  12. import { Color } from '@tiptap/extension-color'
  13. import ListItem from "@tiptap/extension-list-item";
  14. import TextStyle from "@tiptap/extension-text-style";
  15. import TextAlign from '@tiptap/extension-text-align'
  16. interface Props {
  17. content?: string,
  18. onChange?: (richText: string) => void,
  19. error?: boolean,
  20. }
  21. const MailField: React.FC<Props> = ({
  22. content,
  23. onChange,
  24. error
  25. }) => {
  26. const TAB_CHAR = '\u0009';
  27. const TabHandler = Extension.create({
  28. name: 'tabHandler',
  29. addKeyboardShortcuts() {
  30. return {
  31. Tab: ({ editor }) => {
  32. // Sinks a list item / inserts a tab character
  33. editor
  34. .chain()
  35. .sinkListItem('listItem')
  36. .command(({ tr }) => {
  37. tr.insertText(TAB_CHAR);
  38. return true;
  39. })
  40. .run();
  41. // Prevent default behavior (losing focus)
  42. return true;
  43. },
  44. };
  45. },
  46. });
  47. const editor = useEditor({
  48. extensions: [
  49. StarterKit.configure(),
  50. Document,
  51. Paragraph,
  52. Text,
  53. TextStyle,
  54. TextAlign.configure({
  55. types: ['heading', 'paragraph']
  56. }),
  57. Underline,
  58. Highlight.configure({ multicolor: true }),
  59. Color,
  60. ListItem,
  61. TabHandler
  62. ],
  63. content: content,
  64. onUpdate({ editor }) {
  65. if (onChange) {
  66. onChange(editor.getHTML())
  67. }
  68. console.log(editor.getHTML())
  69. },
  70. })
  71. return (
  72. <Grid container rowSpacing={1}>
  73. <Grid item xs={12}>
  74. <MailToolbar editor={editor} />
  75. </Grid>
  76. <Grid item xs={12} >
  77. <EditorContent className={error === true ? "tiptap-error" : ""} label="Template" editor={editor}/>
  78. </Grid>
  79. </Grid>
  80. );
  81. };
  82. export default MailField;