remirror/remirror

View on GitHub
packages/storybook-react/stories/extension-embed/resizable.tsx

Summary

Maintainability
C
1 day
Test Coverage
F
0%
import 'remirror/styles/all.css';

import React, {
  ChangeEventHandler,
  FormEventHandler,
  MouseEventHandler,
  useCallback,
  useState,
} from 'react';
import { IframeExtension } from 'remirror/extensions';
import { Remirror, ThemeProvider, useCommands, useRemirror } from '@remirror/react';

const AddIframeButton = () => {
  const { addIframe } = useCommands();
  const [href, setHref] = useState<string>('https://remirror.io');

  const handleChange: ChangeEventHandler<HTMLInputElement> = useCallback((e) => {
    setHref(e.target.value);
  }, []);

  const handleMouseDown: MouseEventHandler<HTMLButtonElement> = useCallback((e) => {
    e.preventDefault();
  }, []);

  const handleSubmit: FormEventHandler<HTMLFormElement> = useCallback(
    (e) => {
      e.preventDefault();
      addIframe({ src: href, height: 250, width: 500 });
      setHref('');
    },
    [addIframe, href],
  );

  return (
    <form onSubmit={handleSubmit}>
      <input type='url' placeholder='Enter link...' value={href} onChange={handleChange} required />
      <button type='submit' onMouseDown={handleMouseDown}>
        Add iframe
      </button>
    </form>
  );
};

const Resizable: React.FC = () => {
  const { manager } = useRemirror({
    extensions: () => [new IframeExtension({ enableResizing: true })],
  });

  return (
    <ThemeProvider>
      <Remirror manager={manager} autoRender='end' autoFocus>
        <AddIframeButton />
      </Remirror>
    </ThemeProvider>
  );
};

export default Resizable;