defmodule MoonWeb.Pages.Components.ToastPage do
@moduledoc false
use MoonWeb, :live_view
alias Moon.Components.Button
alias Moon.Components.Toast
alias Moon.Components.Toast.Message
alias Moon.Components.ToastStack
alias MoonWeb.Components.ExampleAndCode
alias MoonWeb.Components.Page
alias MoonWeb.Components.ComponentPageDescription
alias MoonWeb.Components.PropsTable
data(breadcrumbs, :any,
default: [
%{
to: "#",
name: "Components v1"
},
%{
to: "/components/toast",
name: "Toast"
}
]
)
data(props_info_array, :list,
default: [
%{
:name => ~c"type",
:type =>
~c"date | datetime-local\" | email | number | password | search | tel | text | url | time | url",
:required => ~c"No",
:default => ~c"text",
:description => ~c"Different types of input"
},
%{
:name => ~c"size",
:type => ~c"medium | large | xlarge",
:required => ~c"-",
:default => ~c"medium",
:description =>
~c"TODO - Size variant (currently only medium | large, with large as default)"
},
%{
:name => ~c"label",
:type => ~c"string",
:required => ~c"Yes",
:default => ~c"-",
:description => ~c"TODO - Should be required for medium size only"
},
%{
:name => ~c"placeholder",
:type => ~c"string",
:required => ~c"No",
:default => ~c"-",
:description => ~c"Placeholder for input"
},
%{
:name => ~c"field",
:type => ~c"atom",
:required => ~c"Yes",
:default => ~c"-",
:description => ~c"Field value for underlying phoenix text input component"
},
%{
:name => ~c"hint_text",
:type => ~c"slot",
:required => ~c"No",
:default => ~c"-",
:description => ~c"Informative or error message under input"
},
%{
:name => ~c"error",
:type => ~c"boolean",
:required => ~c"No",
:default => ~c"-",
:description => ~c"Set error state for input"
},
%{
:name => ~c"show_password_text",
:type => ~c"-",
:required => ~c"-",
:default => ~c"-",
:description =>
~c"TODO - Only for input type password. Text for toggle button: show/hide password"
},
%{
:name => ~c"background_color",
:type => ~c"string",
:required => ~c"No",
:default => ~c"-",
:description => ~c"Background color"
}
]
)
def handle_params(_params, uri, socket) do
{:noreply, assign(socket, uri: uri)}
end
def render(assigns) do
~F"""
Short, time-based messages that slide in and out of a page.
Toasts can be shown on top of the page and automatically disappear after a timeout. You should use ToastStack component for it.
<:example>
<:code>{toast_1_code()}
<:example>
<:code>{toast_2_code()}
<:example>
<:code>{toast_3_code()}
<:example>
<:code>{toast_4_code()}
"""
end
def handle_event("show_one_toast", _, socket) do
ToastStack.show(
%Message{
message: "Hey! Your toast is ready.",
variant: "success"
},
"toasts"
)
{:noreply, socket}
end
def handle_event("show_two_toasts", _, socket) do
ToastStack.show(
[
%Message{
message: "Hey! Another toast is ready.",
variant: "success"
},
%Message{
message: "And this is third one",
variant: "success"
}
],
"toasts"
)
{:noreply, socket}
end
def handle_event("show_variant_toasts", _, socket) do
ToastStack.show(variant_toasts(), "toasts")
{:noreply, socket}
end
def handle_event("show_action_toasts", _, socket) do
ToastStack.show(action_toasts(), "toasts")
{:noreply, socket}
end
def handle_info({:hide_toast, toast_id}, socket) do
ToastStack.hide_toast(toast_id, "toasts")
{:noreply, socket}
end
def variant_toasts do
[
%Message{id: "error_toast", message: "Error!", variant: "error"},
%Message{id: "warning_toast", message: "Warning.", variant: "warning"},
%Message{id: "info_toast", message: "Info.", variant: "info"},
%Message{id: "success_toast", message: "Success!", variant: "success"},
%Message{id: "no_icon_toast", message: "Default."}
]
end
def action_toasts do
[
%Message{
id: "closeable_toast",
message: "You can close this toast.",
variant: "success",
closeable: true
},
%Message{
id: "not_closeable_toast",
message: "You cannot close this toast.",
variant: "warning",
closeable: false
},
%Message{
id: "link_toast",
message: "Allow this app to access your location?",
variant: "info",
link_href: "#",
link_text: "Allow"
},
%Message{
id: "simple_link_toast",
message: "This toast has only text and a link.",
link_href: "#",
link_text: "Why?",
closeable: false
}
]
end
def toast_1_code do
"""
"""
end
def toast_2_code do
"""
alias Moon.Components.ToastStack
alias Moon.Components.Toast.Message
def handle_event("show_one_toast", _, socket) do
ToastStack.show(
%Message{
message: "Hey! Your toast is ready.",
variant: "success"
},
"toasts"
)
{:noreply, socket}
end
def handle_event("show_two_toasts", _, socket) do
ToastStack.show(
[
%Message{
message: "Hey! Another toast is ready.",
variant: "success"
},
%Message{
message: "And this is third one",
variant: "success"
}
],
"toasts"
)
{:noreply, socket}
end
def handle_info({:hide_toast, toast_id}, socket) do
ToastStack.hide_toast(toast_id, "toasts")
{:noreply, socket}
end
"""
end
def toast_3_code do
"""
"""
end
def toast_4_code do
"""
"""
end
end