packages feed

servant-htmx-0.1.0.0: src/Servant/HTMX.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE OverloadedStrings #-}

module Servant.HTMX where

import Data.Text
import Servant
import Servant.API
import Servant.Server

-- | Request headers (sent by the client to the server)
type HXRequest = Header "HX-Request" Text
type HXTriggerId = Header "HX-Trigger" Text
type HXTriggerName = Header "HX-Trigger-Name" Text
type HXTarget = Header "HX-Target" Text
type HXPrompt = Header "HX-Prompt" Text

-- | Response headers (sent by the server to the client)
type HXPush = Header "HX-Push" Text -- use safelinks
type HXRedirect = Header "HX-Redirect" Text -- use safelinks
type HXRefresh = Header "HX-Refresh" Text 
type HXTrigger = Header "HX-Trigger" Text
type HXTriggerAfterSwap = Header "HX-Trigger-After-Swap" Text
type HXTriggerAfterSettle = Header "HX-Trigger-After-Settle" Text

-- | Example usage of htmx header types
type ExampleAPI = HXRequest :> Get '[JSON] Text
                :<|> HXTriggerId :> Post '[JSON] Text
                :<|> "somePath" :> Get '[JSON] (Headers '[HXPush, HXRedirect] Text)

exampleServer :: Server ExampleAPI
exampleServer = exampleGetHandler
              :<|> examplePostHandler
              :<|> exampleSomePathHandler
  where
    exampleGetHandler :: Maybe Text -> Handler Text
    exampleGetHandler mb = case mb of
      Just "true" -> pure "The request was sent to the server by htmx" 
      _ -> pure "The request wasn't sent to the server by htmx" 

    examplePostHandler :: Maybe Text -> Handler Text
    examplePostHandler mb = case mb of
      Just "adminPanel" -> pure "The request was triggered by the admin panel" 
      _ -> pure "The request wasn't triggered by the admin panel" 

    exampleSomePathHandler :: Handler (Headers '[HXPush, HXRedirect] Text)
    exampleSomePathHandler = pure $ noHeader $ addHeader "someURLForRedirect" "This response has htmx headers" 

exampleApp :: Application
exampleApp = serve (Proxy :: Proxy ExampleAPI) exampleServer