Skip to content

Commit fb9f9ff

Browse files
committed
fix: beacon_meta_tags override replaces defaults too
When beacon_meta_tags is provided by LiveData, skip site default meta tags since the override provides the complete set. This prevents duplicate/conflicting meta tags when dynamic pages provide fully resolved metadata at runtime.
1 parent df7deca commit fb9f9ff

File tree

1 file changed

+21
-16
lines changed

1 file changed

+21
-16
lines changed

lib/beacon/web/components/layouts.ex

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,25 @@ defmodule Beacon.Web.Layouts do
9393

9494
@doc false
9595
def meta_tags(assigns) do
96-
page_meta_tags = page_meta_tags(assigns) || []
96+
%{beacon: %{private: %{live_data_keys: live_data_keys}}} = assigns
97+
live_data = Map.take(assigns, live_data_keys)
9798
layout_meta_tags = layout_meta_tags(assigns) || []
9899

99-
(page_meta_tags ++ layout_meta_tags)
100-
|> Enum.reject(&(&1["name"] == "csrf-token"))
101-
|> Kernel.++(Beacon.Content.default_site_meta_tags())
100+
case live_data do
101+
%{beacon_meta_tags: override_tags} when is_list(override_tags) ->
102+
# When beacon_meta_tags is provided by LiveData, it replaces both
103+
# page-level meta tags and site defaults. This is used by dynamic pages
104+
# where page metadata comes from runtime data, not compiled page modules.
105+
(override_tags ++ layout_meta_tags)
106+
|> Enum.reject(&(&1["name"] == "csrf-token"))
107+
108+
_ ->
109+
page_meta_tags = page_meta_tags(assigns) || []
110+
111+
(page_meta_tags ++ layout_meta_tags)
112+
|> Enum.reject(&(&1["name"] == "csrf-token"))
113+
|> Kernel.++(Beacon.Content.default_site_meta_tags())
114+
end
102115
end
103116

104117
defp page_meta_tags(%{page_assigns: %{meta_tags: meta_tags}} = assigns) do
@@ -112,18 +125,10 @@ defmodule Beacon.Web.Layouts do
112125
end
113126

114127
defp compiled_page_meta_tags(assigns) do
115-
%{beacon: %{site: site, private: %{page_module: page_module, live_data_keys: live_data_keys}}} = assigns
116-
live_data = Map.take(assigns, live_data_keys)
117-
118-
case live_data do
119-
%{beacon_meta_tags: meta_tags} when is_list(meta_tags) ->
120-
meta_tags
121-
122-
_ ->
123-
%{site: ^site, id: page_id} = Beacon.apply_mfa(site, page_module, :page_assigns, [[:site, :id]])
124-
%{meta_tags: meta_tags} = compiled_page_assigns(site, page_id)
125-
meta_tags
126-
end
128+
%{beacon: %{site: site, private: %{page_module: page_module}}} = assigns
129+
%{site: ^site, id: page_id} = Beacon.apply_mfa(site, page_module, :page_assigns, [[:site, :id]])
130+
%{meta_tags: meta_tags} = compiled_page_assigns(site, page_id)
131+
meta_tags
127132
end
128133

129134
defp layout_meta_tags(%{layout_assigns: %{meta_tags: meta_tags}} = assigns) do

0 commit comments

Comments
 (0)