import {
getSessionUser
} from "./api/auth.js"
import {
maybeFollowUser
} from "./api/profile.js"
import app from "./app.js"
import store from "./store.js"
var $ = Dom7
var notificationsStore = store.getters.getNotifications
var refreshed = false
$(document).on(\'page:afterin\', \'.page[data-name="notifications"]\', async function (e) {
const data = notificationsStore.value
if (!data || !data.success) {
return
}
// a list if all unread notification ids
const unreadNotificationIds = [
...data.data.recent,
...data.data.last_week,
...data.data.last_30_days,
].filter((item) => item.is_read === "0").map((item) => item._id);
if (unreadNotificationIds.length > 0) {
store.dispatch(\'markNotificationsAsRead\', unreadNotificationIds)
}
})
notificationsStore.onUpdated(async (data) => {
if (!data || !data.success) {
$(\'.notification-wrap\').html(\'<p class="text-center">No notifications</p>\')
return
}
const notifications = data.data
const recentContainer = document.getElementById(\'recent\');
const thisWeekContainer = document.getElementById(\'this-week\');
if (refreshed) {
recentContainer.innerHTML = \'\';
thisWeekContainer.innerHTML = \'\';
refreshed = false
}
document.querySelectorAll(\'.app-notification-title\').forEach(elem => {
elem.innerHTML = elem.getAttribute(\'data-title\')
})
var user = await getSessionUser()
if (!notifications.recent.length) {
recentContainer.innerHTML = \'<p class="text-center">No recent notifications</p>\';
}
if (!notifications.last_week.length) {
thisWeekContainer.innerHTML = \'<p class="text-center">No notifications from this week</p>\';
}
notifications.recent.forEach(notification => {
const notificationItem = createNotificationItem(notification, user);
recentContainer.appendChild(notificationItem);
});
notifications.last_week.forEach(notification => {
const notificationItem = createNotificationItem(notification, user);
thisWeekContainer.appendChild(notificationItem);
});
})
function timeAgo(dateString) {
const now = new Date();
const past = new Date(dateString);
const diffInHours = Math.floor((now - past) / (1000 * 60 * 60));
return diffInHours > 24 ? `${Math.floor(diffInHours / 24)}d ago` : `${diffInHours}h ago`;
}
function createNotificationItem(notification, user) {
const isFollow = notification.type === \'follow\' ? true : false;
const container = document.createElement(isFollow ? \'div\' : \'a\');
if (!isFollow) {
container.href = `/post-view/${notification.entity.entity_id}`;
}
let isReadClass = notification.is_read == "0" ? "unread-notif" : "";
container.className = `notification-item ${isReadClass}`;
container.dataset.notificationId = notification._id;
// Profile image and notification content container
const leftContainer = document.createElement(\'div\');
leftContainer.className = \'notification-left\';
const imageDiv = document.createElement(\'a\');
imageDiv.className = \'image-square image-rounded\';
imageDiv.style.backgroundImage = `url(\'${notification.entity.initiator_data.profile_image || \'assets/img/profile-placeholder.jpg\'}\')`;
imageDiv.href = `/profile-view/${notification.entity.user_id}`;
const infoDiv = document.createElement(\'div\');
infoDiv.className = \'notification-info\';
let content = \'\';
// Conditional content rendering based on the type
if (notification.type === \'like\') {
content = `
<div class="notification-text">
<a href="/profile-view/${notification.entity.user_id}"><strong>${notification.entity.initiator_data.display_name}</strong></a> liked your ${notification.entity.entity_type}
${notification.entity.entity_data.comment ? `<span class="inline font-semibold text-black">: "${notification.entity.entity_data.comment}"</span>` : \'\'}
<span class=""></span>
</div>
`;
} else if (notification.type === \'comment\') {
const eclipseComment = notification.entity.entity_data.comment.length > 50 ? notification.entity.entity_data.comment.substring(0, 50) + \'...\' : notification.entity.entity_data.comment;
container.href = `/post-view/${notification.entity.entity_data.post_id}?commentId=${notification.entity.entity_id}`;
content = `
<div class="notification-text">
<a href="/profile-view/${notification.entity.user_id}"><strong>${notification.entity.initiator_data.display_name}</strong></a> commented on your post:
<span class="font-semibold text-black">"${eclipseComment}"</span>
<span class="${isReadClass}"></span>
</div>
`;
} else if (notification.type === \'follow\') {
content = `
<div class="notification-text">
<a href="/profile-view/${notification.entity.user_id}"><strong>${notification.entity.initiator_data.display_name}</strong></a> followed you
<span class="${isReadClass}"></span>
</div>
`;
} else if (notification.type === \'mention\') {
content = `
<div class="notification-text">
<a href="/profile-view/${notification.entity.user_id}"><strong>${notification.entity.initiator_data.display_name}</strong></a> mentioned you in a ${notification.entity.entity_type}
${notification.entity.entity_data.comment ? `<span class="block font-semibold text-black">"${notification.entity.entity_data.comment}"</span>` : \'\'}
<span class="${isReadClass}"></span>
</div>
`;
} else if (notification.type === \'post\') {
content = `
<div class="notification-text">
<a href="/profile-view/${notification.entity.user_id}"><strong>${notification.entity.initiator_data.display_name}</strong></a> has posted ${notification.entity.entity_type === \'car\' ? "your car" : "a post"}
<a href="/profile/garage/${notification.entity.entity_data?.garage?.id}" class="font-semibold hover:cursor-pointer hover:text-customblue">
${notification.entity.entity_data?.garage?.make || \'\'} ${notification.entity.entity_data?.garage?.model || \'\'}
</a>
<span class="${isReadClass}"></span>
</div>
`;
} else if (notification.type === \'tag\') {
content = `
<div class="notification-text">
<a href="/profile-view/${notification.entity.user_id}"><strong>${notification.entity.initiator_data.display_name}</strong></a> ${notification.entity.entity_type === \'car\' ? "tagged your car in a post" : "tagged you in a post"}
<span class="${isReadClass}"></span>
</div>
`;
}
// Add time ago
const timeSpan = document.createElement(\'span\');
timeSpan.className = \'notification-time\';
timeSpan.textContent = timeAgo(notification.date);
infoDiv.innerHTML = `${content} ${timeSpan.outerHTML}`;
// Adding profile image and content to the left container
leftContainer.appendChild(imageDiv);
leftContainer.appendChild(infoDiv);
// Append left container to the main container
container.appendChild(leftContainer);
if (notification.type === \'follow\') {
const isFollowing = user.following.includes(notification.entity.user_id);
let followBtn = `<div class="btn btn-primary btn-sm toggle-follow" data-is-following="${isFollowing}" data-user-id="${notification.entity.user_id}">
${isFollowing ? \'Unfollow\' : \'Follow\'}
</div>`;
container.innerHTML += followBtn;
} else {
const rightContainer = document.createElement(\'a\');
rightContainer.className = \'notification-left\';
let path;
if (notification.entity.entity_type === \'car\') {
path = \'car\';
rightContainer.href = `/${path}/${notification.entity.entity_id}`;
} else if (notification.entity.entity_type === \'post\') {
path = \'post-view\';
rightContainer.href = `/${path}/${notification.entity.entity_id}`;
} else if (notification.entity.entity_type === \'comment\') {
path = \'post-view\';
rightContainer.href = `/${path}/${notification.entity.entity_data.post_id}?commentId=${notification.entity.entity_id}`;
} else {
path = \'profile-view\';
rightContainer.href = `/${path}/${notification.entity.user_id}`;
}
const imageDiv = document.createElement(\'div\');
imageDiv.className = \'image-square image-rounded\';
imageDiv.style.backgroundImage = `url(\'${notification.entity.entity_data.media}\')`;
imageDiv.style.backgroundSize = \'cover\';
imageDiv.style.backgroundPosition = \'center\';
imageDiv.style.backgroundColor = \'#f1f1f1\';
rightContainer.appendChild(imageDiv);
container.appendChild(rightContainer)
}
return container;
}
$(document).on(\'click\', \'.toggle-follow\', async function (e) {
const userId = e.target.dataset.userId;
const isFollowing = e.target.dataset.isFollowing === \'true\';
// update the button text
e.target.textContent = isFollowing ? \'Follow\' : \'Unfollow\';
e.target.dataset.isFollowing = !isFollowing;
await maybeFollowUser(userId);
store.dispatch(\'updateUserDetails\')
});
$(document).on(\'ptr:refresh\', \'.notification-page.ptr-content\', async function (e) {
refreshed = true
try {
await store.dispatch(\'notificationCount\')
await store.dispatch(\'fetchNotifications\')
} catch (error) {
console.log(error);
}
app.ptr.get(\'.notification-page.ptr-content\').done()
})