defmodule Snowhite.Modules.StockMarket do
use Snowhite.Builder.Module
import Snowhite.Builder.Module
alias __MODULE__
alias __MODULE__.Symbol
def mount(socket) do
send(self(), :updated)
socket = assign(socket, :prices, [])
{:ok, socket}
end
def module_options do
%{
symbols: :required,
adapter: {:optional, StockMarket.Adapters.Finnhub},
adapter_options: {:optional, []},
timezone: {:optional, "UTC"}
}
end
def render(assigns) do
~L"""
<%= for {_, %Symbol{symbol: symbol, value: value, change: change}} <- @prices do %>
<%= symbol %>
<%= format_money(value) %>
<%= format_money(change) %>
<% end %>
"""
end
defp format_money(value) do
value
|> Float.round(2)
|> to_string()
|> pad_money()
end
defp pad_money(value) do
[integer, floating] = String.split(value, ".")
"#{integer}.#{String.pad_trailing(floating, 2, "0")}"
end
defp color(value) when value > 0, do: "positive"
defp color(value) when value < 0, do: "negative"
defp color(_value), do: "even"
def handle_info(:updated, socket) do
prices = StockMarket.Server.prices()
socket = assign(socket, :prices, prices)
{:noreply, socket}
end
def applications(options) do
[
{StockMarket.Server, options}
]
end
end