We can't find the internet
Attempting to reconnect
Something went wrong!
Hang in there while we get back on track
Post 14
Game Site Journal - 05
Published on: 2025-04-13
Tags:
elixir, Blog, Side Project, LiveView, Game Site, Html/CSS, Buttons
So for this post I wanted to go over something that I wanted to add to my games. A Wager button. So for this to work I wanted to be able to send the info for the amount wagered as well as the answer. In the case for the Guessing Game I have hard coded a few buttons (10 that is) that are the number that a player would submit. <div class="grid grid-cols-5 gap-x-3 gap-y-1 max-w-md mx-auto mt-4"> <%= for guess <- 1..10 do %> <.simple_form for={@form} phx-submit="answer" class="text-center"> <.input type="hidden" field={@form[:guess]} value={guess} /> <.button type="submit" class="w-full" phx-hook="CopyBonus"> {guess} </.button> </.simple_form> <% end %> </div> This will create 10 buttons for the user to submit. When I wanted to add a cell for a player to increase their bet simply adding a new .input added it to every cell... Adding it to a single button made it so only the button in question had the wager param sent... This is where adding a hidden field from an other section comes in handy. First create your new cell <div class="max-w-md mx-auto mt-4"> <label for="bonus_input" class="block text-sm font-medium text-gray-700 mb-1"> Wager </label> <input type="number" id="wager_input" name="wager_visible" min="1" value="1" max={@score} step="1" class="w-full rounded-md border-gray-300 shadow-sm" /> </div> Then add this to the .simple_form as an other input <div class="grid grid-cols-5 gap-x-3 gap-y-1 max-w-md mx-auto mt-4"> <%= for guess <- 1..10 do %> <.simple_form for={@form} phx-submit="answer" class="text-center"> <.input type="hidden" field={@form[:guess]} value={guess} /> <input type="hidden" name="wager" id={"wager_hidden_#{guess}"} /> <.button type="submit" class="w-full" phx-hook="CopyBonus"> {guess} </.button> </.simple_form> <% end %> </div> You can see that the id is a string interpolation, so that we can add in the guess id as a well as call the input that is outside the current loop for the buttons. So in the end we have a new input that we can take a wager. In order to add the wager to the score calculation. Now that that is in place we need to add in a Hook on the app.js code: Hooks.CopyBonus = { mounted() { this.el.addEventListener("click", (e) => { const visible = document.getElementById("wager_input") const guess = this.el.getAttribute("data-guess") const hidden = document.getElementById(`wager_hidden_${guess}`) if (visible && hidden) { hidden.value = visible.value || "1" } }) } } This sets the phx-hook let liveSocket = new LiveSocket("/live", Socket, { hooks: Hooks, // Make sure this is capitalized this adds in the new Hook longPollFallbackMs: 2500, params: { _csrf_token: csrfToken } }) The last bit after this was to be sure that the different params were being used correctly. So I made a check for a win or a loss and changed all the score changes to: parsed_wager = parse_wager(wager) |> add_subtract_wager(guess, to_string(socket.assigns.answer)) socket.assigns.score + parsed_wager defp parse_wager(nil), do: 1 defp parse_wager(""), do: 1 defp parse_wager(wager) do case Integer.parse(wager) do {int, _} -> int :error -> 1 end end defp add_subtract_wager(wager, guess, answer) do if guess == answer do wager else wager * -1 end end This was all the new functions needed.
