@quasar/quasar-ui-qcalendar
Version:
QCalendar - Day/Month/Week Calendars, Popups, Date Pickers, Schedules, Agendas, Planners and Tasks for your Vue Apps
49 lines (39 loc) • 1.35 kB
text/typescript
/* global window */
import { Directive, DirectiveBinding } from 'vue'
interface ResizeData {
callback: () => void
// `options` can be either a boolean or an object implementing AddEventListenerOptions.
options: boolean | AddEventListenerOptions
}
// Extend HTMLElement to include our custom property.
interface HTMLElementWithResize extends HTMLElement {
_onResize?: ResizeData
}
const ResizeDirective: Directive = {
mounted(el: HTMLElementWithResize, binding: DirectiveBinding) {
const { modifiers, value } = binding
if (!value) return
const callback = value as () => void
// If modifiers are provided and not empty, use them as options; otherwise, default to { passive: true }.
const options =
Object.keys(modifiers).length > 0
? (modifiers as unknown as AddEventListenerOptions)
: { passive: true }
window.addEventListener('resize', callback, options)
el._onResize = {
callback,
options,
}
// If the "quiet" modifier is not set, call the callback immediately.
if (!modifiers.quiet) {
callback()
}
},
beforeUnmount(el: HTMLElementWithResize) {
if (!el._onResize) return
const { callback, options } = el._onResize
window.removeEventListener('resize', callback, options)
delete el._onResize
},
}
export default ResizeDirective