A Geolocation API example. See live here.
Tip
This requires installing nix with Nix Flakes enabled. Although not required, we recommend using miso's binary cache.
-----------------------------------------------------------------------------
data Action
= GetLocation
| ErrorLocation GeolocationError
| SetLocation Geolocation
deriving (Show, Eq)
-----------------------------------------------------------------------------
#ifdef WASM
foreign export javascript "hs_start" main :: IO ()
#endif
-----------------------------------------------------------------------------
main :: IO ()
main = run $ startApp app
-----------------------------------------------------------------------------
type Model = Maybe Geolocation
-----------------------------------------------------------------------------
app :: App Model Action
app = (component Nothing updateModel viewModel)
#ifndef WASM
{ styles =
[ Href "assets/style.css"
]
}
#endif
-----------------------------------------------------------------------------
updateModel :: Action -> Transition Model Action
updateModel = \case
GetLocation -> do
geolocation SetLocation ErrorLocation
SetLocation location -> do
this ?= location
ErrorLocation (GeolocationError _ err) ->
io_ (consoleError err)
Call nix develop
to enter a shell with GHC 9.12.2
$ nix develop --experimental-features nix-command --extra-experimental-features flakes
Once in the shell, you can call cabal run
to start the development server and view the application at http://localhost:8080
$ nix develop .#wasm --command bash -c "make"
$ nix develop .#ghcjs --command bash -c "build"
To host the built application you can call serve
$ nix develop .#wasm --command bash -c "serve"
$ nix develop .#wasm --command bash -c "make clean"
This comes with a GitHub action that builds and auto hosts the example.