Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | 1x 1x 1x 35x 35x 35x 35x 4x 4x 1x 1x 1x 8x 8x 8x 11x 11x 3x 11x 1x 1x 1x 1x 1x 10x 1x 1x 1x 9x 9x 9x 9x 3x 2x 2x 2x 1x 1x 1x 1x 2x 8x 8x 35x | import { Shape, Anchor, ShapeType } from "./types"; import { createShape, isClose, setClose } from "./utils"; import * as R from "ramda"; type Payload = { selected: number; shapeList: Shape[]; }; type Action = { type: string; location?: Anchor; shapeType?: ShapeType; anchorOrdinal?: number; shapeOrdinal?: number; newShapeList?: Shape[]; color?: string; data?: any; }; export function reducer( payload: Payload, action: Action ): Payload { const { type, location, newShapeList, shapeOrdinal, shapeType, anchorOrdinal, color, data } = action; const { shapeList, selected } = payload; const selectedItem = shapeList[selected]; switch (type) { case "CREATE_SHAPE": payload = { shapeList: [...shapeList, createShape({ shapeType: shapeType ? shapeType : "line", color, data })], selected: shapeList.length }; break; case "DELETE_SHAPE": Iif (typeof (shapeOrdinal) === "undefined") { break; } payload = { shapeList: R.remove(shapeOrdinal, 1, shapeList), selected: 0 }; break; case "CHANGE_SELECTED": Iif (typeof (shapeOrdinal) === "undefined") { break; } payload = { ...payload, selected: shapeOrdinal }; break; case "PUSH_ANCHOR": Iif (!selectedItem || selectedItem.over || !location) { break; } if (selectedItem.anchors.length < 1) { selectedItem.anchors.push(location); } if ((selectedItem.type === "polygon" || selectedItem.type === "sides_polygon") && selectedItem.anchors.length > 3) { selectedItem.anchors = setClose(selectedItem.anchors); selectedItem.over = isClose(selectedItem.anchors); Eif (selectedItem.over) { payload = { ...payload }; break; } } if (selectedItem.type === "sides" && selectedItem.anchors.length > 1) { selectedItem.over = true; payload = { ...payload }; break; } Iif (selectedItem.type === "arrow" && selectedItem.anchors.length > 1) { selectedItem.over = true; payload = { ...payload }; break; } selectedItem.anchors.push(location); payload = { ...payload }; break; case "MOVE_LAST_ANCHOR": if (selectedItem && !selectedItem.over && selectedItem.anchors.length > 0) { selectedItem.anchors = R.update(-1, location, selectedItem.anchors); payload = { ...payload }; } break; case "MOVE_ANCHOR": if (selectedItem && selectedItem.anchors.length > 0 && typeof anchorOrdinal === "number") { selectedItem.anchors = R.update(anchorOrdinal, location, selectedItem.anchors); if ((selectedItem.type === "polygon" || selectedItem.type === "sides_polygon") && selectedItem.over && action.anchorOrdinal === selectedItem.anchors.length - 1) { selectedItem.anchors = R.update(0, location, selectedItem.anchors); } payload = { ...payload }; } break; case "OVER": if (selectedItem && !selectedItem.over && selectedItem.anchors.length > 0) { selectedItem.anchors = R.slice(0, -2, selectedItem.anchors); Iif ((selectedItem.type === "polygon" || selectedItem.type === "sides_polygon") && selectedItem.anchors.length > 3) { selectedItem.anchors = R.update(-1, R.head(selectedItem.anchors), selectedItem.anchors); } if ((selectedItem.type === "polygon" || selectedItem.type === "sides_polygon") && selectedItem.anchors.length <= 3) { break; } Iif (selectedItem.type === "line" && selectedItem.anchors.length < 2) { break; } selectedItem.over = true; payload = { ...payload }; } break; case "LOAD": payload = { selected: !shapeOrdinal || shapeOrdinal < 0 || shapeOrdinal >= newShapeList.length ? 0 : shapeOrdinal, shapeList: newShapeList }; break; } return payload; } |