added zoom in-out
This commit is contained in:
parent
8ec62827d5
commit
92d17167b1
@ -1,24 +1,48 @@
|
|||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
|
|
||||||
|
|
||||||
const PreviewDocument = ({ imageUrl }) => {
|
const PreviewDocument = ({ imageUrl }) => {
|
||||||
const [loading, setLoading] = useState(true);
|
const [loading, setLoading] = useState(true);
|
||||||
const [rotation, setRotation] = useState(0);
|
const [rotation, setRotation] = useState(0);
|
||||||
|
const [scale, setScale] = useState(1);
|
||||||
|
|
||||||
|
const zoomIn = () => setScale((prev) => Math.min(prev + 0.2, 3));
|
||||||
|
const zoomOut = () => setScale((prev) => Math.max(prev - 0.2, 0.4));
|
||||||
|
const resetAll = () => {
|
||||||
|
setRotation(0);
|
||||||
|
setScale(1);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="d-flex justify-content-start">
|
<div className="d-flex justify-content-start gap-3 mb-2">
|
||||||
<i
|
<i
|
||||||
className="bx bx-rotate-right cursor-pointer"
|
className="bx bx-rotate-right cursor-pointer fs-4"
|
||||||
|
title="Rotate"
|
||||||
onClick={() => setRotation((prev) => prev + 90)}
|
onClick={() => setRotation((prev) => prev + 90)}
|
||||||
></i>
|
></i>
|
||||||
|
|
||||||
|
<i
|
||||||
|
className="bx bx-zoom-in cursor-pointer fs-4"
|
||||||
|
title="Zoom In"
|
||||||
|
onClick={zoomIn}
|
||||||
|
></i>
|
||||||
|
|
||||||
|
<i
|
||||||
|
className="bx bx-zoom-out cursor-pointer fs-4"
|
||||||
|
title="Zoom Out"
|
||||||
|
onClick={zoomOut}
|
||||||
|
></i>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
className="position-relative d-flex flex-column justify-content-center align-items-center"
|
className="position-relative d-flex flex-column justify-content-center align-items-center overflow-hidden"
|
||||||
style={{ minHeight: "80vh" }}
|
style={{ minHeight: "80vh" }}
|
||||||
>
|
>
|
||||||
|
|
||||||
{loading && (
|
{loading && (
|
||||||
<div className="text-secondary text-center mb-2">Loading...</div>
|
<div className="text-secondary text-center mb-2">
|
||||||
|
Loading...
|
||||||
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div className="mb-3 d-flex justify-content-center align-items-center">
|
<div className="mb-3 d-flex justify-content-center align-items-center">
|
||||||
@ -30,18 +54,18 @@ const PreviewDocument = ({ imageUrl }) => {
|
|||||||
maxHeight: "80vh",
|
maxHeight: "80vh",
|
||||||
objectFit: "contain",
|
objectFit: "contain",
|
||||||
display: loading ? "none" : "block",
|
display: loading ? "none" : "block",
|
||||||
transform: `rotate(${rotation}deg)`,
|
transform: `rotate(${rotation}deg) scale(${scale})`,
|
||||||
transition: "transform 0.3s ease",
|
transition: "transform 0.3s ease",
|
||||||
|
cursor: "grab",
|
||||||
}}
|
}}
|
||||||
onLoad={() => setLoading(false)}
|
onLoad={() => setLoading(false)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="position-absolute bottom-0 start-0 justify-content-center gap-2">
|
<div className="position-absolute bottom-0 start-0 m-2">
|
||||||
<button
|
<button
|
||||||
className="btn btn-outline-secondary"
|
className="btn btn-outline-secondary"
|
||||||
onClick={() => setRotation(0)}
|
onClick={resetAll}
|
||||||
title="Reset Rotation"
|
|
||||||
>
|
>
|
||||||
<i className="bx bx-reset"></i> Reset
|
<i className="bx bx-reset"></i> Reset
|
||||||
</button>
|
</button>
|
||||||
@ -51,4 +75,6 @@ const PreviewDocument = ({ imageUrl }) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export default PreviewDocument;
|
export default PreviewDocument;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user