11/* @flow strict */
22
3- import SelectorSet from 'selector-set'
4- import formDataEntries from 'form-data-entries'
5-
63// Parse HTML text into document fragment.
74function parseHTML ( document : Document , html : string ) : DocumentFragment {
85 const template = document . createElement ( 'template' )
@@ -12,7 +9,7 @@ function parseHTML(document: Document, html: string): DocumentFragment {
129
1310function serialize ( form : HTMLFormElement ) : string {
1411 const params = new URLSearchParams ( )
15- const entries = 'entries' in FormData . prototype ? new FormData ( form ) . entries ( ) : formDataEntries ( form )
12+ const entries = new FormData ( form ) . entries ( )
1613 for ( const [ name , value ] of [ ...entries ] ) {
1714 params . append ( name , value . toString ( ) )
1815 }
@@ -65,9 +62,9 @@ type Kicker = {
6562 html : ( ) => Promise < SimpleResponse >
6663}
6764
68- export type RemoteFormHandler = ( form : HTMLFormElement , kicker : Kicker , req : SimpleRequest ) => void | Promise < void >
65+ export type RemoteFormHandler = ( form : HTMLFormElement , kicker : Kicker , req : SimpleRequest ) => void
6966
70- let selectorSet : ? SelectorSet < RemoteFormHandler >
67+ let formHandlers : Map < string , RemoteFormHandler [ ] >
7168
7269const afterHandlers = [ ]
7370const beforeHandlers = [ ]
@@ -81,26 +78,39 @@ export function beforeRemote(fn: (form: HTMLFormElement) => mixed) {
8178}
8279
8380export function remoteForm ( selector : string , fn : RemoteFormHandler ) {
84- if ( ! selectorSet ) {
85- selectorSet = new SelectorSet ( )
81+ if ( ! formHandlers ) {
82+ formHandlers = new Map < string , RemoteFormHandler [ ] > ( )
8683 document . addEventListener ( 'submit' , handleSubmit )
8784 }
88- selectorSet . add ( selector , fn )
85+ const handlers = formHandlers . get ( selector ) || [ ]
86+ formHandlers . set ( selector , [ ...handlers , fn ] )
8987}
9088
9189export function remoteUninstall ( selector : string , fn : RemoteFormHandler ) {
92- if ( selectorSet ) {
93- selectorSet . remove ( selector , fn )
90+ if ( formHandlers ) {
91+ const handlers = formHandlers . get ( selector ) || [ ]
92+ formHandlers . set ( selector , handlers . filter ( x => x !== fn ) )
93+ }
94+ }
95+
96+ function getMatches ( el : HTMLElement ) : RemoteFormHandler [ ] {
97+ const results = [ ]
98+ for ( const selector of formHandlers . keys ( ) ) {
99+ if ( el . matches ( selector ) ) {
100+ const handlers = formHandlers . get ( selector ) || [ ]
101+ results . push ( ...handlers )
102+ }
94103 }
104+ return results
95105}
96106
97107function handleSubmit ( event : Event ) {
98108 if ( ! ( event . target instanceof HTMLFormElement ) ) {
99109 return
100110 }
101111 const form = event . target
102- const matches = selectorSet && selectorSet . matches ( form )
103- if ( ! matches || matches . length === 0 ) {
112+ const matches = getMatches ( form )
113+ if ( matches . length === 0 ) {
104114 return
105115 }
106116
@@ -143,7 +153,7 @@ function handleSubmit(event: Event) {
143153// Process each handler sequentially until it either completes or calls the
144154// kicker function.
145155async function processHandlers (
146- matches : Array < * > ,
156+ matches : RemoteFormHandler [ ] ,
147157 form : HTMLFormElement ,
148158 req : SimpleRequest ,
149159 kickerPromise : Promise < SimpleResponse >
@@ -167,7 +177,7 @@ async function processHandlers(
167177 return kick ( )
168178 }
169179 }
170- await Promise . race ( [ kickerCalled , match . data . call ( null , form , kicker , req ) ] )
180+ await Promise . race ( [ kickerCalled , match ( form , kicker , req ) ] )
171181 }
172182 return kickerWasCalled
173183}
0 commit comments