defmodule Snowhite.Modules.Rss do use Snowhite.Builder.Module alias __MODULE__ every(~d(25s), :scroll, &scroll/1) def mount(socket) do socket = socket |> assign(:news, []) send(self(), :updated) {:ok, socket} end def module_options do %{ feeds: :required, visible_news: {:optional, 3}, qr_codes: {:optional, true}, locale: {:optional, "en"}, persist_app: :required } end def render(assigns) do take = get_option(assigns, :visible_news) qr_code? = get_option(assigns, :qr_codes) locale = get_option(assigns, :locale) ~L""" """ end def format_date(locale, %DateTime{} = datetime) do Timex.from_now(datetime, locale) end def render_qr_code(%{qr_code: qr_code}) do EQRCode.svg(qr_code, viewbox: true) end def scroll(%{assigns: %{news: news}} = socket) do news = Enum.map(news, fn {name, list} -> {name, ListHelpers.cycle(list)} end) assign(socket, :news, news) end def handle_info(:updated, socket) do {:noreply, update(socket)} end defp update(socket) do news = Rss.Server.news() assign(socket, :news, news) end def applications(options) do feeds = Keyword.get(options, :feeds, []) qr_codes = Keyword.get(options, :qr_codes, true) persist_app = Keyword.fetch!(options, :persist_app) [ {Rss.Server, [feeds: feeds, qr_codes: qr_codes]}, {Rss.UrlShortener, [persist_app: persist_app]} ] end end