# `Soundcheck.Check.Warning.UnhandledEvent`
[🔗](https://github.com/leonqadirie/soundcheck/blob/v0.1.0/lib/soundcheck/check/warning/unhandled_event.ex#L1)

## Basics

> #### This check is disabled by default. {: .neutral}
>
> [Learn how to enable it](`e:credo:config_file.html#checks`) via `.credo.exs`.

This check has a base priority of `high` and works with any version of Elixir.

## Explanation

Flags template events that no `handle_event/3` clause in the receiving
LiveView or LiveComponent accepts. LiveView crashes the process when
such an event arrives.

Before:

    <button phx-click="sav">Save</button>

    def handle_event("save", params, socket), do: ...

After:

    <button phx-click="save">Save</button>

The check follows LiveView's routing. Without `phx-target`, an event
goes to the LiveView that renders the element, also from inside a
LiveComponent or a function component (every LiveView that renders
the component must handle it). With `phx-target={@myself}`, it goes
to the LiveComponent that renders the element. `JS.push` events and
their `target:` option follow the same rules.

A finding is unverifiable, and appears only in strict mode, when the
event name or target is dynamic, the target is a CSS selector, the
template has no known render path, or the receiver attaches handlers
with `attach_hook/4`. The message suggests the closest handled event
within a few edits.

A shared component may render an event only for some of its callers.
When the event sits inside conditions soundcheck cannot evaluate
(`:if={@actor.type != :service_account}`) and another receiver
handles it, the finding is unverifiable (`guarded`): the condition
may keep the event from rendering where it is unhandled. To have
soundcheck verify such a component, guard the event with a boolean
attr the callers pass as a literal:

    attr :show_admin_actions, :boolean, default: false

    <button :if={@show_admin_actions} phx-click="promote">Promote</button>

    <.member_panel show_admin_actions={true} />

A call site that passes `false`, or omits the attr, rules the event
out for its LiveView.

Confidence: high. Tier: semantic (run `mix compile` before `mix credo`).

## Check-Specific Parameters

Use the following parameters to configure this check:

### `:excluded_paths`

  Paths to skip (atoms, binaries as path segments, or regexes).

*This parameter defaults to* `[~r/\/test\//, "test"]`.

### `:ignore_events`

  Event names to skip: binaries or regexes.

*This parameter defaults to* `[]`.

### `:strict`

  Report unverifiable findings too.

*This parameter defaults to* `false`.

## General Parameters

Like with all checks, [general params](`e:credo:check_params.html`) can be applied.

Parameters can be configured via the [`.credo.exs` config file](`e:credo:config_file.html`).

---

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