Drab tutorial error

Ran into this error message when upgrading from 7.2 to 9.3 and a quick search brought me here. Error is

(ArgumentError) template `main` not found.

Please make sure this partial exists and has been compiled
by Drab (has *.drab extension).

If you want to poke assign to the partial which belong to
the other view, you need to specify the view name in `poke/4`.

    (drab) lib/drab/live.ex:1014: Drab.Live.raise_partial_not_found/1
    (drab) lib/drab/live.ex:890: Drab.Live.assigns_for_partial/5
    (drab) lib/drab/live.ex:600: Drab.Live.do_poke/5

At first I was confused because I was calling poke/2 not poke/4 but after a bit of investigation I see that poke/2 ends up at do_poke/5 using a template id held in socket.assigns. It looks like something is clearing __drab_index: as it goes from __drab_index: “gi2dqnbygazdenbv” to __drab_index: nil in socket.assigns.

I suspect it is an exec_js call I use in the page_loaded callback:

{status, return_value} = exec_js(socket, "navigator.geolocation.watchPosition(function(pos){Drab.exec_elixir('position_changed', {\"lat\":pos.coords.latitude, \"lon\": pos.coords.longitude});}, function(err){}, {});", timeout: 1000)

The solution for me was to use peek/3 & poke/3 to be explicit about the template I want in the poke/peek calls instead of counting on the value to stay clean in assigns.

If I can isolate/verify that the cause of __drab_index getting reset to nil isn’t something in my code I will report it as a bug on github, but thought I would leave a quick note here in case I don’t get to that soon and others run into a similar issue.