Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
canifa_note
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Vũ Hoàng Anh
canifa_note
Commits
e92407d9
Unverified
Commit
e92407d9
authored
Dec 06, 2022
by
Zeng1998
Committed by
GitHub
Dec 06, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: image preview enhancement (#682)
parent
79bf365d
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
62 additions
and
2 deletions
+62
-2
PreviewImageDialog.tsx
web/src/components/PreviewImageDialog.tsx
+62
-2
No files found.
web/src/components/PreviewImageDialog.tsx
View file @
e92407d9
import
{
useState
}
from
"react"
;
import
React
,
{
useState
}
from
"react"
;
import
*
as
utils
from
"../helpers/utils"
;
import
Icon
from
"./Icon"
;
import
{
generateDialog
}
from
"./Dialog"
;
import
"../less/preview-image-dialog.less"
;
const
MIN_SCALE
=
0.5
;
const
MAX_SCALE
=
5
;
const
SCALE_UNIT
=
0.25
;
interface
Props
extends
DialogProps
{
imgUrls
:
string
[];
initialIndex
:
number
;
}
interface
State
{
angle
:
number
;
scale
:
number
;
originX
:
number
;
originY
:
number
;
}
const
PreviewImageDialog
:
React
.
FC
<
Props
>
=
({
destroy
,
imgUrls
,
initialIndex
}:
Props
)
=>
{
const
[
currentIndex
,
setCurrentIndex
]
=
useState
(
initialIndex
);
const
[
state
,
setState
]
=
useState
<
State
>
({
angle
:
0
,
scale
:
1
,
originX
:
-
1
,
originY
:
-
1
,
});
const
handleCloseBtnClick
=
()
=>
{
destroy
();
...
...
@@ -39,6 +56,38 @@ const PreviewImageDialog: React.FC<Props> = ({ destroy, imgUrls, initialIndex }:
}
};
const
handleImgRotate
=
(
event
:
React
.
MouseEvent
,
angle
:
number
)
=>
{
const
curImgAngle
=
(
state
.
angle
+
angle
+
360
)
%
360
;
setState
({
...
state
,
originX
:
-
1
,
originY
:
-
1
,
angle
:
curImgAngle
,
});
};
const
handleImgContainerScroll
=
(
event
:
React
.
WheelEvent
)
=>
{
const
offsetX
=
event
.
nativeEvent
.
offsetX
;
const
offsetY
=
event
.
nativeEvent
.
offsetY
;
const
sign
=
event
.
deltaY
<
0
?
1
:
-
1
;
const
curAngle
=
Math
.
max
(
MIN_SCALE
,
Math
.
min
(
MAX_SCALE
,
state
.
scale
+
sign
*
SCALE_UNIT
));
setState
({
...
state
,
originX
:
offsetX
,
originY
:
offsetY
,
scale
:
curAngle
,
});
};
const
getImageComputedStyle
=
()
=>
{
return
{
transform
:
`scale(
${
state
.
scale
}
) rotate(
${
state
.
angle
}
deg)`
,
transformOrigin
:
`
${
state
.
originX
===
-
1
?
"center"
:
`
${
state
.
originX
}
px`
}
${
state
.
originY
===
-
1
?
"center"
:
`
${
state
.
originY
}
px`
}
`
,
};
};
return
(
<>
<
div
className=
"btns-container"
>
...
...
@@ -48,9 +97,20 @@ const PreviewImageDialog: React.FC<Props> = ({ destroy, imgUrls, initialIndex }:
<
button
className=
"btn"
onClick=
{
handleDownloadBtnClick
}
>
<
Icon
.
Download
className=
"icon-img"
/>
</
button
>
<
button
className=
"btn"
onClick=
{
(
e
)
=>
handleImgRotate
(
e
,
-
90
)
}
>
<
Icon
.
RotateCcw
className=
"icon-img"
/>
</
button
>
<
button
className=
"btn"
onClick=
{
(
e
)
=>
handleImgRotate
(
e
,
90
)
}
>
<
Icon
.
RotateCw
className=
"icon-img"
/>
</
button
>
</
div
>
<
div
className=
"img-container"
onClick=
{
handleImgContainerClick
}
>
<
img
onClick=
{
(
e
)
=>
e
.
stopPropagation
()
}
src=
{
imgUrls
[
currentIndex
]
}
/>
<
img
onClick=
{
(
e
)
=>
e
.
stopPropagation
()
}
src=
{
imgUrls
[
currentIndex
]
}
onWheel=
{
handleImgContainerScroll
}
style=
{
getImageComputedStyle
()
}
/>
</
div
>
</>
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment