1defmodule CometApp.PostPage do
2 use Hologram.Page
3
4 route "/posts/:id"
5
6 param :id, :integer
7
8 layout CometApp.MainLayout
9
10 def init(params, component, _server) do
11 # In real app, fetch from database
12 post = %{
13 id: params.id,
14 title: "Example Post",
15 content: "This is the full content...",
16 likes: 0
17 }
18
19 put_state(component, :post, post)
20 end
21
22 def template do
23 ~HOLO"""
24 <article>
25 <h1>{@post.title}</h1>
26 <p>{@post.content}</p>
27
28 <div class="likes">
29 Likes: {@post.likes}
30 <button $click="like_post">Like</button>
31 </div>
32 </article>
33 """
34 end
35
36 def action(:like_post, _params, component) do
37 # Update likes locally first for instant feedback
38 component
39 |> put_state([:post, :likes], component.state.post.likes + 1)
40 |> put_command(:save_like, post_id: component.state.post.id)
41 end
42
43 def command(:save_like, params, server) do
44 # In real app, save to database
45 IO.puts("Liked post #{params.post_id}")
46 server
47 end
48end