From 63b2d405b664765fb35966df358c4035435022f3 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Tue, 4 Aug 2026 17:10:26 -0500 Subject: [PATCH] fix: decode beacons_json before mutating in patch/remove helpers patch_beacons_json/2 and remove_from_beacons_json/2 were calling Enum.reject/2 directly on @beacons_json, which is a JSON-encoded string from Jason.encode!/0 (not a list). This crashed with Protocol.UndefinedError when no approved beacons existed (string was "[]") and a PubSub broadcast triggered an update. Decode with Jason.decode!/1, operate on the list, then re-encode with Jason.encode!/1 so the template's data-beacons attribute remains a valid JSON string for the JS hook. --- lib/microwaveprop_web/live/beacon_live/index.ex | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/microwaveprop_web/live/beacon_live/index.ex b/lib/microwaveprop_web/live/beacon_live/index.ex index 5639572a..c6a1131c 100644 --- a/lib/microwaveprop_web/live/beacon_live/index.ex +++ b/lib/microwaveprop_web/live/beacon_live/index.ex @@ -139,14 +139,16 @@ defmodule MicrowavepropWeb.BeaconLive.Index do # Replace or add a beacon in the in-memory JSON list without re-querying the DB. defp patch_beacons_json(%{assigns: %{beacons_json: json}} = socket, beacon) do entry = encode_single_beacon(beacon) - updated = Enum.reject(json, &(Map.get(&1, "id") == Map.get(entry, "id"))) ++ [entry] - assign(socket, :beacons_json, updated) + list = Jason.decode!(json) + updated = Enum.reject(list, &(Map.get(&1, "id") == Map.get(entry, "id"))) ++ [entry] + assign(socket, :beacons_json, Jason.encode!(updated)) end defp remove_from_beacons_json(%{assigns: %{beacons_json: json}} = socket, beacon) do id_str = beacon.id |> Ecto.UUID.cast!() |> to_string() - updated = Enum.reject(json, &(Map.get(&1, "id") == id_str)) - assign(socket, :beacons_json, updated) + list = Jason.decode!(json) + updated = Enum.reject(list, &(Map.get(&1, "id") == id_str)) + assign(socket, :beacons_json, Jason.encode!(updated)) end defp encode_single_beacon(beacon) do