diff options
author | Roman Smrž <roman.smrz@seznam.cz> | 2025-03-27 20:14:41 +0100 |
---|---|---|
committer | Roman Smrž <roman.smrz@seznam.cz> | 2025-03-31 21:57:36 +0200 |
commit | e403bd9f9383686fb7b681532386b009f2ee853b (patch) | |
tree | 24d3612ec91c45bf3199e9cf887315f4696d3897 /src | |
parent | 3f1a2c668e1557cc6d76fe889253a8b9fc19c48f (diff) |
Generate sample interactive page
Diffstat (limited to 'src')
-rw-r--r-- | src/Main.hs | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/src/Main.hs b/src/Main.hs index 65ae4a0..69276ac 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -1,4 +1,51 @@ -module Main where +module Main (main, setup) where + +import GHC.Wasm.Prim main :: IO () -main = putStrLn "Hello, Haskell!" +main = error "unused" + +foreign export javascript setup :: IO () +setup :: IO () +setup = do + body <- js_document_getElementById (toJSString "body") + js_set_innerHTML body (toJSString "<input id=\"some_input\" type=\"text\" value=\"xyz\" /><button id=\"some_button\">add</button></div><div><ul id=\"some_list\"></ul></div>") + + buttonElem <- js_document_getElementById (toJSString "some_button") + buttonCallback <- asEventListener onButtonClick + + js_addEventListener buttonElem (toJSString "click") buttonCallback + +onButtonClick :: JSVal -> IO () +onButtonClick _event = do + inputElem <- js_document_getElementById (toJSString "some_input") + listElem <- js_document_getElementById (toJSString "some_list") + + li <- js_document_createElement (toJSString "li") + content <- js_document_createTextNode =<< js_get_value inputElem + js_appendChild li content + js_appendChild listElem li + +foreign import javascript unsafe "document.getElementById($1)" + js_document_getElementById :: JSString -> IO JSVal + +foreign import javascript unsafe "$1.innerHTML = $2" + js_set_innerHTML :: JSVal -> JSString -> IO () + +foreign import javascript unsafe "$1.appendChild($2)" + js_appendChild :: JSVal -> JSVal -> IO () + +foreign import javascript unsafe "document.createElement($1)" + js_document_createElement :: JSString -> IO JSVal + +foreign import javascript unsafe "document.createTextNode($1)" + js_document_createTextNode :: JSString -> IO JSVal + +foreign import javascript unsafe "$1.value" + js_get_value :: JSVal -> IO JSString + +foreign import javascript unsafe "$1.addEventListener($2, $3)" + js_addEventListener :: JSVal -> JSString -> JSVal -> IO () + +foreign import javascript "wrapper" + asEventListener :: (JSVal -> IO ()) -> IO JSVal |