@@ -11,7 +11,7 @@ defmodule LiveDebugger.App.Debugger.NodeState.StreamUtils do
1111 stream_traces = extract_stream_traces ( stream_updates )
1212 stream_names = get_stream_names_map ( stream_traces )
1313
14- fun_list = collect_updates ( stream_traces )
14+ fun_list = collect_updates_for_initial_stream ( stream_traces , stream_names )
1515 config_list = collect_config ( stream_traces )
1616
1717 dbg ( fun_list )
@@ -52,6 +52,58 @@ defmodule LiveDebugger.App.Debugger.NodeState.StreamUtils do
5252 update_list
5353 end
5454
55+ defp collect_updates_for_initial_stream ( update_list , stream_names ) do
56+ update_map =
57+ Enum . reduce ( update_list , % { } , fn update , acc ->
58+ process_update ( acc , update , stream_names )
59+ end )
60+
61+ fun_list =
62+ update_map
63+ |> Enum . flat_map ( & flatten_stream_initial_updates / 1 )
64+
65+ dbg ( fun_list )
66+ fun_list
67+ end
68+
69+ defp process_update ( acc , update , stream_names ) do
70+ Enum . reduce ( stream_names , acc , fn key , acc_inner ->
71+ update_stream_if_present ( acc_inner , update , key )
72+ end )
73+ end
74+
75+ defp update_stream_if_present ( acc , update , key ) do
76+ case Map . get ( update , key ) do
77+ % Phoenix.LiveView.LiveStream { } = stream ->
78+ Map . update ( acc , key , [ ] , fn current ->
79+ apply_stream_update ( current , stream )
80+ end )
81+
82+ _ ->
83+ acc
84+ end
85+ end
86+
87+ defp apply_stream_update ( _current , % Phoenix.LiveView.LiveStream { reset?: true } ) do
88+ [ ]
89+ end
90+
91+ defp apply_stream_update ( current , % Phoenix.LiveView.LiveStream {
92+ inserts: inserts ,
93+ deletes: deletes
94+ } ) do
95+ current =
96+ Enum . reduce ( inserts , current , fn
97+ { dom_id , at , data , limit , updated? } , acc ->
98+ [ { dom_id , at , data , limit , updated? } | acc ]
99+
100+ _ , acc ->
101+ acc
102+ end )
103+
104+ Enum . reject ( current , fn { dom_id , _at , _data , _limit , _updated? } -> dom_id in deletes end )
105+ end
106+
55107 defp collect_config ( update_list ) do
56108 update_list =
57109 update_list
@@ -64,13 +116,18 @@ defmodule LiveDebugger.App.Debugger.NodeState.StreamUtils do
64116 update_list
65117 end
66118
67- def map_stream_entry_to_stream_function ( % Phoenix.LiveView.LiveStream {
68- name: name ,
69- inserts: inserts ,
70- deletes: deletes ,
71- reset?: reset? ,
72- consumable?: _consumable?
73- } ) do
119+ defp map_initial_stream_entry_to_stream_function ( stream_name , inserts ) do
120+ [ ]
121+ |> maybe_add_inserts ( Enum . reverse ( inserts ) , stream_name )
122+ end
123+
124+ defp map_stream_entry_to_stream_function ( % Phoenix.LiveView.LiveStream {
125+ name: name ,
126+ inserts: inserts ,
127+ deletes: deletes ,
128+ reset?: reset? ,
129+ consumable?: _consumable?
130+ } ) do
74131 [ ]
75132 |> maybe_add_reset ( reset? , name )
76133 # Reverse to preserve the order of inserts
@@ -132,13 +189,15 @@ defmodule LiveDebugger.App.Debugger.NodeState.StreamUtils do
132189 defp create_delete_functions ( deletes , name ) do
133190 Enum . map ( deletes , fn dom_id ->
134191 fn socket ->
135- # Problem with same_id because ids are reused and element is updated and then deleted
136- Process . send_after ( self ( ) , { :delete_stream_entry , name , dom_id , socket } , 1 )
137- socket
192+ Phoenix.LiveView . stream_delete_by_dom_id ( socket , name , dom_id )
138193 end
139194 end )
140195 end
141196
197+ defp flatten_stream_initial_updates ( { stream_name , inserts } ) do
198+ map_initial_stream_entry_to_stream_function ( stream_name , inserts )
199+ end
200+
142201 defp flatten_stream_updates ( stream_entry ) do
143202 dbg ( stream_entry )
144203
0 commit comments