From 93b5407e46d9872eb47e90d38943139754941c9e Mon Sep 17 00:00:00 2001 From: lalka2018 <99399973+lalka2016@users.noreply.github.com> Date: Mon, 5 Feb 2024 16:40:43 +0300 Subject: [PATCH] add ability to take avatar photo from camera MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit почему бы и нет --- Web/static/js/al_wall.js | 77 +++++++++++++++++++++++++++++++++++++++- locales/en.strings | 4 ++- locales/ru.strings | 4 ++- locales/uk.strings | 2 +- 4 files changed, 83 insertions(+), 4 deletions(-) diff --git a/Web/static/js/al_wall.js b/Web/static/js/al_wall.js index 59d37df8..8b353d4e 100644 --- a/Web/static/js/al_wall.js +++ b/Web/static/js/al_wall.js @@ -1386,12 +1386,13 @@ $(document).on("click", "#add_image", (e) => {

${tr('troubles_avatar')}

+

${tr('webcam_avatar')}

` @@ -1504,6 +1505,80 @@ $(document).on("click", "#add_image", (e) => { cropper.rotate(-90) }) }) + + $(".ovk-diag-body #_takeSelfie").on("click", (e) => { + $("#avatarUpload")[0].style.display = "none" + + $(".ovk-diag-body")[0].insertAdjacentHTML("beforeend", ` +
+ + +
+ `) + + let video = document.querySelector("#_takeSelfieFrame video") + + if(!navigator.mediaDevices) { + // ех вот бы месседжбоксы были бы классами + u("body").removeClass("dimmed"); + document.querySelector("html").style.overflowY = "scroll" + u(".ovk-diag-cont").remove(); + + fastError(tr("your_browser_doesnt_support_webcam")) + + return + } + + navigator.mediaDevices + .getUserMedia({ video: true, audio: false }) + .then((stream) => { + video.srcObject = stream; + video.play() + + window._cameraStream = stream + }) + .catch((err) => { + u("body").removeClass("dimmed"); + document.querySelector("html").style.overflowY = "scroll" + u(".ovk-diag-cont").remove(); + + fastError(err) + }); + + function __closeConnection() { + window._cameraStream.getTracks().forEach(track => track.stop()) + } + + document.querySelector(".ovk-diag-action").insertAdjacentHTML("beforeend", ` + + `) + + document.querySelector(".ovk-diag-action button").onclick = (evv) => { + __closeConnection() + } + + document.querySelector("#_takeSnap").onclick = (evv) => { + let canvas = document.getElementById('_tempCanvas') + let context = canvas.getContext('2d') + + canvas.setAttribute("width", video.clientWidth) + canvas.setAttribute("height", video.clientHeight) + context.drawImage(video, 0, 0, video.clientWidth, video.clientHeight); + canvas.toBlob((blob) => { + $("#_takeSnap").remove() + + let file = new File([blob], "snapshot.jpg", {type: "image/jpeg", lastModified: new Date().getTime()}) + let dt = new DataTransfer(); + dt.items.add(file); + + $("#_avaInput")[0].files = dt.files + $("#_avaInput").trigger("change") + $("#_takeSelfieFrame").remove() + + __closeConnection() + }) + } + }) }) $(document).on("click", ".avatarDelete", (e) => { diff --git a/locales/en.strings b/locales/en.strings index 9aadcf2d..a9155d0a 100644 --- a/locales/en.strings +++ b/locales/en.strings @@ -465,8 +465,10 @@ "groups_avatar" = "Good photo can make your group more recognizable."; "formats_avatar" = "You can upload an image in JPG, GIF or PNG format."; "troubles_avatar" = "If you're having trouble uploading, try selecting a smaller photo."; -"webcam_avatar" = "If your computer is equipped with a webcam, you can take a snapshot."; +"webcam_avatar" = "If your computer has a webcam, you can take a snapshot »"; "publish_on_wall" = "Make post on wall"; +"take_snapshot" = "Take snapshot"; +"your_browser_doesnt_support_webcam" = "Your browser does not support webcam video capture."; "selected_area_user" = "The selected area will be shown on your page."; "selected_area_club" = "The selected area will be shown on the group page."; diff --git a/locales/ru.strings b/locales/ru.strings index 7070f6bc..1ee718c6 100644 --- a/locales/ru.strings +++ b/locales/ru.strings @@ -451,8 +451,10 @@ "groups_avatar" = "Хорошее фото сделает Ваше сообщество более узнаваемым."; "formats_avatar" = "Вы можете загрузить изображение в формате JPG, GIF или PNG."; "troubles_avatar" = "Если возникают проблемы с загрузкой, попробуйте выбрать фотографию меньшего размера."; -"webcam_avatar" = "Если ваш компьютер оснащён веб-камерой, Вы можете сделать моментальную фотографию »"; +"webcam_avatar" = "Если ваш компьютер оснащён веб-камерой, Вы можете сделать моментальную фотографию »"; "publish_on_wall" = "Опубликовать запись на стене"; +"take_snapshot" = "Сделать снимок"; +"your_browser_doesnt_support_webcam" = "Ваш браузер не поддерживает съёмку видео с веб-камеры."; "selected_area_user" = "Выбранная область будет показываться на вашей странице."; "selected_area_club" = "Выбранная область будет показываться на странице сообщества."; diff --git a/locales/uk.strings b/locales/uk.strings index 515b1e7c..52a02d10 100644 --- a/locales/uk.strings +++ b/locales/uk.strings @@ -367,7 +367,7 @@ "groups_avatar" = "Гарне фото зробить Вашу спільноту більш популярним."; "formats_avatar" = "Ви можете завантажити зображення у форматі JPG, GIF або PNG."; "troubles_avatar" = "Якщо виникають проблеми із завантаженням, спробуйте вибрати фотографію меншого розміру."; -"webcam_avatar" = "Якщо ваш комп'ютер оснащений веб-камерою, Ви можете зробити миттєву фотографію»"; +"webcam_avatar" = "Якщо ваш комп'ютер оснащений веб-камерою, Ви можете зробити миттєву фотографію »"; "update_avatar_notification" = "Фотографію профілю оновлено"; "update_avatar_description" = "Натисніть, щоб перейти до перегляду";