Messenger
Messenger
doctype html>
<html lang="en">
<style>
.containers {
margin: 0 50px;
}
.navbar .containers {
display: flex;
justify-content: space-between;
align-items: center;
}
.navbar-logo img {
height: 50px;
}
.navbar-toggle {
background-color: transparent;
border: none;
outline: none;
color: #ecf0f1;
}
.navbar-toggle span {
display: block;
width: 25px;
height: 3px;
background-color: #ecf0f1;
margin: 4px 0;
}
.navbar-menu {
display: flex;
justify-content: space-between;
align-items: center;
}
.navbar-nav {
list-style: none;
display: flex;
padding: 0;
margin: 0;
}
.nav-item {
margin: 15px 0;
text-align: center;
}
.nav-item a {
color: #bdc3c7;
font-size: 16px;
padding: 10px 0;
display: block;
text-decoration: none;
}
.nav-item a:hover {
color: #ecf0f1;
}
.navbar-nav-auth {
display: flex;
}
.navbar-nav-auth .nav-item {
margin-left: 15px;
}
.navbar-fixed-top {
position: fixed;
top: 0;
width: 100%;
z-index: 1000;
transition: background-color 0.3s ease;
}
.navbar-sticky-function {
background-color: #34495e;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
/* Responsive Styles */
@media (max-width: 768px) {
.navbar-menu {
flex-direction: column;
}
.navbar-nav {
flex-direction: column;
}
.navbar-nav-auth {
flex-direction: column;
}
}
</style>
<?php
require '../constants/settings.php';
require 'constants/check-login.php';
if ($user_online == "true") {
if ($myrole == "employee") {
} else {
header("location:../");
}
} else {
header("location:../");
}
if (isset($_GET['page'])) {
$page = $_GET['page'];
if ($page=="" || $page=="1") {
$page1 = 0;
$page = 1;
} else {
$page1 = ($page*10)-10;
}
} else {
$page1 = 0;
$page = 1;
}
?>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<body class="not-transparent-header">
<div class="container-wrapper">
<header id="header">
<nav class="navbar navbar-default navbar-fixed-top navbar-sticky-
function">
<div class="containers">
<div class="navbar-logo">
<a href="./"><img src="../images/logo1.png" alt="Logo1"
/></a>
</div>
<button class="navbar-toggle" aria-label="Toggle navigation">
<span></span>
<span></span>
<span></span>
</button>
<div class="navbar-menu">
<ul class="navbar-nav">
<li class="nav-item"><a
href="../employee/index_applicant.php" style="color: white;">Home</a></li>
<li class="nav-item"><a href="../job-list.php"
style="color: white;" >Job List</a></li>
<li class="nav-item"><a href="../employers.php"
style="color: white;">Employers</a></li>
<li class="nav-item"><a href="../contact.php"
style="color: white;">Contact Us</a></li>
</ul>
<ul class="navbar-nav navbar-nav-auth">
<?php if ($user_online): ?>
<li class="nav-item"><a href="../logout.php"
style="color: white;">Logout</a></li>
<li class="nav-item"><a href="./"style="color:
white;">Profile</a></li>
<?php else: ?>
<li class="nav-item"><a href="login.php"
style="color: white;">Login</a></li>
<li class="nav-item"><a href="#registerModal" data-
toggle="modal" style="color: white;">Register</a></li>
<?php endif; ?>
</ul>
</div>
</div>
</nav>
</header>
<div class="main-wrapper">
<div class="breadcrumb-wrapper">
<div class="containers">
<ol class="breadcrumb-list booking-step">
<li><a href="../">BATCEIS</a></li>
<li><span>Profile</span></li>
</ol>
<!-- Notification bell positioned relative to the breadcrumb --
>
<div id="notification-bell" class="notification-bell">
<i class="fa fa-bell"></i>
<span id="notification-count" class="notification-
count"></span>
</div>
function fetchNotifications() {
fetch('get_notifications.php')
.then(response => response.json())
.then(data => {
const relevantNotifications =
data.filter(notification =>
notification.status === 'HIRED' ||
notification.status === 'NOT HIRED'
);
notificationCount.textContent =
relevantNotifications.length;
notificationContent.innerHTML = '';
relevantNotifications.forEach(notification => {
const notificationItem =
document.createElement('div');
notificationItem.className = 'notification-
item';
notificationItem.textContent = `Job: $
{notification.job_title} - Status: ${notification.status}`;
notificationContent.appendChild(notificationItem);
notificationItem.appendChild(additionalMessage);
bell.addEventListener('click', function() {
dropdown.style.display = dropdown.style.display ===
'none' ? 'block' : 'none';
});
<style>
.breadcrumb-wrapper {
position: relative;
}
.notification-bell {
position: absolute;
top: 10px;
right: 20px;
cursor: pointer;
z-index: 1001;
font-size: 20px;
color: black;
}
.notification-count {
position: absolute;
color: red;
font-size: 15px;
top: -10px;
left: 15px;
}
.notification-dropdown {
display: none;
position: absolute;
top: 30px;
right: 0;
background-color: #1c1f26;
border: 1px solid #ddd;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
padding: 15px;
max-width: 350px;
max-height: 400px;
overflow-y: auto;
z-index: 1000;
}
.notification-item {
padding: 10px 15px;
border-bottom: 1px solid #eee;
display: flex;
align-items: center;
transition: background-color 0.3s;
cursor: pointer;
}
.notification-item:hover {
background-color: #f0f0f0;
}
.notification-item:last-child {
border-bottom: none;
}
.additional-message {
display: none;
padding: 10px 15px;
background-color: #1c1f26;
border-left: 4px solid #007bff;
margin-top: 5px;
font-size: 14px;
color: #f0f0f0;
}
</style>
<div class="admin-container-wrapper">
<div class="containers">
<div class="GridLex-gap-15-wrappper">
<div class="GridLex-grid-noGutter-equalHeight">
<div class="GridLex-col-3_sm-4_xs-12">
<div class="admin-sidebar">
<div class="admin-user-item">
<div class="image">
<?php
if ($myavatar == null) {
print '<center><img class="img-circle
autofit2" src="../images/default.jpg" title="'.$myfname.'" alt="image"
/></center>';
}else{
echo '<center><img class="img-circle
autofit2" alt="image" title="'.$myfname.'"
src="data:image/jpeg;base64,'.base64_encode($myavatar).'"/></center>';
}
?>
</div>
<br>
<div class="GridLex-col-9_sm-8_xs-12">
<div class="admin-content-wrapper">
<div class="admin-section-title">
<h2>Messenger</h2>
</div>
<div class="resume-list-wrapper">
<?php require
'constants/check_reply.php'; ?>
<div class="GridLex-grid">
<!-- Job Listings Column -->
<div class="GridLex-col-5_xs-12">
<div class="recent-job-wrapper"
id="job-list">
<?php
require
'../constants/db_config.php';
try {
$conn = new
PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn-
>setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn-
>prepare("SELECT * FROM tbl_job_applications WHERE member_no = :myid ORDER BY id
DESC LIMIT :page1, 10");
$stmt->bindParam(':myid',
$myid, PDO::PARAM_STR);
$stmt->bindParam(':page1',
$page1, PDO::PARAM_INT);
$stmt->execute();
$result = $stmt-
>fetchAll();
foreach($result as $row) {
$job_id =
$row['job_id'];
$application_status =
$row['status'];
$stmtb = $conn-
>prepare("SELECT * FROM tbl_jobs WHERE job_id = :job_id");
$stmtb-
>bindParam(':job_id', $job_id, PDO::PARAM_STR);
$stmtb->execute();
$resultb = $stmtb-
>fetchAll();
foreach($resultb as
$rowb) {
$job_title =
$rowb['title'];
$jobcountry =
$rowb['country'];
$jobtype =
$rowb['type'];
$compid =
$rowb['company'];
$stmtc = $conn-
>prepare("SELECT * FROM tbl_users WHERE member_no = :compid AND role =
'employer'");
$stmtc-
>bindParam(':compid', $compid, PDO::PARAM_STR);
$stmtc->execute();
$resultc = $stmtc-
>fetchAll();
foreach ($resultc
as $rowc) {
$compname =
$rowc['first_name'];
$complogo =
$rowc['avatar'];
}
?>
<a
href="javascript:void(0);" class="recent-job-item clearfix"
onclick="showMessenger('<?php echo htmlspecialchars($job_id); ?>', '<?php echo
htmlspecialchars($compid); ?>')">
<div
class="GridLex-grid-middle">
<div
class="GridLex-col-5_xs-10">
<div
class="job-position">
<div class="image">
<?php
if ($complogo == null) {
} else {
}
?>
</div>
<div class="content">
</div>
</div>
</div>
</div>
</a>
<?php
}
}
} catch(PDOException $e) {
echo "Error: " . $e-
>getMessage();
}
?>
</div>
</div>
<style>
.messenger-container {
display: flex;
flex-direction: column;
height: 500px;
background: #ffffff;
border-radius: 10px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
overflow: hidden;
}
.chat-header {
padding: 15px;
background-color: #f1f1f1;
border-bottom: 1px solid #ddd;
}
.message-list {
flex-grow: 1;
overflow-y: auto;
display: flex;
flex-direction: column-reverse;
padding: 15px;
}
.message {
display: flex;
align-items: flex-start;
margin-bottom: 15px;
}
.message.sent {
flex-direction: row-reverse;
}
.message .avatar {
width: 40px;
height: 40px;
border-radius: 50%;
margin-right: 10px;
margin-left: 10px;
}
.message .content {
max-width: 70%;
padding: 10px;
border-radius: 18px;
font-size: 14px;
line-height: 1.4;
}
.message.sent .content {
background-color: #007bff;
color: white;
}
.message.received .content {
background-color: #f1f1f1;
color: #333;
}
.message .time {
font-size: 12px;
color: #888;
margin-top: 5px;
}
.message-input {
display: flex;
padding: 15px;
border-top: 1px solid #ddd;
}
.message-input input {
flex-grow: 1;
padding: 10px;
border: 1px solid #ddd;
border-radius: 20px;
margin-right: 10px;
}
.message-input button {
padding: 10px 15px;
background-color: #007bff;
color: white;
border: none;
border-radius: 20px;
cursor: pointer;
}
.message-input button:hover {
background-color: #0056b3;
}
.containers {
margin: 0 50px;
}
<script>
// Initialize lastMessageTimestamps globally to store the timestamps for each
job/company pair
let lastMessageTimestamps = {};
$.ajax({
url: 'fetch_messages.php',
type: 'POST',
data: { job_id: jobId, compid: compid, last_timestamp: lastTimestamp },
dataType: 'json',
success: function(response) {
if (response.status === 'success') {
const chatBox = $('#message-list');
response.messages.forEach(message => {
const messageClass = message.sender_id == response.myid ?
'sent' : 'received';
chatBox.append(`
<div class="message ${messageClass}">
<p>${escapeHtml(message.message)}</p>
<span class="time">$
{escapeHtml(message.timestamp)}</span>
</div>
`);
$('#message-list').prepend(`
<div class="message ${messageClass}">
<img src="${avatarUrl}" alt="Avatar"
class="avatar">
<div class="content">
<p>${escapeHtml(newMessage.message)}</p>
<span class="time">$
{escapeHtml(newMessage.timestamp)}</span>
</div>
</div>
`);
</div>
</div>
</div>
</div>
<footer class="footer-wrapper">
<div class="main-footer">
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-9">
<div class="row">
<div class="col-sm-6 col-md-4">
<div class="footer-about-us">
<h5 class="footer-title">About
BATCEIS</h5>
<p>BATCEIS is an online job portal that
connects job seekers with employers. Our mission is to help people find jobs and
help employers find the right talent.</p>
</div>
</div>
<div class="col-sm-6 col-md-5 mt-30-xs">
<h5 class="footer-title">Quick Links</h5>
<ul class="footer-menu clearfix">
<li><a href="../">Home</a></li>
<li><a href="../job-list.php">Job
List</a></li>
<li><a
href="../employers.php">Employers</a></li>
<li><a
href="../employees.php">Employees</a></li>
<li><a href="../contact.php">Contact
Us</a></li>
<li><a href="#">Go to top</a></li>
</ul>
</div>
</div>
</div>
<div class="col-sm-12 col-md-3 mt-30-sm">
<h5 class="footer-title">BATCEIS Contact</h5>
<p>Address : Balete, Batangas</p>
<p>Email : <a
href="mailto:[email protected]">[email protected]</a></p>
<p>Phone : <a href="tel:
+639999999999">+639999999999</a></p>
</div>
</div>
</div>
</div>
<div class="bottom-footer">
<div class="container">
<div class="row">
<div class="col-sm-4 col-md-4">
<p class="copy-right">© Copyright <?php echo
date('Y'); ?> BATCEIS</p>
</div>
<div class="col-sm-4 col-md-4">
<ul class="bottom-footer-menu">
<li><a >Developed by Bossing</a></li>
</ul>
</div>
<div class="col-sm-4 col-md-4">
<ul class="bottom-footer-menu for-social">
<li><a href="<?php echo "$tw"; ?>"><i class="ri
ri-twitter" data-toggle="tooltip" data-placement="top"
title="twitter"></i></a></li>
<li><a href="<?php echo "$fb"; ?>"><i class="ri
ri-facebook" data-toggle="tooltip" data-placement="top"
title="facebook"></i></a></li>
<li><a href="<?php echo "$ig"; ?>"><i class="ri
ri-instagram" data-toggle="tooltip" data-placement="top"
title="instagram"></i></a></li>
</ul>
</div>
</div>
</div>
</div>
</footer>
</div>
</div>
<div id="back-to-top">
<a href="#"><i class="ion-ios-arrow-up"></i></a>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const navbarToggle = document.querySelector('.navbar-toggle');
const navbarMenu = document.querySelector('.navbar-menu');
navbarToggle.addEventListener('click', function() {
navbarMenu.classList.toggle('active');
});
});
</script>
</body>
</html>