174 lines
4.3 KiB
JavaScript
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); |