chore: cleaned up unused files 248b84df
Steve · 2026-04-28 07:19 8 file(s) · +23 −246
bun.lock +0 −1
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",
packages/client/package.json +0 −3
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",
packages/client/src/components/now/GuestReply.astro (added) +20 −0
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>
packages/client/src/components/now/GuestReply.tsx (deleted) +0 −29
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 -
}
packages/client/src/components/now/ReplyContainer.tsx (deleted) +0 −28
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 -
}
packages/client/src/components/now/ReplyList.tsx (deleted) +0 −182
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 -
}
packages/client/src/content/post/when-ai-gives-the-ick.mdx +1 −1
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',
packages/client/src/pages/now/[slug].astro +2 −2
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>