a tool for shared writing and social publishing
1import {
2 AsyncValueAutosizeTextarea,
3 AutosizeTextareaProps,
4} from "components/utils/AutosizeTextarea";
5import { BlockProps } from "./Block";
6import { getCoordinatesInTextarea } from "src/utils/getCoordinatesInTextarea";
7import { focusBlock } from "src/utils/focusBlock";
8
9export function BaseTextareaBlock(
10 props: AutosizeTextareaProps & {
11 block: Pick<BlockProps, "previousBlock" | "nextBlock">;
12 },
13) {
14 let { block, ...passDownProps } = props;
15 return (
16 <AsyncValueAutosizeTextarea
17 {...passDownProps}
18 noWrap
19 onKeyDown={(e) => {
20 if (e.key === "ArrowUp") {
21 let selection = e.currentTarget.selectionStart;
22
23 let lastLineBeforeCursor = e.currentTarget.value
24 .slice(0, selection)
25 .lastIndexOf("\n");
26 if (lastLineBeforeCursor !== -1) return;
27 let block = props.block.previousBlock;
28 let coord = getCoordinatesInTextarea(e.currentTarget, selection);
29 if (block) {
30 focusBlock(block, {
31 left: coord.left + e.currentTarget.getBoundingClientRect().left,
32 type: "bottom",
33 });
34 return true;
35 }
36 }
37 if (e.key === "ArrowDown") {
38 let selection = e.currentTarget.selectionStart;
39
40 let lastLine = e.currentTarget.value.lastIndexOf("\n");
41 let lastLineBeforeCursor = e.currentTarget.value
42 .slice(0, selection)
43 .lastIndexOf("\n");
44 if (lastLine !== lastLineBeforeCursor) return;
45 e.preventDefault();
46 let block = props.block.nextBlock;
47
48 let coord = getCoordinatesInTextarea(e.currentTarget, selection);
49 console.log(coord);
50 if (block) {
51 focusBlock(block, {
52 left: coord.left + e.currentTarget.getBoundingClientRect().left,
53 type: "top",
54 });
55 return true;
56 }
57 }
58 }}
59 />
60 );
61}