shareoverlan
Version:
Simple local file sharing over LAN.
238 lines (179 loc) • 6.54 kB
JavaScript
const socket = io('/');
const form = document.getElementById('send-container');
const messageInput = document.getElementById('messageInp');
const messageContainer = document.querySelector(".container");
const onlineSec = document.querySelector('.onlinesection');
const pinMessage = document.getElementById('pin_message');
const username = [];
var audio = new Audio('./assets/ting.mp3');
// message Counter
var messageCounter = 1;
// handle copy message funxtion
const handleCopyMessage = (e) => {
var val = e.target.getAttribute('dataAttributes');
const textArea = document.createElement("textarea");
textArea.value = val;
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
document.execCommand('copy');
e.target.innerHTML = 'Copied !!';
setTimeout(() => {
e.target.innerHTML = 'Copy Message'
}, 3000);
} catch (err) {
console.error('Unable to copy to clipboard', err);
}
document.body.removeChild(textArea);
}
// take to the pinmessage
const takeMeToMessage = () => {
let messageId = pinMessage.getAttribute('messid')
// console.log(messageId);
const link = document.createElement('a');
// Set the href attribute
link.href = messageId;
// Make the link invisible
link.style.display = 'none';
// console.log(link)
// Add the link to the document body
document.body.appendChild(link);
// Programmatically click the link
link.click();
// Remove the link from the document
document.body.removeChild(link);
const targetElement = document.getElementById(messageId);
if (targetElement) {
// Get the element's position relative to the viewport
const rect = targetElement.getBoundingClientRect();
// Calculate the scroll position
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
// Scroll to the element with an offset (e.g., 20px from the top)
const offset = 240;
const targetPosition = rect.top + scrollTop - offset;
window.scrollTo({
top: targetPosition,
behavior: 'smooth'
});
}
}
const handleCancelPinMessage = (event) => {
// console.log(event.target)
event.target.parentElement.innerHTML = ""
}
// handle pin message function
const handlePinMessage = (e, messageCounter) => {
let element = e.target.parentElement.parentElement.parentElement.nextElementSibling
// console.log(element.innerText);
pinMessage.innerHTML = `<b>Pin:</b> ${element.innerText}`;
pinMessage.setAttribute('messId', `#messageCount-${messageCounter}`)
let div = document.createElement('div');
div.classList.add('pin_message_cancel');
div.innerHTML = "X";
div.setAttribute('onclick',"handleCancelPinMessage(event)");
pinMessage.append(div);
}
// append the messgae in UI
const append = (name, message, position) => {
const messageElement = document.createElement('div');
if (position == 'center') {
messageElement.innerHTML = `<span>${name}</span>${message}`;
}
else {
messageElement.innerHTML = `<div>
<div class="sender_name">${name}</div>
<div class="other_options_container">
<span>^</span>
<div class="other_options">
<div dataAttributes="${message}" onclick="handleCopyMessage(event)">Copy Message</div>
<div onclick="handlePinMessage(event,${messageCounter})">Pin Message</div>
</div>
</div>
</div>
<div class="message_content">${message}</div>`;
}
messageElement.classList.add('message');
messageElement.classList.add(position);
messageElement.setAttribute('id', `messageCount-${messageCounter}`)
messageContainer.append(messageElement);
if (position != 'right') {
audio.play();
}
messageContainer.scrollTop = messageContainer.scrollHeight;
messageCounter++;
}
// get old messages from server
const getOldMessages = async () => {
let response = await axios.get('/getoldmessages')
let oldmsg = response.data.messages;
let users = response.data.users;
// console.log(users)
// console.log(oldmsg);
oldmsg.forEach(el => {
append(el.name, el.message, el.position)
})
}
const onlineuser = () => {
for (let i = 0; i < username.length; i++) {
const onlinelight = document.createElement('span');
const onlinename = document.createElement('span');
onlinelight.classList.add('dot');
onlinename.classList.add(username[i]);
onlinename.innerHTML = username[i];
onlineSec.append(onlinelight);
onlineSec.append(onlinename);
}
}
// handle send button
const handleSendBtn = () => {
let val = messageInput.value.trim();
if (val) {
const message = val
append('you', `${message}`, 'right');
socket.emit('send', message);
messageInput.value = "";
setTimeout(() => {
const value = messageInput.value;
messageInput.value = value.slice(0, -1);
}, 100);
}
}
// (send button)
document.querySelector('.send_btn').addEventListener('click', () => {
handleSendBtn();
})
// enter key to send message
messageInput.addEventListener("keypress", e => {
if (e.key === "Enter" && !e.shiftKey) {
handleSendBtn();
}
});
let name = prompt("Enter Your name to Join");
// let name = "sumit"
if (!name) name = "random"+ Math.floor(Math.random() * 1000000);
messageInput.focus()
getOldMessages();
setTimeout(() => {
socket.emit('new-user-joined', name)
if (name) {
append(name, 'Joined the chat', 'center')
}
}, 500);
socket.on('user-joined', name => {
append(`${name}`, 'Joined the chat', 'center');
})
socket.on('receive', data => {
append(`${data.name}`, `${data.message}`, 'left');
})
socket.on('left', user => {
// console.log(user)
append(`${user}`, 'Left the Chat', 'center');
})
// const clear = document.getElementById('clear').addEventListener('click',()=>{
// username.splice(0,username.length);
// })
function auto_grow(element) {
// element.style.height = "40px";
element.style.height = (element.scrollHeight) + "px";
}