From b75b1b34556c9b84a4b8b08b174c8a29d92209b6 Mon Sep 17 00:00:00 2001 From: hzrd149 Date: Thu, 13 Apr 2023 08:38:43 -0500 Subject: [PATCH] refactor embeds --- .changeset/honest-actors-allow.md | 5 + src/app.tsx | 2 + src/components/embed-types/app-music.tsx | 20 ++ src/components/embed-types/common.tsx | 49 ++++ src/components/embed-types/index.ts | 9 + src/components/embed-types/lightning.tsx | 10 + src/components/embed-types/nostr.tsx | 83 ++++++ src/components/embed-types/spotify.tsx | 26 ++ src/components/embed-types/tidal.tsx | 16 ++ src/components/embed-types/twitter.tsx | 11 + src/components/embed-types/youtube.tsx | 65 +++++ src/components/note/note-contents.tsx | 318 +++-------------------- src/helpers/embeds.ts | 32 +++ src/views/dm/chat.tsx | 18 +- src/views/hashtag/index.tsx | 10 + 15 files changed, 393 insertions(+), 281 deletions(-) create mode 100644 .changeset/honest-actors-allow.md create mode 100644 src/components/embed-types/app-music.tsx create mode 100644 src/components/embed-types/common.tsx create mode 100644 src/components/embed-types/index.ts create mode 100644 src/components/embed-types/lightning.tsx create mode 100644 src/components/embed-types/nostr.tsx create mode 100644 src/components/embed-types/spotify.tsx create mode 100644 src/components/embed-types/tidal.tsx create mode 100644 src/components/embed-types/twitter.tsx create mode 100644 src/components/embed-types/youtube.tsx create mode 100644 src/helpers/embeds.ts create mode 100644 src/views/hashtag/index.tsx diff --git a/.changeset/honest-actors-allow.md b/.changeset/honest-actors-allow.md new file mode 100644 index 000000000..d4ac80b7f --- /dev/null +++ b/.changeset/honest-actors-allow.md @@ -0,0 +1,5 @@ +--- +"nostrudel": minor +--- + +Show image and video embeds in DMs (big refactor to support hashtags) diff --git a/src/app.tsx b/src/app.tsx index c4f165045..ee3d750f5 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -15,6 +15,7 @@ import ProfileView from "./views/profile"; import FollowingTab from "./views/home/following-tab"; import DiscoverTab from "./views/home/discover-tab"; import GlobalTab from "./views/home/global-tab"; +import HashTagView from "./views/hashtag"; import UserView from "./views/user"; import UserNotesTab from "./views/user/notes"; import UserFollowersTab from "./views/user/followers"; @@ -121,6 +122,7 @@ const router = createBrowserRouter([ { path: "dm/:key", element: }, { path: "profile", element: }, { path: "l/:link", element: }, + { path: "t/:hashtag", element: }, { path: "", element: , diff --git a/src/components/embed-types/app-music.tsx b/src/components/embed-types/app-music.tsx new file mode 100644 index 000000000..4ef9e5716 --- /dev/null +++ b/src/components/embed-types/app-music.tsx @@ -0,0 +1,20 @@ +import { EmbedableContent, embedJSX } from "../../helpers/embeds"; + +// note1tvqk2mu829yr6asf7w5dgpp8t0mlp2ax5t26ctfdx8m0ptkssamqsleeux +// note1ygx9tec3af92704d92jwrj3zs7cws2jl29yvrlxzqlcdlykhwssqpupa7t +export function embedAppleMusic(content: EmbedableContent) { + return embedJSX(content, { + regexp: /https?:\/\/music\.apple\.com(?:\/[\+~%\/\.\w\-_]*)?(\??(?:[\?#\-\+=&;%@\.\w_]*)#?(?:[\-\.\!\/\\\w]*))?/, + render: (match) => ( + + ), + name: "Apple Music", + }); +} diff --git a/src/components/embed-types/common.tsx b/src/components/embed-types/common.tsx new file mode 100644 index 000000000..7482c592f --- /dev/null +++ b/src/components/embed-types/common.tsx @@ -0,0 +1,49 @@ +import { Box, Image, ImageProps, Link, useDisclosure } from "@chakra-ui/react"; +import { EmbedableContent, embedJSX } from "../../helpers/embeds"; +import appSettings from "../../services/app-settings"; + +const BlurredImage = (props: ImageProps) => { + const { isOpen, onToggle } = useDisclosure(); + return ( + + + + ); +}; + +// note1n06jceulg3gukw836ghd94p0ppwaz6u3mksnnz960d8vlcp2fnqsgx3fu9 +export function embedImages(content: EmbedableContent, trusted = false) { + return embedJSX(content, { + regexp: + /https?:\/\/([\dA-z\.-]+\.[A-z\.]{2,6})((?:\/[\+~%\/\.\w\-_]*)?\.(?:svg|gif|png|jpg|jpeg|webp|avif))(\??(?:[\?#\-\+=&;%@\.\w_]*)#?(?:[\-\.\!\/\\\w]*))?/i, + render: (match) => { + const ImageComponent = trusted || !appSettings.value.blurImages ? Image : BlurredImage; + return ; + }, + name: "Image", + }); +} + +export function embedVideos(content: EmbedableContent) { + return embedJSX(content, { + name: "Video", + regexp: + /https?:\/\/([\dA-z\.-]+\.[A-z\.]{2,6})((?:\/[\+~%\/\.\w\-_]*)?\.(?:mp4|mkv|webm|mov))(\??(?:[\?#\-\+=&;%@\.\w_]*)#?(?:[\-\.\!\/\\\w]*))?/i, + render: (match) =>