BubbleCam/camera.js
2025-03-06 21:21:05 +05:30

174 lines
4.3 KiB
JavaScript

let cameraStream = null;
let currentMode = 'camera';
let avatarData = null;
const runCode = async () => {
const cameraElement = document.querySelector("#camera");
const startCamera = async () => {
try {
const permissions = await navigator.permissions.query({
name: "camera",
});
if (permissions.state === "prompt") {
await navigator.mediaDevices.getUserMedia({ audio: true, video: true });
return;
}
if (permissions.state === "denied") {
console.log("Camera permissions denied, falling back to avatar");
currentMode = 'avatar';
displayAvatar();
return;
}
if (currentMode === 'avatar') {
displayAvatar();
return;
}
const videoElement = document.createElement("video");
videoElement.setAttribute("id", "cam");
videoElement.setAttribute(
"style",
`
height: 200px;
width: 200px;
border-radius: 100px;
transform: scaleX(-1);
object-fit: cover;
`
);
videoElement.setAttribute("autoplay", true);
videoElement.setAttribute("muted", true);
cameraStream = await navigator.mediaDevices.getUserMedia({
audio: false,
video: {
width: { ideal: 400 },
height: { ideal: 400 },
facingMode: "user"
}
});
videoElement.srcObject = cameraStream;
cameraElement.innerHTML = '';
cameraElement.appendChild(videoElement);
} catch (err) {
console.error("Error accessing camera:", err);
currentMode = 'avatar';
displayAvatar();
}
};
const displayAvatar = () => {
if (cameraStream) {
stopCamera();
}
const avatarImg = document.createElement("img");
avatarImg.setAttribute("id", "avatar");
avatarImg.setAttribute(
"style",
`
height: 200px;
width: 200px;
border-radius: 100px;
object-fit: cover;
background-color: #5d3fbd;
`
);
if (avatarData) {
avatarImg.src = avatarData;
} else {
avatarImg.src = 'avatar.png';
avatarImg.onerror = () => {
avatarImg.style.backgroundColor = '#5d3fbd';
avatarImg.style.display = 'flex';
avatarImg.style.justifyContent = 'center';
avatarImg.style.alignItems = 'center';
avatarImg.src = '';
// Create a text element for initials
const initialsElem = document.createElement('div');
initialsElem.textContent = 'BC';
initialsElem.style.color = 'white';
initialsElem.style.fontSize = '60px';
initialsElem.style.fontWeight = 'bold';
cameraElement.innerHTML = '';
cameraElement.appendChild(initialsElem);
};
}
cameraElement.innerHTML = '';
cameraElement.appendChild(avatarImg);
};
const stopCamera = () => {
if (cameraStream) {
cameraStream.getTracks().forEach(track => {
track.stop();
console.log("Camera track stopped:", track);
});
cameraStream = null;
const cameraElement = document.getElementById("purple-camera");
if (cameraElement) {
cameraElement.remove();
}
const videoElement = document.getElementById("cam");
if (videoElement) {
videoElement.remove();
}
}
};
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.type === "stop-camera") {
stopCamera();
sendResponse({ status: "camera-stopped" });
}
else if (message.type === "mode-change") {
currentMode = message.mode;
if (currentMode === 'camera') {
startCamera();
} else {
displayAvatar();
}
sendResponse({ status: "mode-changed" });
}
else if (message.type === "avatar-update") {
avatarData = message.avatarData;
if (currentMode === 'avatar') {
displayAvatar();
}
sendResponse({ status: "avatar-updated" });
}
});
chrome.storage.local.get(['mode', 'avatarData'], function(data) {
currentMode = data.mode || 'camera';
avatarData = data.avatarData;
if (currentMode === 'camera') {
startCamera();
} else {
displayAvatar();
}
});
};
document.addEventListener('DOMContentLoaded', runCode);