Skip to content

Commit a31e21c

Browse files
committed
fix deleting elements at initial render
1 parent 4c2e08b commit a31e21c

File tree

2 files changed

+70
-16
lines changed

2 files changed

+70
-16
lines changed

lib/live_debugger/app/debugger/node_state/stream_utils.ex

Lines changed: 70 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

lib/live_debugger/app/debugger/node_state/web/node_state_live.ex

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,5 @@ defmodule LiveDebugger.App.Debugger.NodeState.Web.NodeStateLive do
137137
|> noreply()
138138
end
139139

140-
def handle_info({:delete_stream_entry, name, dom_id, _}, socket) do
141-
dbg("Deleting #{dom_id}")
142-
{:noreply, Phoenix.LiveView.stream_delete_by_dom_id(socket, name, dom_id)}
143-
end
144-
145140
def handle_info(_, socket), do: {:noreply, socket}
146141
end

0 commit comments

Comments
 (0)