Skip to content

Commit 740c136

Browse files
feat: timer working
1 parent e5227e0 commit 740c136

File tree

4 files changed

+82
-12
lines changed

4 files changed

+82
-12
lines changed

assets/js/app.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,14 @@ import topbar from "../vendor/topbar"
2424
import { Sorting } from "./hooks/sorting"
2525
import { EmojiPicker } from "./hooks/emoji"
2626
import { QRCodeGenerator } from "./hooks/qrcode-generator"
27+
import { Timer } from "./hooks/timer"
2728

2829
// JS Hooks
2930
let Hooks = {}
3031
Hooks.Sorting = Sorting;
3132
Hooks.EmojiPicker = EmojiPicker;
3233
Hooks.QRCodeGenerator = QRCodeGenerator;
34+
Hooks.Timer = Timer;
3335

3436
let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content")
3537
let liveSocket = new LiveSocket("/live", Socket, {

assets/js/hooks/timer.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
export const Timer = {
2+
mounted() {
3+
const finishTime = parseInt(this.el.dataset.finishTime, 10);
4+
const timerElement = this.el;
5+
6+
const updateTimer = () => {
7+
const now = Math.floor(Date.now() / 1000);
8+
const remainingTime = Math.max(0, finishTime - now);
9+
10+
if (remainingTime <= 0) {
11+
clearInterval(timerInterval);
12+
timerElement.textContent = "00:00:00";
13+
this.pushEvent("end-time", {});
14+
return;
15+
}
16+
17+
const hours = Math.floor(remainingTime / 3600);
18+
const minutes = Math.floor((remainingTime % 3600) / 60);
19+
const seconds = remainingTime % 60;
20+
21+
timerElement.textContent = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
22+
};
23+
24+
const timerInterval = setInterval(updateTimer, 1000);
25+
updateTimer();
26+
27+
this.cleanup = () => {
28+
clearInterval(timerInterval);
29+
};
30+
},
31+
32+
destroyed() {
33+
this.cleanup();
34+
},
35+
};

lib/cesium_link_web/live/link_live/index.ex

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,15 @@ defmodule CesiumLinkWeb.LinkLive.Index do
6666

6767
{:noreply, socket}
6868
end
69+
70+
def handle_event("end-time",_, socket) do
71+
{:noreply, socket |> push_navigate(to: ~p"/admin/links")}
72+
end
73+
74+
def publish_in_future?(link) do
75+
case link.publish_at do
76+
nil -> false
77+
publish_at -> DateTime.compare(publish_at, DateTime.utc_now()) == :gt
78+
end
79+
end
6980
end

lib/cesium_link_web/live/link_live/index.html.heex

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,50 +15,72 @@
1515
</.header>
1616

1717
<.table id="links" rows={@streams.links} phx-hook="Sorting">
18-
<:col :let={{_id, _link}}>
19-
<% publish_future = _link.publish_at && DateTime.compare(_link.publish_at, DateTime.utc_now()) == :gt %>
18+
<:col :let={{_id, link}} >
19+
<% publish_future = publish_in_future?(link) %>
2020
<.icon name="hero-bars-3 cursor-pointer ml-4" class={"handle w-5 h-5 #{if publish_future, do: "opacity-50"}"} />
2121
</:col>
22+
2223
<:col :let={{_id, link}} label="Name">
23-
<% publish_future = link.publish_at && DateTime.compare(link.publish_at, DateTime.utc_now()) == :gt %>
24+
<% publish_future = publish_in_future?(link) %>
2425
<p class={"font-semibold text-zinc-900 #{if publish_future, do: "opacity-50"}"}><%= link.name %></p>
2526
</:col>
27+
2628
<:col :let={{_id, link}} label="Emoji">
27-
<% publish_future = link.publish_at && DateTime.compare(link.publish_at, DateTime.utc_now()) == :gt %>
29+
<% publish_future = publish_in_future?(link) %>
2830
<span class={if publish_future, do: "opacity-50"}>
2931
<.emoji code={link.emoji} />
3032
</span>
3133
</:col>
34+
3235
<:col :let={{_id, link}} label="URL">
33-
<% publish_future = link.publish_at && DateTime.compare(link.publish_at, DateTime.utc_now()) == :gt %>
36+
<% publish_future = publish_in_future?(link) %>
3437
<.link target="_blank" class={"hover:text-brand hover:underline #{if publish_future, do: "opacity-50"}"} navigate={link.url}>
3538
<%= truncate_elipsis(link.url, 50) %>
3639
</.link>
3740
</:col>
41+
42+
<:col :let={{_id, link}} label="Time Left">
43+
<% publish_future = publish_in_future?(link) %>
44+
<%= if publish_future do %>
45+
<div
46+
id="timer-countdown"
47+
phx-hook="Timer"
48+
data-finish-time={DateTime.to_unix(link.publish_at)}>
49+
00:00:00
50+
</div>
51+
<% else %>
52+
<h1>No time</h1>
53+
<% end %>
54+
</:col>
55+
3856
<:col :let={{_id, link}} label="Clicks">
39-
<% publish_future = link.publish_at && DateTime.compare(link.publish_at, DateTime.utc_now()) == :gt %>
57+
<% publish_future = publish_in_future?(link) %>
4058
<p class={if publish_future, do: "opacity-50"}>
4159
<%= link.visits %>
4260
</p>
4361
</:col>
62+
4463
<:col :let={{_id, link}} label="Attention">
45-
<% publish_future = link.publish_at && DateTime.compare(link.publish_at, DateTime.utc_now()) == :gt %>
64+
<% publish_future = publish_in_future?(link) %>
4665
<input type="checkbox" disabled={true} checked={link.attention} class={"self-center block rounded-md text-gray-600 #{if publish_future, do: "opacity-50"}"} />
47-
</:col>
48-
<:action :let={{_id, link}}>
49-
<% publish_future = link.publish_at && DateTime.compare(link.publish_at, DateTime.utc_now()) == :gt %>
66+
</:col>
67+
68+
<:action :let={{_id, link}} >
69+
<% publish_future = publish_in_future?(link) %>
5070
<.link patch={~p"/admin/links/#{link}/edit"}>
5171
<.icon name="hero-pencil" class={"w-5 h-5 #{if publish_future, do: "opacity-50"}"} />
5272
</.link>
5373
</:action>
54-
<:action :let={{_id, link}}>
55-
<% publish_future = link.publish_at && DateTime.compare(link.publish_at, DateTime.utc_now()) == :gt %>
74+
75+
<:action :let={{_id, link}} >
76+
<% publish_future = publish_in_future?(link) %>
5677
<.link patch={~p"/admin/links/#{link}/archive"}>
5778
<.icon name="hero-archive-box" class={"w-5 h-5 #{if publish_future, do: "opacity-50"}"} />
5879
</.link>
5980
</:action>
6081
</.table>
6182

83+
6284
<.modal :if={@live_action in [:new, :edit]} id="link-modal" show on_cancel={JS.patch(~p"/admin/links")}>
6385
<.live_component module={CesiumLinkWeb.LinkLive.FormComponent} id={@link.id || :new} title={@page_title} action={@live_action} link={@link} patch={~p"/admin/links"} />
6486
</.modal>

0 commit comments

Comments
 (0)