// Copyright 2025 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import React, { createRef } from 'react'; import Quill from '@signalapp/quill-cjs'; import Emitter from '@signalapp/quill-cjs/core/emitter'; import type { Delta } from '@signalapp/quill-cjs'; export type Props = { className: string; defaultValue: Delta | undefined; formats: Array; modules: Record; onChange?(): void; placeholder: string; readOnly: boolean | undefined; }; export class SimpleQuillWrapper extends React.Component { quill: Quill | undefined; quillElement = createRef(); override shouldComponentUpdate(): boolean { return false; } override componentDidMount(): void { this.createQuill(); if (!this.quill) { throw new Error( 'SimpleQuillWrapper.componentDidMount: this.quill not set!' ); } this.quill.on(Emitter.events.EDITOR_CHANGE, this.props.onChange); const { defaultValue } = this.props; if (defaultValue) { this.quill.setContents(defaultValue); } } override componentWillUnmount(): void { if (!this.quill) { return; } this.quill.off('editor-change', this.props.onChange); this.quill = undefined; } createQuill(): void { if (this.quill) { throw new Error('createQuill: this.quill already set!'); } if (!this.quillElement?.current) { throw new Error('createQuill: this.quillElement is not set!'); } this.quill = new Quill(this.quillElement.current, { formats: this.props.formats, modules: this.props.modules, placeholder: this.props.placeholder, readOnly: this.props.readOnly, }); } // eslint-disable-next-line react/no-unused-class-component-methods public getQuill(): Quill | undefined { return this.quill; } override render(): JSX.Element { return (
); } }