src/svelte/src/utilities/elementKeypressEvents.ts (40 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
type ElementKeypressEventKey = 'Enter' | 'Delete'
const MappableKeys: { [k in ElementKeypressEventKey]: true } = {
Enter: true,
Delete: true,
}
type ElementKeypressEvent = {
elementId: string
run: (keyEvent: KeyboardEvent) => void
}
class ElementKeypressEventMap {
private events: {
[key in ElementKeypressEventKey]: Array<ElementKeypressEvent>
} = {
Delete: [],
Enter: [],
}
public register(key: ElementKeypressEventKey, event: ElementKeypressEvent) {
this.remove_and_replace(key, event)
}
public run(elementId: string, keyEvent: KeyboardEvent) {
this.events[keyEvent.key].forEach((eventItem) => {
if (eventItem.elementId === elementId) eventItem.run(keyEvent)
})
}
private remove_and_replace(
key: ElementKeypressEventKey,
event: ElementKeypressEvent
) {
const replaceIndex = this.events[key].findIndex((storedEvent) => {
return storedEvent.elementId === event.elementId
})
replaceIndex >= 0
? (this.events[key][replaceIndex] = event)
: this.events[key].push(event)
}
}
export function key_is_mappable(eventKey: string): boolean {
return MappableKeys[eventKey as ElementKeypressEventKey] === true
}
export let elementKeypressEventMap = new ElementKeypressEventMap()