{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Data.Morpheus.Server.Playground
  ( httpPlayground,
  )
where

import Data.ByteString.Lazy.Char8 (ByteString)
import Data.Functor (fmap)
import Data.Semigroup ((<>))
import Prelude
  ( (.),
    mconcat,
  )

link :: ByteString -> ByteString -> ByteString
link :: ByteString -> ByteString -> ByteString
link ByteString
rel ByteString
href = ByteString
"<link rel=\"" forall a. Semigroup a => a -> a -> a
<> ByteString
rel forall a. Semigroup a => a -> a -> a
<> ByteString
"\"  href=\"" forall a. Semigroup a => a -> a -> a
<> ByteString
href forall a. Semigroup a => a -> a -> a
<> ByteString
"\" />"

meta :: [(ByteString, ByteString)] -> ByteString
meta :: [(ByteString, ByteString)] -> ByteString
meta [(ByteString, ByteString)]
attr = ByteString
-> [(ByteString, ByteString)] -> [ByteString] -> ByteString
t ByteString
"meta" [(ByteString, ByteString)]
attr []

tag :: ByteString -> [ByteString] -> ByteString
tag :: ByteString -> [ByteString] -> ByteString
tag ByteString
tagName = ByteString
-> [(ByteString, ByteString)] -> [ByteString] -> ByteString
t ByteString
tagName []

t :: ByteString -> [(ByteString, ByteString)] -> [ByteString] -> ByteString
t :: ByteString
-> [(ByteString, ByteString)] -> [ByteString] -> ByteString
t ByteString
tagName [(ByteString, ByteString)]
attr [ByteString]
children =
  ByteString
"<" forall a. Semigroup a => a -> a -> a
<> ByteString
tagName forall a. Semigroup a => a -> a -> a
<> ByteString
" " forall a. Semigroup a => a -> a -> a
<> forall a. Monoid a => [a] -> a
mconcat (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall {a}. (Semigroup a, IsString a) => (a, a) -> a
renderAttr [(ByteString, ByteString)]
attr) forall a. Semigroup a => a -> a -> a
<> ByteString
" >" forall a. Semigroup a => a -> a -> a
<> forall a. Monoid a => [a] -> a
mconcat [ByteString]
children forall a. Semigroup a => a -> a -> a
<> ByteString
"</" forall a. Semigroup a => a -> a -> a
<> ByteString
tagName forall a. Semigroup a => a -> a -> a
<> ByteString
">"
  where
    renderAttr :: (a, a) -> a
renderAttr (a
name, a
value) = a
name forall a. Semigroup a => a -> a -> a
<> a
"=\"" forall a. Semigroup a => a -> a -> a
<> a
value forall a. Semigroup a => a -> a -> a
<> a
"\" "

script :: [(ByteString, ByteString)] -> [ByteString] -> ByteString
script :: [(ByteString, ByteString)] -> [ByteString] -> ByteString
script = ByteString
-> [(ByteString, ByteString)] -> [ByteString] -> ByteString
t ByteString
"script"

html :: [ByteString] -> ByteString
html :: [ByteString] -> ByteString
html = ByteString -> ByteString
docType forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString
-> [(ByteString, ByteString)] -> [ByteString] -> ByteString
t ByteString
"html" []

docType :: ByteString -> ByteString
docType :: ByteString -> ByteString
docType ByteString
x = ByteString
"<!DOCTYPE html>" forall a. Semigroup a => a -> a -> a
<> ByteString
x

httpPlayground :: ByteString
httpPlayground :: ByteString
httpPlayground =
  [ByteString] -> ByteString
html
    [ ByteString -> [ByteString] -> ByteString
tag
        ByteString
"head"
        [ [(ByteString, ByteString)] -> ByteString
meta [(ByteString
"charset", ByteString
"utf-8")],
          [(ByteString, ByteString)] -> ByteString
meta
            [ (ByteString
"name", ByteString
"viewport"),
              (ByteString
"content", ByteString
"user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, minimal-ui")
            ],
          ByteString -> [ByteString] -> ByteString
tag ByteString
"title" [ByteString
"GraphQL Playground"],
          ByteString -> ByteString -> ByteString
link ByteString
"stylesheet" ByteString
"//cdn.jsdelivr.net/npm/graphql-playground-react/build/static/css/index.css",
          ByteString -> ByteString -> ByteString
link ByteString
"shortcut icon" ByteString
"//cdn.jsdelivr.net/npm/graphql-playground-react/build/favicon.png",
          [(ByteString, ByteString)] -> [ByteString] -> ByteString
script
            [(ByteString
"src", ByteString
"//cdn.jsdelivr.net/npm/graphql-playground-react/build/static/js/middleware.js")]
            []
        ],
      ByteString -> [ByteString] -> ByteString
tag
        ByteString
"body"
        [ ByteString
-> [(ByteString, ByteString)] -> [ByteString] -> ByteString
t ByteString
"div" [(ByteString
"id", ByteString
"root")] [],
          [(ByteString, ByteString)] -> [ByteString] -> ByteString
script
            []
            [ ByteString
"  window.addEventListener('load', (_) => \
              \    GraphQLPlayground.init(document.getElementById('root'), {}) \
              \  );"
            ]
        ]
    ]