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};