From 4d4faf3715e7d6fb09af62b7ee5881dc0de78e2e Mon Sep 17 00:00:00 2001 From: sorax Date: Fri, 24 Nov 2023 21:35:57 +0100 Subject: [PATCH] feat: collaborative outline --- lib/radiator_web/live/outline_live/index.ex | 29 ++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/radiator_web/live/outline_live/index.ex b/lib/radiator_web/live/outline_live/index.ex index b5c8d652..012c6b2c 100644 --- a/lib/radiator_web/live/outline_live/index.ex +++ b/lib/radiator_web/live/outline_live/index.ex @@ -4,8 +4,16 @@ defmodule RadiatorWeb.OutlineLive.Index do alias Radiator.Outline alias Radiator.Outline.Node + alias RadiatorWeb.Endpoint + + @topic "outline" + @impl true def mount(_params, _session, socket) do + if connected?(socket) do + Endpoint.subscribe(@topic) + end + node = %Node{} changeset = Outline.change_node(node) @@ -28,6 +36,8 @@ defmodule RadiatorWeb.OutlineLive.Index do def handle_event("next", %{"node" => params}, socket) do {:ok, node} = Outline.create_node(params) + Endpoint.broadcast(@topic, "inserted", node) + socket |> stream_insert(:nodes, node, at: 0) |> reply(:noreply) @@ -38,6 +48,23 @@ defmodule RadiatorWeb.OutlineLive.Index do node = Outline.get_node!(uuid) {:ok, _} = Outline.delete_node(node) - {:noreply, stream_delete(socket, :nodes, node)} + Endpoint.broadcast(@topic, "deleted", node) + + socket + |> stream_delete(:nodes, node) + |> reply(:noreply) + end + + @impl true + def handle_info(%{topic: @topic, event: "inserted", payload: node}, socket) do + socket + |> stream_insert(:nodes, node, at: 0) + |> reply(:noreply) + end + + def handle_info(%{topic: @topic, event: "deleted", payload: node}, socket) do + socket + |> stream_delete(:nodes, node) + |> reply(:noreply) end end