# `Mob.Alert`
[🔗](https://github.com/genericjam/mob/blob/main/lib/mob/alert.ex#L1)

Native alert dialogs, action sheets, and toast messages.

All functions return the socket unchanged so they can be pipelined.

## Alert

Centered modal dialog for confirmations and errors. Maps to
`UIAlertController(.alert)` on iOS and `AlertDialog` on Android.

    def handle_event("delete", _params, socket) do
      Mob.Alert.alert(socket,
        title: "Delete item?",
        message: "This cannot be undone.",
        buttons: [
          [label: "Delete", style: :destructive, action: :confirmed_delete],
          [label: "Cancel", style: :cancel]
        ]
      )
    end

    def handle_info({:alert, :confirmed_delete}, socket) do
      {:noreply, do_delete(socket)}
    end

## Action sheet

Bottom-anchored list for choosing between actions. Maps to
`UIAlertController(.actionSheet)` on iOS and a list dialog on Android.

    Mob.Alert.action_sheet(socket,
      title: "Share photo",
      buttons: [
        [label: "Save to Photos", action: :save],
        [label: "Copy link",      action: :copy],
        [label: "Cancel",         style: :cancel]
      ]
    )

## Toast

Ephemeral status message. No button, no callback.

    Mob.Alert.toast(socket, "Saved!", duration: :short)

iOS renders a floating label overlay (no native equivalent).
Android uses `Toast`.

## Button options

| Key | Values | Default |
|-----|--------|---------|
| `:label` | string | `""` |
| `:style` | `:default`, `:cancel`, `:destructive` | `:default` |
| `:action` | atom delivered as `{:alert, atom}` | `:dismiss` |

Cancel-style buttons send `{:alert, :dismiss}` when tapped unless you
specify a different `:action`.

# `action_sheet`

```elixir
@spec action_sheet(
  Mob.Socket.t(),
  keyword()
) :: Mob.Socket.t()
```

Show a bottom-anchored action sheet.

Result arrives as `{:alert, action_atom}` in `handle_info/2`.

# `alert`

```elixir
@spec alert(
  Mob.Socket.t(),
  keyword()
) :: Mob.Socket.t()
```

Show a centered alert dialog.

Result arrives as `{:alert, action_atom}` in `handle_info/2`.
Dismissing the dialog without tapping a button (e.g. Android back gesture)
sends `{:alert, :dismiss}`.

# `toast`

```elixir
@spec toast(Mob.Socket.t(), String.t(), keyword()) :: Mob.Socket.t()
```

Show a brief ephemeral toast message. No callback.

Options:
  - `:duration` — `:short` (default, ~2 s) or `:long` (~4 s)

---

*Consult [api-reference.md](api-reference.md) for complete listing*
