a tool for shared writing and social publishing
1import { Replicache } from "replicache";
2import { ReplicacheMutators } from "src/replicache";
3import { getSortedSelection } from "components/SelectionManager/selectionState";
4import { useUIState } from "src/useUIState";
5
6export const moveBlockUp = async (rep: Replicache<ReplicacheMutators>) => {
7 let [sortedBlocks, siblings] = await getSortedSelection(rep);
8 if (sortedBlocks.length > 1) return;
9 let block = sortedBlocks[0];
10 let previousBlock =
11 siblings?.[siblings.findIndex((s) => s.value === block.value) - 1];
12 if (previousBlock.value === block.listData?.parent) {
13 previousBlock =
14 siblings?.[siblings.findIndex((s) => s.value === block.value) - 2];
15 }
16
17 if (
18 previousBlock?.listData &&
19 block.listData &&
20 block.listData.depth > 1 &&
21 !previousBlock.listData.path.find(
22 (f) => f.entity === block.listData?.parent,
23 )
24 ) {
25 let depth = block.listData.depth;
26 let newParent = previousBlock.listData.path.find(
27 (f) => f.depth === depth - 1,
28 );
29 if (!newParent) return;
30 if (useUIState.getState().foldedBlocks.includes(newParent.entity))
31 useUIState.getState().toggleFold(newParent.entity);
32 rep?.mutate.moveBlock({
33 block: block.value,
34 oldParent: block.listData?.parent,
35 newParent: newParent.entity,
36 position: { type: "end" },
37 });
38 } else {
39 rep?.mutate.moveBlockUp({
40 entityID: block.value,
41 parent: block.listData?.parent || block.parent,
42 });
43 }
44};
45
46export const moveBlockDown = async (
47 rep: Replicache<ReplicacheMutators>,
48 permission_set: string,
49) => {
50 let [sortedBlocks, siblings] = await getSortedSelection(rep);
51 if (sortedBlocks.length > 1) return;
52 let block = sortedBlocks[0];
53 let nextBlock = siblings
54 .slice(siblings.findIndex((s) => s.value === block.value) + 1)
55 .find(
56 (f) =>
57 f.listData &&
58 block.listData &&
59 !f.listData.path.find((f) => f.entity === block.value),
60 );
61 if (
62 nextBlock?.listData &&
63 block.listData &&
64 nextBlock.listData.depth === block.listData.depth - 1
65 ) {
66 if (useUIState.getState().foldedBlocks.includes(nextBlock.value))
67 useUIState.getState().toggleFold(nextBlock.value);
68 rep?.mutate.moveBlock({
69 block: block.value,
70 oldParent: block.listData?.parent,
71 newParent: nextBlock.value,
72 position: { type: "first" },
73 });
74 } else {
75 rep?.mutate.moveBlockDown({
76 entityID: block.value,
77 parent: block.listData?.parent || block.parent,
78 permission_set: permission_set,
79 });
80 }
81};