@@ -39,7 +39,7 @@ defmodule ChukoWeb.HomeLive do
3939 < . loading />
4040 <% @ query == "" && @ items == [ ] - > %>
4141 < div class = "py-16 text-center " >
42- try searching something 🕵️
42+ search something 🕵️
4343 </ div >
4444 <% @ query != "" && @ items == [ ] - > %>
4545 < div class = "py-16 text-center " >
@@ -61,18 +61,19 @@ defmodule ChukoWeb.HomeLive do
6161 </ select >
6262 </ form >
6363 </ div >
64+ <% :otherwise - > %>
6465 <%!-- Actual product container --%>
65- <%= if @ sorting do %>
66- < . loading />
67- <% else %>
66+ <%= unless @ sorting do %>
6867 < div
6968 id = "infinite-scroll-body "
70- phx-update = "append "
69+ phx-update = "stream "
7170 class = "grid grid-cols-1 gap-y-4 sm:grid-cols-2 sm:gap-x-6 sm:gap-y-10 lg:grid-cols-3 lg:gap-x-8 "
7271 >
73- < . item :for = { item <- @ page_items } item = { item } />
72+ < . item :for = { { id , item } <- @ streams . page_items } item = { item } id = { id } />
7473 </ div >
7574 < div id = "infinite-scroll-marker " phx-hook = "InfiniteScroll " data-page = { @ page } > </ div >
75+ <% else %>
76+ < . loading />
7677 <% end %>
7778 <% end %>
7879 </ div >
@@ -83,20 +84,22 @@ defmodule ChukoWeb.HomeLive do
8384 @ impl true
8485 def mount ( _params , _session , socket ) do
8586 socket =
86- assign ( socket ,
87+ socket
88+ |> assign (
8789 query: "" ,
8890 items: [ ] ,
8991 page: 1 ,
9092 pages: 0 ,
9193 searching: false ,
9294 sorting: false
9395 )
96+ |> stream ( :page_items , [ ] , dom_id: & "item-#{ & 1 . id } " )
9497
9598 if connected? ( socket ) do
9699 Phoenix.PubSub . subscribe ( Chuko.PubSub , "session_#{ socket . id } " )
97100 end
98101
99- { :ok , socket , temporary_assigns: [ page_items: [ ] ] }
102+ { :ok , socket }
100103 end
101104
102105 @ impl true
@@ -117,11 +120,12 @@ defmodule ChukoWeb.HomeLive do
117120 )
118121 when page < pages do
119122 socket =
120- assign ( socket ,
123+ socket
124+ |> assign (
121125 items: items ,
122- page_items: Enum . at ( items , page , [ ] ) ,
123126 page: page + 1
124127 )
128+ |> insert_page_items ( Enum . at ( items , page , [ ] ) )
125129
126130 { :noreply , socket }
127131 end
@@ -170,12 +174,13 @@ defmodule ChukoWeb.HomeLive do
170174 @ impl true
171175 def handle_info ( { :items_sorted , % { items: items } } , socket ) do
172176 socket =
173- assign ( socket ,
177+ socket
178+ |> assign (
174179 items: items ,
175- page_items: Enum . at ( items , 0 , [ ] ) ,
176180 page: 1 ,
177181 sorting: false
178182 )
183+ |> insert_page_items ( Enum . at ( items , 0 , [ ] ) )
179184
180185 { :noreply , socket }
181186 end
@@ -188,13 +193,15 @@ defmodule ChukoWeb.HomeLive do
188193 |> Enum . chunk_every ( 9 )
189194
190195 socket =
191- assign ( socket ,
196+ socket
197+ |> assign (
192198 items: items ,
193199 page_items: Enum . at ( items , 0 , [ ] ) ,
194200 page: 1 ,
195201 pages: Enum . count ( items ) ,
196202 searching: false
197203 )
204+ |> insert_page_items ( Enum . at ( items , 0 , [ ] ) )
198205
199206 { :noreply , socket }
200207 end
@@ -212,4 +219,8 @@ defmodule ChukoWeb.HomeLive do
212219
213220 assign ( socket , query: query , page_title: query , searching: true )
214221 end
222+
223+ defp insert_page_items ( socket , pages ) do
224+ Enum . reduce ( pages , socket , & stream_insert ( & 2 , :page_items , & 1 ) )
225+ end
215226end
0 commit comments