This commit is contained in:
rattatwinko
2025-06-17 12:54:43 +02:00
parent 93b879d69e
commit df97fe59bb
3 changed files with 12 additions and 8 deletions

View File

@@ -1,2 +1,3 @@
[ [
"welcome"
] ]

View File

@@ -70,6 +70,8 @@ export default function AdminPage() {
if (auth === 'true') { if (auth === 'true') {
setIsAuthenticated(true); setIsAuthenticated(true);
loadContent(); loadContent();
const interval = setInterval(loadContent, 500);
return () => clearInterval(interval);
} }
}, []); }, []);
@@ -101,6 +103,7 @@ export default function AdminPage() {
const handleLogout = () => { const handleLogout = () => {
setIsAuthenticated(false); setIsAuthenticated(false);
localStorage.removeItem('adminAuth'); localStorage.removeItem('adminAuth');
router.push('/');
}; };
const handleCreatePost = async (e: React.FormEvent) => { const handleCreatePost = async (e: React.FormEvent) => {
@@ -315,19 +318,19 @@ export default function AdminPage() {
.then((res) => { .then((res) => {
if (!res.ok) { if (!res.ok) {
res.json().then((data) => { res.json().then((data) => {
setPinFeedback(data.error || 'Failed to update pinned posts'); setPinFeedback(data.error || 'Fehler beim Aktualisieren der angehefteten Beiträge');
}); });
} else { } else {
setPinFeedback( setPinFeedback(
newPinned.includes(slug) newPinned.includes(slug)
? 'Post pinned!' ? 'Beitrag angeheftet!'
: 'Post unpinned!' : 'Beitrag gelöst!'
); );
setTimeout(() => setPinFeedback(null), 2000); setTimeout(() => setPinFeedback(null), 2000);
} }
}) })
.catch((err) => { .catch((err) => {
setPinFeedback('Failed to update pinned posts'); setPinFeedback('Fehler beim Aktualisieren der angehefteten Beiträge');
}); });
return newPinned; return newPinned;
}); });
@@ -559,7 +562,7 @@ export default function AdminPage() {
return [...pinnedPosts, ...unpinnedPosts].map((post) => ( return [...pinnedPosts, ...unpinnedPosts].map((post) => (
<div key={post.slug} className="border rounded-lg p-4 relative"> <div key={post.slug} className="border rounded-lg p-4 relative">
{post.pinned && ( {post.pinned && (
<span title="Pinned" className="absolute top-2 right-2 text-2xl">📌</span> <span title="Angeheftet" className="absolute top-2 right-2 text-2xl">📌</span>
)} )}
<h3 className="text-xl font-semibold">{post.title}</h3> <h3 className="text-xl font-semibold">{post.title}</h3>
<p className="text-gray-600">{post.date}</p> <p className="text-gray-600">{post.date}</p>
@@ -632,7 +635,7 @@ export default function AdminPage() {
> >
<div className="flex-1 text-left flex items-center gap-2"> <div className="flex-1 text-left flex items-center gap-2">
{pinned.includes(post.slug) && ( {pinned.includes(post.slug) && (
<span title="Pinned" className="text-xl">📌</span> <span title="Angeheftet" className="text-xl">📌</span>
)} )}
<div> <div>
<div className="font-semibold">{post.title}</div> <div className="font-semibold">{post.title}</div>
@@ -643,7 +646,7 @@ export default function AdminPage() {
<button <button
onClick={() => handlePin(post.slug)} onClick={() => handlePin(post.slug)}
className={`text-2xl focus:outline-none ${pinned.includes(post.slug) ? 'text-yellow-500' : 'text-gray-400 hover:text-yellow-500'}`} className={`text-2xl focus:outline-none ${pinned.includes(post.slug) ? 'text-yellow-500' : 'text-gray-400 hover:text-yellow-500'}`}
title={pinned.includes(post.slug) ? 'Unpin' : 'Pin'} title={pinned.includes(post.slug) ? 'Lösen' : 'Anheften'}
> >
{pinned.includes(post.slug) ? '★' : '☆'} {pinned.includes(post.slug) ? '★' : '☆'}
</button> </button>

View File

@@ -31,7 +31,7 @@ export default function Home() {
useEffect(() => { useEffect(() => {
loadTree(); loadTree();
const interval = setInterval(loadTree, 2000); const interval = setInterval(loadTree, 500);
return () => clearInterval(interval); return () => clearInterval(interval);
}, []); }, []);