|
@@ -71,124 +71,18 @@ const ItemWrapper = styled.div.attrs(({ rotation, locked, selected }) => {
|
|
|
}
|
|
|
`;
|
|
|
|
|
|
-/*const Item = ({
|
|
|
- setState,
|
|
|
- state: { type, x, y, rotation = 0, id, locked, layer, ...rest } = {},
|
|
|
- animate = "hvr-pop",
|
|
|
- isSelected,
|
|
|
- getComponent,
|
|
|
-}) => {
|
|
|
- const itemRef = React.useRef(null);
|
|
|
- const [unlock, setUnlock] = React.useState(false);
|
|
|
- const isMountedRef = React.useRef(false);
|
|
|
- const animateRef = React.useRef(null);
|
|
|
-
|
|
|
- // Allow to operate on locked item if key is pressed
|
|
|
- React.useEffect(() => {
|
|
|
- const onKeyDown = (e) => {
|
|
|
- if (e.key === "u" || e.key === "l") {
|
|
|
- setUnlock(true);
|
|
|
- }
|
|
|
- };
|
|
|
- const onKeyUp = (e) => {
|
|
|
- if (e.key === "u" || e.key === "l") {
|
|
|
- setUnlock(false);
|
|
|
- }
|
|
|
- };
|
|
|
- document.addEventListener("keydown", onKeyDown);
|
|
|
- document.addEventListener("keyup", onKeyUp);
|
|
|
- return () => {
|
|
|
- document.removeEventListener("keydown", onKeyDown);
|
|
|
- document.removeEventListener("keyup", onKeyUp);
|
|
|
- };
|
|
|
- }, []);
|
|
|
-
|
|
|
- const Component = getComponent(type);
|
|
|
-
|
|
|
- const updateState = React.useCallback(
|
|
|
- (callbackOrItem, sync = true) => setState(id, callbackOrItem, sync),
|
|
|
- [setState, id]
|
|
|
- );
|
|
|
-
|
|
|
- // Update actual size when update
|
|
|
- React.useEffect(() => {
|
|
|
- isMountedRef.current = true;
|
|
|
- return () => {
|
|
|
- isMountedRef.current = false;
|
|
|
- };
|
|
|
- }, []);
|
|
|
-
|
|
|
- React.useEffect(() => {
|
|
|
- animateRef.current.className = animate;
|
|
|
- }, [animate]);
|
|
|
-
|
|
|
- const removeClass = (e) => {
|
|
|
- e.target.className = "";
|
|
|
- };
|
|
|
-
|
|
|
- return (
|
|
|
- <div
|
|
|
- style={{
|
|
|
- transform: `translate(${x}px, ${y}px)`,
|
|
|
- display: "inline-block",
|
|
|
- zIndex: (layer || 0) + 3,
|
|
|
- position: "absolute",
|
|
|
- top: 0,
|
|
|
- left: 0,
|
|
|
- }}
|
|
|
- >
|
|
|
- <ItemWrapper
|
|
|
- rotation={rotation}
|
|
|
- locked={locked && !unlock}
|
|
|
- selected={isSelected}
|
|
|
- ref={itemRef}
|
|
|
- layer={layer}
|
|
|
- id={id}
|
|
|
- >
|
|
|
- <div ref={animateRef} onAnimationEnd={removeClass}>
|
|
|
- <Component {...rest} setState={updateState} />
|
|
|
- <div className="corner top-left"></div>
|
|
|
- <div className="corner top-right"></div>
|
|
|
- <div className="corner bottom-left"></div>
|
|
|
- <div className="corner bottom-right"></div>
|
|
|
- </div>
|
|
|
- </ItemWrapper>
|
|
|
- </div>
|
|
|
- );
|
|
|
-};*/
|
|
|
-
|
|
|
const Item = ({
|
|
|
setState,
|
|
|
state: { type, rotation = 0, id, locked, layer, ...rest } = {},
|
|
|
animate = "hvr-pop",
|
|
|
isSelected,
|
|
|
getComponent,
|
|
|
+ unlocked,
|
|
|
}) => {
|
|
|
const itemRef = React.useRef(null);
|
|
|
- const [unlock, setUnlock] = React.useState(false);
|
|
|
const isMountedRef = React.useRef(false);
|
|
|
const animateRef = React.useRef(null);
|
|
|
|
|
|
- // Allow to operate on locked item if key is pressed
|
|
|
- React.useEffect(() => {
|
|
|
- const onKeyDown = (e) => {
|
|
|
- if (e.key === "u" || e.key === "l") {
|
|
|
- setUnlock(true);
|
|
|
- }
|
|
|
- };
|
|
|
- const onKeyUp = (e) => {
|
|
|
- if (e.key === "u" || e.key === "l") {
|
|
|
- setUnlock(false);
|
|
|
- }
|
|
|
- };
|
|
|
- document.addEventListener("keydown", onKeyDown);
|
|
|
- document.addEventListener("keyup", onKeyUp);
|
|
|
- return () => {
|
|
|
- document.removeEventListener("keydown", onKeyDown);
|
|
|
- document.removeEventListener("keyup", onKeyUp);
|
|
|
- };
|
|
|
- }, []);
|
|
|
-
|
|
|
const Component = getComponent(type);
|
|
|
|
|
|
const updateState = React.useCallback(
|
|
@@ -215,7 +109,7 @@ const Item = ({
|
|
|
return (
|
|
|
<ItemWrapper
|
|
|
rotation={rotation}
|
|
|
- locked={locked && !unlock}
|
|
|
+ locked={locked && !unlocked}
|
|
|
selected={isSelected}
|
|
|
ref={itemRef}
|
|
|
layer={layer}
|
|
@@ -235,11 +129,22 @@ const Item = ({
|
|
|
const MemoizedItem = memo(
|
|
|
Item,
|
|
|
(
|
|
|
- { state: prevState, setState: prevSetState, isSelected: prevIsSelected },
|
|
|
- { state: nextState, setState: nextSetState, isSelected: nextIsSelected }
|
|
|
+ {
|
|
|
+ state: prevState,
|
|
|
+ setState: prevSetState,
|
|
|
+ isSelected: prevIsSelected,
|
|
|
+ unlocked: prevUnlocked,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ state: nextState,
|
|
|
+ setState: nextSetState,
|
|
|
+ isSelected: nextIsSelected,
|
|
|
+ unlocked: nextUnlocked,
|
|
|
+ }
|
|
|
) => {
|
|
|
return (
|
|
|
prevIsSelected === nextIsSelected &&
|
|
|
+ prevUnlocked === nextUnlocked &&
|
|
|
prevSetState === nextSetState &&
|
|
|
JSON.stringify(prevState) === JSON.stringify(nextState)
|
|
|
);
|