@omnicajs/vue-remote
Version:
Proxy renderer for Vue.js based on @remote-ui
200 lines (176 loc) • 5.6 kB
text/typescript
import type {
SerializedDataTransfer,
SerializedDragEvent,
SerializedEvent,
SerializedEventType,
SerializedFile,
SerializedFocusEvent,
SerializedInputEvent,
SerializedKeyboardEvent,
SerializedMouseEvent,
SerializedPointerEvent,
SerializedTarget,
SerializedTouch,
SerializedTouchEvent,
SerializedWheelEvent,
} from '~types/events'
export const serializeTarget = (target: EventTarget): SerializedTarget => {
switch (true) {
case target instanceof HTMLInputElement:
case target instanceof HTMLSelectElement:
case target instanceof HTMLTextAreaElement:
return {
value: target.value,
...(target instanceof HTMLInputElement && { checked: target.checked }),
...(target instanceof HTMLSelectElement && {
selectedIndex: target.selectedIndex,
selectedOptions: [...target.selectedOptions].map(option => ({
value: option.value,
text: option.text,
selected: option.selected,
})),
}),
}
case target instanceof HTMLElement:
return {}
}
return {}
}
export const serializeBaseEvent = (event: Event): SerializedEvent => {
return {
type: event.type,
target: event.target ? serializeTarget(event.target) : null,
currentTarget: event.currentTarget ? serializeTarget(event.currentTarget) : null,
bubbles: event.bubbles,
cancelable: event.cancelable,
composed: event.composed,
defaultPrevented: event.defaultPrevented,
eventPhase: event.eventPhase,
isTrusted: event.isTrusted,
}
}
const serializeFiles = (files: FileList): SerializedFile[] => {
return [...files].map(file => ({
lastModified: file.lastModified,
name: file.name,
webkitRelativePath: file.webkitRelativePath,
size: file.size,
type: file.type,
}))
}
const serializeDataTransfer = (dataTransfer: DataTransfer): SerializedDataTransfer => {
return {
dropEffect: dataTransfer.dropEffect,
effectAllowed: dataTransfer.effectAllowed,
types: dataTransfer.types,
files: serializeFiles(dataTransfer.files),
}
}
export const serializeDragEvent = (event: DragEvent): SerializedDragEvent => {
return {
...serializeMouseEvent(event),
dataTransfer: event.dataTransfer ? serializeDataTransfer(event.dataTransfer) : null,
}
}
export const serializeInputEvent = (event: InputEvent): SerializedInputEvent => {
return {
...serializeBaseEvent(event),
data: event.data,
} as SerializedInputEvent
}
export const serializeFocusEvent = (event: FocusEvent): SerializedFocusEvent => {
return {
...serializeBaseEvent(event),
relatedTarget: event.relatedTarget ? { tagName: (event.relatedTarget as HTMLElement).tagName } : null,
}
}
export const serializeKeyboardEvent = (event: KeyboardEvent): SerializedKeyboardEvent => {
return {
...serializeBaseEvent(event),
key: event.key,
code: event.code,
altKey: event.altKey,
ctrlKey: event.ctrlKey,
shiftKey: event.shiftKey,
metaKey: event.metaKey,
}
}
export const serializeMouseEvent = (event: MouseEvent): SerializedMouseEvent => ({
...serializeBaseEvent(event),
clientX: event.clientX,
clientY: event.clientY,
button: event.button,
})
export const serializePointerEvent = (event: PointerEvent): SerializedPointerEvent => ({
...serializeMouseEvent(event),
height: event.height,
isPrimary: event.isPrimary,
pointerId: event.pointerId,
pointerType: event.pointerType,
pressure: event.pressure,
tangentialPressure: event.tangentialPressure,
tiltX: event.tiltX,
tiltY: event.tiltY,
twist: event.twist,
width: event.width,
})
export const serializeTouchList = (touchList: TouchList): SerializedTouch[] => [...touchList].map(touch => ({
clientX: touch.clientX,
clientY: touch.clientY,
force: touch.force,
identifier: touch.identifier,
pageX: touch.pageX,
pageY: touch.pageY,
radiusX: touch.radiusX,
radiusY: touch.radiusY,
rotationAngle: touch.rotationAngle,
screenX: touch.screenX,
screenY: touch.screenY,
}))
export const serializeTouchEvent = (event: TouchEvent): SerializedTouchEvent => ({
...serializeBaseEvent(event),
altKey: event.altKey,
changedTouches: serializeTouchList(event.changedTouches),
ctrlKey: event.ctrlKey,
metaKey: event.metaKey,
shiftKey: event.shiftKey,
targetTouches: serializeTouchList(event.targetTouches),
touches: serializeTouchList(event.touches),
})
export const serializeWheelEvent = (event: WheelEvent): SerializedWheelEvent => ({
...serializeMouseEvent(event),
deltaMode: event.deltaMode,
deltaX: event.deltaX,
deltaY: event.deltaY,
deltaZ: event.deltaZ,
DOM_DELTA_PIXEL: event.DOM_DELTA_PIXEL,
DOM_DELTA_LINE: event.DOM_DELTA_LINE,
DOM_DELTA_PAGE: event.DOM_DELTA_PAGE,
})
export const serializeEvent = <E extends Event>(event: E): SerializedEventType<E> => {
if (event instanceof InputEvent) {
return serializeInputEvent(event)
}
if (event instanceof DragEvent) {
return serializeDragEvent(event)
}
if (event instanceof FocusEvent) {
return serializeFocusEvent(event)
}
if (event instanceof KeyboardEvent) {
return serializeKeyboardEvent(event)
}
if (event instanceof PointerEvent) {
return serializePointerEvent(event)
}
if (event instanceof WheelEvent) {
return serializeWheelEvent(event)
}
if (event instanceof MouseEvent) {
return serializeMouseEvent(event)
}
if (typeof window !== 'undefined' && window.TouchEvent && event instanceof TouchEvent) {
return serializeTouchEvent(event)
}
return serializeBaseEvent(event)
}