Open scan modal, handle permissions, open/close video preview
This commit is contained in:
+1
-1
@@ -30,7 +30,7 @@ let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("
|
|||||||
let liveSocket = new LiveSocket("/live", Socket, {
|
let liveSocket = new LiveSocket("/live", Socket, {
|
||||||
longPollFallbackMs: 2500,
|
longPollFallbackMs: 2500,
|
||||||
params: { _csrf_token: csrfToken },
|
params: { _csrf_token: csrfToken },
|
||||||
hooks: { Hooks }
|
hooks: Hooks
|
||||||
})
|
})
|
||||||
|
|
||||||
// Show progress bar on live navigation and form submits
|
// Show progress bar on live navigation and form submits
|
||||||
|
|||||||
@@ -19,6 +19,29 @@ const barcodeTest = async function () {
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
mounted() {
|
mounted() {
|
||||||
console.log(this.el);
|
const video = this.el;
|
||||||
|
const constraints = {
|
||||||
|
audio: false,
|
||||||
|
video: { width: 800, height: 600 },
|
||||||
|
};
|
||||||
|
|
||||||
|
navigator.mediaDevices
|
||||||
|
.getUserMedia(constraints)
|
||||||
|
.then((mediaStream) => {
|
||||||
|
console.debug("Camera access allowed")
|
||||||
|
this.pushEventTo(video, "camera:allowed", {});
|
||||||
|
console.log(mediaStream);
|
||||||
|
video.srcObject = mediaStream;
|
||||||
|
video.onloadedmetadata = () => {
|
||||||
|
video.play();
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.error(`${err.name}: ${err.message}`);
|
||||||
|
this.pushEventTo(video, "camera:denied", {});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
destroyed() {
|
||||||
|
this.el.srcObject.getTracks().forEach(track => track.stop());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,20 @@ defmodule MusicLibraryWeb.CollectionLive.Index do
|
|||||||
|> assign(:record, nil)
|
|> assign(:record, nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp apply_action(socket, :barcode_scan, params) do
|
||||||
|
socket =
|
||||||
|
if get_in(socket.assigns, [:streams, :records]) == nil do
|
||||||
|
socket
|
||||||
|
|> apply_action(:index, params)
|
||||||
|
else
|
||||||
|
socket
|
||||||
|
end
|
||||||
|
|
||||||
|
socket
|
||||||
|
|> assign(:page_title, gettext("Scan barcodes · Collection"))
|
||||||
|
|> assign(:record, nil)
|
||||||
|
end
|
||||||
|
|
||||||
defp apply_action(socket, :edit, params = %{"id" => id}) do
|
defp apply_action(socket, :edit, params = %{"id" => id}) do
|
||||||
socket =
|
socket =
|
||||||
if get_in(socket.assigns, [:streams, :records]) == nil do
|
if get_in(socket.assigns, [:streams, :records]) == nil do
|
||||||
|
|||||||
@@ -2,9 +2,14 @@
|
|||||||
<header class="gap-6 mb-2">
|
<header class="gap-6 mb-2">
|
||||||
<div class="flex items-center justify-between gap-6 mb-2 mt-2">
|
<div class="flex items-center justify-between gap-6 mb-2 mt-2">
|
||||||
<.search_form query={@record_list_params.query} />
|
<.search_form query={@record_list_params.query} />
|
||||||
<.link patch={~p"/collection/import"}>
|
<nav>
|
||||||
<.button>{gettext("Import")}</.button>
|
<.link patch={~p"/collection/import"}>
|
||||||
</.link>
|
<.button>{gettext("Import")}</.button>
|
||||||
|
</.link>
|
||||||
|
<.link patch={~p"/collection/scan"}>
|
||||||
|
<.button>{gettext("Scan")}</.button>
|
||||||
|
</.link>
|
||||||
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
@@ -93,4 +98,19 @@
|
|||||||
/>
|
/>
|
||||||
</.modal>
|
</.modal>
|
||||||
|
|
||||||
|
<.modal
|
||||||
|
:if={@live_action == :barcode_scan}
|
||||||
|
id="barcode-scanner-modal"
|
||||||
|
show
|
||||||
|
on_cancel={JS.patch(back_path(@record_list_params))}
|
||||||
|
>
|
||||||
|
<.live_component
|
||||||
|
module={MusicLibraryWeb.RecordLive.BarcodeScannerComponent}
|
||||||
|
id={:barcode_scanner}
|
||||||
|
title={@page_title}
|
||||||
|
action={@live_action}
|
||||||
|
patch={back_path(@record_list_params)}
|
||||||
|
/>
|
||||||
|
</.modal>
|
||||||
|
|
||||||
<.pagination id={:bottom_pagination} pagination_params={@record_list_params} />
|
<.pagination id={:bottom_pagination} pagination_params={@record_list_params} />
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
defmodule MusicLibraryWeb.RecordLive.BarcodeScannerComponent do
|
||||||
|
use MusicLibraryWeb, :live_component
|
||||||
|
|
||||||
|
require Logger
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def render(assigns) do
|
||||||
|
~H"""
|
||||||
|
<div>
|
||||||
|
<h1>Barcode Scan</h1>
|
||||||
|
<video id="barcode-scan" phx-hook="BarcodeScanner"></video>
|
||||||
|
</div>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_event("camera:allowed", _params, socket) do
|
||||||
|
Logger.debug(fn -> "Camera access allowed" end)
|
||||||
|
{:noreply, assign(socket, camera: :allowed)}
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_event("camera:denied", _params, socket) do
|
||||||
|
Logger.debug(fn -> "Camera access denied" end)
|
||||||
|
{:noreply, assign(socket, camera: :denied)}
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -39,6 +39,7 @@ defmodule MusicLibraryWeb.Router do
|
|||||||
|
|
||||||
live "/collection", CollectionLive.Index, :index
|
live "/collection", CollectionLive.Index, :index
|
||||||
live "/collection/import", CollectionLive.Index, :import
|
live "/collection/import", CollectionLive.Index, :import
|
||||||
|
live "/collection/scan", CollectionLive.Index, :barcode_scan
|
||||||
live "/collection/:id/edit", CollectionLive.Index, :edit
|
live "/collection/:id/edit", CollectionLive.Index, :edit
|
||||||
|
|
||||||
live "/collection/:id", CollectionLive.Show, :show
|
live "/collection/:id", CollectionLive.Show, :show
|
||||||
|
|||||||
Reference in New Issue
Block a user