From a4bc3fd0ce7be0bf1a754082634539b4b6067c07 Mon Sep 17 00:00:00 2001 From: florian <> Date: Sat, 17 Feb 2024 13:12:23 +0100 Subject: [PATCH] chore: formating and cleanup --- TODO.md | 23 +++++---- bun.lockb | Bin 144690 -> 144728 bytes src/App.css | 2 +- .../AuthorProfile/AuthorProfile.css | 46 ++++++++++++++++++ .../{ => AuthorProfile}/AuthorProfile.tsx | 10 ++-- .../DetailsAuthor.tsx | 0 .../DetailsView.css | 4 -- .../DetailsView.tsx | 2 +- src/components/GridView/GridView.css | 6 ++- src/components/GridView/index.tsx | 27 +++++----- src/components/Icons/IconSettings.tsx | 12 +++-- src/components/InfoPanel/InfoPanel.tsx | 33 ++++++------- .../{GridView => ScrollView}/ScrollImage.css | 0 .../{GridView => ScrollView}/ScrollImage.tsx | 0 .../{GridView => ScrollView}/ScrollView.tsx | 4 +- src/components/SlideShow.css | 38 --------------- src/components/SlideShow.tsx | 4 +- src/components/SlideView/index.tsx | 2 +- src/components/env.ts | 19 ++++++++ src/utils/useProfile.ts | 2 +- 20 files changed, 135 insertions(+), 99 deletions(-) create mode 100644 src/components/AuthorProfile/AuthorProfile.css rename src/components/{ => AuthorProfile}/AuthorProfile.tsx (77%) rename src/components/{GridView => GridDetails (deprecated)}/DetailsAuthor.tsx (100%) rename src/components/{GridView => GridDetails (deprecated)}/DetailsView.css (99%) rename src/components/{GridView => GridDetails (deprecated)}/DetailsView.tsx (99%) rename src/components/{GridView => ScrollView}/ScrollImage.css (100%) rename src/components/{GridView => ScrollView}/ScrollImage.tsx (100%) rename src/components/{GridView => ScrollView}/ScrollView.tsx (95%) diff --git a/TODO.md b/TODO.md index b5bcac6..de0a779 100644 --- a/TODO.md +++ b/TODO.md @@ -1,16 +1,21 @@ # TODO +- hashtag view (single hasttag), header +- masonry, mit subtitles (user displayname, tags (most imporant), desc?, date) (ggf. nur desktop) +- NIP 46 +- header für multiple tags?? +- follow button für user view +- navigation entry points: + - Curated Topics, i.e. defined hashtags -> topic view + - Search (custom hashtags, profile search, content search, community seaarch) + - Global +- community view +- community links in detail view (/masonry) + - Avatar display is laggy, needs caching -- video mute icon position needs to be better arranged -- add zap/like to the scroll view -- grid profile: add banner/bio, maybe name to the right of the logo - turn settings dialog into a "search" and improve display on mbile -- bring back the desktop view of the details dialog +- bring back the desktop view of the details dialog (maybe!?) - nip-46 nsecbunker login - think about use of ui framework, and redesign settings dialog -- move NSFW block list into a list event on an slidestr.net profile -- direct link to profile (from nostrudel) should go to the grid. +- move NSFW block list into a list event on an slidestr.net profile (public nsfw mute list) - Add key/salt to imageproxy, see snort impl -- Add Follow button to profile page -- After seleting a profile, I get to the grid for that user: How to I get back to the previous search? -- \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 6de7c89e4d6df060f8fd09a6da7e592bfa5f1c29..5501719e6d19213d8825ba15725a32992db77c2e 100755 GIT binary patch delta 26652 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șMPVZh(uKXJSqH?0L{{9`pm(oVS?|{pRb<_xF{p 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 NtS#nkWRURv{{lx$W&;2K delta 27545 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 diff --git a/src/App.css b/src/App.css index f25dbc4..1782dc4 100644 --- a/src/App.css +++ b/src/App.css @@ -2,6 +2,6 @@ overflow: hidden; margin: 0px; padding: 0px; - + /*background-color: green; /* DEBUG colors */ } diff --git a/src/components/AuthorProfile/AuthorProfile.css b/src/components/AuthorProfile/AuthorProfile.css new file mode 100644 index 0000000..0649b2f --- /dev/null +++ b/src/components/AuthorProfile/AuthorProfile.css @@ -0,0 +1,46 @@ + +.author-info { + cursor: pointer; + color: white; + position: absolute; + bottom: 2em; + left: 2em; + z-index: 200; + display: flex; + flex-direction: row; + gap: 8px; + align-items: center; + } + + .author-image { + display: block; + transition: opacity 1s ease-in-out; + background-size: cover; + background-repeat: no-repeat; + width: 64px; + height: 64px; + border-radius: 12px; + animation-duration: 0.5s; + animation-timing-function: ease-in; + animation-name: showAuthor; + background-color: transparent; + } + + +@media screen and (max-width: 768px) { + .author-image { + width: 48px; + height: 48px; + } + + .author-info { + width: 80vw; + } + } + + @media screen and (max-width: 768px) { + .author-name { + display: none; + } + } + \ No newline at end of file diff --git a/src/components/AuthorProfile.tsx b/src/components/AuthorProfile/AuthorProfile.tsx similarity index 77% rename from src/components/AuthorProfile.tsx rename to src/components/AuthorProfile/AuthorProfile.tsx index eb2470d..aa350d1 100644 --- a/src/components/AuthorProfile.tsx +++ b/src/components/AuthorProfile/AuthorProfile.tsx @@ -1,8 +1,8 @@ -import './SlideShow.css'; -import useImageLoaded from '../utils/useImageLoaded'; -import { createImgProxyUrl } from './nostrImageDownload'; -import useNav from '../utils/useNav'; -import { ViewMode } from './SlideShow'; +import './AuthorProfile.css'; +import useImageLoaded from '../../utils/useImageLoaded'; +import { createImgProxyUrl } from '../nostrImageDownload'; +import useNav from '../../utils/useNav'; +import { ViewMode } from '../SlideShow'; type AvatarImageProps = { src?: string; diff --git a/src/components/GridView/DetailsAuthor.tsx b/src/components/GridDetails (deprecated)/DetailsAuthor.tsx similarity index 100% rename from src/components/GridView/DetailsAuthor.tsx rename to src/components/GridDetails (deprecated)/DetailsAuthor.tsx diff --git a/src/components/GridView/DetailsView.css b/src/components/GridDetails (deprecated)/DetailsView.css similarity index 99% rename from src/components/GridView/DetailsView.css rename to src/components/GridDetails (deprecated)/DetailsView.css index 1377927..492d8eb 100644 --- a/src/components/GridView/DetailsView.css +++ b/src/components/GridDetails (deprecated)/DetailsView.css @@ -1,5 +1,3 @@ - - .details { position: absolute; z-index: 500; @@ -49,7 +47,6 @@ display: inline; } - .details-contents .detail-image { object-fit: contain; max-width: 100%; @@ -134,7 +131,6 @@ } } - @media screen and (max-width: 768px) { .details { overflow-y: scroll; diff --git a/src/components/GridView/DetailsView.tsx b/src/components/GridDetails (deprecated)/DetailsView.tsx similarity index 99% rename from src/components/GridView/DetailsView.tsx rename to src/components/GridDetails (deprecated)/DetailsView.tsx index 6290ae4..929a681 100644 --- a/src/components/GridView/DetailsView.tsx +++ b/src/components/GridDetails (deprecated)/DetailsView.tsx @@ -31,7 +31,7 @@ const DetailsView = ({ images, currentImage, setCurrentImage }: DetailsViewProps () => (currentImage !== undefined ? images[currentImage] : undefined), [images, currentImage] ); - + const nextImageData = useMemo( () => (currentImage !== undefined ? images[currentImage + 1] : undefined), [images, currentImage] diff --git a/src/components/GridView/GridView.css b/src/components/GridView/GridView.css index 2babc7a..bc8e1f7 100644 --- a/src/components/GridView/GridView.css +++ b/src/components/GridView/GridView.css @@ -64,10 +64,14 @@ } .profile-header { - padding:2em; + padding: 2em; padding-bottom: 1em; } +.profile-header h2 { + margin: 0px; +} + .profile-header .author-info { position: relative; bottom: initial; diff --git a/src/components/GridView/index.tsx b/src/components/GridView/index.tsx index ba6f0ed..d416f11 100644 --- a/src/components/GridView/index.tsx +++ b/src/components/GridView/index.tsx @@ -3,7 +3,7 @@ import { NostrImage, urlFix } from '../nostrImageDownload'; import './GridView.css'; import GridImage from './GridImage'; import { Settings } from '../../utils/useNav'; -import AuthorProfile from '../AuthorProfile'; +import AuthorProfile from '../AuthorProfile/AuthorProfile'; import { useSwipeable } from 'react-swipeable'; import { Helmet } from 'react-helmet'; import useProfile from '../../utils/useProfile'; @@ -62,7 +62,7 @@ const GridView = ({ settings, images, currentImage, setCurrentImage, setViewMode useEffect(() => { document.body.addEventListener('keydown', onKeyDown); - setState({activeImage: undefined}); + setState({ activeImage: undefined }); if (currentImage) { console.log('setting hash to #g' + currentImage); @@ -84,19 +84,18 @@ const GridView = ({ settings, images, currentImage, setCurrentImage, setViewMode ) : null} */} - {activeProfile && ( + {(activeProfile || settings.tags.length == 1) && (
- - {/* - {activeProfile.banner} - {activeProfile.bio} - {activeProfile.website} - */} + {activeProfile ? ( + + ) : ( + settings.tags.map(t =>

#{t}

) + )}
)} diff --git a/src/components/Icons/IconSettings.tsx b/src/components/Icons/IconSettings.tsx index 6889704..4b40832 100644 --- a/src/components/Icons/IconSettings.tsx +++ b/src/components/Icons/IconSettings.tsx @@ -1,7 +1,13 @@ const IconSettings = () => ( - - - + + + ); export default IconSettings; diff --git a/src/components/InfoPanel/InfoPanel.tsx b/src/components/InfoPanel/InfoPanel.tsx index 060cfd3..ea0e743 100644 --- a/src/components/InfoPanel/InfoPanel.tsx +++ b/src/components/InfoPanel/InfoPanel.tsx @@ -1,10 +1,10 @@ -import { uniq } from 'lodash'; +import uniq from 'lodash/uniq'; import { NostrImage, urlFix } from '../nostrImageDownload'; import useNav, { Settings } from '../../utils/useNav'; import './InfoPanel.css'; import IconChevronDown from '../Icons/IconChevronDown'; import { ViewMode } from '../SlideShow'; -import AuthorProfile from '../AuthorProfile'; +import AuthorProfile from '../AuthorProfile/AuthorProfile'; import useProfile from '../../utils/useProfile'; import { useGlobalState } from '../../utils/globalState'; import IconLink from '../Icons/IconLink'; @@ -48,21 +48,20 @@ const InfoPanel = ({ image, onClose, setViewMode, settings }: InfoPanelProps) => {image.tags.length > 0 && (
- {uniq(image?.tags) - .map(t => ( - <> - { - //setCurrentImage(undefined); - setViewMode('grid'); - nav({ ...currentSettings, tags: [t], npubs: [] }); - }} - > - {t} - {' '} - - ))} + {uniq(image?.tags).map(t => ( + <> + { + //setCurrentImage(undefined); + setViewMode('grid'); + nav({ ...currentSettings, tags: [t], npubs: [] }); + }} + > + {t} + {' '} + + ))}
)}
diff --git a/src/components/GridView/ScrollImage.css b/src/components/ScrollView/ScrollImage.css similarity index 100% rename from src/components/GridView/ScrollImage.css rename to src/components/ScrollView/ScrollImage.css diff --git a/src/components/GridView/ScrollImage.tsx b/src/components/ScrollView/ScrollImage.tsx similarity index 100% rename from src/components/GridView/ScrollImage.tsx rename to src/components/ScrollView/ScrollImage.tsx diff --git a/src/components/GridView/ScrollView.tsx b/src/components/ScrollView/ScrollView.tsx similarity index 95% rename from src/components/GridView/ScrollView.tsx rename to src/components/ScrollView/ScrollView.tsx index 7b3e86b..bb9799a 100644 --- a/src/components/GridView/ScrollView.tsx +++ b/src/components/ScrollView/ScrollView.tsx @@ -1,7 +1,7 @@ import { useEffect, useMemo, useRef, useState } from 'react'; import { NostrImage, urlFix } from '../nostrImageDownload'; import { Settings } from '../../utils/useNav'; -import AuthorProfile from '../AuthorProfile'; +import AuthorProfile from '../AuthorProfile/AuthorProfile'; import { Helmet } from 'react-helmet'; import useProfile from '../../utils/useProfile'; import ScrollImage from './ScrollImage'; @@ -47,7 +47,7 @@ const ScrollView = ({ settings, images, currentImage, setCurrentImage, setViewMo const { activeProfile, profileNpub, title } = useProfile(settings, state.activeImage); const infoPanelAvailable = state.activeImage && (state.activeImage.content || state.activeImage.tags.length > 0); -console.log(JSON.stringify([state?.activeImage?.content, state?.activeImage?.tags])); + console.log(JSON.stringify([state?.activeImage?.content, state?.activeImage?.tags])); return (
diff --git a/src/components/SlideShow.css b/src/components/SlideShow.css index fdfb374..ab2ced8 100644 --- a/src/components/SlideShow.css +++ b/src/components/SlideShow.css @@ -81,29 +81,6 @@ } } -.author-info { - cursor: pointer; - color: white; - position: absolute; - bottom: 2em; - left: 2em; - z-index: 200; -} - -.author-image { - margin-bottom: 0.5em; - display: block; - transition: opacity 1s ease-in-out; - background-size: cover; - background-repeat: no-repeat; - width: 64px; - height: 64px; - border-radius: 12px; - animation-duration: 0.5s; - animation-timing-function: ease-in; - animation-name: showAuthor; - background-color: transparent; -} .slide { position: fixed; @@ -297,19 +274,4 @@ .controls { top: 2em; } - - .author-image { - width: 48px; - height: 48px; - } - - .author-info { - width: 80vw; - } } - -@media screen and (max-width: 768px) { - .author-name { - display: none; - } -} \ No newline at end of file diff --git a/src/components/SlideShow.tsx b/src/components/SlideShow.tsx index 560b398..f551021 100644 --- a/src/components/SlideShow.tsx +++ b/src/components/SlideShow.tsx @@ -24,15 +24,15 @@ import { NDKEvent } from '@nostr-dev-kit/ndk'; import { useGlobalState } from '../utils/globalState'; import useAutoLogin from '../utils/useAutoLogin'; import IconUser from './Icons/IconUser'; -import ScrollView from './GridView/ScrollView'; +import ScrollView from './ScrollView/ScrollView'; import IconPlay from './Icons/IconPlay'; import IconGrid from './Icons/IconGrid'; import IconFullScreen from './Icons/IconFullScreen'; -import GridView from './GridView'; import useZapsAndReations from '../utils/useZapAndReaction'; import IconHeart from './Icons/IconHeart'; import IconBolt from './Icons/IconBolt'; import IconSearch from './Icons/IconSearch'; +import GridView from './GridView'; // type AlbyNostr = typeof window.nostr & { enabled: boolean }; diff --git a/src/components/SlideView/index.tsx b/src/components/SlideView/index.tsx index ec1721e..226dc4e 100644 --- a/src/components/SlideView/index.tsx +++ b/src/components/SlideView/index.tsx @@ -1,5 +1,5 @@ import { MutableRefObject, useEffect, useRef, useState } from 'react'; -import AuthorProfile from '../AuthorProfile'; +import AuthorProfile from '../AuthorProfile/AuthorProfile'; import Slide from './Slide'; import { NostrImage, urlFix } from '../nostrImageDownload'; import useDebouncedEffect from '../../utils/useDebouncedEffect'; diff --git a/src/components/env.ts b/src/components/env.ts index 6b8f89d..60009e2 100644 --- a/src/components/env.ts +++ b/src/components/env.ts @@ -2,6 +2,25 @@ import { nip19 } from 'nostr-tools'; export const appName = 'slidestr.net'; +export const topics = { + art: ['art', 'artstr', 'beautiful', 'colorful', 'psychedelic'], + bitcoin: ['bitcoin', 'plebchain'], + nostr: ['coffeechain', 'nostr', 'zapathon', 'grownostr', 'freedom'], + animals: ['catstr', 'cute', 'dogstr'], + photography: [ + 'naturephotography', + 'photo', + 'photography', + 'photos', + 'photostr', + 'picoftheday', + 'streetphotography', + 'picstr', + ], + lifestyle: ['fashion', 'flowerstr', 'foodstr', 'style', 'weedstr', 'travel', 'travelstr', 'happy', 'life', 'love'], + gardening: ['gardening', 'gardenstr', 'nature'], +}; + export const defaultHashTags = [ 'artstr', 'catstr', diff --git a/src/utils/useProfile.ts b/src/utils/useProfile.ts index a414350..9d8ed36 100644 --- a/src/utils/useProfile.ts +++ b/src/utils/useProfile.ts @@ -8,7 +8,7 @@ const useProfile = (settings: Settings, activeImage?: NostrImage) => { const { getProfile } = useNDK(); const [title, setTitle] = useState(appName); - const profileNpub = settings.npubs.length == 1 ?settings.npubs[0] : activeImage && activeImage?.author; + const profileNpub = settings.npubs.length == 1 ? settings.npubs[0] : activeImage && activeImage?.author; const activeProfile = profileNpub && getProfile(profileNpub);