1
0
Fork 0
mirror of https://github.com/muerwre/vault-frontend.git synced 2025-04-24 20:36:40 +07:00

fix photoswipe

This commit is contained in:
Fedor Katurov 2025-02-13 15:36:18 +07:00
parent 5e71294e71
commit 606700f5d2
3 changed files with 44 additions and 63 deletions

View file

@ -1,3 +1,5 @@
import { lazy } from 'react';
import { LoginDialog } from '~/containers/auth/LoginDialog'; import { LoginDialog } from '~/containers/auth/LoginDialog';
import { LoginSocialRegisterDialog } from '~/containers/auth/LoginSocialRegisterDialog'; import { LoginSocialRegisterDialog } from '~/containers/auth/LoginSocialRegisterDialog';
import { RestorePasswordDialog } from '~/containers/auth/RestorePasswordDialog'; import { RestorePasswordDialog } from '~/containers/auth/RestorePasswordDialog';
@ -6,9 +8,14 @@ import { TelegramAttachDialog } from '~/containers/auth/TelegramAttachDialog';
import { EditorCreateDialog } from '~/containers/dialogs/EditorCreateDialog'; import { EditorCreateDialog } from '~/containers/dialogs/EditorCreateDialog';
import { EditorEditDialog } from '~/containers/dialogs/EditorEditDialog'; import { EditorEditDialog } from '~/containers/dialogs/EditorEditDialog';
import { LoadingDialog } from '~/containers/dialogs/LoadingDialog'; import { LoadingDialog } from '~/containers/dialogs/LoadingDialog';
import { PhotoSwipe } from '~/containers/dialogs/PhotoSwipe';
import { TestDialog } from '~/containers/dialogs/TestDialog'; import { TestDialog } from '~/containers/dialogs/TestDialog';
const PhotoSwipe = lazy(() =>
import('~/containers/dialogs/PhotoSwipe').then((it) => ({
default: it.PhotoSwipe,
})),
);
export enum Dialog { export enum Dialog {
Login = 'Login', Login = 'Login',
Register = 'Register', Register = 'Register',

View file

@ -1,7 +1,8 @@
import { FC, createElement } from 'react'; import { FC, createElement, Suspense } from 'react';
import { observer } from 'mobx-react-lite'; import { observer } from 'mobx-react-lite';
import { LoaderCircle } from '~/components/common/LoaderCircle';
import { ModalWrapper } from '~/components/common/ModalWrapper'; import { ModalWrapper } from '~/components/common/ModalWrapper';
import { DIALOG_CONTENT } from '~/constants/modal'; import { DIALOG_CONTENT } from '~/constants/modal';
import { useModalStore } from '~/store/modal/useModalStore'; import { useModalStore } from '~/store/modal/useModalStore';
@ -18,10 +19,12 @@ const Modal: FC<Props> = observer(() => {
return ( return (
<ModalWrapper onOverlayClick={hide}> <ModalWrapper onOverlayClick={hide}>
<Suspense fallback={<LoaderCircle />}>
{createElement(DIALOG_CONTENT[current!]! as any, { {createElement(DIALOG_CONTENT[current!]! as any, {
onRequestClose: hide, onRequestClose: hide,
...props, ...props,
})} })}
</Suspense>
</ModalWrapper> </ModalWrapper>
); );
}); });

View file

@ -1,9 +1,9 @@
import { useEffect } from 'react'; import { useEffect, useRef } from 'react';
import 'photoswipe/style.css'; import 'photoswipe/style.css';
import { observer } from 'mobx-react-lite'; import { observer } from 'mobx-react-lite';
import { SlideData } from 'photoswipe/dist/types/slide/slide'; import PSWP from 'photoswipe';
import { renderToStaticMarkup } from 'react-dom/server'; import { renderToStaticMarkup } from 'react-dom/server';
import { Icon } from '~/components/common/Icon'; import { Icon } from '~/components/common/Icon';
@ -29,49 +29,18 @@ const padding = { top: 10, left: 10, right: 10, bottom: 10 } as const;
const PhotoSwipe = observer(({ index, items }: Props) => { const PhotoSwipe = observer(({ index, items }: Props) => {
const { hideModal } = useModal(); const { hideModal } = useModal();
const { isTablet } = useWindowSize(); const { isTablet } = useWindowSize();
const pswp = useRef(new PSWP());
useEffect(() => { useEffect(() => {
Promise.all( const dataSource = items.map((file) => ({
items.map( src: getURL(file, imagePresets[1600]),
(file): Promise<SlideData> => width: file.metadata?.width,
new Promise((resolve) => { height: file.metadata?.height,
const src = getURL( }));
file,
isTablet ? imagePresets[900] : imagePresets[1600],
);
if (file.metadata?.width && file.metadata.height) { pswp.current.options = {
resolve({ ...pswp.current.options,
src, dataSource,
width: file.metadata.width,
height: file.metadata.height,
});
return;
}
const img = new Image();
img.onload = () => {
resolve({
src,
height: img.naturalHeight,
width: img.naturalWidth,
});
};
img.onerror = () => {
resolve({});
};
img.src = getURL(file, imagePresets[1600]);
}),
),
).then(async (images: SlideData[]) => {
const PSWP = await import('photoswipe').then((it) => it.default);
const ps = new PSWP({
dataSource: images,
index: index || 0, index: index || 0,
closeOnVerticalDrag: true, closeOnVerticalDrag: true,
padding, padding,
@ -82,13 +51,15 @@ const PhotoSwipe = observer(({ index, items }: Props) => {
arrowNextSVG, arrowNextSVG,
arrowPrevSVG, arrowPrevSVG,
closeSVG, closeSVG,
}); };
ps.on('destroy', hideModal); pswp.current.on('closingAnimationEnd', hideModal);
ps.on('close', hideModal); pswp.current.init();
ps.init(); return () => {
}); pswp.current?.off('close', hideModal);
pswp.current?.destroy();
};
}, [hideModal, items, index, isTablet]); }, [hideModal, items, index, isTablet]);
return null; return null;