1st project here. Trying to attach a hook. I’ve spent hours logging everything I can think of to figure out why I can see my hook mount and even verify it mounts to the id I gave the element, but nothing I do will fire it.
Is there a way to trigger it from F12 console to confirm it’s even there? I tried this, but get true, and no console.log that I’m expecting:
I’m so new at phx that I’m sure it’s something silly. I even stumbled on possibly using phx-update=“ignore” which seemed counterintuitive, but I’m stumped. AI is no help at all, it makes stuff up. So I’d hoped if I understood where the event is actually put in the dom I could see if it’s even there. AI just made stuff up:
“My previous suggestions regarding __phoenixHooks and __phxHookInstances were incorrect in terms of how you directly access hook instances on DOM elements in the browser console.”
What are you trying to do with the hook first? revealTextArea implies showing / hiding something which can be done more simply either with CSS and HTML (eg a <detail> component) or with the JS functions like toggle.
If you just want to get a hook working start with something very simple that adds a class to change the color of the element clicked. That way you can proceed in steps and see if the problem is defining the hook, or what the hook does.
It doesn’t work, no matter where I put it. I call it like this and console logs tell me it’s called
This implies that the hook is “hooked up” correctly, suggesting that what you have written in the hook doesn’t do what you expect it to do.
There is a server side delayed typing simulation response being pushed and that’s working. When the simulation completes I used push_event(socket, “introduction_complete”, %{}) to try to tell the dom that the process was complete and to show the textbox, but now all I have it doing is writing a console.log, which isn’t happening after sending the event.
I must misunderstand push_event, does it require that the client side rerender to trigger it? I’d thought liveview was controlling the dom and not the other way around. More than the specific functionality that’s what I’m trying to understand. Since pushing the event doesn’t trigger the console log I’m pretty sure I can’t change css or anything else really.
Thank you again! I’m sure that’s the concept I’m not getting, here’s the server side handler that triggers it, everything is working except for the hook:
def handle_info({:type_next_char, line_index, char_index, lines}, socket) do
IO.puts("handle_info called with line_index: #{line_index}, char_index: #{char_index}")
if line_index < length(lines) do
line = Enum.at(lines, line_index)
if char_index < String.length(line) do
char = String.at(line, char_index)
new_content = socket.assigns.typed_content <> char
socket =
socket
|> assign(:typed_content, new_content)
|> assign(:dummy_messages, [%{List.first(socket.assigns.dummy_messages) | content: new_content}])
Process.send_after(self(), {:type_next_char, line_index, char_index + 1, lines}, 50)
{:noreply, socket}
else
# Move to next line with a pause
if line_index + 1 < length(lines) do
new_content = socket.assigns.typed_content <> "\n"
socket =
socket
|> assign(:typed_content, new_content)
|> assign(:dummy_messages, [%{List.first(socket.assigns.dummy_messages) | content: new_content}])
Process.send_after(self(), {:type_next_char, line_index + 1, 0, lines}, 1000)
{:noreply, socket}
else
# Typing is complete
socket = assign(socket, :typing_active, false)
IO.puts("Typing simulation complete, sending introduction_complete event")
push_event(socket, "introduction_complete", %{})
{:noreply, socket}
end
end
else
{:noreply, socket}
end
end
Server console:
handle_info called with line_index: 1, char_index: 1
Typing simulation complete, sending introduction_complete event
The hook is just JS that gets added to the bundle. It is available on liveSocket.hooks. in the console but whether you can “trigger” it really depends on what the hook does. In general though I wouldn’t recommend that approach because the app cares about how it gets triggered by phoenix, so that’s what you should test and see in dev.