index.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import BlockComponent from '../BlockComponent';
  2. import { Slate, Editable } from 'slate-react';
  3. import Leaf from './Leaf';
  4. import HoveringToolbar from '$app/components/HoveringToolbar';
  5. import { TreeNode } from '@/appflowy_app/block_editor/view/tree_node';
  6. import { useTextBlock } from './index.hooks';
  7. import { BlockCommonProps, TextBlockToolbarProps } from '@/appflowy_app/interfaces';
  8. import { toolbarDefaultProps } from '@/appflowy_app/constants/toolbar';
  9. export default function TextBlock({
  10. node,
  11. needRenderChildren = true,
  12. toolbarProps,
  13. ...props
  14. }: {
  15. needRenderChildren?: boolean;
  16. toolbarProps?: TextBlockToolbarProps;
  17. } & BlockCommonProps<TreeNode> &
  18. React.HTMLAttributes<HTMLDivElement>) {
  19. const { editor, value, onChange, onKeyDownCapture, onDOMBeforeInput } = useTextBlock({ node });
  20. const { showGroups } = toolbarProps || toolbarDefaultProps;
  21. return (
  22. <div {...props} className={`${props.className || ''} py-1`}>
  23. <Slate editor={editor} onChange={onChange} value={value}>
  24. {showGroups.length > 0 && <HoveringToolbar node={node} blockId={node.id} />}
  25. <Editable
  26. onKeyDownCapture={onKeyDownCapture}
  27. onDOMBeforeInput={onDOMBeforeInput}
  28. renderLeaf={(leafProps) => <Leaf {...leafProps} />}
  29. placeholder='Enter some text...'
  30. />
  31. </Slate>
  32. {needRenderChildren && node.children.length > 0 ? (
  33. <div className='pl-[1.5em]'>
  34. {node.children.map((item) => (
  35. <BlockComponent key={item.id} node={item} />
  36. ))}
  37. </div>
  38. ) : null}
  39. </div>
  40. );
  41. }