defmodule BlockBox.Views do @moduledoc """ Provides a generator for creating [views](https://api.slack.com/reference/surfaces/views). """ alias BlockBox.CompositionObjects, as: CO alias BlockBox.Utils, as: Utils @type view_type :: :modal | :home @doc """ Creates a [view payload](https://api.slack.com/reference/surfaces/views). ## Options Options are not included by default. * `:close` - `t:BlockBox.CompositionObjects.text_object/0` or String * `:submit` - `t:BlockBox.CompositionObjects.text_object/0` or String * `:private_metadata` - String * `:callback_id` - String * `:clear_on_close` - boolean * `:notify_on_close` - boolean * `:external_id` - String """ @spec build_view(view_type, String.t() | CO.plain_text_object(), list(map()), keyword()) :: map() def build_view(type, title, blocks, opts \\ []) def build_view(type, title, blocks, opts) when is_binary(title) do build_view(type, CO.text_object(title), blocks, opts) end def build_view(type, title, blocks, opts) do opts = Utils.convert_text_opts(opts, [:submit, :close]) %{ type: type, title: title, blocks: blocks } |> Map.merge(Enum.into(opts, %{})) end end