defmodule Snowhite.Modules.Weather.Forecast do use Snowhite.Builder.Module, config_key: :weather, topic: "snowhite:modules:weather" alias OpenWeather.Weather.WeatherItem alias Snowhite.Modules.Weather def mount(socket) do socket = update(socket) {:ok, socket} end def render(assigns) do case get_option(assigns, :display) do :inline -> render_inline(assigns) :topdown -> render_topdown(assigns) end end defp render_topdown(assigns) do units = get_option(assigns, :units) locale = get_option(assigns, :locale) ~L""" <%= for %{dt: dt, main: main, weather: [weather | _]} <- @forecasts do %> <% end %>
">

<%= round(main.temp) %>

<%= day_name(dt, locale) %>

""" end defp render_inline(assigns) do units = get_option(assigns, :units) locale = get_option(assigns, :locale) ~L"""
<%= for %{dt: dt, main: main, weather: [weather | _]} <- @forecasts do %>
">

<%= round(main.temp) %>

<%= String.at(day_name(dt, locale), 0) %>

<% end %>
""" end defp day_name(date, locale) do Timex.lformat!(date, "{WDfull}", locale) end def handle_info(:updated, socket) do {:noreply, update(socket)} end def update(socket) do forecasts = Weather.Server.forecasts() forecasts = Enum.filter(forecasts, fn forecast -> forecast.dt.hour == 12 end) assign(socket, :forecasts, forecasts) end def module_options do Map.put(Snowhite.Modules.Weather.module_options(), :display, {:optional, :topdown}) end defdelegate applications(options), to: Snowhite.Modules.Weather end