packages feed

wikimusic-ssr-0.6.0.1: src/WikiMusic/SSR/View/Html.hs

{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module WikiMusic.SSR.View.Html () where

import Data.Map qualified as Map
import Data.Text qualified as T
import Free.AlaCarte
import Optics
import Relude
import Text.Blaze.Html
import Text.Blaze.Html5 as H
import Text.Blaze.Html5.Attributes as A
import WikiMusic.SSR.Free.View
import WikiMusic.SSR.Language
import WikiMusic.SSR.Model.Api
import WikiMusic.SSR.Model.Env
import WikiMusic.SSR.View.ArtistHtml
import WikiMusic.SSR.View.Components.Forms
import WikiMusic.SSR.View.Components.Meta
import WikiMusic.SSR.View.Components.PageTop
import WikiMusic.SSR.View.GenreHtml
import WikiMusic.SSR.View.SongHtml
import Prelude qualified

instance Exec View where
  -- artists
  execAlgebra (ArtistListPage env mode sortOrder l palette r next) =
    next =<< artistListPage' env mode sortOrder l palette r
  execAlgebra (ArtistDetailPage env mode language palette r next) =
    next =<< artistDetailPage' env mode language palette (Prelude.head . Map.elems $ r ^. #artists)
  execAlgebra (ArtistCreatePage env mode language palette next) =
    next =<< artistCreatePage' env mode language palette
  execAlgebra (ArtistEditPage env mode language palette artist next) =
    next =<< artistEditPage' env mode language palette artist
  -- genres
  execAlgebra (GenreListPage env mode sortOrder l palette r next) =
    next =<< genreListPage' env mode sortOrder l palette r
  execAlgebra (GenreDetailPage env mode language palette r next) =
    next =<< genreDetailPage' env mode language palette (Prelude.head . Map.elems $ r ^. #genres)
  execAlgebra (GenreCreatePage env mode language palette next) =
    next =<< genreCreatePage' env mode language palette
  execAlgebra (GenreEditPage env mode language palette genre next) =
    next =<< genreEditPage' env mode language palette genre
  -- songs
  execAlgebra (SongListPage env mode sortOrder language palette r next) =
    next =<< songListPage' env mode sortOrder language palette r
  execAlgebra (SongDetailPage env mode language palette songAsciiSize r next) =
    next =<< songDetailPage' env mode language palette songAsciiSize (Prelude.head . Map.elems $ r ^. #songs)
  execAlgebra (SongCreatePage env mode language palette next) =
    next =<< songCreatePage' env mode language palette
  execAlgebra (SongEditPage env mode language palette song next) =
    next =<< songEditPage' env mode language palette song
  execAlgebra (ErrorPage env mode language palette message next) =
    next =<< errorPage' env mode language palette message
  execAlgebra (LoginPage env mode language palette next) =
    next =<< loginPage' env mode language palette

errorPage' :: (MonadIO m) => Env -> UiMode -> Language -> Palette -> Text -> m Html
errorPage' env mode language palette message = do
  sharedHead <- mkSharedHead env mode palette ((^. #titles % #errorOccurred) |##| language)
  pure $ H.html $ do
    sharedHead
    body $ section $ do
      sharedPageTop (Just $ (^. #titles % #errorOccurred) |##| language) mode language palette
      h3 . text $ messageCauses
      H.pre ! class_ "font-size-small" $ text message
  where
    messageCauses :: Text
    messageCauses = T.intercalate " - " causeStrings
    causeStrings = catMaybes [Just "Error", if T.isInfixOf "504" message then Just "Gateway Timeout" else Nothing]

loginPage' :: (MonadIO m) => Env -> UiMode -> Language -> Palette -> m Html
loginPage' env mode language palette = do
  sharedHead <- mkSharedHead env mode palette ((^. #titles % #login) |##| language)
  pure $ H.html $ do
    sharedHead
    body $ section $ do
      sharedPageTop (Just $ (^. #titles % #login) |##| language) mode language palette
      section $ postForm "/login" $ do
        requiredEmailInput "email" ((^. #forms % #email) |##| language)
        requiredPasswordInput "password" ((^. #forms % #password) |##| language)
        submitButton language