|
13 | 13 | {-# LANGUAGE TypeOperators #-} |
14 | 14 | module Happstack.Authenticate.Client where |
15 | 15 |
|
| 16 | +import Control.Monad.Reader (ask) |
16 | 17 | import Control.Monad.Trans (MonadIO(liftIO)) |
17 | 18 | import Control.Concurrent (threadDelay) |
18 | 19 | import Control.Concurrent.STM.TVar (TVar, newTVarIO, modifyTVar', readTVar, writeTVar) |
19 | 20 | import Control.Concurrent.STM (atomically) |
20 | 21 | import Control.Lens ((&), (.~)) |
21 | 22 | import Control.Lens.TH (makeLenses) |
22 | | -import Chili.Types (Event(Change, ReadyStateChange, Submit), EventObject, InputEvent(Input), InputEventObject(..), IsJSNode, JSElement, JSNode, JSNodeList, StorageEvent(Storage), StorageEventObject, XMLHttpRequest, byteStringToArrayBuffer, createJSElement, ev, getData, getLength, item, key, unJSNode, fromJSNode, getChecked, getFirstChild, getOuterHTML, getValue, newXMLHttpRequest, nodeType, nodeValue, oldValue, open, preventDefault, querySelector, send, sendString, getOuterHTML, getStatus, getReadyState, getResponseByteString, getResponse, getResponseText, getResponseType, item, newValue, nodeListLength, parentNode, replaceChild, remove, sendArrayBuffer, setProperty, setRequestHeader, setResponseType, setTextContent, stopPropagation, toJSNode, url, window) |
| 23 | +import Chili.Types (Event(Change, ReadyStateChange, Submit), EventObject, InputEvent(Input), InputEventObject(..), IsJSNode, JSElement, JSNode, JSNodeList, ResourceEvent(Load), StorageEvent(Storage), StorageEventObject, XMLHttpRequest, byteStringToArrayBuffer, createJSElement, ev, getData, getLength, item, key, unJSNode, fromJSNode, getChecked, getFirstChild, getOuterHTML, getValue, newXMLHttpRequest, nodeType, nodeValue, oldValue, open, preventDefault, querySelector, send, sendString, getOuterHTML, getStatus, getReadyState, getResponseByteString, getResponse, getResponseText, getResponseType, item, newValue, nodeListLength, parentNode, replaceChild, remove, sendArrayBuffer, setProperty, setRequestHeader, setResponseType, setTextContent, stopPropagation, toJSNode, url, window) |
23 | 24 | import qualified Chili.Types as Chili |
24 | 25 | import qualified Data.Aeson as Aeson |
25 | 26 | import qualified Data.Aeson.Text as Aeson |
@@ -57,19 +58,27 @@ import Happstack.Authenticate.Password.Core(ChangePasswordData(..), UserPass(..) |
57 | 58 | import Happstack.Authenticate.Password.URL(AccountURL(Password), PasswordURL(Account, Token, PasswordRequestReset, PasswordReset),passwordAuthenticationMethod) |
58 | 59 | import GHC.Generics (Generic) |
59 | 60 | import GHCJS.DOM.Document (setCookie) |
| 61 | +import GHCJS.DOM.EventM (EventName, EventM) |
| 62 | +import qualified GHCJS.DOM.EventM as EventM |
| 63 | +import qualified GHCJS.DOM.GlobalEventHandlers as DOM (load) |
60 | 64 | import GHCJS.DOM.Location (Location, getSearch, setHref) |
61 | 65 | import qualified GHCJS.DOM.URLSearchParams as Search |
62 | 66 | import GHCJS.DOM.Window (getLocalStorage, getLocation) |
63 | 67 | import GHCJS.DOM.Storage (Storage, getItem, removeItem, setItem) |
64 | 68 | import GHCJS.DOM.StorageEvent (StorageEvent) |
65 | 69 | import qualified GHCJS.DOM.StorageEvent as StoragEvent |
66 | 70 | import qualified GHCJS.DOM as GHCJS |
| 71 | +import qualified GHCJS.DOM.Types as DOM |
67 | 72 | import System.IO (hFlush, stdout, hGetBuffering, hSetBuffering, BufferMode(..)) |
68 | 73 | import Text.Shakespeare.I18N (Lang, mkMessageFor, renderMessage) |
69 | 74 | import Unsafe.Coerce (unsafeCoerce) |
70 | 75 |
|
71 | 76 | import Web.Routes (RouteT(..), toPathInfo, toPathSegments) |
72 | 77 |
|
| 78 | + |
| 79 | +on :: (DOM.IsEvent e, DOM.IsEventTarget t) => t -> EventName t e -> (e -> IO ()) -> IO (IO ()) |
| 80 | +on elem eventName handler = EventM.on elem eventName (do e <- ask ; liftIO (handler e)) |
| 81 | + |
73 | 82 | debugPrint :: Show a => a -> IO () |
74 | 83 |
|
75 | 84 | #ifdef DEBUG |
@@ -989,10 +998,13 @@ initHappstackAuthenticateClient baseURL mTurnstileKey sps = |
989 | 998 | atomically $ modifyTVar' modelTV $ \m -> m { _turnstileToken = Just (textFromJSString token) } |
990 | 999 |
|
991 | 1000 | case mTurnstileKey of |
992 | | - Nothing -> pure () |
| 1001 | + Nothing -> |
| 1002 | + do debugStrLn "turnstile not enabled because no turnskile key was found." |
993 | 1003 | (Just siteKey) -> |
994 | 1004 | do tId <- turnstileRender "#cf-turnstile-widget" siteKey addTurnstileToken |
| 1005 | + debugStrLn "called turnstileRender" |
995 | 1006 | pure () |
| 1007 | + |
996 | 1008 | pure update |
997 | 1009 | -- addEventListener newNode (ev @Click) (logoutHandler (\url -> baseURL <> toPathInfo url) update modelTV) False |
998 | 1010 | -- listen for changes to local storage |
|
0 commit comments