I have a stateful LiveComponent where I would like to handle a timeout. This timeout should occur a few seconds after one of the
handle_event functions is no longer being called.
I already did this in a LiveView and it was super easy: I call
Process.send_after and do the work in the matching
handle_info that is called with
socket as a parameter.
In a LiveComponent,
handle_info does not exist. Handling this in the parent LiveView won’t work because I need to alter the
socket from the component but the
socket passed to
handle_infois the parent LiveView’s
In every scenario I tried I end up with the following problem: at one point I need to update the
socket after the delay, so I do something like this:
def start_timeout(socket) do
<send event with the socket with whatever tool>
The problem with this approach is that there is no garantee that the socket was not altered during the sleep time. And I really have no idea, with my actual knowledge of Elixir and Phoenix, how to handle this case.
Any clues on how this can be done at the LiveComponent’s level? At this point the only solution I see is to migrate the LiveComponent’s code in the LiveView and use
handle_info from there. I know this is not the best solution as I would loose the modularity and end up with monolithic Liveviews. But I am just not ready to dig in LiveViews code to fully understand the inner logic.