Scroll to load more results in the add record overlay
This commit is contained in:
@@ -7,6 +7,8 @@ defmodule MusicLibraryWeb.AddRecordComponent do
|
|||||||
alias MusicBrainz.ReleaseGroupSearchResult
|
alias MusicBrainz.ReleaseGroupSearchResult
|
||||||
alias MusicLibrary.Records
|
alias MusicLibrary.Records
|
||||||
|
|
||||||
|
@batch_size 20
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def render(assigns) do
|
def render(assigns) do
|
||||||
~H"""
|
~H"""
|
||||||
@@ -35,6 +37,8 @@ defmodule MusicLibraryWeb.AddRecordComponent do
|
|||||||
<ul
|
<ul
|
||||||
id="release-groups"
|
id="release-groups"
|
||||||
phx-update="stream"
|
phx-update="stream"
|
||||||
|
phx-viewport-bottom={!@loaded_all_results? && "load-more"}
|
||||||
|
phx-target={@myself}
|
||||||
role="list"
|
role="list"
|
||||||
class="divide-y divide-zinc-100 dark:divide-slate-300/30 mt-5"
|
class="divide-y divide-zinc-100 dark:divide-slate-300/30 mt-5"
|
||||||
>
|
>
|
||||||
@@ -147,7 +151,8 @@ defmodule MusicLibraryWeb.AddRecordComponent do
|
|||||||
|> stream_configure(:release_groups,
|
|> stream_configure(:release_groups,
|
||||||
dom_id: fn rg -> "musicbrainz_#{rg.id}" end
|
dom_id: fn rg -> "musicbrainz_#{rg.id}" end
|
||||||
)
|
)
|
||||||
|> stream(:release_groups, [])}
|
|> stream(:release_groups, [])
|
||||||
|
|> assign(:loaded_all_results?, false)}
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
@@ -156,7 +161,8 @@ defmodule MusicLibraryWeb.AddRecordComponent do
|
|||||||
|
|
||||||
socket =
|
socket =
|
||||||
if mb_query != "" do
|
if mb_query != "" do
|
||||||
{:ok, release_groups} = search(mb_query)
|
{:ok, release_groups} =
|
||||||
|
MusicBrainz.search_release_group(mb_query, limit: @batch_size, offset: 0)
|
||||||
|
|
||||||
stream(socket, :release_groups, release_groups, reset: true)
|
stream(socket, :release_groups, release_groups, reset: true)
|
||||||
else
|
else
|
||||||
@@ -165,6 +171,7 @@ defmodule MusicLibraryWeb.AddRecordComponent do
|
|||||||
|
|
||||||
{:ok,
|
{:ok,
|
||||||
assign(socket,
|
assign(socket,
|
||||||
|
offset: 0,
|
||||||
icon_name: assigns.icon_name,
|
icon_name: assigns.icon_name,
|
||||||
form: to_form(%{"mb_query" => mb_query})
|
form: to_form(%{"mb_query" => mb_query})
|
||||||
)}
|
)}
|
||||||
@@ -172,17 +179,35 @@ defmodule MusicLibraryWeb.AddRecordComponent do
|
|||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_event("search", %{"mb_query" => mb_query}, socket) do
|
def handle_event("search", %{"mb_query" => mb_query}, socket) do
|
||||||
{:ok, release_groups} = search(mb_query)
|
{:ok, release_groups} =
|
||||||
|
MusicBrainz.search_release_group(mb_query, limit: @batch_size, offset: 0)
|
||||||
|
|
||||||
{:noreply,
|
{:noreply,
|
||||||
socket
|
socket
|
||||||
|
|> assign(:offset, 0)
|
||||||
|> stream(:release_groups, release_groups, reset: true)
|
|> stream(:release_groups, release_groups, reset: true)
|
||||||
|> assign(:form, to_form(%{"mb_query" => mb_query}))}
|
|> assign(:form, to_form(%{"mb_query" => mb_query}))}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp search(""), do: {:ok, []}
|
def handle_event("load-more", _params, socket) do
|
||||||
|
%{"mb_query" => mb_query} = socket.assigns.form.params
|
||||||
|
offset = socket.assigns.offset + @batch_size
|
||||||
|
|
||||||
defp search(mb_query) do
|
case MusicBrainz.search_release_group(mb_query, limit: @batch_size, offset: offset) do
|
||||||
MusicBrainz.search_release_group(mb_query, limit: 10)
|
{:ok, []} ->
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> assign(:offset, offset)
|
||||||
|
|> assign(:loaded_all_results?, true)}
|
||||||
|
|
||||||
|
{:ok, release_groups} ->
|
||||||
|
{:noreply,
|
||||||
|
socket
|
||||||
|
|> assign(:offset, offset)
|
||||||
|
|> stream(:release_groups, release_groups)}
|
||||||
|
|
||||||
|
{:error, _reason} ->
|
||||||
|
{:noreply, socket}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user