import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = ["button"]
disable() {
this.buttonTarget.disabled = true
this.buttonTarget.dataset.previousText = this.buttonTarget.textContent
this.buttonTarget.textContent = "Liking…"
}
enable() {
this.buttonTarget.disabled = false
const prev = this.buttonTarget.dataset.previousText
if (prev) this.buttonTarget.textContent = prev
}
}
<%= button_to "Like", snip_likes_path(@snip), method: :post,
data: {
controller: "like",
like_target: "button",
action: "turbo:submit-start->like#disable turbo:submit-end->like#enable"
} %>
A small UX win: disable the like button immediately and re-enable on failure. Turbo gives you events; Stimulus coordinates button state and the server still returns the canonical count.