#frontend …login.html… <!DOCTYPE html>
…index.html… <!DOCTYPE html>
#backend. …login.js… // DOM elements const loginForm = document.getElementById(‘loginForm’); const signupForm = document.getElementById(‘signupForm’); const switchToSignup = document.getElementById(‘switchToSignup’); const switchToLogin = document.getElementById(‘switchToLogin’); const fbLogin = document.getElementById(‘fbLogin’); const forgotPassword = document.getElementById(‘forgotPassword’);
// Event listeners loginForm.addEventListener(‘submit’, handleLogin); signupForm.addEventListener(‘submit’, handleSignup); switchToSignup.addEventListener(‘click’, (e) => { e.preventDefault(); showSignup(); }); switchToLogin.addEventListener(‘click’, (e) => { e.preventDefault(); showLogin(); }); fbLogin.addEventListener(‘click’, () => alert(‘Facebook login not implemented in this demo.’)); forgotPassword.addEventListener(‘click’, (e) => { e.preventDefault(); alert(‘Forgot password? Feature not implemented.’); });
// Initialize document.addEventListener(‘DOMContentLoaded’, () => { const loggedInUser = localStorage.getItem(‘loggedInUser’); if (loggedInUser) { window.location.href = ‘index.html’; } else { showLogin(); } });
function showLogin() { loginForm.classList.remove(‘hidden’); signupForm.classList.add(‘hidden’); document.getElementById(‘switchToSignup’).style.display = ‘block’; document.getElementById(‘switchToLogin’).style.display = ‘none’; }
function showSignup() { loginForm.classList.add(‘hidden’); signupForm.classList.remove(‘hidden’); document.getElementById(‘switchToSignup’).style.display = ‘none’; document.getElementById(‘switchToLogin’).style.display = ‘block’; }
function handleLogin(e) { e.preventDefault(); const identifier = document.getElementById(‘username’).value; // username or email const password = document.getElementById(‘password’).value;
const users = JSON.parse(localStorage.getItem('users')) || [];
const user = users.find(u => (u.username === identifier || u.email === identifier) && u.password === password);
if (user) {
localStorage.setItem('loggedInUser', user.username);
window.location.href = 'index.html';
} else {
alert('Invalid credentials');
} }
function handleSignup(e) { e.preventDefault(); const fullName = document.getElementById(‘fullName’).value; const username = document.getElementById(‘newUsername’).value; const email = document.getElementById(‘email’).value; const password = document.getElementById(‘newPassword’).value; const confirmPassword = document.getElementById(‘confirmPassword’).value;
if (password !== confirmPassword) {
alert('Passwords do not match');
return;
}
if (password.length < 6) {
alert('Password must be at least 6 characters');
return;
}
const users = JSON.parse(localStorage.getItem('users')) || [];
if (users.find(u => u.username === username)) {
alert('Username already exists');
return;
}
if (users.find(u => u.email === email)) {
alert('Email already exists');
return;
}
users.push({ fullName, username, email, password });
localStorage.setItem('users', JSON.stringify(users));
localStorage.setItem('loggedInUser', username);
window.location.href = 'index.html'; }
…script.js… // DOM elements const signoutBtn = document.getElementById(‘signoutBtn’); const profileBtn = document.getElementById(‘profileBtn’); const feedBtn = document.getElementById(‘feedBtn’); const profileSection = document.getElementById(‘profile’); const feedSection = document.getElementById(‘feed’); const profileForm = document.getElementById(‘profileForm’); const profileInfo = document.getElementById(‘profileInfo’); const postForm = document.getElementById(‘postForm’); const postsDiv = document.getElementById(‘posts’);
// Event listeners signoutBtn.addEventListener(‘click’, handleSignout); profileBtn.addEventListener(‘click’, showProfile); feedBtn.addEventListener(‘click’, showFeed); profileForm.addEventListener(‘submit’, handleProfileUpdate); postForm.addEventListener(‘submit’, handlePost); postsDiv.addEventListener(‘click’, handleLike);
// Initialize document.addEventListener(‘DOMContentLoaded’, init);
function init() { const loggedInUser = localStorage.getItem(‘loggedInUser’); if (!loggedInUser) { window.location.href = ‘login.html’; } else { showFeed(); } }
function showProfile() { profileSection.classList.remove(‘hidden’); feedSection.classList.add(‘hidden’); loadProfile(); }
function showFeed() { profileSection.classList.add(‘hidden’); feedSection.classList.remove(‘hidden’); loadPosts(); }
function loadProfile() { const username = localStorage.getItem(‘loggedInUser’); const users = JSON.parse(localStorage.getItem(‘users’)) || []; const user = users.find(u => u.username === username); if (user) { profileInfo.innerHTML = ` <p>Username: ${user.username}</p> <p>Full Name: ${user.fullName || ‘Not set’}</p> <p>Email: ${user.email}</p> `; document.getElementById(‘editUsername’).value = user.username; document.getElementById(‘editFullName’).value = user.fullName || ‘’; document.getElementById(‘editEmail’).value = user.email; } }
function handleProfileUpdate(e) { e.preventDefault(); const oldUsername = localStorage.getItem(‘loggedInUser’); const newUsername = document.getElementById(‘editUsername’).value; const newFullName = document.getElementById(‘editFullName’).value; const newEmail = document.getElementById(‘editEmail’).value;
const users = JSON.parse(localStorage.getItem('users')) || [];
const userIndex = users.findIndex(u => u.username === oldUsername);
if (userIndex !== -1) {
if (newUsername !== oldUsername) {
const existingUsername = users.find(u => u.username === newUsername);
if (existingUsername) {
alert('Username already in use');
return;
}
// Update loggedInUser
localStorage.setItem('loggedInUser', newUsername);
// Update all posts' username
const posts = JSON.parse(localStorage.getItem('posts')) || [];
posts.forEach(post => {
if (post.username === oldUsername) {
post.username = newUsername;
}
post.comments.forEach(comment => {
if (comment.username === oldUsername) {
comment.username = newUsername;
}
});
post.likes = post.likes.map(like => like === oldUsername ? newUsername : like);
});
localStorage.setItem('posts', JSON.stringify(posts));
}
const existingEmail = users.find(u => u.email === newEmail && u.username !== newUsername);
if (existingEmail) {
alert('Email already in use');
return;
}
users[userIndex].username = newUsername;
users[userIndex].fullName = newFullName;
users[userIndex].email = newEmail;
localStorage.setItem('users', JSON.stringify(users));
loadProfile();
alert('Profile updated');
} }
function handleSignout() { localStorage.removeItem(‘loggedInUser’); window.location.href = ‘login.html’; }
function handlePost(e) { e.preventDefault(); const content = document.getElementById(‘postContent’).value; const username = localStorage.getItem(‘loggedInUser’); const timestamp = new Date().toLocaleString();
const posts = JSON.parse(localStorage.getItem('posts')) || [];
posts.unshift({ id: Date.now(), username, content, timestamp, likes: [], comments: [] });
localStorage.setItem('posts', JSON.stringify(posts));
document.getElementById('postContent').value = '';
loadPosts(); }
function handleLike(e) { const postDiv = e.target.closest(‘.post’); const index = parseInt(postDiv.dataset.index); const username = localStorage.getItem(‘loggedInUser’); const posts = JSON.parse(localStorage.getItem(‘posts’)) || []; const post = posts[index];
if (e.target.classList.contains('like-btn')) {
if (post.likes.includes(username)) {
post.likes = post.likes.filter(u => u !== username);
} else {
post.likes.push(username);
}
} else if (e.target.classList.contains('share-btn')) {
alert('Post shared!');
return;
} else if (e.target.type === 'submit' && e.target.closest('.comment-form')) {
e.preventDefault();
const input = postDiv.querySelector('.comment-input');
const text = input.value.trim();
if (text) {
post.comments.push({ username, text });
input.value = '';
}
} else {
return;
}
localStorage.setItem('posts', JSON.stringify(posts));
loadPosts(); }
function loadPosts() {
const posts = JSON.parse(localStorage.getItem(‘posts’)) || [];
posts.forEach(post => {
if (!post.likes) post.likes = [];
if (!post.comments) post.comments = [];
});
localStorage.setItem(‘posts’, JSON.stringify(posts));
postsDiv.innerHTML = posts.map((post, index) => {
const liked = post.likes.includes(localStorage.getItem(‘loggedInUser’));
const likeText = liked ? ‘Unlike’ : ‘Like’;
const likeCount = post.likes.length;
const commentsHtml = post.comments.map(comment => <div class="comment"><strong>${comment.username}:</strong> ${comment.text}</div>).join(‘’);
return `
<div class="post" data-index="${index}">
<div class="username">${post.username}</div>
<div class="content">${post.content}</div>
<div class="timestamp">${post.timestamp}</div>
${likeCount} likes
<div class="comments">${commentsHtml}</div>
<form class="comment-form">
</form>
</div>
`;
}).join(‘’);
}