I have a simple list of items in a stream as well as some sort links:
def mount(_params, _session, socket) do
if connected?(socket), do: Items.subscribe()
socket =
socket
|> assign(
username: Accounts.current_username(socket.assigns.current_user),
user_id: socket.assigns.current_user.id
)
{:ok, socket}
end
def handle_params(params, _uri, socket) do
user_id = socket.assigns.current_user.id
sort_by = valid_sort_by(params)
sort_order = valid_sort_order(params)
page = param_to_integer(params["page"], 1)
per_page = param_to_integer(params["per_page"], 9)
date = Date.utc_today()
year = param_to_integer(params["year"], date.year)
month = param_to_integer(params["month"], date.month)
options = %{
sort_by: sort_by,
sort_order: sort_order,
page: page,
per_page: per_page,
year: year,
month: month
}
items = list_items(%{user_id: user_id}, options)
socket =
socket
|> stream(:items, items)
|> assign(:options, options)
{:noreply, socket}
end
def sort_link(assigns) do
~H"""
<.link
class="px-4 w-32 text-center"
patch={
~p"/items?#{%{@options | sort_by: @sort_by, sort_order: next_sort_order(@options.sort_order)}}"
}
>
<%= render_slot(@inner_block) %>
<%= sort_indicator(@sort_by, @options) %>
</.link>
"""
end
Whenever I click on the sort_link, the items returned from list_items do update within the assigns (checked using inspect, but the view doesn’t update unless I reload (or if I use navigate
instead of patch
).
I’m curious why this is. Is there something that I’m missing here?