Skip to content

Commit c9382c2

Browse files
authored
Use field names when serializing events to JS (#848)
* Use field names when serializing events to JS - Default ToJSVal encodes Map as an Array, so use an Object encoding instead - Update TypeScripts to reflect the change * Make sure the tests pass too. * Parenify
1 parent 3c83c05 commit c9382c2

File tree

4 files changed

+27
-8
lines changed

4 files changed

+27
-8
lines changed

js/miso.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2045,7 +2045,7 @@ describe('js tests', () => {
20452045
);
20462046

20472047
/* setup event delegation */
2048-
events = { click: ['click', true] };
2048+
events = [ { name : 'click', capture: true } ];
20492049
var getVTree = function (cb) {
20502050
cb(vtree);
20512051
};

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"test": "bun test js/miso.spec.js && bun run lcov",
99
"lcov": "lcov-viewer lcov -o ./coverage ./coverage/lcov.info",
1010
"watch": "tsc ts/miso.ts --watch",
11-
"pretty": "prettier --write ts/*.ts",
11+
"pretty": "prettier --write ts/miso/*.ts ts/*.ts",
1212
"build": "bun build --outfile=js/miso.js ./ts/index.ts --target=browser"
1313
},
1414
"type": "module",

src/Miso/Delegate.hs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE RecordWildCards #-}
12
-----------------------------------------------------------------------------
23
{-# LANGUAGE OverloadedStrings #-}
34
-----------------------------------------------------------------------------
@@ -17,10 +18,28 @@ module Miso.Delegate
1718
import Control.Monad.IO.Class (liftIO)
1819
import Data.IORef (IORef, readIORef)
1920
import qualified Data.Map.Strict as M
20-
import Language.Javascript.JSaddle (JSM, JSVal, Object(..), toJSVal)
21+
import Language.Javascript.JSaddle (create, JSM, JSVal, Object(..), ToJSVal(toJSVal))
2122
import Miso.FFI (delegateEvent, undelegateEvent)
2223
import Miso.Html.Types (VTree(..))
2324
import Miso.String (MisoString)
25+
import qualified Miso.FFI as FFI
26+
-----------------------------------------------------------------------------
27+
-- | Local Event type, used to create field names for a delegated event
28+
data Event
29+
= Event
30+
{ name :: MisoString
31+
-- ^ Event name
32+
, capture :: Bool
33+
-- ^ Capture settings for event
34+
} deriving (Show, Eq)
35+
-----------------------------------------------------------------------------
36+
-- | Instance used to initialize event delegation
37+
instance ToJSVal Event where
38+
toJSVal Event {..} = do
39+
o <- create
40+
flip (FFI.set "name") o =<< toJSVal name
41+
flip (FFI.set "capture") o =<< toJSVal capture
42+
toJSVal o
2443
-----------------------------------------------------------------------------
2544
-- | Entry point for event delegation
2645
delegator
@@ -30,7 +49,7 @@ delegator
3049
-> Bool
3150
-> JSM ()
3251
delegator mountPointElement vtreeRef es debug = do
33-
evts <- toJSVal (M.toList es)
52+
evts <- toJSVal (uncurry Event <$> M.toList es)
3453
delegateEvent mountPointElement evts debug $ do
3554
VTree (Object vtree) <- liftIO (readIORef vtreeRef)
3655
pure vtree

ts/miso/event.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ export function delegate(
77
) {
88
for (var event in events) {
99
mount.addEventListener(
10-
events[event][0],
10+
events[event]['name'],
1111
function (e: any) {
1212
listener(e, mount, getVTree, debug);
1313
},
14-
events[event][1],
14+
events[event]['capture'],
1515
);
1616
}
1717
}
@@ -32,11 +32,11 @@ export function undelegate(
3232
) {
3333
for (var event in events) {
3434
mount.removeEventListener(
35-
events[event][0],
35+
events[event]['name'],
3636
function (e: any) {
3737
listener(e, mount, getVTree, debug);
3838
},
39-
events[event][1],
39+
events[event]['capture'],
4040
);
4141
}
4242
}

0 commit comments

Comments
 (0)