mirror of
https://github.com/Shadowfita/docmost.git
synced 2025-11-10 04:22:00 +10:00
* feat: support i18n * feat: wip support i18n * feat: complete space translation * feat: complete page translation * feat: update space translation * feat: update workspace translation * feat: update group translation * feat: update workspace translation * feat: update page translation * feat: update user translation * chore: update pnpm-lock * feat: add query translation * refactor: merge to single file * chore: remove necessary code * feat: save language to BE * fix: only load current language * feat: save language to locale column * fix: cleanups * add language menu to preferences page * new translations * translate editor * Translate editor placeholders * translate space selection component --------- Co-authored-by: Philip Okugbe <phil@docmost.com> Co-authored-by: Philip Okugbe <16838612+Philipinho@users.noreply.github.com>
80 lines
2.0 KiB
TypeScript
80 lines
2.0 KiB
TypeScript
import { EditorContent, useEditor } from "@tiptap/react";
|
|
import { Placeholder } from "@tiptap/extension-placeholder";
|
|
import { Underline } from "@tiptap/extension-underline";
|
|
import { Link } from "@tiptap/extension-link";
|
|
import { StarterKit } from "@tiptap/starter-kit";
|
|
import classes from "./comment.module.css";
|
|
import { useFocusWithin } from "@mantine/hooks";
|
|
import clsx from "clsx";
|
|
import { forwardRef, useEffect, useImperativeHandle } from "react";
|
|
import { useTranslation } from "react-i18next";
|
|
|
|
interface CommentEditorProps {
|
|
defaultContent?: any;
|
|
onUpdate?: any;
|
|
editable: boolean;
|
|
placeholder?: string;
|
|
autofocus?: boolean;
|
|
}
|
|
|
|
const CommentEditor = forwardRef(
|
|
(
|
|
{
|
|
defaultContent,
|
|
onUpdate,
|
|
editable,
|
|
placeholder,
|
|
autofocus,
|
|
}: CommentEditorProps,
|
|
ref,
|
|
) => {
|
|
const { t } = useTranslation();
|
|
const { ref: focusRef, focused } = useFocusWithin();
|
|
|
|
const commentEditor = useEditor({
|
|
extensions: [
|
|
StarterKit.configure({
|
|
gapcursor: false,
|
|
dropcursor: false,
|
|
}),
|
|
Placeholder.configure({
|
|
placeholder: placeholder || t("Reply..."),
|
|
}),
|
|
Underline,
|
|
Link,
|
|
],
|
|
onUpdate({ editor }) {
|
|
if (onUpdate) onUpdate(editor.getJSON());
|
|
},
|
|
content: defaultContent,
|
|
editable,
|
|
autofocus: (autofocus && "end") || false,
|
|
});
|
|
|
|
useEffect(() => {
|
|
setTimeout(() => {
|
|
if (autofocus) {
|
|
commentEditor?.commands.focus("end");
|
|
}
|
|
}, 10);
|
|
}, [commentEditor, autofocus]);
|
|
|
|
useImperativeHandle(ref, () => ({
|
|
clearContent: () => {
|
|
commentEditor.commands.clearContent();
|
|
},
|
|
}));
|
|
|
|
return (
|
|
<div ref={focusRef} className={classes.commentEditor}>
|
|
<EditorContent
|
|
editor={commentEditor}
|
|
className={clsx(classes.ProseMirror, { [classes.focused]: focused })}
|
|
/>
|
|
</div>
|
|
);
|
|
},
|
|
);
|
|
|
|
export default CommentEditor;
|