43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
import type { AnalyticsDetailType } from '../types/AnalyticsType'
|
|
|
|
export default defineNuxtPlugin((nuxtApp) => {
|
|
// 공통 함수 정의
|
|
const createEventHandler = (eventName: string, sendFunction: Function) => {
|
|
return (el: any, binding: any) => {
|
|
const eventHandler = (event: Event) => {
|
|
const bindingValue = binding.value
|
|
if (bindingValue) {
|
|
sendFunction(bindingValue)
|
|
}
|
|
// 기존의 @click 핸들러 호출
|
|
if (typeof binding.value === 'function') {
|
|
binding.value(event)
|
|
}
|
|
}
|
|
|
|
el.addEventListener(eventName, eventHandler)
|
|
el[`__${eventName}EventHandler__`] = eventHandler
|
|
}
|
|
}
|
|
|
|
const removeEventHandler = (eventName: string) => {
|
|
return (el: any) => {
|
|
if (el[`__${eventName}EventHandler__`]) {
|
|
el.removeEventListener(eventName, el[`__${eventName}EventHandler__`])
|
|
delete el[`__${eventName}EventHandler__`]
|
|
}
|
|
}
|
|
}
|
|
|
|
// analytics
|
|
nuxtApp.vueApp.directive('analytics', {
|
|
mounted: createEventHandler('click', (bindingValue: AnalyticsDetailType) => {
|
|
const { sendLog } = useAnalytics()
|
|
const i18n = nuxtApp.$i18n as { locale: { value: string } }
|
|
|
|
sendLog(i18n.locale.value, bindingValue)
|
|
}),
|
|
beforeUnmount: removeEventHandler('click')
|
|
})
|
|
})
|