{-# LANGUAGE CPP #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE TypeApplications #-} {-# OPTIONS_GHC -fno-warn-missing-signatures #-} module Main where import Control.Monad.Catch (MonadThrow) import Control.Monad.Reader (MonadIO) import Data.Proxy (Proxy (..)) import Language.Javascript.JSaddle (askJSM, runJSM) import Servant.API ((:<|>) (..)) import Shpadoinkle import Shpadoinkle.Backend.ParDiff (runParDiff) import Shpadoinkle.Html.Utils (getBody) import Shpadoinkle.Router (fullPageSPA, withHydration) #ifndef ghcjs_HOST_OS import Shpadoinkle.Router (MonadJSM) #endif import Shpadoinkle.Router.Client (client, runXHR) import UnliftIO (MonadUnliftIO (..), UnliftIO (..)) import Types import View newtype App a = App { runApp :: JSM a } deriving (Functor, Applicative, Monad, MonadIO, MonadThrow) #ifndef ghcjs_HOST_OS deriving (MonadJSM) #endif instance MonadUnliftIO App where {-# INLINE askUnliftIO #-} askUnliftIO = do ctx <- askJSM; return $ UnliftIO $ \(App m) -> runJSM m ctx instance CRUDSpaceCraft App where listSpaceCraft = App $ runXHR listSpaceCraftM getSpaceCraft x = App . runXHR $ getSpaceCraftM x updateSpaceCraft x y = App . runXHR $ updateSpaceCraftM x y createSpaceCraft x = App . runXHR $ createSpaceCraftM x deleteSpaceCraft x = App . runXHR $ deleteSpaceCraftM x (listSpaceCraftM :<|> getSpaceCraftM :<|> updateSpaceCraftM :<|> createSpaceCraftM :<|> deleteSpaceCraftM) = client (Proxy @ API) app :: JSM () app = fullPageSPA @ SPA runApp runParDiff (withHydration start) view getBody start routes main :: IO () main = do putStrLn "running app" runJSorWarp 8080 app