Something went wrong. Try again.
leaflet fork for copy edit / bug fixes forked from leaflet.pub/leaflet
Something went wrong. Try again.
2.3 kB · 78 lines
TypeScript
at main
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879import { BlockStructureMirror, blockListAttributes,} from "src/replicache/blockMirror";import { getBlocksFromMirror } from "src/replicache/getBlocks";import { useMirrorQuery } from "src/hooks/useMirrorQuery";import { useEntitySetContext } from "components/EntitySetProvider";
export type EditorCommentInfo = { commentEntityID: string; blockID: string;};
type PageEditorComments = { pageID: string; comments: EditorCommentInfo[];};
// Everything that changes which comments a page has or their order: block// order (the block-list attributes and canvas positions) and the comments// themselves.const relevantAttributes = [ ...blockListAttributes, "canvas/block", "block/comment",];
function computeComments( mirror: BlockStructureMirror, pageID: string,): PageEditorComments { // getBlocksFromMirror flattens nested list items into document order, so // comments on nested list items are found along with everything else. let cardBlocks = getBlocksFromMirror(mirror, pageID); let canvasBlocks = mirror.eav(pageID, "canvas/block");
let sortedCanvasBlocks = canvasBlocks .map((b) => ({ value: b.data.value, position: b.data.position })) .toSorted((a, b) => { if (a.position.y === b.position.y) return a.position.x - b.position.x; return a.position.y - b.position.y; });
let sorted = [ ...cardBlocks.map((b) => ({ value: b.entityID })), ...sortedCanvasBlocks, ];
let comments: EditorCommentInfo[] = []; for (let block of sorted) { let blockComments = mirror.eav(block.value, "block/comment"); let sortedComments = blockComments.toSorted((a, b) => a.data.position > b.data.position ? 1 : -1, ); for (let c of sortedComments) { comments.push({ commentEntityID: c.data.value, blockID: block.value, }); } }
return { pageID, comments };}
export function usePageEditorComments(pageID: string): PageEditorComments { let { permissions } = useEntitySetContext(); let data = useMirrorQuery( relevantAttributes, (mirror) => computeComments(mirror, pageID), [pageID], );
// Read-only viewers don't see comments at all, so hand downstream consumers // (side column, sheet, popover) an empty set if (!permissions.write || !data) return { pageID, comments: [] }; return data;}