Skip to content

Commit f1e7683

Browse files
committed
fix(image-lightbox): fix closing transition triggering multiple times
1 parent f607a1a commit f1e7683

File tree

6 files changed

+39
-12
lines changed

6 files changed

+39
-12
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Fixed
11+
12+
- `ImageLightbox`: fix closing transition triggering multiple times.
13+
1014
## [3.9.2][] - 2024-10-04
1115

1216
### Fixed

packages/lumx-react/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"@testing-library/user-event": "^14.4.3",
4040
"@types/body-scroll-lock": "^2.6.1",
4141
"@types/classnames": "^2.2.9",
42+
"@types/dom-view-transitions": "^1.0.5",
4243
"@types/jest": "^29.2.1",
4344
"@types/lodash": "^4.14.149",
4445
"@types/react": "^17.0.2",

packages/lumx-react/src/components/image-lightbox/ImageLightbox.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ const Inner: Comp<ImageLightboxProps, HTMLDivElement> = forwardRef((props, ref)
5555
closeButtonProps={closeButtonProps}
5656
focusElement={currentPaginationItemRef}
5757
{...forwardedProps}
58+
// Disable the close on click away as we want a custom one here
59+
preventAutoClose
5860
>
5961
<ClickAwayProvider childrenRefs={clickAwayChildrenRefs} callback={onClickAway}>
6062
<ImageSlideshow

packages/lumx-react/src/components/image-lightbox/useImageLightbox.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ export function useImageLightbox<P extends Partial<ImageLightboxProps>>(
109109
isOpen: true,
110110
onClose: () => {
111111
close();
112-
prevProps?.onClose?.();
112+
propsRef.current?.onClose?.();
113113
},
114114
images,
115115
activeImageIndex: activeImageIndex || 0,

packages/lumx-react/src/utils/DOM/startViewTransition.ts

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,21 @@ import { MaybeElementOrRef } from '@lumx/react/utils/type';
55
import { unref } from '../react/unref';
66
import { getPrefersReducedMotion } from '../browser/getPrefersReducedMotion';
77

8-
function setTransitionViewName(elementRef: MaybeElementOrRef<HTMLElement>, name: string | null | undefined) {
9-
const element = unref(elementRef) as any;
10-
if (element) element.style.viewTransitionName = name;
8+
function setupViewTransitionName(elementRef: MaybeElementOrRef<HTMLElement>, name: string) {
9+
let originalName: string | null = null;
10+
return {
11+
set() {
12+
const element = unref(elementRef);
13+
if (!element) return;
14+
originalName = element.style.viewTransitionName;
15+
element.style.viewTransitionName = name;
16+
},
17+
unset() {
18+
const element = unref(elementRef);
19+
if (!element || originalName === null) return;
20+
element.style.viewTransitionName = originalName;
21+
},
22+
};
1123
}
1224

1325
/**
@@ -37,20 +49,20 @@ export async function startViewTransition({
3749
return;
3850
}
3951

40-
// Set transition name on source element
41-
setTransitionViewName(viewTransitionName.source, viewTransitionName.name);
52+
// Setup set/unset transition name on source & target
53+
const sourceTransitionName = setupViewTransitionName(viewTransitionName.source, viewTransitionName.name);
54+
const targetTransitionName = setupViewTransitionName(viewTransitionName.target, viewTransitionName.name);
55+
56+
sourceTransitionName.set();
4257

4358
// Start view transition, apply changes & flush to DOM
4459
await start(() => {
45-
// Un-set transition name on source element
46-
setTransitionViewName(viewTransitionName.source, null);
60+
sourceTransitionName.unset();
4761

4862
flushSync(changes);
4963

50-
// Set transition name on target element
51-
setTransitionViewName(viewTransitionName.target, viewTransitionName.name);
64+
targetTransitionName.set();
5265
}).updateCallbackDone;
5366

54-
// Un-set transition name on target element
55-
setTransitionViewName(viewTransitionName.target, null);
67+
targetTransitionName.unset();
5668
}

yarn.lock

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3869,6 +3869,7 @@ __metadata:
38693869
"@testing-library/user-event": ^14.4.3
38703870
"@types/body-scroll-lock": ^2.6.1
38713871
"@types/classnames": ^2.2.9
3872+
"@types/dom-view-transitions": ^1.0.5
38723873
"@types/jest": ^29.2.1
38733874
"@types/lodash": ^4.14.149
38743875
"@types/react": ^17.0.2
@@ -6067,6 +6068,13 @@ __metadata:
60676068
languageName: node
60686069
linkType: hard
60696070

6071+
"@types/dom-view-transitions@npm:^1.0.5":
6072+
version: 1.0.5
6073+
resolution: "@types/dom-view-transitions@npm:1.0.5"
6074+
checksum: 4190915a3d4c63d4c590d5e64d14ca1d1140496a75adb5af64b0ef13e075cc7676bff926f5c5c60305c4f6d46965a196c119a7960cbe0ff40e95e17e82334c22
6075+
languageName: node
6076+
linkType: hard
6077+
60706078
"@types/ejs@npm:^3.1.1":
60716079
version: 3.1.2
60726080
resolution: "@types/ejs@npm:3.1.2"

0 commit comments

Comments
 (0)