85 lines
3.0 kB
1
defmodule BlogWeb.MuensterLive do
2
use BlogWeb, :live_view
3
require Logger
4
5
@max_posts 500
6
7
def mount(_params, _session, socket) do
8
if connected?(socket) do
9
Phoenix.PubSub.subscribe(Blog.PubSub, "muenster_posts")
10
end
11
import Ecto.Query
12
# skeets no longer just contain muenster...
13
posts = Blog.Repo.all(
14
from s in Blog.Social.Skeet,
15
where: ilike(s.skeet, "%muenster%"),
16
order_by: [desc: s.inserted_at],
17
limit: 3,
18
select: %{text: s.skeet, timestamp: s.inserted_at}
19
)
20
# get the most recent ten muenster skeets from the database
21
{:ok, assign(socket,
22
posts: posts,
23
total_count: Enum.count(posts),
24
page_title: "Thoughts and Tidbits Blog: Bobby Experiment - muenster cheese skeet detection",
25
meta_attrs: [
26
%{name: "title", content: "Detect muenster cheese skeets coming across the wire, live from your back yard or device"},
27
%{name: "description", content: "Try it, skeet something with the word muenster in it, and see if it appears here!"},
28
%{property: "og:title", content: "Detect muenster cheese skeets coming across the wire, live from your back yard or device"},
29
%{property: "og:description", content: "Try it, skeet something with the word muenster in it, and see if it appears here!"},
30
%{property: "og:type", content: "website"}
31
]
32
)}
33
end
34
35
def handle_info({:new_post, skeet}, socket) do
36
posts = [%{
37
text: skeet,
38
timestamp: NaiveDateTime.local_now()
39
} | socket.assigns.posts] |> Enum.take(@max_posts)
40
41
{:noreply, assign(socket,
42
posts: posts,
43
total_count: socket.assigns.total_count + 1
44
)}
45
end
46
47
def render(assigns) do
48
~H"""
49
<.head_tags meta_attrs={@meta_attrs} page_title={@page_title} />
50
<div class="p-4">
51
<h1 class="text-2xl font-bold mb-4">Muenster Mentions</h1>
52
<div class="text-sm text-gray-500 mb-4">
53
Total mentions: <%= @total_count %>
54
</div>
55
<div class="space-y-4">
56
<%= for post <- @posts do %>
57
<div class="p-4 bg-white shadow rounded-lg border border-gray-200">
58
<p class="text-gray-800 whitespace-pre-wrap"><%= post.text %></p>
59
<div class="mt-2 text-xs text-gray-500">
60
<%= Calendar.strftime(post.timestamp, "%Y-%m-%d %H:%M:%S") %>
61
</div>
62
</div>
63
<% end %>
64
<%= if Enum.empty?(@posts) do %>
65
<p class="text-gray-500 italic">Waiting for posts mentioning muenster...</p>
66
<% end %>
67
</div>
68
</div>
69
"""
70
end
71
72
def head_tags(assigns) do
73
~H"""
74
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
75
<%= for meta <- @meta_attrs do %>
76
<%= if Map.has_key?(meta, :name) do %>
77
<meta name={meta.name} content={meta.content}/>
78
<% else %>
79
<meta property={meta.property} content={meta.content}/>
80
<% end %>
81
<% end %>
82
<title><%= @page_title %></title>
83
"""
84
end
85
end
86