FPSMS-frontend
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.
 
 

105 lines
2.7 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. import Table from "@tiptap/extension-table";
  17. import TableCell from "@tiptap/extension-table-cell";
  18. import TableHeader from "@tiptap/extension-table-header";
  19. import TableRow from "@tiptap/extension-table-row";
  20. import Gapcursor from "@tiptap/extension-gapcursor";
  21. interface Props {
  22. content?: string;
  23. onChange?: (richText: string) => void;
  24. error?: boolean;
  25. }
  26. const MailField: React.FC<Props> = ({ content, onChange, error }) => {
  27. const TAB_CHAR = "\u0009";
  28. const TabHandler = Extension.create({
  29. name: "tabHandler",
  30. addKeyboardShortcuts() {
  31. return {
  32. Tab: ({ editor }) => {
  33. // Sinks a list item / inserts a tab character
  34. editor
  35. .chain()
  36. .sinkListItem("listItem")
  37. .command(({ tr }) => {
  38. tr.insertText(TAB_CHAR);
  39. return true;
  40. })
  41. .run();
  42. // Prevent default behavior (losing focus)
  43. return true;
  44. },
  45. };
  46. },
  47. });
  48. const editor = useEditor(
  49. {
  50. extensions: [
  51. StarterKit.configure(),
  52. Document,
  53. Paragraph,
  54. Text,
  55. TextStyle,
  56. TextAlign.configure({
  57. types: ["heading", "paragraph"],
  58. }),
  59. Underline,
  60. Highlight.configure({ multicolor: true }),
  61. Color,
  62. ListItem,
  63. TabHandler,
  64. Gapcursor,
  65. Table.configure({
  66. resizable: true,
  67. }),
  68. TableRow,
  69. TableHeader,
  70. TableCell,
  71. ],
  72. content: content,
  73. onUpdate({ editor }) {
  74. if (onChange) {
  75. onChange(editor.getHTML());
  76. }
  77. console.log(editor.getHTML());
  78. },
  79. },
  80. [],
  81. );
  82. return (
  83. <Grid container rowSpacing={1}>
  84. {/* <Grid item xs={12}>
  85. {editor && <MailToolbar editor={editor} />}
  86. </Grid> */}
  87. <Grid item xs={12}>
  88. <EditorContent
  89. className={error === true ? "tiptap-error" : ""}
  90. label="Template"
  91. editor={editor}
  92. />
  93. </Grid>
  94. </Grid>
  95. );
  96. };
  97. export default MailField;