diff --git a/package-lock.json b/package-lock.json
index fe55ae7..d8d0f6f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,6 +15,7 @@
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-helmet": "^6.1.0",
+ "react-lazy-load": "^4.0.1",
"react-router-dom": "^6.15.0",
"react-swipeable": "^7.0.1"
},
@@ -4647,6 +4648,15 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
"integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
},
+ "node_modules/react-lazy-load": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/react-lazy-load/-/react-lazy-load-4.0.1.tgz",
+ "integrity": "sha512-TnXRr79X9rlC9UcmO6iyS28rOPHrgkHIP4+b8yZPfs1tw6k/Rp2DmFY8R20BqWR45ZWkpT+4dqV1f+yci+1ozg==",
+ "peerDependencies": {
+ "react": "^17.0.0 || ^18.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0"
+ }
+ },
"node_modules/react-refresh": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz",
diff --git a/package.json b/package.json
index 0193822..906d23c 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-helmet": "^6.1.0",
+ "react-lazy-load": "^4.0.1",
"react-router-dom": "^6.15.0",
"react-swipeable": "^7.0.1"
},
diff --git a/src/components/GridView/DetailsView.tsx b/src/components/GridView/DetailsView.tsx
index 8a27af8..4934770 100644
--- a/src/components/GridView/DetailsView.tsx
+++ b/src/components/GridView/DetailsView.tsx
@@ -37,6 +37,10 @@ const DetailsView = ({ images, activeImageIdx, setActiveImageIdx }: DetailsViewP
[images, activeImageIdx]
);
+ useEffect(() => {
+ setState({ ...state, showNavButtons: false });
+ return () => setState({ ...state, showNavButtons: true });
+ }, []);
const activeProfile = currentImage?.author !== undefined ? getProfile(currentImage?.author) : undefined;
const { nav, currentSettings } = useNav();
@@ -126,7 +130,7 @@ const DetailsView = ({ images, activeImageIdx, setActiveImageIdx }: DetailsViewP
currentImage.post.wasZapped = true;
};
- const imageWidth = useMemo(() => size.width && size.width > 1600 ? 1600 : 800, [size.width])
+ const imageWidth = useMemo(() => (size.width && size.width > 1600 ? 1600 : 800), [size.width]);
const nextImageProxyUrl = nextImage?.url && createImgProxyUrl(nextImage?.url, imageWidth, -1);
const currentImageProxyUrl = currentImage?.url && createImgProxyUrl(currentImage?.url, imageWidth, -1);
@@ -137,12 +141,19 @@ const DetailsView = ({ images, activeImageIdx, setActiveImageIdx }: DetailsViewP
return (
setActiveImageIdx(undefined)}>
- {nextImage && !isVideo(nextImage.url) &&
}
- {nextImage && isVideo(nextImage.url) &&
}
-
- {isVideo(currentImage.url) ?
:
}
+ {nextImage && !isVideo(nextImage.url) && (
+
+ )}
+ {nextImage && isVideo(nextImage.url) &&
}
+
+ {isVideo(currentImage.url) ? (
+
+ ) : (
+
+ )}
-
{currentImage?.content}
+ {currentImage?.content &&
{currentImage?.content}
}
+
{state.userNPub && (
currentImage && heartClick(currentImage)}>
@@ -163,21 +175,23 @@ const DetailsView = ({ images, activeImageIdx, setActiveImageIdx }: DetailsViewP
)}
)}
-
- {uniq(currentImage?.tags).map(t => (
- <>
- {
- setActiveImageIdx(undefined);
- nav({ ...currentSettings, tags: [t], npubs: [] });
- }}
- >
- {t}
- {' '}
- >
- ))}
-
+ {currentImage.tags.length > 0 && (
+
+ {uniq(currentImage?.tags).map(t => (
+ <>
+ {
+ setActiveImageIdx(undefined);
+ nav({ ...currentSettings, tags: [t], npubs: [] });
+ }}
+ >
+ {t}
+ {' '}
+ >
+ ))}
+
+ )}
diff --git a/src/components/GridView/GridImage.tsx b/src/components/GridView/GridImage.tsx
index 9f61c36..2866f7a 100644
--- a/src/components/GridView/GridImage.tsx
+++ b/src/components/GridView/GridImage.tsx
@@ -1,5 +1,6 @@
import { MouseEventHandler, SyntheticEvent, useState } from 'react';
import { NostrImage, createImgProxyUrl, isVideo } from '../nostrImageDownload';
+import LazyLoad from 'react-lazy-load';
interface GridImageProps {
image: NostrImage;
@@ -11,31 +12,35 @@ const GridImage = ({ image, onClick }: GridImageProps) => {
const mediaIsVideo = isVideo(image.url);
- return mediaIsVideo ? (
-
- ) : (
-
) => {
- e.currentTarget.src = '/notfound.png';
- }}
- className={`image ${loaded ? 'show' : ''}`}
- onLoad={() => setLoaded(true)}
- loading="lazy"
- key={image.url}
- onClick={onClick}
- src={createImgProxyUrl(image.url)}
- >
+ return (
+
+ {mediaIsVideo ? (
+
+ ) : (
+ ) => {
+ e.currentTarget.src = '/notfound.png';
+ }}
+ className={`image ${loaded ? 'show' : ''}`}
+ onLoad={() => setLoaded(true)}
+ loading="lazy"
+ key={image.url}
+ onClick={onClick}
+ src={createImgProxyUrl(image.url)}
+ >
+ )}
+
);
};
diff --git a/src/components/GridView/index.tsx b/src/components/GridView/index.tsx
index 7e15b7e..b777b19 100644
--- a/src/components/GridView/index.tsx
+++ b/src/components/GridView/index.tsx
@@ -7,6 +7,7 @@ import { Settings } from '../../utils/useNav';
import { useNDK } from '@nostr-dev-kit/ndk-react';
import AuthorProfile from '../AuthorProfile';
import { useSwipeable } from 'react-swipeable';
+import LazyLoad from 'react-lazy-load';
type GridViewProps = {
settings: Settings;
diff --git a/src/components/Icons/IconFullScreen.tsx b/src/components/Icons/IconFullScreen.tsx
index 85b7767..971c6ea 100644
--- a/src/components/Icons/IconFullScreen.tsx
+++ b/src/components/Icons/IconFullScreen.tsx
@@ -1,6 +1,10 @@
const IconFullScreen = () => (
-
-
-
-
-
-
- {!fullScreen && (
-
+ )}
{showGrid ? (
diff --git a/src/utils/globalState.tsx b/src/utils/globalState.tsx
index 3fe7d93..e098f99 100644
--- a/src/utils/globalState.tsx
+++ b/src/utils/globalState.tsx
@@ -5,9 +5,11 @@ import React, { createContext, useContext, useReducer } from 'react';
interface GlobalState {
userNPub?: string;
profile?: NDKUserProfile;
+ showNavButtons: boolean;
}
const initialState: GlobalState = {
userNPub: undefined,
+ showNavButtons: true
};
type GlobalStateType = [GlobalState, React.Dispatch
>];