Skip to content

Commit 78459f8

Browse files
authored
Merge pull request #131 from phoenixframework/bms_liveview_reload
Live reloading LiveViews without a hard refresh
2 parents 6771687 + 573a791 commit 78459f8

File tree

3 files changed

+51
-1
lines changed

3 files changed

+51
-1
lines changed

lib/phoenix_live_reload/channel.ex

+16-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ defmodule Phoenix.LiveReloader.Channel do
1616
socket
1717
|> assign(:patterns, config[:patterns] || [])
1818
|> assign(:debounce, config[:debounce] || 0)
19+
|> assign(:notify_patterns, config[:notify] || [])
1920

2021
{:ok, socket}
2122
else
@@ -24,7 +25,11 @@ defmodule Phoenix.LiveReloader.Channel do
2425
end
2526

2627
def handle_info({:file_event, _pid, {path, _event}}, socket) do
27-
%{patterns: patterns, debounce: debounce} = socket.assigns
28+
%{
29+
patterns: patterns,
30+
debounce: debounce,
31+
notify_patterns: notify_patterns,
32+
} = socket.assigns
2833

2934
if matches_any_pattern?(path, patterns) do
3035
ext = Path.extname(path)
@@ -36,6 +41,16 @@ defmodule Phoenix.LiveReloader.Channel do
3641
end
3742
end
3843

44+
for {topic, patterns} <- notify_patterns do
45+
if matches_any_pattern?(path, patterns) do
46+
Phoenix.PubSub.broadcast(
47+
socket.pubsub_server,
48+
to_string(topic),
49+
{:phoenix_live_reload, topic, path}
50+
)
51+
end
52+
end
53+
3954
{:noreply, socket}
4055
end
4156

test/channel_test.exs

+9
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,13 @@ defmodule Phoenix.LiveReloader.ChannelTest do
8787
send(socket.channel_pid, file_event('a/b/c/lib/live_web/views/user_view.ex', :created))
8888
assert_push "assets_change", %{asset_type: "ex"}
8989
end
90+
91+
@endpoint MyApp.ReloadEndpoint
92+
test "sends notification for liveviews" do
93+
{:ok, _, socket} =
94+
LiveReloader.Socket |> socket() |> subscribe_and_join(Channel, "phoenix:live_reload", %{})
95+
socket.endpoint.subscribe("live_view")
96+
send(socket.channel_pid, file_event("lib/live_web/live/user_live.ex", :created))
97+
assert_receive {:phoenix_live_reload, :live_view, "lib/live_web/live/user_live.ex"}
98+
end
9099
end

test/test_helper.exs

+26
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,37 @@ Application.put_env(:phoenix_live_reload, MyApp.EndpointWrongWindow,
4545
]
4646
)
4747

48+
Application.put_env(:phoenix_live_reload, MyApp.ReloadEndpoint,
49+
pubsub_server: MyApp.PubSub,
50+
live_reload: [
51+
url: "ws://localhost:4000",
52+
patterns: [
53+
~r"priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$",
54+
~r"priv/gettext/.*(po)$",
55+
~r{web/views/.*(ex)$},
56+
~r{web/templates/.*(eex)$}
57+
],
58+
notify: [
59+
live_view: [
60+
~r{web/components.ex$},
61+
~r{web/live/.*(ex)$}
62+
]
63+
]
64+
]
65+
)
66+
4867
defmodule MyApp.Endpoint do
4968
use Phoenix.Endpoint, otp_app: :phoenix_live_reload
5069

5170
socket "/socket", Phoenix.LiveReloader.Socket, websocket: true, longpoll: true
5271
end
5372

73+
defmodule MyApp.ReloadEndpoint do
74+
use Phoenix.Endpoint, otp_app: :phoenix_live_reload
75+
76+
socket "/socket", Phoenix.LiveReloader.Socket, websocket: true, longpoll: true
77+
end
78+
5479
defmodule MyApp.EndpointScript do
5580
use Phoenix.Endpoint, otp_app: :phoenix_live_reload
5681
end
@@ -74,6 +99,7 @@ children = [
7499
MyApp.EndpointConfig,
75100
MyApp.EndpointParentWindow,
76101
MyApp.EndpointWrongWindow,
102+
MyApp.ReloadEndpoint
77103
]
78104

79105
Supervisor.start_link(children, strategy: :one_for_one)

0 commit comments

Comments
 (0)