mirror of
https://github.com/Instadapp/assembly.git
synced 2024-07-29 22:37:06 +00:00
58 lines
2.2 KiB
TypeScript
58 lines
2.2 KiB
TypeScript
import { computed } from '@vue/composition-api'
|
|
import { useBigNumber } from './useBigNumber'
|
|
const { gt } = useBigNumber()
|
|
|
|
function createEventListener(context, eventName, filter, params) {
|
|
return function (event) {
|
|
const input = event.target
|
|
|
|
if (filter) {
|
|
// filter input with input filter
|
|
if (filter(input.value)) {
|
|
input.oldValue = input.value
|
|
input.oldSelectionStart = input.selectionStart
|
|
input.oldSelectionEnd = input.selectionEnd
|
|
|
|
if (params?.max && gt(input.value, params.max)) {
|
|
input.value = params.max
|
|
}
|
|
|
|
context.emit(eventName, input.value)
|
|
} else if (Object.prototype.hasOwnProperty.call(input, 'oldValue')) {
|
|
input.value = input.oldValue
|
|
// FIXME: Jumps back to old value after moving cursor
|
|
if (input.oldSelectionStart !== null && input.oldSelectionEnd !== null) {
|
|
input.setSelectionRange(input.oldSelectionStart, input.oldSelectionEnd)
|
|
}
|
|
} else {
|
|
input.value = ''
|
|
}
|
|
} else {
|
|
context.emit(eventName, input.value)
|
|
}
|
|
}
|
|
}
|
|
|
|
export function useInputListeners(props, context, filter, params) {
|
|
if (!props || typeof props.value === 'undefined') {
|
|
throw new Error(
|
|
"No prop 'value' found. Make sure to define and add it to the input.\nAdd the prop like this:\nvalue: { type: String, required: false, default: '' }\n\nAnd the binding on the input like this:\n:value=\"value\""
|
|
)
|
|
}
|
|
const inputListeners = computed(() =>
|
|
Object.assign({}, context.listeners, {
|
|
change: createEventListener(context, 'change', filter, params),
|
|
input: createEventListener(context, 'input', filter, params),
|
|
keydown: createEventListener(context, 'keydown', filter, params),
|
|
keyup: createEventListener(context, 'keyup', filter, params),
|
|
mousedown: createEventListener(context, 'mousedown', filter, params),
|
|
mouseup: createEventListener(context, 'mouseup', filter, params),
|
|
select: createEventListener(context, 'select', filter, params),
|
|
contextmenu: createEventListener(context, 'contextmenu', filter, params),
|
|
dro: createEventListener(context, 'dro', filter, params),
|
|
})
|
|
)
|
|
|
|
return { inputListeners }
|
|
}
|