defmodule WaevWeb.ExportsView do use WaevWeb, :view defp pp_date(datestr) do # TODO use timex to pretty-print dates (translations??) [d, m, y] = String.split(datestr, "/") |> Enum.map(&String.to_integer/1) y = 2000 + y m = Enum.at( [ "enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre" ], m - 1 ) "#{d} de #{m} de #{y}" end # Organize messages to make them easier to display # [Waev.Export.Message] -> [{Date, [{Side, [Waev.Export.Message]}]}] # Naming: ^-Days ^-Blocks^-Block def process_messages(messages) do messages |> Enum.reduce([], fn message, days -> [datestr, _timestr] = String.split(message.date, " ") side = message.side case days do # Insert message on the last block (same date, same side) [{^datestr, [{^side, block} | old_blocks]} | old_days] -> [{datestr, [{side, [message | block]} | old_blocks]} | old_days] # Insert message on new block (same date) # Old block must be reversed to keep messages in the correct order [{^datestr, [{old_side, old_block} | old_blocks]} | old_days] -> [ {datestr, [{side, [message]}, {old_side, old_block} | old_blocks]} | old_days ] # Insert message on new date # Old blocks must be reversed to keep days in the correct order [{old_datestr, old_blocks} | old_days] -> [{datestr, [{side, [message]}]}, {old_datestr, old_blocks} | old_days] # Ez. [] -> [{datestr, [{side, [message]}]}] end end) # Reverse messages, blocks and days, as they were appended in the list head # Enum.reduce is used to avoid double iteration with map + reverse |> Enum.reduce([], fn {date, blocks}, days -> blocks = Enum.reduce(blocks, [], fn {side, messages}, blocks -> [{side, Enum.reverse(messages)} | blocks] end) # Reverse days [{pp_date(date), blocks} | days] end) end def party_peek(assigns, party) do ~E"""