|
document.addEventListener("DOMContentLoaded", async () => {
|
|
|
|
const auth = firebase.auth();
|
|
const db = firebase.firestore();
|
|
|
|
|
|
const activityTab = document.getElementById("activity-tab");
|
|
const searchCountElement = activityTab.querySelector(".stat-value");
|
|
const timelineContainer = activityTab.querySelector(".timeline");
|
|
|
|
|
|
function getRelativeTimeString(timestamp) {
|
|
const now = new Date();
|
|
const searchTime = timestamp.toDate();
|
|
const diffInMs = now - searchTime;
|
|
const diffInDays = Math.floor(diffInMs / (1000 * 60 * 60 * 24));
|
|
|
|
if (diffInDays === 0) {
|
|
const diffInHours = Math.floor(diffInMs / (1000 * 60 * 60));
|
|
if (diffInHours === 0) {
|
|
const diffInMinutes = Math.floor(diffInMs / (1000 * 60));
|
|
return diffInMinutes === 1 ? "1 minute ago" : `${diffInMinutes} minutes ago`;
|
|
}
|
|
return diffInHours === 1 ? "1 hour ago" : `${diffInHours} hours ago`;
|
|
} else if (diffInDays === 1) {
|
|
return "Yesterday";
|
|
} else if (diffInDays < 7) {
|
|
return `${diffInDays} days ago`;
|
|
} else if (diffInDays < 30) {
|
|
const diffInWeeks = Math.floor(diffInDays / 7);
|
|
return diffInWeeks === 1 ? "1 week ago" : `${diffInWeeks} weeks ago`;
|
|
} else {
|
|
return searchTime.toLocaleDateString();
|
|
}
|
|
}
|
|
|
|
|
|
function createTimelineItem(activity) {
|
|
const timelineItem = document.createElement("div");
|
|
timelineItem.className = "timeline-item";
|
|
|
|
const timelineDot = document.createElement("div");
|
|
timelineDot.className = "timeline-dot";
|
|
|
|
const timelineContent = document.createElement("div");
|
|
timelineContent.className = "timeline-content";
|
|
|
|
const title = document.createElement("h4");
|
|
title.textContent = activity.type === "search" ? activity.query : activity.title;
|
|
|
|
const description = document.createElement("p");
|
|
if (activity.type === "search") {
|
|
description.textContent = `You searched for "${activity.query}"`;
|
|
} else if (activity.type === "save") {
|
|
description.textContent = `You saved "${activity.title}"`;
|
|
} else if (activity.type === "profile") {
|
|
description.textContent = "You updated your profile information";
|
|
}
|
|
|
|
const timelineDate = document.createElement("span");
|
|
timelineDate.className = "timeline-date";
|
|
|
|
const clockIcon = document.createElement("i");
|
|
clockIcon.className = "fas fa-clock";
|
|
|
|
timelineDate.appendChild(clockIcon);
|
|
timelineDate.append(` ${getRelativeTimeString(activity.timestamp)}`);
|
|
|
|
timelineContent.appendChild(title);
|
|
timelineContent.appendChild(description);
|
|
timelineContent.appendChild(timelineDate);
|
|
|
|
timelineItem.appendChild(timelineDot);
|
|
timelineItem.appendChild(timelineContent);
|
|
|
|
return timelineItem;
|
|
}
|
|
|
|
|
|
async function loadUserActivity() {
|
|
const user = auth.currentUser;
|
|
if (!user) return;
|
|
|
|
try {
|
|
|
|
const activitiesSnapshot = await db.collection("users")
|
|
.doc(user.uid)
|
|
.collection("activities")
|
|
.orderBy("timestamp", "desc")
|
|
.limit(10)
|
|
.get();
|
|
|
|
|
|
timelineContainer.innerHTML = "";
|
|
|
|
|
|
let searchCount = 0;
|
|
|
|
if (!activitiesSnapshot.empty) {
|
|
activitiesSnapshot.forEach(doc => {
|
|
const activity = doc.data();
|
|
|
|
|
|
if (activity.type === "search") {
|
|
searchCount++;
|
|
}
|
|
|
|
|
|
const timelineItem = createTimelineItem(activity);
|
|
timelineContainer.appendChild(timelineItem);
|
|
});
|
|
|
|
|
|
searchCountElement.textContent = searchCount;
|
|
} else {
|
|
|
|
searchCountElement.textContent = "0";
|
|
|
|
|
|
const noActivitiesMessage = document.createElement("div");
|
|
noActivitiesMessage.className = "empty-state";
|
|
noActivitiesMessage.innerHTML = `
|
|
<i class="fas fa-history"></i>
|
|
<p>No activity history found. Your recent searches and actions will appear here.</p>
|
|
`;
|
|
timelineContainer.appendChild(noActivitiesMessage);
|
|
}
|
|
} catch (error) {
|
|
console.error("Error loading user activity:", error);
|
|
timelineContainer.innerHTML = `<div class="error-message">Failed to load activity history.</div>`;
|
|
}
|
|
}
|
|
|
|
|
|
window.saveSearchActivity = async (query) => {
|
|
const user = auth.currentUser;
|
|
if (!user || !query) return;
|
|
|
|
try {
|
|
|
|
const activity = {
|
|
type: "search",
|
|
query: query,
|
|
timestamp: firebase.firestore.FieldValue.serverTimestamp()
|
|
};
|
|
|
|
|
|
await db.collection("users")
|
|
.doc(user.uid)
|
|
.collection("activities")
|
|
.add(activity);
|
|
|
|
console.log("Search activity saved successfully");
|
|
} catch (error) {
|
|
console.error("Error saving search activity:", error);
|
|
}
|
|
};
|
|
|
|
|
|
window.saveProfileUpdateActivity = async () => {
|
|
const user = auth.currentUser;
|
|
if (!user) return;
|
|
|
|
try {
|
|
|
|
const activity = {
|
|
type: "profile",
|
|
title: "Profile Updated",
|
|
timestamp: firebase.firestore.FieldValue.serverTimestamp()
|
|
};
|
|
|
|
|
|
await db.collection("users")
|
|
.doc(user.uid)
|
|
.collection("activities")
|
|
.add(activity);
|
|
|
|
console.log("Profile update activity saved successfully");
|
|
} catch (error) {
|
|
console.error("Error saving profile update activity:", error);
|
|
}
|
|
};
|
|
|
|
|
|
window.saveArticleActivity = async (title, articleId) => {
|
|
const user = auth.currentUser;
|
|
if (!user || !title) return;
|
|
|
|
try {
|
|
|
|
const activity = {
|
|
type: "save",
|
|
title: title,
|
|
articleId: articleId || null,
|
|
timestamp: firebase.firestore.FieldValue.serverTimestamp()
|
|
};
|
|
|
|
|
|
await db.collection("users")
|
|
.doc(user.uid)
|
|
.collection("activities")
|
|
.add(activity);
|
|
|
|
console.log("Article save activity recorded successfully");
|
|
} catch (error) {
|
|
console.error("Error saving article activity:", error);
|
|
}
|
|
};
|
|
|
|
|
|
const activityTabBtn = document.querySelector('[data-tab="activity"]');
|
|
if (activityTabBtn) {
|
|
activityTabBtn.addEventListener("click", loadUserActivity);
|
|
}
|
|
|
|
|
|
const saveBtn = document.getElementById("saveBtn");
|
|
const originalClickHandler = saveBtn.onclick;
|
|
|
|
saveBtn.addEventListener("click", async () => {
|
|
|
|
if (typeof originalClickHandler === "function") {
|
|
originalClickHandler();
|
|
}
|
|
|
|
|
|
await saveProfileUpdateActivity();
|
|
});
|
|
|
|
|
|
|
|
const searchForm = document.getElementById("searchForm");
|
|
if (searchForm) {
|
|
searchForm.addEventListener("submit", (e) => {
|
|
const searchInput = searchForm.querySelector("input[type=search]");
|
|
if (searchInput && searchInput.value.trim()) {
|
|
saveSearchActivity(searchInput.value.trim());
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
auth.onAuthStateChanged(user => {
|
|
if (user && activityTab.classList.contains("active")) {
|
|
loadUserActivity();
|
|
}
|
|
});
|
|
});
|
|
|
|
|
|
|
|
|