diff --git a/posts/pinned.json b/posts/pinned.json new file mode 100644 index 0000000..32960f8 --- /dev/null +++ b/posts/pinned.json @@ -0,0 +1,2 @@ +[ +] \ No newline at end of file diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index 7592ffb..5a69534 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -61,6 +61,7 @@ export default function AdminPage() { } return []; }); + const [pinFeedback, setPinFeedback] = useState(null); const router = useRouter(); useEffect(() => { @@ -300,14 +301,45 @@ export default function AdminPage() { } }; - const handlePin = (slug: string) => { - setPinned((prev) => - prev.includes(slug) ? prev.filter((s) => s !== slug) : [slug, ...prev] - ); + const handlePin = async (slug: string) => { + setPinned((prev) => { + const newPinned = prev.includes(slug) + ? prev.filter((s) => s !== slug) + : [slug, ...prev]; + // Update pinned.json on the server + fetch('/api/admin/posts', { + method: 'PATCH', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ pinned: newPinned }), + }) + .then((res) => { + if (!res.ok) { + res.json().then((data) => { + setPinFeedback(data.error || 'Failed to update pinned posts'); + }); + } else { + setPinFeedback( + newPinned.includes(slug) + ? 'Post pinned!' + : 'Post unpinned!' + ); + setTimeout(() => setPinFeedback(null), 2000); + } + }) + .catch((err) => { + setPinFeedback('Failed to update pinned posts'); + }); + return newPinned; + }); }; return (
+ {pinFeedback && ( +
+ {pinFeedback} +
+ )} {!isAuthenticated ? (

Admin Login

@@ -598,10 +630,15 @@ export default function AdminPage() { key={post.slug} className={`border rounded-lg p-3 flex items-center gap-3 justify-between ${pinned.includes(post.slug) ? 'bg-yellow-100 border-yellow-400' : ''}`} > -
-
{post.title}
-
{post.date}
-
{post.summary}
+
+ {pinned.includes(post.slug) && ( + 📌 + )} +
+
{post.title}
+
{post.date}
+
{post.summary}
+