thomashoneyman/purescript-halogen-hooks

Fork in initializer fails to update state

JordanMartinez opened this issue · 1 comments

I'm not sure whether this is a bug with Halogen or with Halogen Hooks. Paste the below code into https://try.purescript.org and you'll see that Loading never changes to Loading...:

module Main where

import Prelude

import Data.Maybe (Maybe(..))
import Data.Monoid (power)
import Data.Tuple.Nested ((/\))
import Effect (Effect)
import Effect.Aff (Aff, Milliseconds(..), delay)
import Halogen (liftAff)
import Halogen as H
import Halogen.Aff (awaitBody, runHalogenAff)
import Halogen.HTML as HH
import Halogen.Hooks as Hooks
import Halogen.VDom.Driver (runUI)

main :: Effect Unit
main = runHalogenAff do
  body <- awaitBody
  runUI loading unit body

loading :: forall q i o. H.Component HH.HTML q i o Aff
loading = Hooks.component \_ _ -> Hooks.do
  state /\ stateId <- Hooks.useState (-1)
  Hooks.useLifecycleEffect do
    id <- Hooks.fork do
      liftAff $ delay (Milliseconds 300.0)
      Hooks.modify_ stateId (\s -> if s == 2 then 0 else s + 1)
    pure $ Just do
      Hooks.kill id

  Hooks.pure $
    HH.h1_
      -- Should look like "Loading" -> "Loading." -> "Loading.." -> "Loading..."
      [ HH.text $ "Loading" <> (power "." state) ]

I can reproduce this with just plain Halogen, so I'm pretty sure I'm doing something wrong here, or there is a bug in Halogen. Closing.