30012026-01 VDS aktarım Batuhan

This commit is contained in:
M. Batuhan Erkek
2026-01-30 00:53:50 +03:00
commit d00a5fac34
6 changed files with 1109 additions and 0 deletions

194
admin.js Normal file
View File

@@ -0,0 +1,194 @@
import { initializeApp } from "https://www.gstatic.com/firebasejs/12.8.0/firebase-app.js";
import { getAnalytics } from "https://www.gstatic.com/firebasejs/12.8.0/firebase-analytics.js";
import {
getAuth,
onAuthStateChanged,
signInWithEmailAndPassword,
signOut,
} from "https://www.gstatic.com/firebasejs/12.8.0/firebase-auth.js";
import {
addDoc,
collection,
deleteDoc,
doc,
getFirestore,
onSnapshot,
orderBy,
query,
serverTimestamp,
} from "https://www.gstatic.com/firebasejs/12.8.0/firebase-firestore.js";
const firebaseConfig = {
apiKey: "AIzaSyAdLH7HMwCMZ4lThoWGEiI5TEjfvBMXem8",
authDomain: "batuhanerkeksite.firebaseapp.com",
projectId: "batuhanerkeksite",
storageBucket: "batuhanerkeksite.firebasestorage.app",
messagingSenderId: "439489523058",
appId: "1:439489523058:web:ce15dc3127f1ce03a8c1eb",
measurementId: "G-FC46PNZJHX",
};
const app = initializeApp(firebaseConfig);
try {
getAnalytics(app);
} catch {
// Analytics optional in local/dev environments.
}
const auth = getAuth(app);
const db = getFirestore(app);
const loginCard = document.getElementById("login-card");
const adminPanel = document.getElementById("admin-panel");
const loginForm = document.getElementById("login-form");
const blogForm = document.getElementById("blog-form");
const postsList = document.getElementById("posts-list");
const logoutBtn = document.getElementById("logout-btn");
const tagsInput = document.getElementById("tags-input");
const tagsList = document.getElementById("tags-list");
let currentTags = [];
const postsRef = collection(db, "posts");
const renderPosts = (posts) => {
postsList.innerHTML = "";
if (!posts.length) {
const empty = document.createElement("div");
empty.className = "post-item";
empty.textContent = "Henüz blog yazısı yok.";
postsList.appendChild(empty);
return;
}
posts.forEach((post) => {
const wrapper = document.createElement("div");
wrapper.className = "post-item";
const title = document.createElement("h3");
title.textContent = post.title;
const meta = document.createElement("div");
meta.className = "post-meta";
const tagsLabel = post.tags?.length ? post.tags.join(", ") : "Etiket yok";
meta.textContent = `${post.date || "-"} · ${tagsLabel}`;
const summary = document.createElement("p");
summary.textContent = post.summary;
const actions = document.createElement("div");
actions.className = "post-actions";
const removeBtn = document.createElement("button");
removeBtn.className = "ghost";
removeBtn.type = "button";
removeBtn.textContent = "Sil";
removeBtn.addEventListener("click", () => {
deleteDoc(doc(db, "posts", post.id));
});
actions.appendChild(removeBtn);
wrapper.append(title, meta, summary, actions);
postsList.appendChild(wrapper);
});
};
const setAuthState = (isLoggedIn) => {
loginCard.classList.toggle("hidden", isLoggedIn);
adminPanel.classList.toggle("hidden", !isLoggedIn);
};
const renderTags = () => {
tagsList.innerHTML = "";
if (!currentTags.length) return;
currentTags.forEach((tag, index) => {
const chip = document.createElement("span");
chip.className = "tag";
chip.textContent = tag;
const removeBtn = document.createElement("button");
removeBtn.type = "button";
removeBtn.setAttribute("aria-label", `${tag} etiketini kaldır`);
removeBtn.textContent = "×";
removeBtn.addEventListener("click", () => {
currentTags = currentTags.filter((_, i) => i !== index);
renderTags();
});
chip.appendChild(removeBtn);
tagsList.appendChild(chip);
});
};
const addTag = (rawValue) => {
const value = rawValue.trim();
if (!value) return;
if (currentTags.includes(value)) return;
currentTags = [...currentTags, value];
renderTags();
};
tagsInput.addEventListener("keydown", (event) => {
if (event.key === "Enter") {
event.preventDefault();
addTag(tagsInput.value);
tagsInput.value = "";
}
});
loginForm.addEventListener("submit", (event) => {
event.preventDefault();
const formData = new FormData(loginForm);
const email = formData.get("email");
const password = formData.get("password");
signInWithEmailAndPassword(auth, email, password)
.then(() => {
loginForm.reset();
})
.catch(() => {
alert("Giriş başarısız. E-posta veya şifre hatalı.");
});
});
logoutBtn.addEventListener("click", () => {
signOut(auth);
});
blogForm.addEventListener("submit", (event) => {
event.preventDefault();
const formData = new FormData(blogForm);
const newPost = {
title: formData.get("title").trim(),
tags: currentTags,
summary: formData.get("summary").trim(),
content: formData.get("content").trim(),
date: formData.get("date"),
image: formData.get("image").trim(),
createdAt: serverTimestamp(),
};
addDoc(postsRef, newPost)
.then(() => {
blogForm.reset();
currentTags = [];
renderTags();
})
.catch(() => {
alert("Yazı kaydedilemedi. Tekrar deneyin.");
});
});
onAuthStateChanged(auth, (user) => {
setAuthState(!!user);
});
const postsQuery = query(postsRef, orderBy("createdAt", "desc"));
onSnapshot(postsQuery, (snapshot) => {
const posts = snapshot.docs.map((docSnap) => ({
id: docSnap.id,
...docSnap.data(),
}));
renderPosts(posts);
});