----------------------------------------------------------------------------
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE ExistentialQuantification  #-}
{-# LANGUAGE DerivingStrategies         #-}
{-# LANGUAGE OverloadedStrings          #-}
{-# LANGUAGE TypeApplications           #-}
{-# LANGUAGE RecordWildCards            #-}
{-# LANGUAGE LambdaCase                 #-}
-----------------------------------------------------------------------------
module Miso.UI.AlertDialog
  ( -- ** Component
    alertDialogComponent
    -- ** Types
  , AlertDialog (..)
    -- ** Constructors
  , emptyAlertDialog
  ) where
-----------------------------------------------------------------------------
import           Control.Monad
import           Language.Javascript.JSaddle ((#), jsg)
-----------------------------------------------------------------------------
import           Miso
import qualified Miso.Html.Element as H
import qualified Miso.Html.Event as E
import qualified Miso.Html.Property as P
-----------------------------------------------------------------------------
data AlertDialog
  = AlertDialog
  { AlertDialog -> MisoString
_alertDialogButton :: MisoString
  } deriving (AlertDialog -> AlertDialog -> Bool
(AlertDialog -> AlertDialog -> Bool)
-> (AlertDialog -> AlertDialog -> Bool) -> Eq AlertDialog
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AlertDialog -> AlertDialog -> Bool
== :: AlertDialog -> AlertDialog -> Bool
$c/= :: AlertDialog -> AlertDialog -> Bool
/= :: AlertDialog -> AlertDialog -> Bool
Eq, Int -> AlertDialog -> ShowS
[AlertDialog] -> ShowS
AlertDialog -> String
(Int -> AlertDialog -> ShowS)
-> (AlertDialog -> String)
-> ([AlertDialog] -> ShowS)
-> Show AlertDialog
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AlertDialog -> ShowS
showsPrec :: Int -> AlertDialog -> ShowS
$cshow :: AlertDialog -> String
show :: AlertDialog -> String
$cshowList :: [AlertDialog] -> ShowS
showList :: [AlertDialog] -> ShowS
Show)
-----------------------------------------------------------------------------
emptyAlertDialog :: AlertDialog
emptyAlertDialog :: AlertDialog
emptyAlertDialog = MisoString -> AlertDialog
AlertDialog MisoString
forall a. Monoid a => a
mempty
-----------------------------------------------------------------------------
data Action
  = ShowModal DOMRef
  | CloseDialog
-----------------------------------------------------------------------------
alertDialogComponent :: Component parent AlertDialog Action
alertDialogComponent :: forall parent. Component parent AlertDialog Action
alertDialogComponent = Component parent AlertDialog Action
forall parent. Component parent AlertDialog Action
vcomp
  where
    update_ :: Action -> Effect parent model action
update_ (ShowModal JSVal
domRef) = JSM () -> Effect parent model action
forall a parent model action. JSM a -> Effect parent model action
io_ (JSM () -> Effect parent model action)
-> JSM () -> Effect parent model action
forall a b. (a -> b) -> a -> b
$ do
      dialogRef <- JSVal -> JSM JSVal
nextSibling JSVal
domRef
      void $ dialogRef # ("showModal" :: MisoString) $ ()

    update_ Action
CloseDialog = JSM () -> Effect parent model action
forall a parent model action. JSM a -> Effect parent model action
io_ (JSM () -> Effect parent model action)
-> JSM () -> Effect parent model action
forall a b. (a -> b) -> a -> b
$ do
      dialog <- forall a. ToJSString a => a -> JSM JSVal
jsg @MisoString MisoString
"document"
        # ("getElementById" :: MisoString)
        ([MisoString] -> JSM JSVal) -> [MisoString] -> JSM JSVal
forall a b. (a -> b) -> a -> b
$ [MisoString
"alert-dialog-demo" :: MisoString]
      void $ dialog # ("close" :: MisoString) $ ()

    vcomp :: Component parent AlertDialog Action
vcomp = AlertDialog
-> (Action -> Effect parent AlertDialog Action)
-> (AlertDialog -> View AlertDialog Action)
-> Component parent AlertDialog Action
forall model action parent.
model
-> (action -> Effect parent model action)
-> (model -> View model action)
-> Component parent model action
component AlertDialog
emptyAlertDialog Action -> Effect parent AlertDialog Action
forall {parent} {model} {action}.
Action -> Effect parent model action
update_ ((AlertDialog -> View AlertDialog Action)
 -> Component parent AlertDialog Action)
-> (AlertDialog -> View AlertDialog Action)
-> Component parent AlertDialog Action
forall a b. (a -> b) -> a -> b
$ \AlertDialog
_ ->
      [Attribute Action]
-> [View AlertDialog Action] -> View AlertDialog Action
forall action model.
[Attribute action] -> [View model action] -> View model action
H.div_
      []
      [ [Attribute Action]
-> [View AlertDialog Action] -> View AlertDialog Action
forall action model.
[Attribute action] -> [View model action] -> View model action
H.button_
        [ MisoString -> Attribute Action
forall action. MisoString -> Attribute action
P.type_ MisoString
"button"
        , MisoString -> Attribute Action
forall action. MisoString -> Attribute action
P.class_ MisoString
"btn-outline"
        , (JSVal -> Action) -> Attribute Action
forall action. (JSVal -> action) -> Attribute action
E.onClickWith JSVal -> Action
ShowModal
        ]
        [ View AlertDialog Action
"Open alert dialog"
        ]
      , [Attribute Action]
-> [View AlertDialog Action] -> View AlertDialog Action
forall action model.
[Attribute action] -> [View model action] -> View model action
H.dialog_
          [ MisoString -> Attribute Action
forall action. MisoString -> Attribute action
P.id_ MisoString
"alert-dialog-demo"
          , MisoString -> Attribute Action
forall action. MisoString -> Attribute action
P.class_ MisoString
"dialog"
          , MisoString -> MisoString -> Attribute Action
forall action. MisoString -> MisoString -> Attribute action
P.aria_ MisoString
"labelledby" MisoString
"alert-dialog-title"
          , MisoString -> MisoString -> Attribute Action
forall action. MisoString -> MisoString -> Attribute action
P.aria_ MisoString
"describedby" MisoString
"alert-dialog-description"
          ]
          [ [Attribute Action]
-> [View AlertDialog Action] -> View AlertDialog Action
forall action model.
[Attribute action] -> [View model action] -> View model action
H.article_ []
            [ [Attribute Action]
-> [View AlertDialog Action] -> View AlertDialog Action
forall action model.
[Attribute action] -> [View model action] -> View model action
H.header_ []
              [ [Attribute Action]
-> [View AlertDialog Action] -> View AlertDialog Action
forall action model.
[Attribute action] -> [View model action] -> View model action
H.h2_
                [ MisoString -> Attribute Action
forall action. MisoString -> Attribute action
P.id_ MisoString
"alert-dialog-title"
                ]
                [ View AlertDialog Action
"Are you absolutely sure?"
                ]
              , [Attribute Action]
-> [View AlertDialog Action] -> View AlertDialog Action
forall action model.
[Attribute action] -> [View model action] -> View model action
H.p_
                [ MisoString -> Attribute Action
forall action. MisoString -> Attribute action
P.id_ MisoString
"alert-dialog-description"
                ]
                [ MisoString -> View AlertDialog Action
forall model action. MisoString -> View model action
text (MisoString -> View AlertDialog Action)
-> MisoString -> View AlertDialog Action
forall a b. (a -> b) -> a -> b
$
                    MisoString
"This action cannot be undone. " MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<>
                    MisoString
"This will permanently delete your" MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<>
                    MisoString
"account and remove your data from our servers."
                ]
              ]
            , [Attribute Action]
-> [View AlertDialog Action] -> View AlertDialog Action
forall action model.
[Attribute action] -> [View model action] -> View model action
H.footer_ []
              [ [Attribute Action]
-> [View AlertDialog Action] -> View AlertDialog Action
forall action model.
[Attribute action] -> [View model action] -> View model action
H.button_
                [ MisoString -> Attribute Action
forall action. MisoString -> Attribute action
P.class_ MisoString
"btn-outline"
                , Action -> Attribute Action
forall action. action -> Attribute action
E.onClick Action
CloseDialog
                ] [ View AlertDialog Action
"Cancel" ]
              , [Attribute Action]
-> [View AlertDialog Action] -> View AlertDialog Action
forall action model.
[Attribute action] -> [View model action] -> View model action
H.button_
                [ MisoString -> Attribute Action
forall action. MisoString -> Attribute action
P.class_ MisoString
"btn-primary"
                , Action -> Attribute Action
forall action. action -> Attribute action
E.onClick Action
CloseDialog
                ] [ View AlertDialog Action
"Continue" ]
              ]
            ]
          ]
        ]
-----------------------------------------------------------------------------