diff --git a/assets/js/app.js b/assets/js/app.js index f8cdc58..03b4292 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -3,10 +3,8 @@ // its own CSS file. import "../css/app.scss" -import "@fontsource/inter/400.css"; import "@fontsource/inter/variable.css"; - // webpack automatically bundles all modules in your // entry points. Those entry points can be configured // in "webpack.config.js". diff --git a/lib/zcash_explorer/application.ex b/lib/zcash_explorer/application.ex index 9e34d18..98bca5e 100644 --- a/lib/zcash_explorer/application.ex +++ b/lib/zcash_explorer/application.ex @@ -37,7 +37,8 @@ defmodule ZcashExplorer.Application do warmer(module: ZcashExplorer.Metrics.NetworkSolpsWarmer, state: {}), warmer(module: ZcashExplorer.Blocks.BlockWarmer, state: {}), warmer(module: ZcashExplorer.Transactions.TransactionWarmer, state: {}), - warmer(module: ZcashExplorer.Mempool.MempoolWarmer, state: {}) + warmer(module: ZcashExplorer.Mempool.MempoolWarmer, state: {}), + warmer(module: ZcashExplorer.Nodes.NodeWarmer, state: {}) ]} ] diff --git a/lib/zcash_explorer/nodes/nodes_warmer.ex b/lib/zcash_explorer/nodes/nodes_warmer.ex new file mode 100644 index 0000000..c0806eb --- /dev/null +++ b/lib/zcash_explorer/nodes/nodes_warmer.ex @@ -0,0 +1,24 @@ +defmodule ZcashExplorer.Nodes.NodeWarmer do + use Cachex.Warmer + + @doc """ + Returns the interval for this warmer. + """ + def interval, + do: :timer.seconds(60) + + @doc """ + Executes this cache warmer. + """ + def execute(_state) do + Zcashex.getpeerinfo() |> handle_result() + end + + # ignores the warmer result in case of error + defp handle_result({:error, _reason}), + do: :ignore + + defp handle_result({:ok, nodes}) do + {:ok, [{"zcash_nodes", nodes}]} + end +end diff --git a/lib/zcash_explorer_web/live/nodes_live.ex b/lib/zcash_explorer_web/live/nodes_live.ex new file mode 100644 index 0000000..487c0a0 --- /dev/null +++ b/lib/zcash_explorer_web/live/nodes_live.ex @@ -0,0 +1,53 @@ +defmodule ZcashExplorerWeb.NodesLive do + use Phoenix.LiveView + + def render(assigns) do + ~L""" +
+ + + + + + + + + + <%= for node <- @zcash_nodes do %> + + + + + + <% end %> + +
AddressVersionBlock Height
+ <%= node["addr"] %> + + <%= node["subver"] %> + + <%= node["synced_blocks"] %> +
+
+ """ + end + + @impl true + def mount(_params, _session, socket) do + if connected?(socket), do: Process.send_after(self(), :update, 5000) + + case Cachex.get(:app_cache, "zcash_nodes") do + {:ok, zcash_nodes} -> + {:ok, assign(socket, :zcash_nodes, zcash_nodes)} + + {:error, _reason} -> + {:ok, assign(socket, :zcash_nodes, "loading...")} + end + end + + def handle_info(:update, socket) do + Process.send_after(self(), :update, 5000) + {:ok, zcash_nodes} = Cachex.get(:app_cache, "zcash_nodes") + {:noreply, assign(socket, :zcash_nodes, zcash_nodes)} + end +end diff --git a/lib/zcash_explorer_web/live/raw_mempool_live.ex b/lib/zcash_explorer_web/live/raw_mempool_live.ex index cac56d8..b112a99 100644 --- a/lib/zcash_explorer_web/live/raw_mempool_live.ex +++ b/lib/zcash_explorer_web/live/raw_mempool_live.ex @@ -17,7 +17,7 @@ defmodule ZcashExplorerWeb.RawMempoolLive do <%= for tx <- @raw_mempool do %> - + <%= tx["txid"] %> diff --git a/lib/zcash_explorer_web/router.ex b/lib/zcash_explorer_web/router.ex index d9feaec..f9138a5 100644 --- a/lib/zcash_explorer_web/router.ex +++ b/lib/zcash_explorer_web/router.ex @@ -30,6 +30,7 @@ defmodule ZcashExplorerWeb.Router do live "/index/recent_blocks", RecentBlocksLive live "/index/recent_transactions", RecentTransactionsLive live "/live/raw_mempool", RawMempoolLive + live "/live/nodes", NodesLive get "/broadcast", PageController, :broadcast post "/broadcast", PageController, :do_broadcast get "/payment-disclosure", PageController, :disclosure diff --git a/lib/zcash_explorer_web/templates/layout/app.html.eex b/lib/zcash_explorer_web/templates/layout/app.html.eex index 1c513c3..4b119a6 100644 --- a/lib/zcash_explorer_web/templates/layout/app.html.eex +++ b/lib/zcash_explorer_web/templates/layout/app.html.eex @@ -11,7 +11,7 @@
- Block Explorer + Block Explorer ( beta )
@@ -50,8 +50,12 @@ Heroicon name: outline/x" x-state:on="Menu open" x-state:off="Menu closed" class