chore: cleaned up unused files
248b84df
8 file(s) · +23 −246
| 13 | 13 | "@astrojs/react": "4.4.2", |
|
| 14 | 14 | "@astrojs/rss": "4.0.14", |
|
| 15 | 15 | "@astrojs/ts-plugin": "1.10.6", |
|
| 16 | - | "@atproto/api": "^0.18.9", |
|
| 17 | 16 | "@types/react": "^18.3.8", |
|
| 18 | 17 | "@types/react-dom": "^18.3.0", |
|
| 19 | 18 | "astro": "5.16.7", |
| 9 | 9 | "build": "astro build", |
|
| 10 | 10 | "preview": "astro preview", |
|
| 11 | 11 | "format": "biome format --write src package.json", |
|
| 12 | - | "deploy:orbiter": "orbiter deploy", |
|
| 13 | 12 | "deploy": "bun run build && wrangler pages deploy dist", |
|
| 14 | - | "publish:atproto": "bun run scripts/publish-to-atproto.ts", |
|
| 15 | 13 | "parse:birds": "bun run scripts/parse-birds.ts" |
|
| 16 | 14 | }, |
|
| 17 | 15 | "devDependencies": { |
|
| 35 | 33 | "@astrojs/react": "4.4.2", |
|
| 36 | 34 | "@astrojs/rss": "4.0.14", |
|
| 37 | 35 | "@astrojs/ts-plugin": "1.10.6", |
|
| 38 | - | "@atproto/api": "^0.18.9", |
|
| 39 | 36 | "@types/react": "^18.3.8", |
|
| 40 | 37 | "@types/react-dom": "^18.3.0", |
|
| 41 | 38 | "astro": "5.16.7", |
|
| 1 | + | --- |
|
| 2 | + | interface Props { |
|
| 3 | + | postTitle: string; |
|
| 4 | + | } |
|
| 5 | + | ||
| 6 | + | const { postTitle } = Astro.props; |
|
| 7 | + | const emailSubject = encodeURIComponent(`Re: ${postTitle}`); |
|
| 8 | + | const mailtoLink = `mailto:contact@stevedylan.dev?subject=${emailSubject}`; |
|
| 9 | + | --- |
|
| 10 | + | ||
| 11 | + | <div class="mt-8 space-y-4"> |
|
| 12 | + | <div class="flex gap-3 flex-wrap"> |
|
| 13 | + | <a |
|
| 14 | + | href={mailtoLink} |
|
| 15 | + | class="px-2 py-0.5 border border-white hover:border-gray-400 hover:text-gray-400 transition-colors text-xs" |
|
| 16 | + | > |
|
| 17 | + | Reply via Email |
|
| 18 | + | </a> |
|
| 19 | + | </div> |
|
| 20 | + | </div> |
| 1 | - | // COMMENTS FUNCTIONALITY DISABLED - Only email reply remains |
|
| 2 | - | ||
| 3 | - | interface GuestReplyProps { |
|
| 4 | - | atUri: string; |
|
| 5 | - | postTitle: string; |
|
| 6 | - | onReplyPosted?: () => void; |
|
| 7 | - | } |
|
| 8 | - | ||
| 9 | - | export function GuestReply({ |
|
| 10 | - | atUri, |
|
| 11 | - | postTitle, |
|
| 12 | - | onReplyPosted, |
|
| 13 | - | }: GuestReplyProps) { |
|
| 14 | - | const emailSubject = encodeURIComponent(`Re: ${postTitle}`); |
|
| 15 | - | const mailtoLink = `mailto:contact@stevedylan.dev?subject=${emailSubject}`; |
|
| 16 | - | ||
| 17 | - | return ( |
|
| 18 | - | <div className="mt-8 space-y-4"> |
|
| 19 | - | <div className="flex gap-3 flex-wrap"> |
|
| 20 | - | <a |
|
| 21 | - | href={mailtoLink} |
|
| 22 | - | className="px-2 py-0.5 border border-white hover:border-gray-400 hover:text-gray-400 transition-colors text-xs" |
|
| 23 | - | > |
|
| 24 | - | Reply via Email |
|
| 25 | - | </a> |
|
| 26 | - | </div> |
|
| 27 | - | </div> |
|
| 28 | - | ); |
|
| 29 | - | } |
| 1 | - | // COMMENTS FUNCTIONALITY DISABLED - Only email reply remains |
|
| 2 | - | // import { useState } from "react"; |
|
| 3 | - | // import { ReplyList } from "./ReplyList"; |
|
| 4 | - | import { GuestReply } from "./GuestReply"; |
|
| 5 | - | ||
| 6 | - | interface ReplyContainerProps { |
|
| 7 | - | atUri: string; |
|
| 8 | - | postTitle: string; |
|
| 9 | - | } |
|
| 10 | - | ||
| 11 | - | export function ReplyContainer({ atUri, postTitle }: ReplyContainerProps) { |
|
| 12 | - | // const [refreshKey, setRefreshKey] = useState(0); |
|
| 13 | - | ||
| 14 | - | // const handleReplyPosted = () => { |
|
| 15 | - | // setRefreshKey((prev) => prev + 1); |
|
| 16 | - | // }; |
|
| 17 | - | ||
| 18 | - | return ( |
|
| 19 | - | <> |
|
| 20 | - | {/* <ReplyList key={refreshKey} atUri={atUri} /> */} |
|
| 21 | - | <GuestReply |
|
| 22 | - | atUri={atUri} |
|
| 23 | - | postTitle={postTitle} |
|
| 24 | - | // onReplyPosted={handleReplyPosted} |
|
| 25 | - | /> |
|
| 26 | - | </> |
|
| 27 | - | ); |
|
| 28 | - | } |
| 1 | - | // COMMENTS FUNCTIONALITY DISABLED |
|
| 2 | - | // import { useState, useEffect } from "react"; |
|
| 3 | - | ||
| 4 | - | // const API_URL = import.meta.env.PUBLIC_API_URL || "https://api.stevedylan.dev"; |
|
| 5 | - | ||
| 6 | - | // interface Author { |
|
| 7 | - | // did: string; |
|
| 8 | - | // handle: string; |
|
| 9 | - | // displayName?: string; |
|
| 10 | - | // avatar?: string; |
|
| 11 | - | // } |
|
| 12 | - | ||
| 13 | - | // interface CommentReference { |
|
| 14 | - | // createdAt: string; |
|
| 15 | - | // did: string; |
|
| 16 | - | // uri: string; |
|
| 17 | - | // } |
|
| 18 | - | ||
| 19 | - | // interface Reply { |
|
| 20 | - | // uri: string; |
|
| 21 | - | // cid: string; |
|
| 22 | - | // author: Author; |
|
| 23 | - | // root: { |
|
| 24 | - | // cid: string; |
|
| 25 | - | // uri: string; |
|
| 26 | - | // }; |
|
| 27 | - | // parent: { |
|
| 28 | - | // cid: string; |
|
| 29 | - | // uri: string; |
|
| 30 | - | // }; |
|
| 31 | - | // content: string; |
|
| 32 | - | // createdAt: string; |
|
| 33 | - | // $type: string; |
|
| 34 | - | // } |
|
| 35 | - | ||
| 36 | - | // interface ReplyListProps { |
|
| 37 | - | // atUri: string; |
|
| 38 | - | // } |
|
| 39 | - | ||
| 40 | - | // export function ReplyList({ atUri }: ReplyListProps) { |
|
| 41 | - | // const [replies, setReplies] = useState<Reply[]>([]); |
|
| 42 | - | // const [loading, setLoading] = useState(true); |
|
| 43 | - | // const [error, setError] = useState<string | null>(null); |
|
| 44 | - | ||
| 45 | - | // useEffect(() => { |
|
| 46 | - | // fetchReplies(); |
|
| 47 | - | // }, [atUri]); |
|
| 48 | - | ||
| 49 | - | // const fetchReplies = async () => { |
|
| 50 | - | // try { |
|
| 51 | - | // setLoading(true); |
|
| 52 | - | // setError(null); |
|
| 53 | - | ||
| 54 | - | // const encodedUri = encodeURIComponent(atUri); |
|
| 55 | - | // const response = await fetch(`${API_URL}/now/comments/${encodedUri}`); |
|
| 56 | - | ||
| 57 | - | // if (!response.ok) { |
|
| 58 | - | // throw new Error("Failed to fetch comments"); |
|
| 59 | - | // } |
|
| 60 | - | ||
| 61 | - | // const data = await response.json(); |
|
| 62 | - | // setReplies(data.replies || []); |
|
| 63 | - | // } catch (err) { |
|
| 64 | - | // console.error("Error fetching replies:", err); |
|
| 65 | - | // setError(err instanceof Error ? err.message : "Failed to load replies"); |
|
| 66 | - | // } finally { |
|
| 67 | - | // setLoading(false); |
|
| 68 | - | // } |
|
| 69 | - | // }; |
|
| 70 | - | ||
| 71 | - | // const formatDate = (dateString: string) => { |
|
| 72 | - | // const date = new Date(dateString); |
|
| 73 | - | // const now = new Date(); |
|
| 74 | - | // const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000); |
|
| 75 | - | ||
| 76 | - | // if (diffInSeconds < 60) { |
|
| 77 | - | // return `${diffInSeconds}s ago`; |
|
| 78 | - | // } else if (diffInSeconds < 3600) { |
|
| 79 | - | // return `${Math.floor(diffInSeconds / 60)}m ago`; |
|
| 80 | - | // } else if (diffInSeconds < 86400) { |
|
| 81 | - | // return `${Math.floor(diffInSeconds / 3600)}h ago`; |
|
| 82 | - | // } else if (diffInSeconds < 604800) { |
|
| 83 | - | // return `${Math.floor(diffInSeconds / 86400)}d ago`; |
|
| 84 | - | // } else { |
|
| 85 | - | // return date.toLocaleDateString(); |
|
| 86 | - | // } |
|
| 87 | - | // }; |
|
| 88 | - | ||
| 89 | - | // if (loading) { |
|
| 90 | - | // return ( |
|
| 91 | - | // <div className="mt-8"> |
|
| 92 | - | // <h3 className="text-lg font-bold mb-4">Replies</h3> |
|
| 93 | - | // <p className="text-sm text-gray-400">Loading replies...</p> |
|
| 94 | - | // </div> |
|
| 95 | - | // ); |
|
| 96 | - | // } |
|
| 97 | - | ||
| 98 | - | // if (error) { |
|
| 99 | - | // return ( |
|
| 100 | - | // <div className="mt-8"> |
|
| 101 | - | // <h3 className="text-lg font-bold mb-4">Replies</h3> |
|
| 102 | - | // <p className="text-sm text-red-500">{error}</p> |
|
| 103 | - | // </div> |
|
| 104 | - | // ); |
|
| 105 | - | // } |
|
| 106 | - | ||
| 107 | - | // if (replies.length === 0) { |
|
| 108 | - | // return ( |
|
| 109 | - | // <div className="mt-8"> |
|
| 110 | - | // <h3 className="text-lg font-bold mb-4">Replies</h3> |
|
| 111 | - | // <p className="text-sm text-gray-400"> |
|
| 112 | - | // No replies yet. Be the first to reply! |
|
| 113 | - | // </p> |
|
| 114 | - | // </div> |
|
| 115 | - | // ); |
|
| 116 | - | // } |
|
| 117 | - | ||
| 118 | - | // return ( |
|
| 119 | - | // <div className="mt-8"> |
|
| 120 | - | // <h3 className="text-lg font-bold mb-4">Replies</h3> |
|
| 121 | - | // <div className="space-y-6"> |
|
| 122 | - | // {replies.map((reply) => ( |
|
| 123 | - | // <div key={reply.uri}> |
|
| 124 | - | // <div className="flex items-start gap-3"> |
|
| 125 | - | // {reply.author.avatar ? ( |
|
| 126 | - | // <img |
|
| 127 | - | // src={reply.author.avatar} |
|
| 128 | - | // alt={reply.author.handle} |
|
| 129 | - | // className="w-10 h-10 rounded-full" |
|
| 130 | - | // /> |
|
| 131 | - | // ) : ( |
|
| 132 | - | // <div className="w-10 h-10 rounded-full bg-gray-700 flex items-center justify-center"> |
|
| 133 | - | // <span className="text-gray-400 text-sm"> |
|
| 134 | - | // {reply.author.handle.charAt(0).toUpperCase()} |
|
| 135 | - | // </span> |
|
| 136 | - | // </div> |
|
| 137 | - | // )} |
|
| 138 | - | ||
| 139 | - | // <div className="flex-1 min-w-0"> |
|
| 140 | - | // <div className="flex items-center gap-2 flex-wrap"> |
|
| 141 | - | // <span className="font-semibold text-sm"> |
|
| 142 | - | // {reply.author.displayName || reply.author.handle} |
|
| 143 | - | // </span> |
|
| 144 | - | // {reply.author.displayName && ( |
|
| 145 | - | // <a |
|
| 146 | - | // href={`https://pdsls.dev/at://${reply.author.did}`} |
|
| 147 | - | // target="_blank" |
|
| 148 | - | // rel="noopener noreferrer" |
|
| 149 | - | // className="text-xs text-gray-400 hover:text-gray-300" |
|
| 150 | - | // > |
|
| 151 | - | // @{reply.author.handle} |
|
| 152 | - | // </a> |
|
| 153 | - | // )} |
|
| 154 | - | // <a |
|
| 155 | - | // href={`https://pdsls.dev/${reply.uri}`} |
|
| 156 | - | // target="_blank" |
|
| 157 | - | // rel="noopener noreferrer" |
|
| 158 | - | // className="text-xs text-gray-400 hover:text-gray-300" |
|
| 159 | - | // > |
|
| 160 | - | // {formatDate(reply.createdAt)} |
|
| 161 | - | // </a> |
|
| 162 | - | // </div> |
|
| 163 | - | ||
| 164 | - | // <p className="mt-2 text-sm whitespace-pre-wrap break-words"> |
|
| 165 | - | // {reply.content} |
|
| 166 | - | // </p> |
|
| 167 | - | // </div> |
|
| 168 | - | // </div> |
|
| 169 | - | // </div> |
|
| 170 | - | // ))} |
|
| 171 | - | // </div> |
|
| 172 | - | // </div> |
|
| 173 | - | // ); |
|
| 174 | - | // } |
|
| 175 | - | ||
| 176 | - | interface ReplyListProps { |
|
| 177 | - | atUri: string; |
|
| 178 | - | } |
|
| 179 | - | ||
| 180 | - | export function ReplyList({ atUri }: ReplyListProps) { |
|
| 181 | - | return null; |
|
| 182 | - | } |
| 15 | 15 | ||
| 16 | 16 | Needless to say, people didn't like it. |
|
| 17 | 17 | ||
| 18 | - | <ImageCollage client:load images={[ |
|
| 18 | + | <ImageCollage images={[ |
|
| 19 | 19 | '/blog-images/other/friend-2.jpeg', |
|
| 20 | 20 | '/blog-images/other/friend-3.jpeg', |
|
| 21 | 21 | '/blog-images/other/friend-4.jpeg', |
| 1 | 1 | --- |
|
| 2 | 2 | import PageLayout from "@/layouts/Base.astro"; |
|
| 3 | - | import { ReplyContainer } from "@/components/now/ReplyContainer"; |
|
| 3 | + | import GuestReply from "@/components/now/GuestReply.astro"; |
|
| 4 | 4 | import { OWNER_DID, PDS_URL } from "@/data/constants"; |
|
| 5 | 5 | import { createMarkdownRenderer } from "@/utils"; |
|
| 6 | 6 | ||
| 141 | 141 | Share |
|
| 142 | 142 | </button> |
|
| 143 | 143 | </div> |
|
| 144 | - | <ReplyContainer client:load atUri={atUri} postTitle={title} /> |
|
| 144 | + | <GuestReply postTitle={title} /> |
|
| 145 | 145 | </> |
|
| 146 | 146 | )} |
|
| 147 | 147 | </article> |
|