From e21035157894f93b53af48642147a4acf721579e Mon Sep 17 00:00:00 2001 From: zmeyer44 Date: Sat, 14 Oct 2023 18:57:37 -0400 Subject: [PATCH] updating article page --- app/(app)/(profile)/[npub]/page.tsx | 113 ++++++++++++++++++ app/(app)/_layout/Header.tsx | 5 +- app/(app)/_layout/Keystone.tsx | 2 +- app/(app)/_layout/components/Relays.tsx | 41 +++++++ app/(app)/app/_sections/BecomeACreator.tsx | 4 +- app/(app)/app/_sections/FeaturedLists.tsx | 2 +- app/(app)/app/_sections/LongFormContent.tsx | 46 +++++++ app/(app)/app/page.tsx | 23 +--- app/(app)/article/[eventId]/page.tsx | 55 +-------- assets/Logo/index.tsx | 1 + bun.lockb | Bin 301563 -> 302341 bytes components/KindCard/1.tsx | 18 +++ components/KindCard/30023.tsx | 23 ++++ components/KindCard/3745.tsx | 18 +++ components/KindCard/components/Actions.tsx | 27 +++++ components/KindCard/components/Container.tsx | 42 +++++++ .../KindCard/components/ProfileHeader.tsx | 25 ++++ components/KindCard/components/Tags.tsx | 18 +++ components/KindCard/default.tsx | 18 +++ components/KindCard/index.tsx | 31 +++++ components/LongForm/Editor.tsx | 44 +------ components/LongForm/index.tsx | 57 +++++++++ components/LongFormContentCard/index.tsx | 83 ------------- components/SubscriptionCard/index.tsx | 56 +++++++++ components/Tabs/index.tsx | 45 +++++++ components/ui/tabs.tsx | 55 +++++++++ constants/dummy.ts | 38 ++++++ constants/index.ts | 1 + containers/Article/Actions.tsx | 26 ++++ containers/Article/index.tsx | 109 +++++++++++++++++ lib/nostr/dates.ts | 17 +++ lib/nostr/utils.ts | 64 ++++++++++ package.json | 1 + 33 files changed, 908 insertions(+), 200 deletions(-) create mode 100644 app/(app)/(profile)/[npub]/page.tsx create mode 100644 app/(app)/_layout/components/Relays.tsx create mode 100644 app/(app)/app/_sections/LongFormContent.tsx create mode 100644 components/KindCard/1.tsx create mode 100644 components/KindCard/30023.tsx create mode 100644 components/KindCard/3745.tsx create mode 100644 components/KindCard/components/Actions.tsx create mode 100644 components/KindCard/components/Container.tsx create mode 100644 components/KindCard/components/ProfileHeader.tsx create mode 100644 components/KindCard/components/Tags.tsx create mode 100644 components/KindCard/default.tsx create mode 100644 components/KindCard/index.tsx create mode 100644 components/LongForm/index.tsx delete mode 100644 components/LongFormContentCard/index.tsx create mode 100644 components/SubscriptionCard/index.tsx create mode 100644 components/Tabs/index.tsx create mode 100644 components/ui/tabs.tsx create mode 100644 constants/dummy.ts create mode 100644 containers/Article/Actions.tsx create mode 100644 containers/Article/index.tsx create mode 100644 lib/nostr/dates.ts create mode 100644 lib/nostr/utils.ts diff --git a/app/(app)/(profile)/[npub]/page.tsx b/app/(app)/(profile)/[npub]/page.tsx new file mode 100644 index 0000000..60aa59a --- /dev/null +++ b/app/(app)/(profile)/[npub]/page.tsx @@ -0,0 +1,113 @@ +"use client"; +import { useState } from "react"; +import Image from "next/image"; +import { Button } from "@/components/ui/button"; +import SubscriptionCard from "@/components/SubscriptionCard"; +import { HiCheckBadge } from "react-icons/hi2"; +import Tabs from "@/components/Tabs"; + +export default function ProfilePage({ + params: { npub }, +}: { + params: { + npub: string; + }; +}) { + const [activeTab, setActiveTab] = useState("feed"); + const demo = [ + { + id: "1", + title: "BTC Radio", + description: + "BTC Radio is the best fuking show ever. you should sub to it. now", + picture: + "https://assets.whop.com/cdn-cgi/image/width=1080/https://assets.whop.com/images/images/51602.original.png?1693358530", + tags: ["music", "crypto", "art"], + }, + ]; + return ( +
+
+
+
+
+
+ banner +
+
+
+
+
+ profile picture +
+ + +
+
+
+

+ Zach Meyer +

+ +
+
+

@zach

·
+

zach@ordstr.com

+
+
+

+ This is my bio. You should check it out now. +

+
+
+
+
+
+ {demo.map((e) => ( + + ))} +
+
+ setActiveTab(t.name)} + /> +
+
+
+ ); +} diff --git a/app/(app)/_layout/Header.tsx b/app/(app)/_layout/Header.tsx index 5eed387..510dbc6 100644 --- a/app/(app)/_layout/Header.tsx +++ b/app/(app)/_layout/Header.tsx @@ -2,6 +2,8 @@ import { UserMenu } from "./components/UserMenu"; import { Search } from "./components/Search"; import { Notifications } from "./components/Notifications"; import { MobileMenu } from "./components/MobileMenu"; +import { Relays } from "./components/Relays"; + import Logo from "@/assets/Logo"; export default function Header() { return ( @@ -9,7 +11,7 @@ export default function Header() {
- +
Flockstr
@@ -19,6 +21,7 @@ export default function Header() {
+
diff --git a/app/(app)/_layout/Keystone.tsx b/app/(app)/_layout/Keystone.tsx index f8f6a2a..a800ef3 100644 --- a/app/(app)/_layout/Keystone.tsx +++ b/app/(app)/_layout/Keystone.tsx @@ -5,7 +5,7 @@ export default function Keystone() {
diff --git a/app/(app)/_layout/components/Relays.tsx b/app/(app)/_layout/components/Relays.tsx new file mode 100644 index 0000000..300d2fd --- /dev/null +++ b/app/(app)/_layout/components/Relays.tsx @@ -0,0 +1,41 @@ +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { SiRelay } from "react-icons/si"; +import { RELAYS } from "@/constants"; +export function Relays() { + return ( + + + + + + {RELAYS.map((r) => ( + + {r} + + ))} + + + + Manage Relays + ⇧⌘M + + + + ); +} diff --git a/app/(app)/app/_sections/BecomeACreator.tsx b/app/(app)/app/_sections/BecomeACreator.tsx index 465f418..94716ef 100644 --- a/app/(app)/app/_sections/BecomeACreator.tsx +++ b/app/(app)/app/_sections/BecomeACreator.tsx @@ -3,7 +3,7 @@ import { Button } from "@/components/ui/button"; export default function BecomeACreator() { return ( -
+
creator icons -
+

Start earning on Nostr

diff --git a/app/(app)/app/_sections/FeaturedLists.tsx b/app/(app)/app/_sections/FeaturedLists.tsx index 35f3070..bc4162a 100644 --- a/app/(app)/app/_sections/FeaturedLists.tsx +++ b/app/(app)/app/_sections/FeaturedLists.tsx @@ -77,7 +77,7 @@ export default function FeaturedLists() { )} />
- +
+ + Long form content + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/app/(app)/app/page.tsx b/app/(app)/app/page.tsx index 3aa1ac6..22849ba 100644 --- a/app/(app)/app/page.tsx +++ b/app/(app)/app/page.tsx @@ -1,16 +1,10 @@ import { Button } from "@/components/ui/button"; import HorizontalCarousel from "./_sections/HorizontalCarousel"; import { RiArrowRightLine } from "react-icons/ri"; -import LongFormContentCard from "@/components/LongFormContentCard"; import BecomeACreator from "./_sections/BecomeACreator"; -import { - Section, - SectionHeader, - SectionTitle, - SectionContent, -} from "@/containers/PageSection"; import LiveStreamingSection from "./_sections/LiveStreaming"; import FeaturedListsSection from "./_sections/FeaturedLists"; +import LongFormContentSection from "./_sections/LongFormContent"; export default function Page() { return ( @@ -26,20 +20,7 @@ export default function Page() {
-
- - Long form content - - - - - - - - -
+ diff --git a/app/(app)/article/[eventId]/page.tsx b/app/(app)/article/[eventId]/page.tsx index 2d8b268..398f4e3 100644 --- a/app/(app)/article/[eventId]/page.tsx +++ b/app/(app)/article/[eventId]/page.tsx @@ -1,13 +1,5 @@ "use client"; -import { useMemo } from "react"; -import dynamic from "next/dynamic"; -import { Button } from "@/components/ui/button"; -import { RiCloseFill } from "react-icons/ri"; -import { Avatar, AvatarImage, AvatarFallback } from "@radix-ui/react-avatar"; -import { useRouter } from "next/navigation"; -const Viewer = dynamic(() => import("@/components/LongForm/Viewer"), { - ssr: false, -}); +import Article from "@/containers/Article"; export default function ArticlePage({ params: { eventId }, @@ -16,48 +8,5 @@ export default function ArticlePage({ eventId: string; }; }) { - const router = useRouter(); - const markdown = `This is a test -### test text - -- First -- Second -1 nest`; - - return ( -
-
-
- - - SC - - - Derek Seivers - -
- -
-
- -
- ); + return
; } diff --git a/assets/Logo/index.tsx b/assets/Logo/index.tsx index faca468..2a2b7ad 100644 --- a/assets/Logo/index.tsx +++ b/assets/Logo/index.tsx @@ -6,6 +6,7 @@ const Logo = (props: SVGProps) => ( width={188.303} height={289.598} viewBox="54.17 96.938 188.303 289.598" + fill="currentColor" {...props} > diff --git a/bun.lockb b/bun.lockb index 2ee3a5c3caf50e6ac43dd456c9f283d06b7b1eed..9717de9ae3e2586fbe383cdc0b759b65c9bb0931 100755 GIT binary patch delta 57022 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 delta 56929 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%0A%g@52Xy8Y}%h_%J8}N5Ds*7#sug!sxGfI{`ie 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 + + The start of the Nostr revolution + + + This is the summary of this artilce. Let's hope that it is a good + article and that it will end up being worth reading. I don't want to + waste my time on some random other stuff. + + + ); +} diff --git a/components/KindCard/30023.tsx b/components/KindCard/30023.tsx new file mode 100644 index 0000000..993237d --- /dev/null +++ b/components/KindCard/30023.tsx @@ -0,0 +1,23 @@ +"use client"; +import Container from "./components/Container"; +import { CardTitle, CardDescription } from "@/components/ui/card"; +import { getTagValues, getTagsValues } from "@/lib/nostr/utils"; +import { type Event } from "nostr-tools"; +import { removeDuplicates } from "@/lib/utils"; + +export default function Kind30023({ content, tags }: Event) { + const title = getTagValues("title", tags); + const summary = getTagValues("summary", tags); + const contentTags = removeDuplicates(getTagsValues("t", tags)); + + return ( + + + {title} + + + {summary ?? content} + + + ); +} diff --git a/components/KindCard/3745.tsx b/components/KindCard/3745.tsx new file mode 100644 index 0000000..9d9e839 --- /dev/null +++ b/components/KindCard/3745.tsx @@ -0,0 +1,18 @@ +import Container from "./components/Container"; +import { CardTitle, CardDescription } from "@/components/ui/card"; +import { type Event } from "nostr-tools"; + +export default function Kind3745({}: Event) { + return ( + + + The start of the Nostr revolution + + + This is the summary of this artilce. Let's hope that it is a good + article and that it will end up being worth reading. I don't want to + waste my time on some random other stuff. + + + ); +} diff --git a/components/KindCard/components/Actions.tsx b/components/KindCard/components/Actions.tsx new file mode 100644 index 0000000..9cd3f22 --- /dev/null +++ b/components/KindCard/components/Actions.tsx @@ -0,0 +1,27 @@ +import { Button } from "@/components/ui/button"; +import { + HiOutlineHandThumbUp, + HiOutlineChatBubbleLeftEllipsis, +} from "react-icons/hi2"; +import { HiOutlineLightningBolt } from "react-icons/hi"; + +export default function Actions() { + return ( +
+
+
+ + +
+ +
+
+ ); +} diff --git a/components/KindCard/components/Container.tsx b/components/KindCard/components/Container.tsx new file mode 100644 index 0000000..1b91571 --- /dev/null +++ b/components/KindCard/components/Container.tsx @@ -0,0 +1,42 @@ +"use client"; +import Image from "next/image"; +import Link from "next/link"; +import { RiMoreFill } from "react-icons/ri"; +import { Card, CardContent, CardHeader } from "@/components/ui/card"; +import { formatDate } from "@/lib/utils/dates"; +import { Button } from "@/components/ui/button"; +import { ReactNode } from "react"; +import ProfileHeader from "./ProfileHeader"; +import Actions from "./Actions"; +import Tags from "./Tags"; +import { type Event } from "nostr-tools"; + +type CreatorCardProps = { + contentTags?: string[]; + children: ReactNode; +}; + +export default function Container({ children, contentTags }: CreatorCardProps) { + return ( + + + +
+ {formatDate(new Date("10-5-23"), "MMM Do")} + +
+
+ + {children} + {!!contentTags?.length && ( +
+ +
+ )} + +
+
+ ); +} diff --git a/components/KindCard/components/ProfileHeader.tsx b/components/KindCard/components/ProfileHeader.tsx new file mode 100644 index 0000000..db627fb --- /dev/null +++ b/components/KindCard/components/ProfileHeader.tsx @@ -0,0 +1,25 @@ +import { Avatar, AvatarImage, AvatarFallback } from "@radix-ui/react-avatar"; +import { HiCheckBadge } from "react-icons/hi2"; + +type ProfileHeaderProps = {}; +export default function ProfileHeader({}: ProfileHeaderProps) { + return ( +
+ + + SC + +
+ + Derek Seivers + + +
+
+ ); +} diff --git a/components/KindCard/components/Tags.tsx b/components/KindCard/components/Tags.tsx new file mode 100644 index 0000000..91e6b1f --- /dev/null +++ b/components/KindCard/components/Tags.tsx @@ -0,0 +1,18 @@ +"use client"; + +import { Badge } from "@/components/ui/badge"; + +type TagsProps = { + tags: string[]; +}; +export default function Tags({ tags }: TagsProps) { + return ( +
+ {tags.map((t, idx) => ( + + {t} + + ))} +
+ ); +} diff --git a/components/KindCard/default.tsx b/components/KindCard/default.tsx new file mode 100644 index 0000000..c53af98 --- /dev/null +++ b/components/KindCard/default.tsx @@ -0,0 +1,18 @@ +import Container from "./components/Container"; +import { CardTitle, CardDescription } from "@/components/ui/card"; +import { type Event } from "nostr-tools"; + +export default function KindDefault({}: Event) { + return ( + + + The start of the Nostr revolution + + + This is the summary of this artilce. Let's hope that it is a good + article and that it will end up being worth reading. I don't want to + waste my time on some random other stuff. + + + ); +} diff --git a/components/KindCard/index.tsx b/components/KindCard/index.tsx new file mode 100644 index 0000000..e19a7b2 --- /dev/null +++ b/components/KindCard/index.tsx @@ -0,0 +1,31 @@ +"use client"; + +import { type ComponentType } from "react"; +import dynamic from "next/dynamic"; +import { type Event } from "nostr-tools"; + +const KindCard1 = dynamic(() => import("./1"), { + ssr: false, +}); +const KindCard3745 = dynamic(() => import("./3745"), { + ssr: false, +}); +const KindCard30023 = dynamic(() => import("./30023"), { + ssr: false, +}); +const KindCardDefault = dynamic(() => import("./default"), { + ssr: false, +}); + +const componentMap: Record> = { + 1: KindCard1, + 30023: KindCard30023, + 3745: KindCard3745, +}; + +type KindCardProps = Event; +export default function KindCard(props: KindCardProps) { + const { kind } = props; + const KindCard_ = componentMap[kind] ?? KindCardDefault; + return ; +} diff --git a/components/LongForm/Editor.tsx b/components/LongForm/Editor.tsx index 3ae37ba..2635c09 100644 --- a/components/LongForm/Editor.tsx +++ b/components/LongForm/Editor.tsx @@ -1,59 +1,27 @@ "use client"; -import { useEffect, useState } from "react"; +import { useState } from "react"; import { useTheme } from "next-themes"; -import { BlockNoteEditor, PartialBlock, Block } from "@blocknote/core"; +import { BlockNoteEditor, PartialBlock } from "@blocknote/core"; import { BlockNoteView, useBlockNote } from "@blocknote/react"; -import Spinner from "../spinner"; import "@blocknote/core/style.css"; interface EditorProps { - onChange: (value: string) => void; - initialMarkdown?: string; editable?: boolean; } -const Editor = ({ onChange, initialMarkdown, editable }: EditorProps) => { +const Editor = ({ editable }: EditorProps) => { const { resolvedTheme } = useTheme(); - const [loading, setLoading] = useState(true); - const [initialContent, setInitialContent] = useState(); + const [content, setContent] = useState(""); const editor: BlockNoteEditor = useBlockNote({ editable, - initialContent: initialContent, onEditorContentChange: (editor) => { - onChange(JSON.stringify(editor.topLevelBlocks, null, 2)); + setContent(JSON.stringify(editor.topLevelBlocks, null, 2)); }, }); - useEffect(() => { - if (editor) { - if (!initialContent && initialMarkdown) { - // Whenever the current Markdown content changes, converts it to an array - // of Block objects and replaces the editor's content with them. - const getBlocks = async () => { - const blocks: Block[] = - await editor.markdownToBlocks(initialMarkdown); - setInitialContent(blocks); - editor.replaceBlocks(editor.topLevelBlocks, blocks); - setLoading(false); - }; - void getBlocks(); - } else if (loading) { - setLoading(false); - } - } - }, [editor]); - - if (loading) { - return ( -
- -
- ); - } - return ( -
+
(); + const [loading, setLoading] = useState(true); + + const editor: BlockNoteEditor = useBlockNote({ + editable: false, + }); + + useEffect(() => { + if (editor) { + if (content) { + console.log("initial md", content); + // Whenever the current Markdown content changes, converts it to an array + // of Block objects and replaces the editor's content with them. + const getBlocks = async () => { + const blocks: Block[] = await editor.markdownToBlocks(content); + console.log("Blocks", blocks); + editor.replaceBlocks(editor.topLevelBlocks, blocks); + setLoading(false); + }; + void getBlocks(); + } else if (loading) { + console.log("TURING LOADING OFF"); + setLoading(false); + } + } + }, [editor]); + + if (loading) { + return ( +
+ +
+ ); + } + return ( +
+ +
+ ); +} diff --git a/components/LongFormContentCard/index.tsx b/components/LongFormContentCard/index.tsx deleted file mode 100644 index 37baf35..0000000 --- a/components/LongFormContentCard/index.tsx +++ /dev/null @@ -1,83 +0,0 @@ -"use client"; -import Image from "next/image"; -import Link from "next/link"; -import { RiMoreFill } from "react-icons/ri"; -import { HiOutlineLightningBolt } from "react-icons/hi"; -import { - HiOutlineHandThumbUp, - HiOutlineChatBubbleLeftEllipsis, - HiOutlineEllipsisHorizontal, -} from "react-icons/hi2"; - -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from "@/components/ui/card"; -import { Avatar, AvatarImage, AvatarFallback } from "@radix-ui/react-avatar"; -import { formatDate } from "@/lib/utils/dates"; -import { Button } from "../ui/button"; - -type CreatorCardProps = { - displayName: string; - about: string; - picture: string; - banner: string; -}; - -export default function LongFormContentCard() { - return ( - - -
- - - SC - - - Derek Seivers - -
-
- {formatDate(new Date("10-5-23"), "MMM Do")} - -
-
- - - The start of the Nostr revolution - - - This is the summary of this artilce. Let's hope that it is a good - article and that it will end up being worth reading. I don't want to - waste my time on some random other stuff. - -
-
-
- - -
- -
-
-
-
- ); -} diff --git a/components/SubscriptionCard/index.tsx b/components/SubscriptionCard/index.tsx new file mode 100644 index 0000000..5590c9a --- /dev/null +++ b/components/SubscriptionCard/index.tsx @@ -0,0 +1,56 @@ +import Image from "next/image"; +import { Button } from "@/components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { cn } from "@/lib/utils"; +import { HiOutlineCheckBadge } from "react-icons/hi2"; + +type SubscriptionCardProps = { + id: string; + title: string; + picture: string; + description: string; + tags: string[]; +}; +export default function SubscriptionCard({ + picture, + title, + tags, + description, +}: SubscriptionCardProps) { + return ( + +
+ {title} +
+
+ + {title} + + {description} + + + + + + +
+
+ ); +} diff --git a/components/Tabs/index.tsx b/components/Tabs/index.tsx new file mode 100644 index 0000000..d7f08d8 --- /dev/null +++ b/components/Tabs/index.tsx @@ -0,0 +1,45 @@ +import { cn } from "@/lib/utils"; + +type TabsProps = { + tabs: T[]; + activeTab: string; + setActiveTab: (tab: T) => void; +}; +export default function Tabs({ + tabs, + activeTab, + setActiveTab, +}: TabsProps) { + return ( +
+
+ {tabs.map((tab, idx) => ( + + ))} +
+
+ ); +} diff --git a/components/ui/tabs.tsx b/components/ui/tabs.tsx new file mode 100644 index 0000000..0f4caeb --- /dev/null +++ b/components/ui/tabs.tsx @@ -0,0 +1,55 @@ +"use client" + +import * as React from "react" +import * as TabsPrimitive from "@radix-ui/react-tabs" + +import { cn } from "@/lib/utils" + +const Tabs = TabsPrimitive.Root + +const TabsList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsList.displayName = TabsPrimitive.List.displayName + +const TabsTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName + +const TabsContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsContent.displayName = TabsPrimitive.Content.displayName + +export { Tabs, TabsList, TabsTrigger, TabsContent } diff --git a/constants/dummy.ts b/constants/dummy.ts new file mode 100644 index 0000000..2a76b6f --- /dev/null +++ b/constants/dummy.ts @@ -0,0 +1,38 @@ +import { type Event } from "nostr-tools"; +import { unixTimeNowInSeconds } from "@/lib/nostr/dates"; + +export const DUMMY_1: Event = { + id: "test", + content: "Time for nostr to take over twitter", + kind: 1, + pubkey: "235235", + sig: "wetwet", + tags: [["t", "nostr"]], + created_at: unixTimeNowInSeconds() - 3600, +}; +export const DUMMY_30023: Event = { + kind: 30023, + created_at: 1675642635, + content: + "Lorem [ipsum][nostr:nevent1qqst8cujky046negxgwwm5ynqwn53t8aqjr6afd8g59nfqwxpdhylpcpzamhxue69uhhyetvv9ujuetcv9khqmr99e3k7mg8arnc9] dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\nRead more at nostr:naddr1qqzkjurnw4ksz9thwden5te0wfjkccte9ehx7um5wghx7un8qgs2d90kkcq3nk2jry62dyf50k0h36rhpdtd594my40w9pkal876jxgrqsqqqa28pccpzu.", + tags: [ + ["d", "lorem-ipsum"], + ["title", "Lorem Ipsum"], + ["published_at", "1296962229"], + ["t", "placeholder"], + ["t", "nostr"], + [ + "e", + "b3e392b11f5d4f28321cedd09303a748acfd0487aea5a7450b3481c60b6e4f87", + "wss://relay.example.com", + ], + [ + "a", + "30023:a695f6b60119d9521934a691347d9f78e8770b56da16bb255ee286ddf9fda919:ipsum", + "wss://relay.nostr.org", + ], + ], + pubkey: "...", + id: "...", + sig: "wetwet", +}; diff --git a/constants/index.ts b/constants/index.ts index 6d2e816..5f94006 100644 --- a/constants/index.ts +++ b/constants/index.ts @@ -1 +1,2 @@ export * from "./relays"; +export * from "./dummy"; diff --git a/containers/Article/Actions.tsx b/containers/Article/Actions.tsx new file mode 100644 index 0000000..db4a1bc --- /dev/null +++ b/containers/Article/Actions.tsx @@ -0,0 +1,26 @@ +"use client"; +import { Button } from "@/components/ui/button"; +import { + HiOutlineHandThumbUp, + HiOutlineChatBubbleLeftEllipsis, +} from "react-icons/hi2"; +import { HiOutlineLightningBolt } from "react-icons/hi"; + +export default function Actions() { + return ( +
+
+ + + +
+
+ ); +} diff --git a/containers/Article/index.tsx b/containers/Article/index.tsx new file mode 100644 index 0000000..b894ac2 --- /dev/null +++ b/containers/Article/index.tsx @@ -0,0 +1,109 @@ +"use client"; +import dynamic from "next/dynamic"; +import { useMemo } from "react"; +import { Button } from "@/components/ui/button"; +import { RiCloseFill } from "react-icons/ri"; +import { Avatar, AvatarImage, AvatarFallback } from "@radix-ui/react-avatar"; +import { useRouter } from "next/navigation"; +import { formatDate } from "@/lib/utils/dates"; +import Actions from "./Actions"; + +export default function ArticlePage() { + const Viewer = useMemo( + () => dynamic(() => import("@/components/LongForm"), { ssr: false }), + [], + ); + const router = useRouter(); + const markdown = `Do you have any thoughts of YakiHonne? Share it and earn SATs! + + Comment2Earn | Earn SATs by sharing your comments on YakiHonne + + Earn SATs by sharing your comments on YakiHonne. + + ⏰2nd - 15th Oct + + ### Follow Us + + - Nostr: npub1yzvxlwp7wawed5vgefwfmugvumtp8c8t0etk3g8sky4n0ndvyxesnxrf8q + - Twitter: https://twitter.com/YakiHonne + - Facebook Profile: https://www.facebook.com/profi…1715056704 + - Facebook Page: https://www.facebook.com/profi…2076811240 + - Facebook Group: https://www.facebook.com/group…4539860115 + - Youtube: https://www.youtube.com/channe…f4EyFJ7BlA + + ### How to Get SATs: + 1. Post your thoughts about YakiHonne on at least one of the above social media, and be sure to @ YakiHonne. + 2. Follow YakiHonne on at least one of the social media above. + 3. Back to this article, leave your social account which followed YakiHonne in the Comments. + 4. Be zapped with SATs. + + ### What You Will Get: + 1. 500 SATs, if you finished all steps. + 2. 1000 SATs, if you finished all steps and`; + + return ( +
+
+
+ + + SC + + + Derek Seivers + +
+ +
+
+
+
+
+
+ +
+ + {formatDate(new Date("10-2-22"), "MMMM Do, YYYY")} + + +
+
+

+ This is the large title for the article. It's time to take over. +

+
+ +
+
+

+ Here is a short summary for the article that you are about to + start reading. Get ready to really enojy your self. +

+
+
+ +
+
+
+ ); +} diff --git a/lib/nostr/dates.ts b/lib/nostr/dates.ts new file mode 100644 index 0000000..e7e1814 --- /dev/null +++ b/lib/nostr/dates.ts @@ -0,0 +1,17 @@ +export function unixTimeNowInSeconds() { + return Math.floor(new Date().getTime() / 1000); +} + +export function dateTomorrow() { + return new Date(Date.now() + 3600 * 1000 * 24); +} + +export function formattedDate(unixTimestampInSeconds: number): string { + const options = { + year: "numeric", + month: "long", + day: "numeric", + } as const; + const date = new Date(unixTimestampInSeconds * 1000); + return date.toLocaleDateString("en-US", options); +} diff --git a/lib/nostr/utils.ts b/lib/nostr/utils.ts new file mode 100644 index 0000000..a654bc9 --- /dev/null +++ b/lib/nostr/utils.ts @@ -0,0 +1,64 @@ +import { nip19 } from "nostr-tools"; + +export const NOSTR_BECH32_REGEXP = + /^(npub|nprofile|note|nevent|naddr|nrelay)1[023456789acdefghjklmnpqrstuvwxyz]+/; + +export function nip19ToTag(nip19Id: string): string[] | undefined { + const decoded = nip19.decode(nip19Id); + + let tag: string[]; + switch (decoded.type) { + case "npub": + case "note": + return ["p", decoded.data]; + case "nprofile": + tag = ["e", decoded.data.pubkey]; + if (decoded.data.relays && decoded.data.relays.length > 0) + tag.push(decoded.data.relays[0]); + return tag; + case "nevent": + tag = ["e", decoded.data.id]; + if (decoded.data.relays && decoded.data.relays.length > 0) + tag.push(decoded.data.relays[0]); + return tag; + case "naddr": + tag = [ + "a", + `${decoded.data.kind}:${decoded.data.pubkey}:${decoded.data.identifier}`, + ]; + if (decoded.data.relays && decoded.data.relays.length > 0) { + tag.push(decoded.data.relays[0]); + } + return tag; + } +} + +export function aTagToNip19(aTag: string[]): string { + if (aTag[0] !== "a") throw new Error("Not an a tag"); + const tagIdSplit = aTag[1].split(":"); + + return nip19.naddrEncode({ + kind: parseInt(tagIdSplit[0]), + pubkey: tagIdSplit[1], + identifier: tagIdSplit[2], + }); +} +export const getTagValues = (name: string, tags: string[][]) => { + const [itemTag] = tags.filter((tag: string[]) => tag[0] === name); + const [, item] = itemTag || [, undefined]; + return item; +}; +export const getTagAllValues = (name: string, tags: string[][]) => { + const [itemTag] = tags.filter((tag: string[]) => tag[0] === name); + const itemValues = itemTag || [, undefined]; + itemValues.shift(); + return itemValues; +}; +export const getTagsValues = (name: string, tags: string[][]) => { + const itemTags = tags.filter((tag: string[]) => tag[0] === name); + return itemTags.map(([key, val]) => val) ?? []; +}; +export const getTagsAllValues = (name: string, tags: string[][]) => { + const itemTags = tags.filter((tag: string[]) => tag[0] === name); + return itemTags.map(([key, ...vals]) => vals) ?? []; +}; diff --git a/package.json b/package.json index 4b665fa..1b1b8eb 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "^1.0.4", "@tailwindcss/container-queries": "^0.1.1", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0",